Uma vez configurado nosso servidor DHCP, precisamos agora preparar nosso servidor TFTP para enviar o bootloader (pxelinux.0) pela rede e os demais arquivos que serão utilizados no startup de instalação da máquina inst-automatico.
O Trivial File Transfer Protocol é o escolhido para esse serviço por basear suas conexões sem a necessidade de autenticação e por utilizar o protocolo UDP. Outro detalhe sobre o TFTP é que ele é um serviço baseado no SuperDaemon XINETD, isto é, precisamos do xinetd para executar o TFTP. Para habilitarmos o serviço, basta:
# rpm -q tftp-server
tftp-server-0.49-5.fc12.x86_64
# rpm -q xinetd
xinetd-2.3.14-29.fc12.x86_64
# chkconfig xinetd on
# chkconfig tftp on
# cat /etc/xinetd.d/tftp | grep -v ^#
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
per_source = 11
cps = 100 2
flags = IPv4
}
# service xinetd start
Na arquivo acima podemos observar como é fácil a configuração do TFTP no sistema. Não será necessário nenhuma customização no serviço por enquanto. Um detalhe imprescindível na configuração é o parâmetro server_args = -s /var/lib/tftpboot, que cria uma espécie de chroot para o serviço. Desta forma, nossos arquivos de configuração irão se localizar dentro do diretório proposto.
Para continuarmos de forma segura e termos certeza que tudo que configuração até o momento está funcionando, podemos copiar um arquivo qualquer para dentro do diretório /var/lib/tftpboot e baixá-lo via tftp, a fim de testar o serviço. Caso o comando tftp não esteja disponível no sistema, instale o pacote tftp.
# rpm -q tftp
tftp-0.49-5.fc12.x86_64
# cp /etc/hosts /var/lib/tftpboot/
# ls -la /var/lib/tftpboot/
total 12
drwxr-xr-x. 2 root root 4096 2010-04-04 03:31 .
drwxr-xr-x. 30 root root 4096 2010-04-04 03:22 ..
-rw-r--r--. 1 root root 264 2010-04-04 03:31 hosts
# tftp 192.168.240.10 -c get hosts
# ls -la hosts
-rw-r--r--. 1 root root 264 2010-04-04 03:31 hosts
Se você conseguiu fazer o download do arquivo utilizando um cliente TFTP, estamos indo muito bem. Nosso próximo passo será copiar para o diretório /var/lib/tftpboot o bootloader chamado de pxelinux.0. Para fazer uso do PXE, sua máquina cliente deve ter esse suporte na placa de rede que às vezes deve ser habilitado na própria placa ou no caso de placas on-board, na BIOS do cliente com uma opção geralmente identificada como "Boot Onboard Lan Support" ou "PXE Onboard Support".
O processo de boot via PXE consiste em inicializar o cliente pela placa de rede sem a necessidade de ter um sistema operacional instalado localmente, pois o cliente irá solicitar um endereço IP via DHCP (já temos o servidor DHCP configurado) e utilizará o parâmetro next-server 192.168.240.10 para solicitar o bootloader, que é informado pelo parâmetro filename "pxelinux.0", ambos no arquivo dhcpd.conf. A transferência do bootloader será dada sob o protocolo TFTP.
Por conta disto devemos então colocar o arquivo pxelinux.0 dentro do diretório /var/lib/tftpboot. Para isso:
# rpm -q syslinux
syslinux-3.75-4.fc12.x86_64
# rpm -ql syslinux | grep pxelinux.0
/usr/share/syslinux/gpxelinux.0
/usr/share/syslinux/pxelinux.0
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# ls -la /var/lib/tftpboot/
total 28
drwxr-xr-x. 2 root root 4096 2010-04-04 03:43 .
drwxr-xr-x. 30 root root 4096 2010-04-04 03:22 ..
-rw-r--r--. 1 root root 264 2010-04-04 03:31 hosts
-rw-r--r--. 1 root root 15702 2010-04-04 03:43 pxelinux.0
Está ficando bonito! O que precisamos entender agora é o funcionamento do bootloader pxelinux.0.
Por padrão o pxelinux.0 irá procurar um arquivo de configuração dentro de um diretório chamado pxelinux.cfg. O bootloader irá procurar os arquivos de configuração nessa ordem, onde no match de alguns deles o próximo não será consultado.
1. MAC Address: como primeira etapa, o pxelinux.0 irá procurar o arquivo nomeado com o MAC Address do cliente;
2. IP em Hexadecimal: irá procurar o arquivo convertendo o IP do cliente para hexadecimal e irá decrementar sempre um caractere da direita a fim de encontrar alguma configuração do cliente ou da subnet informada. Para a conversão do IP para hexadecimal, podemos utilizar o utilitário gethostip.
3. Default: por fim, se não for localizado nenhum arquivo acima, o bootloader procurará um arquivo chamado default.
Abaixo segue um exemplo retirado do arquivo de documentação do projeto:
/mybootdir/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/mybootdir/pxelinux.cfg/C000025B
/mybootdir/pxelinux.cfg/C000025
/mybootdir/pxelinux.cfg/C00002
/mybootdir/pxelinux.cfg/C0000
/mybootdir/pxelinux.cfg/C000
/mybootdir/pxelinux.cfg/C00
/mybootdir/pxelinux.cfg/C0
/mybootdir/pxelinux.cfg/C
/mybootdir/pxelinux.cfg/default
Nesses arquivos teremos as configurações de qual kernel, initrd e kickstart iremos utilizar para a instalação do cliente.
# pwd
/var/lib/tftpboot
# mkdir pxelinux.cfg
# cd pxelinux.cfg/
# pwd
/var/lib/tftpboot/pxelinux.cfg
# gethostip -x 192.168.240.49
C0A8F031
# touch C0A8F031
Como nosso arquivo C0A8F031 ainda não possui conteúdo, uma boa dica é utilizar um cdrom de boot para utilizar alguns arquivos como exemplos, bem como para copiarmos o kernel e o initrd do sistema que queremos instalar. Irei instalar um cliente com o Fedora 12. Esses arquivos podem ser encontrados dentro do DVD ou CD bootável do sistema.
# mount -o loop fedora12-x86_64.iso /mnt
# cd /mnt
# ls
EFI images
media.repo repodata
RPM-GPG-KEY-fedora-12-primary
RPM-GPG-KEY-fedora-ppc
RPM-GPG-KEY-fedora-x86_64
GPL
isolinux
Packages
RPM-GPG-KEY-fedora
RPM-GPG-KEY-fedora-i386
RPM-GPG-KEY-fedora-ppc64
TRANS.TBL
# cd images/pxeboot/
# ls
initrd.img
README
TRANS.TBL
vmlinuz
# cp vmlinuz initrd.img /var/lib/tftpboot/
# cd ../../isolinux/
# ls
boot.cat
boot.msg
grub.conf
initrd.img
isolinux.bin
isolinux.cfg
memtest
splash.jpg
TRANS.TBL
vesamenu.c32
vmlinuz
# cp boot.msg /var/lib/tftpboot/
# cp isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/C0A8F031
cp: overwrite `/var/lib/tftpboot/pxelinux.cfg/C0A8F031'?
y
# cd /var/lib/tftpboot/
# pwd
/var/lib/tftpboot
# ls
boot.msg
hosts
initrd.img
pxelinux.0
pxelinux.cfg
vmlinuz
# cat boot.msg
Para instalar o Fedora 12, digite:
fedora12
# cat pxelinux.cfg/C0A8F031
prompt 1
timeout 600
display boot.msg
default fedora12
label fedora12
kernel vmlinuz
append initrd=initrd.img network ksdevice=eth0 ks=http://192.168.240.10/kickstart-fedora12.cfg
Alterado os arquivos como segue o exemplo acima, nosso servidor PXE já esta pronto! No arquivo C0A8F031 configuramos para exibir o menu para o usuário (prompt 1, display boot.msg) por 60 segundos (timeout 600) e caso o usuário não escreva a opção informada (boot.msg) o padrão será bootar com o fedora12 (default fedora12).
Na configuração do label, informamos o kernel, o initrd e o kickstart que será utilizado para a instalação do servidor.
Para maiores informações, consulte os arquivos no diretório /usr/share/doc/syslinux*.