Boot pela rede com Linux


O boot pela rede é o processo de carregar um sistema operacional pela rede ao invés do disco rígido. Muitos thin clients (mini computador que depende um servidor central) não tem disco e carregam um sistema operacional básico pela rede. Também pode ser utilizado para montar rede de clusters (centenas de computadores trabalhando de forma simultânea em uma determinada tarefa), para fazer instalações, fazer manutenção e usar o PC sem depender do sistema que está no disco rígido.

"Bootando" pela rede com o PXE, iPXE e nginx

PXE é um protocolo usado por quase todas as placas de rede. Computadores com placa de rede integrada costumam ter uma opção na BIOS para dar boot pela LAN, ou alguma opção para ativar o tal do PXE, é só fuçar na bios que você acha.

Na hora do boot, o programa iPXE (um carregador de sistemas operacionais) vai ser transferido do servidor para o cliente por TFTP, e então vai apresentar um menu com opções e o sistema a ser transferido por HTTP.

Nem todo sistema operacional ou distribuição do Linux pode ser carregada pela rede. Neste exemplo vou configurar um Linux para funcionar como servidor, disponibilizando GParted Live para boot via rede:

1 - No servidor Linux, como root, criar o diretório /tftproot

2 - Instalar o dnsmasq (servidor tudo em 1 : DHCP, TFTP, PXE, DNS), e editar o arquivo /etc/dnsmasq.conf. O resto das linhas está comentado - "#"  (altere estes IPs pelos utilizados na sua rede):
bogus-priv
filterwin2k
no-resolv
dhcp-range=192.168.0.100,192.168.0.200,12h
pxe-prompt="Press F8 for menu.", 60
pxe-service=x86PC, "Boot from local disk"
pxe-service=x86PC, "iPXE - Open Source Boot Firmware", undionly
enable-tftp
tftp-root=/tftproot
dhcp-authoritative

3 - Instalar o nginx (pode ser Apache ou outro servidor web, estou usando ele porque é leve e fácil de configurar). Editar ou criar o arquivo /etc/nginx/sites-enabled/default:
server {

  root /usr/share/nginx/www;
  index index.html index.htm;

  server_name localhost;

  location / {
  try_files $uri $uri/ /index.html;
  }

  location /tftproot/ {
  alias /tftproot/;
  autoindex on;
  }

}
(o importante mesmo são estas últimas linhas em amarelo, as demais não precisam ser alteradas)


4 - Criar o arquivo /tftproot/menu.ipxe. (troque o endereço 192.168.0.1 pelo IP do seu servidor):
#!ipxe

set boot-url http://192.168.0.1/tftproot
set menu-url ${boot-url}/menu.ipxe
set menu-timeout 15000
set submenu-timeout ${menu-timeout}

isset ${menu-default} || set menu-default exit

:start
menu iPXE boot

menu item --gap -- ------------------------- Operating systems ------------------------------
item gparted GParted Live
item --gap -- ------------------------- Advanced options -------------------------------
item --key c config Configure settings (c)
item shell Drop to iPXE shell
item --key r reboot Reboot computer (r) item
item --key x exit Exit iPXE and continue BIOS boot (x)

choose --timeout ${menu-timeout} --default ${menu-default} selected || goto cancel
set menu-timeout 0
goto ${selected}

:cancel
echo You cancelled the menu, dropping you to a shell

:shell
echo Type exit to get the back to the menu
shell
set menu-timeout 0
set submenu-timeout 0
goto start

:failed
echo Booting failed, dropping to shell
goto shell

:reboot
reboot

:exit
exit

:config
config
goto start

:back
set submenu-timeout 0
clear submenu-default
goto start


:gparted
kernel ${boot-url}/vmlinuz boot=live config union=aufs noswap noprompt vga=788 fetch=${boot-url}/filesystem.squashfs
initrd ${boot-url}/initrd.img
boot || goto failed

(este é o menu do iPXE para escolher o sistema operacional)

5 - Baixar a ISO do GParted Live. Montar/Abrir a ISO, entrar no diretório live e extrair apenas os arquivos filesystem.squashfs, initrd.img e vmlinuz para /tftproot/ no servidor.

6 - Entrar no site http://www.rom-o-matic.eu/ para gerar o seu iPXE personalizado. Escolher a opção "UNDI Only (.kpxe)", não alterar as outras opções, colar o script personalizado que está logo abaixo, e clicar no botão para continuar:
#!ipxe
dhcp
chain menu.ipxe
(colar lá na página do rom-o-matic, em "Embedded script")

Obs: Tenho uma versão pronta do iPXE aqui: (download)

7 - Salvar o arquivo, renomear para undionly.0 e copiar para o servidor em /tftproot/

8 - Reiniciar o dnsmasq e testar se o nginx está funcionando. O dnsmasq é meio chato mesmo, não funciona junto com outros servidores de Dhcp no mesmo servidor nem na mesma rede. O nginx não costuma dar problemas, é só abrir um navegador e digitar o endereço IP do servidor para verificar se aparece uma página inicial.

