domingo, 27 de setembro de 2009

Wireless LTSP no Ubuntu 9.04

LTSP wireless no Ubuntu 9.04

For English version of this Wireless LTSP tutorial:
http://www.mediafire.com/file/3kuk0znozzz/Wireless_LTSP_EN.pdf

O Tutorial para versão 9.10 esta a caminho.

O LTSP (Linux Terminal Server Project) usando redes wireless é algo muito útil e pratico. Reparei que não há nenhum artigo em português sobre isso, o único site que encontrei na internet que descreve como alcançar isso é o http://www.lug-kr.de/wiki/ThinClientLokalBooten (em alemão). O autor dele, LUG Krefeld, fez um ótimo trabalho viabilizando LTSP wireless. O que eu farei é dar explicações adicionais e detalhadas que tenho certeza que vão ajudar muito. Os dois scripts usados aqui são de autoria de LUG Krefeld. Esse tutorial como descrito funciona no ubuntu 9.04. Em outras distribuições baseadas no ubuntu e também no Debian ela funciona com poucas alterações. Já em outras distribuições como Fedora, Suse etc sera necessária maiores alterações já que o init e processo de boot é diferente.
Para ter o LTSP funcionado no Ubuntu 9.04 há duas maneiras.
1. método:
Pode-se usar o Ubuntu 9.04 alternate CD que ja vem com o LTSP, bastando apertar o F4 no menu de boot e escolher "Install an LTSP Server" que ele instala. A única pergunta que se deve ficar mais atento é qual é sua interface primaria de rede. Primaria é aquela que você usa para conectar a internet, pois na outra ele vai iniciar o servidor dhcp (dhcpd). Responda as demais perguntas da instalação e quando reiniciar já terá um servidor LTSP funcionando.
2. método:
O LTSP pode também ser facilmente instalado em um Ubuntu 9.04 ja instalado.
sudo apt-get update
sudo apt-get install ltsp-server-standalone openssh-server
sudo ltsp-build-client
caso esteja usando o Ubuntu 9.04 X86_64 é recomendável usar o comando abaixo ao invés do de cima porque o client provavelmente não tera processador compatível com 64 bits.
sudo ltsp-build-client --arch i386
com qualquer um dos dois métodos ja terá um LTSP funcionando.
Um pouco de teoria.
Em redes com fio bastaria no cliente configurar na BIOS para dar boot pela rede (disponível na maioria das placas mães) ou, caso não tenha, dar boot por Etherboot/GPXe. Em ambos os casos sera feita uma requisição dhcp, o servidor retornará com um ip e com uma pequena imagem via TFTP e essa imagem carregara o kernel e initrd que darão sequência ao boot.
Em redes wireless é diferente porque não há placas de rede wireless que venham com opção de boot pela rede embutido. No Eherboot/GPXe também não há drivers wireless.
A solução descrita aqui consiste em dar boot no kernel com uma versão modificada do initrd
Para que não sabe, no procedimento padrão de boot do pxe a pequena imagem carregada via TFTP carrega depois o kernel + initrd (que ficam no servidor)e dão sequência ao boot. Com o grub instalado, por exemplo, pode-se carregar esse kernel + initrd localmente( no cliente), o resultado sera o mesmo.
No initrd do ubuntu não há drivers wireless, eles são carregados somente depois. O que será feito é incluir já nesse initrd tudo necessario para possibilitar o LTSP em redes wireless.
A imagem e o kernel ficam na pasta /opt/ltsp/i386/boot do servidor.
Depois das modificações feitas a imagem gerada e o kernel (que não foi alterado) deve ser bootado de alguma forma, darei exemplos com o grub adiante.
Há alguns itens a serem modificados na imagem (initrd): Incluir drivers wireless, pacotes que permitam realizar a conexão wireless e dois scrips feitos por LUG Krefeld, sendo que um deles é responsável por fazer essas inclusões e outro para capturar as entradas no boot (como essid e senha)
Começando pelos pacotes:
crie uma pasta para baixar os pacotes
mkdir pacotes_wireless
cd pacotes_wireless
sudo aptitude download wireless-tools libiw29 libc6 libssl0.9.8 openvpn liblzo1 zlib1g
Com isso ele baixará esses pacotes para a pasta atual .
Esses pacotes são os necessários para permitir a conexão wireless. Sendo que esses são para o ubuntu 9.04. Pode haver pequena variação em outras distros ou versões, como por exemplo o libiw29, que dependendo da versão do linux pode ser libiw28
Lembrando que se mudar o nome dessa pasta (wireless)terá que mudar também no script "wirelessboot".
O comando abaixo serve para extrair o conteúdo de todos esse pacotes para uma pasta(wireless)
sudo su
for package in *.deb ; do dpkg -x $package wireless ; done
A pasta wireless deve ser copiada para /opt/ltsp/i386/root . Pense nessa pasta (wireless)com sendo a raiz de um sistema. Um dos scripts depois fara o copia do conteúdo desta pasta para a raiz da nova imagem que desta forma ir ter esse arquivos nessessarios para se conectar a uma rede wireless. E melhor fazer dessa forma do que copiar direto para a raiz do LTSP (/opt/ltsp/i386/) por questão de organização.
Essa dica usa dois scripts feitos por LUG Krefeld
http://www.lug-kr.de/wiki/ThinClientLokalBooten
O primeiro não necessita de alteração tanto que não farei tradução. O segundo script deverá ser modificado de acordo com o driver que sua placa de rede wireless usa.
O intuito do primeiro script é pegar os comando que você passar pelo grub (ou outro gerenciador)no boot e conectar a rede wireless. De-lhe o nome de “wireless” e copie para a pasta /opt/ltsp/i386/etc/initramfs-tools/scripts/init-premount/ ,não é necessário altera-lo
---
#!/bin/sh
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
for x in $(cat /proc/cmdline); do
case $x in
device=*)
device=${x#device=}
;;
essid=*)
essid=${x#essid=}
;;
wirelesskey=*)
wirelesskey=${x#wirelesskey=}
;;
openvpn=*)
openvpn=${x#openvpn=}
;;
hostname=*)
hostname=${x#hostname=}
;;
esac
done
if [ -n "${device}" ]; then
DEVICE=$device
# den Wert fuer nachfolgende Skripte speichern
echo "DEVICE=${device}" >>/conf/param.conf
fi
if [ -n "${essid}" ]; then
# dem USB-System Zeit lassen, den WLAN-Treiber zu installieren
sleep 5
# Besonderheit fuer rt73-Treiber, schadet anderen aber wohl nicht:
ifconfig $DEVICE up
if [ -n "${wirelesskey}" ]; then
iwconfig $DEVICE key $wirelesskey
fi
iwconfig $DEVICE essid $essid
fi
if [ -n "${openvpn}" ]; then
# Als Parameter muss ein lokales Device angegeben werden, in dem die Schluessel liegen
echo -n "OpenVPN startet..."
mount $openvpn /mnt/
# zuerst sollte die Basisverbindung konfiguriert werden
ipconfig $DEVICE
# source relevant ipconfig output
. /tmp/net-${DEVICE}.conf
# OpenVPN benoetigt seinerseits evtl. auch den Nameserver
echo "nameserver $IPV4DNS0" >/etc/resolv.conf
# Jetzt sollte das Ding starten:
/usr/sbin/openvpn --daemon --cd /mnt/openvpn --config /mnt/openvpn/${hostname}.conf
# Ich setze die MAC-Adresse des tun-Devices auf die meiner Ethernet-Schnittstelle
# So ist es dem DHCP-Server egal, ueber welches Netz ich komme
ifconfig eth0 down
until ifconfig tap1; do sleep 1; done
ifconfig tap1 down
mac=`ifconfig eth0grep eth0`
ifconfig tap1 hw ether ${mac#*HWaddr}
ifconfig tap1 up
# Die weiteren Skripte sollen jetzt vom tun-Device als Hauptdevice ausgehen
echo "DEVICE=tap1" >>/conf/param.conf
echo "Fertig."
fi
---
O segundo script (que necessita de alteração) é esse:
---
#!/bin/sh
. /usr/share/initramfs-tools/hook-functions
PREREQ="lvm"
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
echo "Adicionado modulos wireless"
force_load ide-disk
force_load generic
force_load tun
cp -a /root/wireless/* "${DESTDIR}/"
---
Esse script precisa ser alterado de acordo com o driver da placa wireless que é utilizado no cliente. Não é necessário remover nada no script, somente adicionar. Não há ainda uma imagem genérica, a dificuldade em faze-la é não carregar lixo. Mas não vai demorar ate eu ou alguem fazer isso. Deve ser incluído no script os módulos que o hardware do cliente usam. As vezes só os módulos que tem relação com a placa de wireless do cliente bastam mas as vezes estes tem pré-requisitos de outros módulos. A maneira mais fácil e garantida de saber quais módulos são usados pelo cliente é dar boot no ubuntu ou xubuntu no cliente e depois de carregado dar o comando
lsmod > modulos
Isso irá gerar o arquivo modulos que contem do lado esquerdo o módulos e as dependências do lado direito. Apague as dependências e insira forceload antes do modulo. Ficará parecido com isso:
force_load led-class
force_load lbm_cw-cfg80211
force_load lbm_cw-mac80211
force_load ath5k
...
só que serão uns 30 módulos. Recomendo colocar todos pra garantir. Depois de concluído essa edição copie todas essa linhas para antes da ultima linha do script
(cp -a /root/wireless/* "${DESTDIR}/")
Salve o script, de-lhe o nome de “wirelessboot”e coloque na seguinte pasta /opt/ltsp/i386/etc/initramfs-tools/hooks/:
Esse script faz com que todos os drivers listados sejam carregados alem de copiar os pacotes necessário para o funcionamento (/opt/ltsp/i386/root/wireless). Não é para entrar na pasta e executar nenhum dos dois scripts.
Quando ja tiver copiado os scripts para os devidos lugares execute o comando abaixo:
sudo chroot /opt/ltsp/i386 update-initramfs -u
Dentro da pasta /opt/ltsp/i386/boot estará o kernel (que é o mesmo) e o novo initrd (que terá mais de 14Mb, o triplo do tamanho normal).
o nome do kernel será provavelmente "vmlinuz-2.6.28-11-generic" e a imagem
"initrd.img-2.6.28-11-generic".
copie esse dois arquivos para um pendrive, hd ou cd com grub. Eu costumo utilizar um pendrive com o SuperGrubDisk.
www.supergrubdisk.org/
adicione esse entrada no arquivo menu.lst. Modificando conforme sua rede.
title ThinClient wireless
root (hd0,0)
kernel /boot/vmlinuz device=wlan0 essid=residencia wirelesskey=senha openvpn=/dev/hda1 hostname=meucliente
initrd /boot/initrd.img
Device geralmente é wlan0 mas pode variar conforme sua placa wireless.
No meu dell mini 9 é device=eth0. essid é o nome da rede e wirelesskey é a senha. Lembrando que senhas WEP do tipo passfrase deve ser precedida de "s:" ficando essid=s:senha
Lembro também que não adianta colocar senhas com "#" no access point que quando o script pegar vai comentar a linha da senha é dara erro. O openvpn e o hostname so são nessessarios caso você use vpn. É mais fácil fazer isso tudo com access point ou roteador funcionando com access point. Isso acontece porque o próprio roteador fornece um ip para o laptop e o laptop precisa que esse ip desse dado pelo dhcp do servidor e não pelo do roteador. Existem caminhos para resolver isso. Não vou escrever aqui pois ja existe na internet. Lembro ainda que certos laptops usam drivers wireless restritos sendo o mais comum o “wl”.
Se for o caso tem que copiar o arquivo do drive propriamente dito para dentro de /opt/ltsp/i386/root/wireless adicionado depois o mesmo caminho que exite no cliente se fosse dar um boot convencional. Geralmente estes drivers (tem extensão .ko) ficam dentro de uma pasta chamado “volatile”.
O procedimento LTSP explicado aqui foi testado no Ubuntu 9.04. Funciona também em distros baseadas no Ubuntu e no Debian Lenny fazendo poucas ou mesmo nenhuma alteração. Para outras distribuições a ideia geral é a mesma, mas como a estrutura delas é diferente será necessário fazer alterações.
Apesar de trabalhoso o resultado é muito bom. Fica muito prático. E depois de pegar o jeito consegue-se fazer rapidamente. Uma dica que dou é primeiro testar o LTSP em redes com fio, e obviamente so começar com o tutorial se a rede com fio já estiver funcionando perfeitamente.
É útil para utilização em escolas também. O edubuntu agora instala por cima do ubuntu é fica muito bom.
Este é meu primeiro post. Espero ter ajudado.
Fabio Moraes Hache
fabiohache@gmail.com

Um comentário:

  1. Salve!,
    Dom Fabio, muito ótimo seu tutorial!
    Aqui em casa tenho um servidor LTSP e dois terminais burrinhos. Após todos funcionando, gostaria de conseguir transformar meu N810 em um thin client também.
    Sei que solicitar um tutorial específico sobre isso é abuso, mas, se possível, gostaria de receber um direcionamento ou leves instruções de por onde posso começar para atingir esse objetivo.
    Gostei muito mesmo do post.

    ResponderExcluir