Entendendo o PXE de forma simples

Pre-Boot Exection Environment

O Ambiente de Pré-execução (PXE ou 'pixie', ambos do inglês: Preboot eXecution Environment) é um ambiente para inicializar computadores usando a Interface da Placa de Rede sem a dependência da disponibilidade de dispositivos de armazenamento (como Disco Rígidos) ou algum Sistema Operacional instalado. Ou seja, o Sistema Operacional do equipamento é carregado pela interface de rede toda vez que o mesmo é ligado, evitando assim o uso de unidades de armazenamento local e ou ação de atualização para cada equipamento. Basta atualizar o sistema no servidor que disponibiliza o mesmo, que todos os equipamentos irão iniciar a nova versão a partir do próximo boot.

Funcionamento

Um cliente tenta localizar um serviço de redirecionamento de PXE na rede (como um proxy DHCP) com o intuito de receber informações sobre servidores de boot PXE disponíveis. Após receber resposta, o cliente perguntará a um servidor de boot apropriado qual o caminho do arquivo ou por um NBP (Network Bootstrap Program), e armazenará essa informação dentro da RAM do computador usando o TFTP. Após o armazenamento ele verifica as informações e depois as executa.

Onde uso o PXE?

Aqui darei dois exemplos muito comuns de uso do PXE:

  1. Usado em servidores LTSP, o PXE que passará as informações para boot dos clientes.

  2. Usado para fazer instalação de um distribuição em várias máquinas simultaneamente por rede, como explicado aqui.

Configurar um servidor PXE no Linux - Totalmente OFFLINE

Alt pxeserver

Administrar grandes quantidades de computadores nem sempre é uma tarefa fácil, por exemplo, quando se tem que formatar ou atualizar um grande numero de maquinas, mas que de certa forma implique na dificuldade de ter que fazer em maquina por maquina. Esta solução foi testada amplamente em varias versões de S.O derivados do Ubuntu, como Xubuntu, Kubuntu, Ubuntu Server e o próprio Ubuntu.

Objectivo

Facilitar a instalação do sistema operacional de forma a agilizar o processo , diminuindo tempo gasto, e prováveis custos com mídias e outros.

Passo 1 – Obter os pacotes necessários, incluindo as imagens de disco que serão instaladas (no caso de ser mais de uma). Passo 2 – Ter um servidor com Linux pré instalado para que seja feita a configuração do servidor PxE, eu usei Ubuntu 16.04 para Servir as demais maquinas na rede , mas você pode optar por executar um que já tenha em sua rede e que lhe facilite o manuseio das informações. OS: o sistema tem que ter os pacotes logo abaixo descrito. Vamos preparar o servidor, usar a imagem (pode baixar também), criar os diretórios e organizar as demais informações.

Primeiro, antes de qualquer coisa vamos dar um ‘update’ no nosso sistema, isso pode evitar erros na hora de instalar os pacotes dentre outros …

$ sudo apt update

Depois de ter concluído o processo acima iremos instalar o DnsMasq, NFS, Syslinux e pxelinux

DNSMASQ

*dnsmasq proporciona serviços como cache DNS e servidor DHCP. Como um Sistema de Nomes de Domínio (DNS), pode armazenar em cache as consultas DNS para melhorar a velocidade de conexão para sites previamente visitados. E como um servidor DHCP, dnsmasq pode ser usado para prover endereços IP internos e roteamento para computadores em uma LAN. Ambos serviços podem ser implementados. dnsmasq é considerado leve e de fácil configuração; é próprio para o uso pessoal como também para uma rede com até 50 computadores. Ainda oferece suporte a servidor PXE.

 $ sudo apt install dnsmasq nfs-kernel-server syslinux-common pxelinux

OBS: Eu usei o Virtualbox para fazer o laboratório por isso deve configurar uma segunda placa para o seu host server

Configurar a segunda placa de rede

$ sudo vi /etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp

# The secundary network interface - "Configuração adicional"
auto enp0s8
iface enp0s8 inet static
address 192.168.5.254
netmask 255.255.255.0
network 192.168.5.0
bradcast 192.168.5.255

$ sudo systemctl status networking.service

Pronto, instalação concluida, vai configurar alguns parâmetros Criar um diretório pra armazenar todo o nosso conteúdo. No diretório raiz, proceda:

$ sudo mkdir /tftpboot

Agora vamos mover os arquivos do Syslinux para o nosso recém criado diretório.