9 - Ligar o PC a ser "bootado". Ele precisa estar na mesma rede física do servidor (conectados por cabo no mesmo switch, ou até um cabo crossover entre os dois), e também precisa estar com a opção de boot pela rede ativada na BIOS. Dá para testar com o VMware também (aperte F12 na tela de boot), a placa de rede virtual precisa estar no modo bridge.
Se estiver tudo funcionando, o PC vai se comunicar com o servidor e mostrar a opção iPXE - Open Source Boot Firmware:

PXE boot  Menu iPXE

 

Instalando o Windows 7 ou 8 pela rede

Se por acaso você está precisando instalar o Windows 7 (8) em um PC que não consegue dar boot nem pelo DVD nem por USB, ou você está com preguiça limpar o seu pendrive lotado, então você veio ao lugar certo!!!

Aproveite toda a configuração feita acima no "boot pela rede" e continue seguindo os passos:

1 - Copiar os arquivos de driver da placa de rede do PC que você vai instalar, compatível com o Windows que você vai usar (7 ou 8, x32 ou x64) e salvar em algum diretório temporário no servidor. (são os arquivos .cat, .inf e .sys).
A parte chata é que estes drivers precisam ser carregados manualmente para a rede funcionar durante a instalação do Windows.
Neste exemplo vou inserir os drivers da placa de rede dentro da imagem de boot do Windows.
Mas você pode copiar os drivers para um pendrive apenas para conectar na rede para continuar a instalação.
Se você vai usar a ISO/DVD de instalação do Windows x64, baixe os drivers para x64. Se a sua ISO é para instalar a versão x32 ou é versão "all in one" (x32 e x64), baixe os drivers para x32.

2 - Compartilhar o DVD (ou a ISO extraída) no servidor através do Samba. Exemplo de compartilhamento público (/etc/samba/smb.conf)
[cdrom]
read only = yes
locking = no
path = /cdrom
guest ok = yes
(neste caso o cdrom está montado em /cdrom)

3 - Copiar do DVD (ou ISO) do Windows os arquivos bootmgr (está na raiz), sources/boot.wim, boot/boot.sdi e boot/bcd, colando em /tftproot/ no servidor. (se for o Windows 8, copie também boot/fonts/segmono_boot.ttf, boot/fonts/segoe_slboot.ttf e boot/fonts/wgl4_boot.ttf para /tftproot/).

4 - Editar o arquivo /tftproot/menu.ipxe, adicionando um novo item:

           ......
item win7 Boot Windows 7
           ......
           ......
:win7
kernel ${boot-url}/wimboot
initrd ${boot-url}/bootmgr bootmgr
initrd ${boot-url}/bcd BCD
initrd ${boot-url}/boot.sdi boot.sdi
initrd ${boot-url}/boot.wim boot.wim
initrd ${boot-url}/segmono_boot.ttf segmono_boot.ttf
initrd ${boot-url}/segoe_slboot.ttf segoe_slboot.ttf
initrd ${boot-url}/wgl4_boot.ttf wgl4_boot.ttf

imgstat boot || goto failed
(as linhas em amarelo são só para o Windows 8)

5 - Baixar o wimboot e copiar o arquivo para /tftproot/ no servidor. (download alternativo)

6 - Inserir os drivers na imagem boot.wim. É necessário instalar o wimlib, geralmente não vem com o Linux então você precisa procurar uma versão para a sua distribuição, ou tentar com a minha versão compilada com bibliotecas estáticas (download).
Digitar estes comandos no servidor para inserir os arquivos de driver na imagem:

wimlib-imagex update /tftproot/bootwin8.wim 2 --command="add /tmp/drivers /drivers"
(os arquivos .cat, .inf e .sys estão em /tmp/drivers/ no servidor)

Obs: Dá para adicionar os drivers de outra maneira, com o imagex e dism no Windows, ou então copiar em pendrive.

7 -  Ligar o PC a ser instalado, ativando a opção de boot pela rede na BIOS, e escolher o item "Boot Windows 7" no menu do iPXE que vai aparecer. A instalação do Windows vai começar, mas não clique em nada!
Aperte SHIFT+F10 para aparecer o prompt, e siga os comandos:

 

drvload x:\caminho\seu_driver.inf
wpeutil initializenetwork
net use * \\ip_do_seu_servidor\compartilhamento /USER:guest
z:\sources\setup.exe

PXE boot windows 8
(troque o endereço IP pelo do seu servidor)

O comando drvload carrega os drivers da placa de rede. Se você inseriu os drivers no arquivo boot.wim, então é a letra x: mesmo. Se você copiou os drivers para um pendrive, então troque pela letra correspondente. (digite dir d: ou dir e: (f,g,h...) até encontrar a letra do pendrive).
O comando net use conecta no servidor fazendo login como usuário guest (convidado), e senha em branco. Você pode fazer login como outro usuário.

Pronto, a letra z: está mapeada para o DVD do Windows compartilhado no servidor. É só executar o setup.exe dentro do sources e continuar a instalação.


Voltar

>    © 2013 Rafael Ferrari (RafaelBF)   >    rafa.eng.br   >    email