Inicialização sem Disco pela Rede (PXE) no Ubuntu 12.04

1. Introdução

O objetivo deste tutorial é descrever a configuração necessária para permitir que um computador cliente realize boot pela rede, carregando uma instalação de sistema operacional que está armazenada em um servidor na mesma subrede. Esse cenário não se trata de thin clients. Uma cópia completa do sistema operacional estará em execução no computador cliente, inclusive os processos das aplicações. Quando se fala em thin client, os processos executam no servidor, o cliente apenas exibe os resultados remotamente.

Para a solução de inicialização sem disco, o cliente precisa suportar boot através do ambiente PXE (Preeboot Execution Environment). Este ambiente é responsável pela configuração da rede e cópia dos arquivos necessários do servidor. Sua ativação é realizada através da configuração das opções de boot na BIOS do computador. A princípio, discos ou outro tipo de armazenamento não são necessários no cliente.

O servidor precisa executar serviços de configuração automática de rede (DHCP) e transferência de arquivos (TFTP) para permitir o uso do PXE pelo cliente. O DHCP fornece um endereço IP ao cliente para permitir a comunicação TCP/UDP. O após a configuração de rede, a transferência de um kernel e de um arquivo initramfs é feita através do TFTP. Com isso a máquina cliente consegue carregar o kernel e o sistema inicializa. Mas para se tornar útil, precisamos de uma instalação completa de uma distribuição Linux. A solução é armazenar essa instalação em um diretório do servidor e compartilhá-la com os clientes através de NFS. Esse detalhe é muito importante, pois exige que o kernel enviado ao cliente tenha suporte à NFS.

O restante do tutorial se organiza da maneira descrita a seguir. Primeiro vamos tratar da configuração do serviços DHCP e TFTP. Em seguida, vamos criar no servidor um diretório com a instalação Linux que será carregada no cliente e configurá-la adequadamente. O próximo passo é a configuração de um kernel para boot no cliente. Por último, daremos boot na máquina cliente. Para todos os propósitos, os comandos são executados no Ubuntu 12.04 LTS AMD64. Usamos um servidor e um cliente para demonstração.

2. Configuração dos Serviços

2.1 Configuração do DHCP

O primeiro passo é definir qual a subrede do ambiente. Para nosso estudo de caso, consideramos a rede 10.0.0.0/255.255.255.0. O servidor terá IP 10.0.0.1 e o cliente terá IP 10.0.0.2. Para configurar a interface do cliente, é preciso colocar as informações abaixo no arquivo /etc/network/interfaces:

iface eth2 inet static
    address 10.0.0.1
    netmask 255.255.255.0
    gateway 10.0.0.1

Substitua eth2 e a faixa IP pelos valores adequados caso necessário. Depois disso, basta reiniciar as interfaces de rede:

~# service networking restart
~# service network-manager restart

Detalhe importante: não coloque ‘auto eth2’ antes da linha começando com ‘iface’. Isso evita que o network-manager tente gerenciar a interface. Com a interface configurada, é hora de instalar e configurar o DHCP.

~# apt-get install dhcp3-server
~# cat /etc/dhcp/dhcpd.conf
allow booting;
allow bootp;
subnet 10.0.0.0 netmask 255.255.255.0 {
  range 10.0.0.2 10.0.0.100;
  option broadcast-address 10.0.0.255;
  option routers 2.xxx;
  option domain-name-servers 8.8.8.8;
  filename "/pxelinux.0";
}
~# service isc-dhcp-server restart
isc-dhcp-server start/running, process 11263

O mais importante é a linha filename “/pxelinux.0”. Ela indica o caminho do arquivo que será transferido ao ambiente PXE do cliente. Este caminho é relativo ao diretório do TFTP, que iremos configurar a seguir. Caso o servidor tenha duas interfaces de rede, talvez seja importante alterar o arquivo /etc/default/isc-dhcp-server para ligar o serviço a apenas uma delas.

2.2 Configuração do TFTP

