Boot remoto com pxe no ubuntu server

Configurar um serviço de boot remoto é um skill dos sysadmins da era paleozóica, a idéia é usar um servidor dedicado à persistência de dados, servindo todos os dados, incluindo o sistema operacional via rede. A vantagem desse modelo é o custo de administração, como os sistemas são centralizados em uma máquina, instalar, remover ou configurar todo o parque é muito mais rápido, e é possível administrar o SO de uma máquina mesmo com ela desligada.

Essa técnica, é a base primordial da cloud computing, à partir dessa infra é possível configurar e servir VPS, e migrar de um node pra outro de forma transparente, e com a dose de redundancia certa, o sistema se torna muito confiável, já que uma falha de hardware é minimizada, já que a persistência é feita em outra máquina.

A topologia é simples:

O processo de boot remoto é relativamente simples:

  • o node chama o boot via PXE, que envia pacotes arp pela rede pedindo um IP.
  •  O storage capta esses pacotes, envia um IP para o node junto com algumas configurações, como o path do root e o kernel que será usado.
  • O node, agora portando um IP, pede ao storage um kernel e a imagem de ram via tftp.
  • O kernel boota no node, monta o sistema de arquivo contido na imagem de ram (initramfs), os drivers de rede são carregados.
  • O sistema contido no initramfs monta o sistema root do SO via nfs.
  • O processo de boot continua normalmente, como se fosse de um disco qualquer.

 

As ferramentas usadas para a tarefa são:

  • ISC DHCP Server, serve os IPs e as configurações iniciais.
  • TFTP-HPA, um servidor FTP super simples, que aceita poucos comandos.
  • nfs-kernel-server, um servidor nfs que roda parcialmente em kernel space, e tem um desempenho superior ao seu equivalente user space.

O primeiro passo é instalar os pacotes:

apt-get install dhcp3-server tftpd-hpa nfs-kernel-server initramfs-tools

Uma boa configuração do DHCP server (/etc/dhcp/dhcpd.conf ) tem mais ou menos o seguinte aspecto:

ddns-update-style none;
option domain-name "exemplo.com";
option domain-name-servers 8.8.8.8;
default-lease-time 86400;
max-lease-time 604800;
option time-offset -18000;
authoritative;
log-facility local7;
allow booting;
allow bootp;
subnet 192.168.0.0 netmask 255.255.255.0 {
        get-lease-hostnames on;
        use-host-decl-names on;
        range 192.168.0.200 192.168.0.210;
        option routers 192.168.0.10;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.0.255;
        filename "pxelinux.0";
        next-server 192.168.0.10;
}

Lembrando que o IP 192.168.0.10 é o IP do servidor DHCP/Storage/Gateway

Atente ao Range de IPs na no parametro “range”, preste atenção nele isso é importante, volto nesse ponto já já.

A configuração do TFTPD é simples e auto explicativo:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

A configuração do serviço de compartilhamento NFS é simples, por exemplo:

/srv/client_root_fs 192.168.0.*(rw,no_root_squash,async) 
/srv/node01 192.168.0.*(rw,no_root_squash,async) 
/srv/node02 192.168.0.*(rw,no_root_squash,async) 
/srv/node03 192.168.0.*(rw,no_root_squash,async) 
/srv/node04 192.168.0.*(rw,no_root_squash,async) 
/data 192.168.0.*(rw,no_root_squash,async)

O PXE tem uma configuração, /var/lib/tftpboot/pxelinux.cfg/default, ela tem mais ou menos o aspecto abaixo:

DEFAULT linux
LABEL linux
    kernel vmlinuz
    append root=/dev/nfs initrd=initrd.img nfsroot=192.168.0.10:/srv/client_root_fs ip=dhcp rw

Todas as requisições que chegarem, receberão essa configuração, com esses parâmetros, isso é bacana, mas teremos problemas se todos os nodes usarem a mesma imagem de disco. É relativamente simples separar os diretórios /var e /tmp dos nodes usando links. Mas é possivel individualizar toda a imagem de root, inclusive personalizando os pacotes e serviços instalados.

Criando por exemplo 10 clones da imagem principal, denominados de node01, node02 …. node10. É possivel ter 10 máquinas completamente individualizadas, podendo inclusive servir distros diferentes.

Pra essa mágica funcionar, devemos criar uma configuração PXE para cada IP do range de ips que definimos na configuração do dhcpd. Por padrão o PXE procura pelas configurações em um arquivo com o mac address da placa que fez a requisição, por exemplo:

pxelinux.cfg/01-00-14-22-a1-53-85

Depois ele tenta pegar o arquivo à partir do IP que o node recebeu, mas antes o IP deve ser convertido para Hexadecimal, por exemplo:

pxelinux.cfg/C0A800C9

O ip 192.168.0.201 convertido para Hex é : C0A800C9, uma forma simples de converter esses ips esta no site: http://www.kloth.net/services/iplocate.php

Por último o PXE tenta ler o arquivo default, ou seja, todas as máquinas que você não declarar vão subir com a configuração do arquivo default.

pxelinux.cfg/default

Segue um exemplo de configuração PXE para um IP declarado (pxelinux.cfg/C0A800C9
) , por exemplo :

DEFAULT linux
LABEL linux
    kernel vmlinuz
    append root=/dev/nfs initrd=initrd.img nfsroot=192.168.0.10:/srv/node01 ip=dhcp rw

 

Feito isso, toda máquina que pegar um IP pelo DHCP, vai subir o sistema à partir de uma das cópias de imagem de sistema, se o IP estiver no range, ele pega um diretório especifico, se não estiver pega o default.

Deu pra sacar a mágica envolvida ? Não importa qual máquina boota, a partição de root não tá atrelado ao hardware, se o hardware pifa ? É só espetar outro que ele funciona ! Sem precisar configurar nada, é só mandar subir o PXE. Precisa aumentar o número de nodes ? Sem problema ! É só clonar as imagens, as configurações do PXE e aumentar o range no DHCP, simples assim.

One thought on “Boot remoto com pxe no ubuntu server

Comments are closed.