Instalação via PXE ou iPXE (Método 1)
Este método coloquei por questões didáticas e para melhor entendimento do processo, mas aconselho a optar pelo Método 2 na página 7 (CUSTOMIZANDO A INSTALAÇÃO 6), pois é mais rápido, fácil e simples, porém, as devidas explicações estão nas páginas 4 a 6.
Toda essa instalação deve ser feita no servidor (sendo ou não um cluster) e, tendo sucesso, será feita uma única vez e depois basta manter fazendo as devidas atualizações e/ou alterações que forem necessárias.
Instalação PXE e iPXE são pela rede, ou seja, nas opções de boot do BIOS da placa-mãe dos clientes você inicializa pela placa de rede.
PXE (Preboot eXecution Environment) é um ambiente de pré-inicialização que permite a inicialização de um computador através da rede, sem a necessidade de um dispositivo de armazenamento local (como um disco rígido).
iPXE é uma implementação de código aberto do PXE (Preboot eXecution Environment), uma tecnologia que permite inicializar computadores a partir da rede. Em resumo, é um bootloader que estende o PXE com mais recursos e flexibilidade permitindo a inicialização de máquinas sem dependência de discos rígidos ou mídia física.
Lembrando que inicializar por PXE (placa de rede) vai de acordo com o menu de boot de cada placa-mãe.
Você pode configurar o BIOS da placa-mãe para inicializar pelo PXE diretamente como primeira opção de boot ou pode teclar F_algum_numero para as opções de boot a cada inicialização, veja dois exemplos diferentes:
Na próxima página tem os scripts para instalação automatizada e estudo de todo o conteúdo desta página.
Nesta seção/página não darei explicações básicas sobre comandos, pois principia-se que tenha de ter um certo conhecimento sobre essa base no
Linux.
Sinto muito caso um iniciante tentar fazer e não conseguir por não ter essas explicações básicas, mas o artigo tornar-se-ia muito extenso.
Essas partes básicas quem tiver interesse terá de pesquisar por conta.
Automatizar instalações do Debian via rede (iPXE) pode poupar horas de trabalho, especialmente em ambientes com dezenas ou centenas de máquinas.
Apesar de o Preseed ser um recurso poderoso do instalador Debian ele sofre com problemas de compatibilidade e formatação, especialmente ao lidar com particionamentos manuais e hardware legado.
Aqui apresento uma solução estável e compatível com máquinas novas e antigas, utilizando:
Problemas Comuns com Preseed
Alguns dos obstáculos que encontrei ao tentar uma instalação sem intervenção via Preseed incluem:
Falhas silenciosas causadas por tabulações ou espaços extras no particionamento (expert_recipe);
A partição swap sendo ignorada se colocada fora de ordem;
Problemas com compatibilidade em hardware mais antigo, principalmente com discos IDE ou BIOS legados;
preseed.cfg sendo ignorado mesmo que especificado via kernel boot line.
A inicialização por iPXE é diferente de por PXE, então por iPXE você pode tanto embutir no initrd quanto deixar por URL. A vantagem de não embutir está na facilidade de alterar os arquivos sem que tenha de fazer todo o processo de embutimento cada vez, por exemplo, no caso de um cluster.
Estrutura do preseed.cfg
O preseed.cfg utilizado cobre, basicamente:
Localização, teclado, fuso horário;
Configuração de rede e hostname fixo;
Usuário root e padrão com senha;
Particionamento totalmente automatizado com expert_recipe detalhado;
Instalação de pacotes;
Comandos pós-instalação.
A parte completa do particionamento está abaixo, ao final tem o preseed.cfg completo e também o arquivo embed-preseed.sh que embute automaticamente o preseed no initrd.gz para instalação via iPXE:
### Instala e pre-carrega os modulos necessarios ###
d-i anna-install string btrfs-modules xfs-modules
d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true
### Configura o particionamento automatico ###
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root
d-i partman-auto/expert_recipe string \
boot-root :: \
40 50 512 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } . \
4096 4096 4096 linux-swap \
$primary{ } \
method{ swap } format{ } . \
51200 51200 51200 btrfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ btrfs } \
mountpoint{ / } . \
512 512 -1 xfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /orangefs } .
### Confirma as acoes do particionador ###
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
O ponto crítico do particionamento por preseed é que o expert_recipe é extremamente sensível à formatação.
Algumas observações práticas IMPORTANTES:
Não use tabulações, apenas espaços simples;
Jamais deixe espaços em branco no final das linhas do recipe;
A ordem das partições importa — por exemplo, a swap deve vir após /boot e antes de / (raiz);
No esquema de particionamento não pode ter comentários entre as linhas da string expert_recipe, aliás, não pode ter nada além do esquema de particionamento;
Um erro mínimo de formatação e/ou sintaxe pode resultar em falha silenciosa do instalador.
SCRIPT EMBED-PRESEED.SH
Esse script extrai, modifica e reempacota o initrd.gz embutindo o preseed.cfg de forma confiável.
Instale os pacotes necessários:
sudo apt update
sudo apt install -y wget cpio unzip
sudo vim embed-preseed.sh
#!/bin/bash
set -e
BOOT_DIR="/var/www/html/boot/debian-installer/amd64"
WORK_DIR="/tmp/initrd-work"
PRESEED_SOURCE="/var/www/html/boot/preseed.cfg"
OUTPUT_INITRD="$BOOT_DIR/initrd-custom.gz"
# === CHECAGENS INICIAIS ===
INITRD_ORIGINAL="$BOOT_DIR/initrd.gz"
if [ ! -f "$INITRD_ORIGINAL" ]; then
echo "Arquivo initrd.gz não encontrado em: $INITRD_ORIGINAL"
exit 1
fi
if [ ! -f "$PRESEED_SOURCE" ]; then
echo "Arquivo preseed.cfg não encontrado em: $PRESEED_SOURCE"
exit 1
fi
echo "Preparando o diretório de trabalho..."
rm -rf "$WORK_DIR"
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"
echo "Fazendo backup do initrd original..."
cp "$INITRD_ORIGINAL" "${INITRD_ORIGINAL}.bak"
echo "Extraindo initrd.gz..."
gzip -dc "$INITRD_ORIGINAL" | cpio -id --quiet
echo "Copiando preseed.cfg para raiz do initrd..."
cp "$PRESEED_SOURCE" ./preseed.cfg
echo "Reempacotando initrd com preseed embutido..."
##find . | cpio --quiet -o -H newc | gzip -9 > "$OUTPUT_INITRD"
find . | cpio --quiet -o -H newc --owner=0:0 | gzip -9 > "$OUTPUT_INITRD"
echo "Novo initrd com preseed embutido foi criado com sucesso!"
echo "Local: $OUTPUT_INITRD"
echo
echo "Use esta linha no seu script iPXE:"
echo "initrd http:///boot/debian-installer/amd64/initrd-custom.gz"
Como usar:
sudo chmod +x embed-preseed.sh
sudo ./embed-preseed.sh
Exemplo de Boot via iPXE com label iPXE embutido dentro de menu PXE
LABEL debian-ipxe
MENU LABEL Instale o Debian via iPXE (netboot e preseed)
KERNEL ipxe.lkrn
APPEND dhcp && chain
http://192.168.1.3/boot/debian.ipxe
Conteúdo do arquivo debian.ipxe:
#!ipxe
echo "Configuracao feita..."
echo
kernel
http://192.168.1.3/boot/debian-installer/amd64/linux auto=true priority=critical
initrd
http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz
boot
Esse método provou-se confiável em servidores novos com UEFI e máquinas antigas com BIOS tradicional.
Testado com sucesso inclusive em hardware antigo com DDR2 e BIOS legado.
Evita depender de parâmetros instáveis em linha de kernel.
Pode ser adaptado para qualquer distribuição baseada no debian-installer.
O esquema total utilizado foi com label iPXE dentro de menu PXE com apache2, tftpd-hpa e isc-dhcp-server, mas pode ser utilizado com somente iPXE.
IPXE.LKRN
https://ipxe.org/
https://boot.ipxe.org/
O iPXE é o principal firmware de inicialização de rede de código aberto. Ele oferece uma implementação PXE completa, aprimorada com recursos adicionais, como:
Inicializar a partir de servidor web via HTTP
Inicializar a partir de SAN iSCSI
Inicialização de SAN Fibre Channel via FCoE
Inicialização de SAN AoE
Inicializar a partir de uma rede sem fio
Inicializar a partir de uma rede de longa distância
Inicialização de uma rede Infiniband
Controlar o processo de inicialização com um script
Você pode usar o iPXE para substituir a ROM PXE existente na sua placa de rede ou pode fazer o chainload no iPXE para obter os recursos do iPXE sem ter de atualizar a ROM.
Basicamente, o ipxe.lkrn é um firmware de inicialização de rede de código aberto. Ele permite que computadores inicializem pela rede, mesmo quando o PXE (Preboot Execution Environment) integrado não é suportado ou quando se deseja funcionalidades adicionais além do PXE padrão. O ipxe.lkrn pode ser inicializado como um kernel Linux e pode ser usado para carregar outros programas e arquivos de inicialização da rede.
Exemplo de arquivo /var/lib/tftpboot/pxelinux.cfg/default (menu PXE):
DEFAULT debian
UI menu.c32
PROMPT 1
TIMEOUT 100
MENU TITLE PXE Boot Menu
LABEL debian-pxe
MENU LABEL Instale o Debian (PXE)
KERNEL vmlinuz
APPEND initrd=initrd.gz auto=true priority=critical preseed/url=
http://192.168.1.3/debianiso/preseed.cfg ---
LABEL memtest
MENU LABEL Teste de RAM (Memtest86+ 7.20)
KERNEL memtest86+
LABEL clonezilla
MENU LABEL Clonezilla Live (Backup/Restore)
KERNEL clonezilla/vmlinuz
APPEND initrd=clonezilla/initrd.img boot=live union=overlay username=user config components noswap edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_keymap="none" ocs_live_batch="no" vga=788 fetch=tftp://192.168.1.3/clonezilla/filesystem.squashfs
LABEL debian-ipxe
MENU LABEL Instale o Debian via iPXE (netboot e preseed)
KERNEL ipxe.lkrn
APPEND dhcp && chain
http://192.168.1.3/boot/debian.ipxe
preseed.cfg completo
#_preseed_V1
###Preseed para boot PXE sem Interface Grafica###
Este é o preseed ##
### Locale e linguagem ###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false
Configuracoes de teclado
d-i console-keymaps-at/keymap select br-abnt2
d-i keyboard-configuration/xkb-keymap select br
d-i keyboard-configuration/layout select br
d-i keyboard-configuration/model select abnt2
d-i keyboard-configuration/variant select abnt2
d-i keyboard-configuration/options string lv3:alt_switch,compose:rctrl
d-i keyboard-configuration/store_defaults_in_debconf_db boolean true
d-i time/zone string America/Sao_Paulo
### Hostname e rede ###
d-i netcfg/use_autoconfig boolean true
d-i netcfg/disable_dhcp_hostname boolean true
d-i netcfg/get_nameservers string 1.1.1.1 9.9.9.9
d-i netcfg/get_hostname string no01
d-i netcfg/get_hostname seen true
d-i netcfg/get_domain string localdomain
d-i netcfg/get_domain seen true
d-i netcfg/choose_interface select auto
### Repositorio Debian ###
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
### Usuario ###
d-i passwd/root-password password cluster
d-i passwd/root-password-again password cluster
d-i passwd/user-fullname string Kluster User
d-i passwd/username string kluster
d-i passwd/user-password password cluster
d-i passwd/user-password-again password cluster
d-i passwd/user-default-groups string sudo
### Popularidade ###
popularity-contest popularity-contest/participate boolean false
### Pre-carrega os modulos necessarios
d-i anna-install string btrfs-modules xfs-modules
d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true
### Configura o particionamento automatico
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root
d-i partman-auto/expert_recipe string \
boot-root :: \
40 50 512 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } . \
4096 4096 4096 linux-swap \
$primary{ } \
method{ swap } format{ } . \
51200 51200 51200 btrfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ btrfs } \
mountpoint{ / } . \
512 512 -1 xfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /orangefs } .
### Confirma as acoes do particionador
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
### Pacotes ###
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools aptitude libu2f-udev console-setup keyboard-configuration console-data
### GRUB ###
d-i grub-installer/bootdev string default
### Finalizacao ###
d-i finish-install/reboot_in_progress note
### Comandos pos-instalacao ###
d-i preseed/late_command string \
mkdir -p /target/root/.ssh; \
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM2+c+950T5ryZyco86ezUh8f1w9jz34ObqbowLK3DlC kluster@cservidor" > /target/root/.ssh/authorized_keys; \
chmod 700 /target/root/.ssh; \
chmod 600 /target/root/.ssh/authorized_keys; \
in-target bash -c 'echo "XKBMODEL=\"abnt2\"" > /etc/default/keyboard; \
echo "XKBLAYOUT=\"br\"" >> /etc/default/keyboard; \
echo "XKBVARIANT=\"abnt2\"" >> /etc/default/keyboard; \
echo "XKBOPTIONS=\"lv3:alt_switch,compose:rctrl\"" >> /etc/default/keyboard; \
echo "BACKSPACE=\"guess\"" >> /etc/default/keyboard'; \
in-target dpkg-reconfigure -f noninteractive keyboard-configuration; \
in-target setupcon --force; \
in-target update-initramfs -u; \
in-target bash -c 'set -e; \
apt-get clean || true; \
apt-get update || true; \
sed -i "s/^allow-hotplug/auto/" /etc/network/interfaces; \
update-grub || true; update-initramfs -u || true; \
mkdir -p /etc/sudoers.d; \
echo "kluster ALL=(ALL:ALL) ALL" > /etc/sudoers.d/kluster; \
chmod 0440 /etc/sudoers.d/kluster'
Para hostname dinâmico configure o arquivo /etc/dhcp/dhcpd.conf para detectar o MAC e mapear via DHCP fixo (ideal em redes e clusters).
Exemplo de configuração do isc-dhcp-server no seu PXE server com hostnames fixos baseados no MAC:
host no01 {
hardware ethernet 00:11:22:33:44:55;
fixed-address 111.222.33.4;
option host-name "no01";
}
O Debian usará o hostname passado pelo DHCP se netcfg/get_hostname não estiver definido no preseed.
Deixe comentadas estas linhas do preseed.cfg:
#d-i netcfg/get_hostname string no01
#d-i netcfg/get_hostname seen true
Caso queria definir um hostname no preseed descomente as duas linhas e não configure o /etc/dhcp/dhcpd.conf para fixar o IP e o hotsname pelo MAC, porém, caso você tenha 7 máquinas, ou mais, por exemplo, para instalar, terá de alterar o preseed e reembutir 7 vezes (ou mais) no initrd.