O TFTP é responsável por transferir os arquivos iniciais ao ambiente PXE. Para instalá-lo, digite os comandos abaixo.

~# apt-get install tftpd-hpa
~# cat /etc/default/tftpd-hpa 
# /etc/default/tftpd-hpa
RUN_DAEMON="yes"
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
~# mkdir /var/lib/tftpboot/pxelinux.cfg

Com isso, os arquivos presentes em /var/lib/tftpboot estarão disponíveis ao PXE. O importante agora é instalar o pacote que contém o sistema básico que será enviado e as ferramentas que permitem a criação de um kernel para o boot do cliente. Vamos aproveitar e instalar também o pacote que dá suporte ao NFS por parte do servidor.

~# apt-get install syslinux 

Podemos agora copiar os arquivos básicos para o diretório do TFTP e configurar o restante da estrutura de diretórios.

~# cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/
~# mkdir /var/lib/tftpboot/pxelinux.cfg/
~# cat /var/lib/tftpboot/pxelinux.cfg/default
LABEL linux
KERNEL vmlinuz-3.2.0-23-generic-pae 
APPEND root=/dev/nfs initrd=initrd.img-3.2.0-23-generic-pae nfsroot=10.0.0.1:/nfsroot,rw ip=dhcp rw (desde APPEND tudo na mesma linha)

O parâmetro nfsroot na linha APPEND indica onde estará a distribuição Linux. Essa será acessada via o NFS, etapa que iremos configurar na próxima seção. Na pasta /var/lib/tftpboot temos que ter um kernel equivalente às linhas KERNEL e ao campo initrd da linha APPEND. Existem várias maneiras de arranjar um kernel adequado. Na seção 2.4, será detalhado como obter um kernel e um initrd adequados. Lembre-se apenas qual arquivo deve ser alterado com as informações do novo kernel (/var/lib/tftpboot/pxelinux.cfg/default).

2.3 Configuração do NFS

Caso você não tenha instalado o NFS na seção anterior, faça agora com o comando abaixo. Além disso, vamos aproveitar para criar o diretório onde estará a instalação do sistema operacional que será carregado no cliente. Para exportá-lo, precisamos também alterar o arquivo /etc/exports.

~# apt-get install nfs-kernel-server
~# mkdir /nfsroot
~# cat /etc/exports 
/nfsroot             10.0.0.0/255.255.255.0(rw,no_root_squash,async,insecure,no_subtree_check)
~# exportfs -rv
exporting 10.0.0.0/255.255.255.0:/nfsroot

Agora a pasta /nfsroot do servidor está acessível ao cliente. Falta agora colocar uma instalação Linux nela. Isso pode ser feito com o comando abaixo.

:~# debootstrap --arch amd64 precise /nfsroot/

Seria o momento para tomar um café, já que demora bastante. O que o comando debootstrap faz é realizar o download do sistema mínimo para garantir uma inicialização. Sua principal utilização talvez seja permitir executar um ambiente de testes em chroot. Após seu término, devemos entrar no ambiente instalado através do comando chroot.

~# mount -o bind /dev /nfsroot/dev
~# mount -o bind /proc /nfsroot/proc
~# mount -o bind /sys /nfsroot/sys
~# chroot /nfsroot/ 

Assim você estará dentro do console da nova instalação. A primeira sugestão é alterar o hostname. Por padrão, o nome da máquina é o mesmo do servidor. Devemos alterar os arquivos /etc/hostname e /etc/hosts para refletir o novo sistema. No nosso caso, iremos adotar ‘virtual’ como nome da máquina.

~# cat /etc/hostname
virtual
~# cat /etc/hosts   
127.0.0.1	localhost virtual
::1		localhost ip6-localhost ip6-loopback
fe00::0		ip6-localnet
ff00::0		ip6-mcastprefix
ff02::1		ip6-allnodes
ff02::2		ip6-allrouters

Você pode também instalar qualquer pacote que achar necessário com o apt-get. É aconselhável instalar o cliente do nfs.

~# apt-get install nfs-common

