Autor: Arliton Rocha arliton@gmail.com IPXE Tutorial - Sistema de Clonagem Ambiente ideal: O mesmo do servidor. Pacotes necessários: build-essential, binutils-dev, libiberty-dev, liblzma-dev 1 - Arquivo /etc/dhcp/dhcpd.conf. Exemplo: authoritative; ddns-update-style none; default-lease-time 86400; max-lease-time 86400; log-facility local7; allow booting; allow bootp; option space ipxe; option architecture-type code 93 = unsigned integer 16; subnet 172.16.0.0 netmask 255.240.0.0 { range 172.17.0.100 172.17.255.254; option routers 172.17.0.1; next-server 172.16.0.1; option domain-name "gwb.ipsoft.com.br"; option netbios-name-servers 172.17.0.1; option netbios-node-type 8; option tftp-server-name "172.16.0.1"; if option architecture-type = 00:09 { filename "/ipxe/ipxe64.efi"; } elsif option architecture-type = 00:07 { filename "/ipxe/ipxe64.efi"; } elsif option architecture-type = 00:06 { filename "/ipxe/ipxe32.efi"; } else { filename "/ipxe/undionly.kpxe"; } } Observações: - Geralmente são carregadas mais frequentemente as opções ipxe32.efi e undionly.kpxe. - ipxe32.efi é para modo efi de 32 bits. - undionly.kpxe é carregado para o modo legacy. 2 - Gerando IPXE: Clonar repositório ipxe: # git clone git://git.ipxe.org/ipxe.git Posicionar boot.ipxe dentro de ipxe/src. Conteúdo de boot.ipxe: #!ipxe dhcp || failed_dhcp chain http://${net0/next-server}:7878/ipxe/cfg/01-${net0/mac:hexhyp} || goto padrao echo Carregando menu/mac: ${net0/mac:hexhyp} ... chain http://${net0/next-server}:7878/ipxe/cfg/01-${net0/mac:hexhyp} :failed_dhcp echo Falha ao pegar IP ... echo Carregando shell ... shell :padrao echo Carregando menu padrao ... chain http://${net0/next-server}:7878/ipxe/cfg/default Observações: - Este script será embarcado (após execução do build.sh a seguir) dentro dos binários: ipxe32.efi, ipxe64.efi e undionly.kpxe; - O script tenta pegar ip por dhcp, caso falhe ele cai no shell do ipxe; - Ajustar arquivo /etc/apache2/ports.conf para ouvir na porta 7878 (exemplo, fica a critério); - Arquivos ipxe devem ficar em /var/www (diretório base que o apache serve). Criar diretório /var/www/ipxe; - net0/next-server é uma variável preenchida através do que retorna o /etc/dhcp/dhcpd.conf em next-server; - net0/mac:hexhyp é preenchida com o mac do cliente em questão. Separado por traço (-); - /var/www/ipxe/cfg deve conter ou ser um link para o diretório contendo os arquivos pxe (menus); Pode-se fazer: ln -sf /srv/tftp/isolinux/pxelinux.cfg /var/www/ipxe/cfg - O boot.ipxe tenta encontrar um arquivo com o nome 01-. Caso não encontre, o fluxo muda para :padrao e o script default (em cfg) é carregado; Posicionar script build.sh dentro de ipxe/src. Conteúdo de build.sh: #!/bin/bash DATE=$(date +%d-%m-%Y) test -d "$DATE" && rm -rf "$DATE" mkdir "$DATE" clear ; echo "Construindo bin-i386-efi/ipxe.efi ..." ; echo make bin-i386-efi/ipxe.efi EMBED=boot.ipxe cp -vf bin-i386-efi/ipxe.efi "$DATE"/ipxe32.efi echo ; echo sleep 3 clear ; echo "Construindo bin-x86_64-efi/ipxe.efi ..." ; echo make bin-x86_64-efi/ipxe.efi EMBED=boot.ipxe cp -vf bin-x86_64-efi/ipxe.efi "$DATE"/ipxe64.efi echo ; echo sleep 3 clear ; echo "Construindo undionly.kpxe ..." ; echo make bin/undionly.kpxe EMBED=boot.ipxe cp -vf bin/undionly.kpxe "$DATE"/ echo ; echo sleep 3 test -d /srv/tftp/ipxe/"$DATE" && rm -rf /srv/tftp/ipxe/"$DATE" mkdir -p /srv/tftp/ipxe mv "$DATE" /srv/tftp/ipxe/ chmod 755 /srv/tftp/ipxe/"$DATE"/* cd /srv/tftp/ipxe ln -sf "$DATE"/* . cd - clear ; echo "Concluido! :D" exit 0 Rodar build.sh: # cd ipxe/src # chmod 755 build.sh # ./build.sh Observações: - Os binários ipxe32.efi, ipxe64.efi e undionly.kpxe serão gerados e posicionados em /srv/tftp/ipxe. Na verdade dentro da pasta correspondente a data de geração (por organização e controle). /srv/tftp/ipxe é o diretório onde o servidor dhcp busca os binários ipxe. - Os arquivos .efi são mais completos (maiores) pois contêm implementações de drivers de rede dentro deles. - O undionly.kpxe é mais simples e depende bastante do firmware da placa de rede do cliente. - Importante periodicamente atualizar o repositório (git pull) e gerar novamente. Podem haver melhorias. 3 - Sintaxe arquivo ipxe (pxelinux.cfg): Arquivo default (exemplo): #!ipxe ######## MAIN MENU ################### :start set master 172.16.0.1:7878 set nfs 172.16.0.1 iseq ${platform} efi && set kimg rescue64 || set kimg rescue32 menu Sistema de Clonagem GWB item item integrar Integracao item gerarImg Geracao de Imagem Linux item winPEg Geracao de Imagem Windows item gerarStp Geracao de SETUP item choose --default integrar --timeout 3000 target && goto ${target} ## Utility menu items: :shell echo Digite 'exit' para retornar ao menu shell set menu-timeout 0 goto start :reboot reboot :exit exit ########## MENU ITEMS ####################### :integrar kernel http://${master}/ipxe/${kimg} initrd=initram.igz setkmap=br-a scandelay=1 dodhcp nomodeset nodmraid nomdadm nonm nfsboot=${nfs}:/srv/gwb ar_source=nfs://${nfs}:/srv/gwb/ ar_nodel ar_nowait ar_ignorefail integracao initrd http://${master}/ipxe/initram.igz boot :gerarImg kernel http://${master}/ipxe/${kimg} initrd=initram.igz setkmap=br-a scandelay=1 dodhcp nomodeset nodmraid nomdadm nonm nfsboot=${nfs}:/srv/gwb ar_source=nfs://${nfs}:/srv/gwb/ ar_nodel ar_nowait ar_ignorefail gerar initrd http://${master}/ipxe/initram.igz boot :winPEg chain http://${master}/ipxe/winpe.ipxe :gerarStp kernel http://${master}/ipxe/${kimg} initrd=initram.igz setkmap=br-a scandelay=1 dodhcp nomodeset nodmraid nomdadm nonm nfsboot=${nfs}:/srv/gwb ar_source=nfs://${nfs}:/srv/gwb/ ar_nodel ar_nowait ar_ignorefail gerar_setup initrd http://${master}/ipxe/initram.igz boot Observações: - Este arquivo (como os demais similares) deve estar dentro de /srv/tftp/isolinux/pxelinux.cfg. Deve haver um link apontando /var/www/ipxe/cfg para /srv/tftp/isolinux/pxelinux.cfg. - Posicionar arquivos do sysresc (rescue32, rescue64 e initram.igz) dentro de /var/www/ipxe; Ou fazer links para os existentes em /srv/tftp/isolinux. - master define o servidor web e porta; - nfs define o servidor nfs (onde deve estar posicionado o dat...). Ajustar local exportado, caso necessário. - Orientações sobre o arquivo winpe.ipxe no item 4 a seguir. 4 - Sintaxe winpe.ipxe (carregamento do winpe): Baixar última versão do binário wimboot: http://git.ipxe.org/releases/wimboot/wimboot-latest.zip Posicionar wimboot em /var/www/ipxe. Criar arquivo winpe.ipxe em /var/www/ipxe com o contéudo: #!ipxe cpuid --ext 29 && set arch amd64 || set arch x86 kernel wimboot initrd ${arch}/winpe/Boot/BCD BCD initrd ${arch}/winpe/Boot/boot.sdi boot.sdi initrd ${arch}/winpe/sources/boot.wim boot.wim boot Observações: - Criar pasta para a arquitetura amd64: mkdir /var/www/ipxe/amd64 Geralmente o winpe usado é 64 bits. Pode-se, por 'garantia', gerar um link para x86: ln -sf /var/www/ipxe/amd64 /var/www/ipxe/x86 - Abrir iso winpe adaptada dentro da pasta da arquitetura (/var/www/ipxe/amd64). Dentro de amd64/winpe. Basicamente, é isto! :D