$ sudo cp -r /usr/lib/syslinux/* /tftpboot

Agora vamos mover os arquivo pxelinux.0 para o nosso recém criado diretório.

$ sudo cp -r /usr/lib/PXELINUX/pxelinux.0 /tftpboot

Vamos criar o diretório onde ficará nosso principal arquivo de boot

$ sudo mkdir /tftpboot/pxelinux.cfg

Agora o nosso arquivo de boot:

$ sudo touch /tftpboot/pxelinux.cfg/default

Vamos então criar o diretório onde ficará as imagns do disco, os arquivos compartilhados e outros.

$ sudo mkdir -p /tftpboot/{nfs,imagem}

$ sudo mkdir /tftpboot/nfs/kubuntu

Feito isso, enviei a imagem do Kubuntu para o meu Ubuntu, em tmp ou Transferências/Download e fiz uma copia dela em /tftpboot/imagem com o nome de Kubuntu.iso.

$ cp /tmp/kubuntu-16.04-deaktop-amd64.iso /tftpboot/imagem/kubuntu.iso

Agora é hora de configurar o dnsmasq.

$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.old

$ sudo vi /etc/dnsmasq.conf

# Never forward plain names (without a dot or domain part)
# domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv

# Declare a interface que será usada para servir as demais máquinas (DHCP)
# enp0s8, enp0s3, eth0, eth1, etc...
interface=enp0s8

# Endereço do host PXE
listen-address=192.168.5.254

# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts

# Usado pelo dnsmasq como dhcp server
dhcp-range=192.168.5.50,192.168.5.150

# Aqui o nosso pxelinux.0 também está em tftpboot
dhcp-boot=pxelinux.0

# Vamos declarar o serviço
pxe-service=x86PC, "Install Linux", pxelinux

# Enable dnsmasq's built-in TFTP server
enable-tftp

# Aponta pro diretório root do tftp
tftp-root=/tftpboot

# Essa linha refere-se ao dhcp, e ao servidor que estamos configurando
dhcp-boot=pxelinux.0,servername,192.168.5.254

# Set the limit on DHCP leases, the default is 150
dhcp-lease-max=150

Salve e insira essa linha no exports

$ sudo vi /etc/exports

/tftpboot/nfs/kubuntu/ *(ro,sync,no_subtree_check)

Vamos montar a imagem pra dar o boot.

$ sudo mount -o loop /tftpboot/imagem/kubuntu.iso /tftpboot/nfs/kubuntu

Vamos criar um link simbolico para o file ldlinux.c32

$ cd /tftpboot/

$ sudo ln -s nfs/ubuntu/isolinux/ldlinux.c32 .

Vamos criar um link simbolico para o file vmlinuz.efi

$ ln -s nfs/ubuntu/casper/vmlinuz.efi .

Confira se tudo correu bem, veja se os arquivos foram montados no diretório especificado.

ls /tftpboot/nfs/kubuntu

Caso não tenha nada, bom, retorne e veja se houve algum erro na copia da imagem ou na montagem da imagem. Vamos iniciar os serviços!

$ sudo update-rc.d rpcbind enable && sudo update-rc.d nfs-kernel-server enable

$ sudo service rpcbind restart

$ sudo service nfs-kernel-server restart

Estando tudo ok prosseguimos, vamos agora só montar o arquivo que dará boot propriamente dito ao sistema…. aquele lá do diretório “/tftpboot/pxelinux.cfg”….

$ cd /tftpboot/pxelinux.cfg

$ sudo vi default

CRIE UM MENU COMO O FEITO ABAIXO, APONTANDO CORRETAMENTE PARA OS ARQUIVOS VMLINUZ E INITRD.LZ

DEFAULT menu.c32
PROMPT 0
MENU TITLE PXE Boot
LABEL Test
    MENU LABEL Test
LABEL Kubuntu
    MENU LABEL ^Kubuntu 16.04
    KERNEL nfs/kubuntu/casper/vmlinuz.efi
    APPEND initrd=nfs/kubuntu/casper/initrd.lz boot=casper 
            netboot=nfs nfsroot=192.168.5.254:/tftpboot/nfs/kubuntu

Após isso basta ir nos terminais clientes e selecionar o boot correspondente ao PXE, no menu Digite ou selecione a distribuição desejada(isso porque você pode inserir varias) e aguardar o carregamento.