A configuração de rede deve ficar assim:

~# cat /etc/network/interfaces 
auto lo
iface lo inet loopback
iface eth0 inet manual

O /etc/fstab deve ficar desta forma:

~# cat /etc/fstab
proc            /proc           proc    defaults       0       0
/dev/nfs       /                nfs     defaults       1       1
none            /tmp            tmpfs   defaults       0       0
none            /var/run        tmpfs   defaults       0       0
none            /var/lock       tmpfs   defaults       0       0
none            /var/tmp        tmpfs   defaults       0       0

Não esqueça também de adicionar pelo menos um usuário ou alterar a senha de root.

~# passwd
~# adduser usuario

Quando terminar a configuração, lembre de desmontar os diretórios /proc, /dev/ e /sys. Para isso você tem que sair do ambiente chroot. Os comandos necessários são mostrados abaixo. Por enquanto, não saia do chroot, pois ele será necessário para a seção 2.4.

~# exit
~# umount  /nfsroot/dev
~# umount  /nfsroot/proc
~# umount  /nfsroot/sys

2.4 Configuração do Kernel do Cliente

Existem várias maneiras de conseguir um kernel adequado. Você pode compilar a partir do zero ou utilizar o kernel pronto do servidor. Nós vamos usar um meio termo. Vamos utilizar um kernel pré-compilado do Ubuntu vamos personalizar o arquivo initrd para conter os módulos da placa de rede da máquina cliente e do NFS.

O ambiente em chroot criado pelo debootstrap não tem kernel instalado. Basta verificar que a pasta /boot está vazia. Vamos instalar um kernel então. Também vamos instalar o pacote initramfs-tools, pois ele será necessário para criar o arquivo initrd personalizado.

~# aptitude install linux-image-3.2.0-23-generic-pae initramfs-tools

Verifique agora a pasta /boot. Você verá os arquivos vmlinuz-3.2.0-23-generic-pae e initrd.img-3.2.0-23-generic-pae. O primeiro vamos utilizar do jeito que está. Agora o segundo precisamos adaptar. Temos que alterar os arquivos /etc/initramfs-tools/initramfs.conf e /etc/initramfs-tools/modules. As versões finais dos arquivos devem ficar como abaixo abaixo:

~# cat /etc/initramfs-tools/initramfs.conf
MODULES=netboot
BUSYBOX=y
COMPCACHE_SIZE=""
COMPRESS=gzip
BOOT=nfs
DEVICE=
NFSROOT=auto
~# cat /etc/initramfs-tools/modules  	 
# Módulo da placa de rede
8139too
# Módulos do NFS
nfsd
nfs
lockd
fscache
auth_rpcgss
nfs_acl
sunrpc

Veja que no arquivo /etc/initramfs-tools/modules você precisa colocar o módulo da placa de rede do cliente. Não existe maneira simples de descobrir isso. Uma solução é inicializar o cliente com um livecd e descobrir essa informação através dos comandos lspsci e lsmod. Os outros módulos são necessários para carregar o sistema de arquivo NFS. Depois disso, o próximo passo é criar o novo initrd. Para isso, execute o comando abaixo.

#~  mkinitramfs -o /boot/initrd.img-3.2.0-23-generic-pae 3.2.0-23-generic-pae

Com isso, os arquivos do diretório estarão atualizados. Agora, saia do chroot como descrito ao final da seção 2.3 e copie os arquivos para o diretório do TFTP com os comandos abaixo.

#~ cp /nfsroot/boot/vmlinuz-3.2.0-23-generic-pae /var/lib/tftpboot
#~ cp /nfsroot/boot/initrd.img-3.2.0-23-generic-pae /var/lib/tftpboot
#~ chmod -R 777 /var/lib/tftpboot

2.5 Conclusão

Para finalizar, reinicie todos os serviços. Configure a BIOS do cliente para dar boot pela rede e reinicie a máquina. Se tudo der certo, rapidamente você estará no console da máquina cliente.

Referências

https://help.ubuntu.com/community/DisklessUbuntuHowto
https://help.ubuntu.com/community/Installation/OnNFSDrivehttps://help.ubuntu.com/community/PXEInstallServer
https://wiki.ubuntu.com/DebootstrapChroot
http://www.vivaolinux.com.br/artigo/Ubuntu-Server-1204-LTS-Como-Servidor-Gateway-e-DHCP/
http://dathan.org/docs/pxe-mini-howto.html
 

Anúncios

12 pensamentos sobre “Inicialização sem Disco pela Rede (PXE) no Ubuntu 12.04

  1. Iranildo Fidelis disse:

    Vejo só, tanto pesquisei sobre configuração pxe e encontrei um tutor justamente de um dos mestre da minha Universidade. Muito bom, foi melhor tutor que encontrei até agora.

  2. pedro disse:

    Muito massa!!!

  3. mizaelJr disse:

    Cara, estou com uns problamas aqui na linha em que diz “service isc-dhcp-server restart”
    o que aparece no terminal é “Stop/start : Unknown job: isc-dhcp-server”.

    preciso muito resolver essa bronca, o meu S.O é o ubuntu 14.04, eu tenho que instalar ele em umas 200 maquinas, se puder me ajudar eu agradeço.

    ( Aliás, os comandos para desligar e ligar a rede, não funcionam)

    • jmhal disse:

      Olá Mizael,

      Uma pergunta, você conseguiu instalar o DHCP? Eu fiz esse tutorial baseado no Ubuntu 12.04. É capaz do nome do pacote ter mudado. Quando você executa “apt-get install dhcp3-server”, o que acontece? Os comandos que você usa para reiniciar a rede são “service networking restart” e “service network-manager restart”? Pelo menos o primeiro funcionou aqui numa máquina virtual que tenho com o 14.04. O segundo só vai funcionar se você estiver com a versão Server. Você está tentando instalar com a versão Server ou Desktop?

  4. Boa noite, Primeiramente parabéns pelo excelente tutorial e obrigado pois esta me ajudando muito.

    Gostaria de tirar uma duvida, não sei se é eu que estou deixando de fazer algo, mas não consigo encontrar o arquivo default aqui no meus testes.
    Eu preciso criar ele? em que momento?
    Versão usada: Ubuntu 12.04 lts

    copia de seu tutorial.
    ~# cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/
    ~# mkdir /var/lib/tftpboot/pxelinux.cfg/
    ~# cat /var/lib/tftpboot/pxelinux.cfg/default*

    Desde ja agradeço sua resposta.

    • jmhal disse:

      Olá Ademar,

      Na verdade, o arquivo default não existe logo na instalação. Meu objetivo com o comando “cat /var/lib/tftpboot/pxelinux.cfg/default” é mostrar o que você deve colocar dentro dele. Só lembre de adaptar de acordo com o kernel.

      []’s

  5. Segui o tutorial várias vezes. Ao executar o cliente pxe aparecia a mensagem “No default or UI configuration directive found!”, e simplesmente não carregava a imagem. Após um longo tempo de pesquisa e irritações, descobri que era simplesmente a falta da declaração default no arquivo “default” do diretório “/pxelinux.cfg”.

    Então na seção 2.2, na configuração /var/lib/tftpboot/pxelinux.cfg/default, constar o seguinte:

    DEFAULT linux
    LABEL linux
    KERNEL vmlinuz-3.2.0-23-generic-pae
    APPEND root=/dev/nfs initrd=initrd.img-3.2.0-23-generic-pae nfsroot=10.0.0.1:/nfsroot,rw ip=dhcp rw

  6. Diego disse:

    Prezados estou travado no
    debootstrap –arch amd64 precise /nfsroot/

    ele diz que o comando não é valido

    Alguém pode ajudar..

    Versão 12.04 LTS Server 64.

  7. Gabriel Santos disse:

    amigo bom dia, se eu quiser instalar windows na maquina cliente esses tutorial irá me ajudar ??

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: