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
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.
CUSTOMIZANDO A INSTALAÇÃO 4
Sequência de scripts
Toda a instalação explicada na seção anterior pode ser feita automatizada com a sequência de scripts a seguir.
Ao final da seção CUSTOMIZANDO A INSTALAÇÃO 5 tem um resumo dos arquivos que você deve revisar depois.
Toda essa instalação deve ser feita no servidor 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.
1 - INSTALA-PXE.SH
Execute primeiro esse script que ele realizará a instalação e configuração dos pacotes necessários, inclusive isc-dhcp-server, apache2 e tftp-hpa.
Aconselho sempre que, mesmo as configurações sendo feitas por script, revise depois os arquivos como, por exemplo, /etc/dhcp/dhcpd.conf.
Lembrando que essas instalações são feitas somente no servidor.
Nos clientes você somente inicializa (boota) pela rede (PXE - placa de rede).
Esse script já deixa o ambiente pronto com o menu permitindo escolher instalação Debian PXE, realizar um Memetest86+, iniciar o Clonezilla ou instalar por iPXE.
Caso utilizar IP fixo por MAC no DHCP comente as 2 linhas do range do script e mais abaixo na subnet do DHCP comente a linha range $DHCP_RANGE_START $DHCP_RANGE_END.
Aconselho a executar o script como ele está e executar as instalações dos computadores e depois alterar manualmente o /etc/dhcp/dhcp.conf para IP fixo por MAC, mas isso vai da sua preferência de acordo com o teu ambiente.
$ sudo vim instala-pxe.sh
#!/bin/bash
set -e
if [ "$EUID" -ne 0 ]; then
echo "Este script deve ser executado como root (use sudo)."
exit 1
fi
### === CONFIGURAÇÕES ===
### Altere para o teu ambiente ###
### A interface a ser setada é a que vai para o switch da rede/cluster ###
### Caso utilizar IP fixo por MAC no DHCP comente as 2 linhas do range ###
##PRESEED_PATH="/home/aristotles/0-Montagem_de_Cluster/PXE/preseed.cfg"
PRESEED_PATH="/home/kluster/0-Montagem_de_Cluster/PXE/preseed.cfg"
INTERFACE="ens1"
SERVER_IP="192.168.1.3"
DHCP_SUBNET="192.168.1.0"
DHCP_NETMASK="255.255.255.0"
DHCP_RANGE_START="192.168.1.4"
DHCP_RANGE_END="192.168.1.12"
DHCP_ROUTER="192.168.1.3"
echo "Instalando pacotes..."
apt update
#aptitude safe-upgrade -y
apt install -y isc-dhcp-server tftpd-hpa apache2 syslinux syslinux-common pxelinux wget cpio unzip debconf-utils
### === CONFIGURAR PXE COM NETBOOT E TFTP ===
echo "Configurando PXE com netboot e TFTP..."
mkdir -p /var/lib/tftpboot
mkdir -p /var/lib/tftpboot/{pxelinux.cfg,EFI/boot,grub,clonezilla}
# Baixar os arquivos netboot do Debian (amd64)
NETBOOT_BASE_URL="http://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/debian-installer/amd64"
wget -q --show-progress "$NETBOOT_BASE_URL/linux" -O /var/lib/tftpboot/vmlinuz
wget -q --show-progress "$NETBOOT_BASE_URL/initrd.gz" -O /var/lib/tftpboot/initrd.gz
# Personalizar initrd.gz para incluir DNS dentro do initrd
echo "Personalizando initrd.gz para incluir DNS..."
cd /var/lib/tftpboot
mkdir -p initrd-temp
cd initrd-temp
gzip -dc ../initrd.gz | cpio -id --no-absolute-filenames
cat < etc/resolv.conf
nameserver 1.1.1.1
nameserver 9.9.9.9
EOF
# Recriar o initrd.gz customizado
find . | cpio -o -H newc | gzip -c > ../initrd-custom.gz
cd ..
rm -rf initrd-temp
mv initrd-custom.gz initrd.gz
echo "initrd.gz customizado com DNS inserido."
# Copiar arquivos PXELINUX essenciais
cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libutil.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libcom32.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/menu.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /var/lib/tftpboot/
### === BAIXAR E CONFIGURAR MEMTEST86+ 7.20 ===
TMPDIR="/var/lib/tftpboot/tmp"
rm -rf "$TMPDIR"
mkdir -p "$TMPDIR"
echo "Baixando Memtest86+ 7.20..."
wget -q --show-progress https://www.memtest.org/download/v7.20/mt86plus_7.20.binaries.zip -O "$TMPDIR/memtest.zip" || { echo "Falha no download do Memtest86+"; exit 1; }
unzip -o "$TMPDIR/memtest.zip" -d "$TMPDIR"
if [[ -f "$TMPDIR/memtest64.bin" ]]; then
cp "$TMPDIR/memtest64.bin" /var/lib/tftpboot/memtest86+
echo "Memtest86+ copiado como 'memtest86+' (usando memtest64.bin)"
else
echo "Arquivo memtest64.bin não encontrado após extração."
exit 1
fi
rm -rf "$TMPDIR"
### === BAIXAR E INSTALAR CLONEZILLA ===
CLONEZILLA_ZIP="/var/lib/tftpboot/clonezilla.zip"
CLONEZILLA_DIR="/var/lib/tftpboot/clonezilla"
TMP_CLONEZILLA_DIR="/var/lib/tftpboot/tmp/clonezilla-files"
echo "Verificando Clonezilla..."
if [[ -f "$CLONEZILLA_DIR/vmlinuz" && -f "$CLONEZILLA_DIR/initrd.img" && -f "$CLONEZILLA_DIR/filesystem.squashfs" ]]; then
echo "Clonezilla já está configurado em $CLONEZILLA_DIR. Pulando extração e cópia."
else
# Verifica se o zip existe e/ou se está corrompído antes de baixar
if [ -f "$CLONEZILLA_ZIP" ]; then
if unzip -tq "$CLONEZILLA_ZIP" >/dev/null 2>&1; then
echo "Arquivo $CLONEZILLA_ZIP existe e é válido. Pulando download."
else
echo "Arquivo $CLONEZILLA_ZIP está corrompido. Baixando novamente..."
rm -f "$CLONEZILLA_ZIP"
# Baixa o arquivo
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-5/clonezilla-live-3.2.2-5-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "Falha no download do Clonezilla"; exit 1; }
fi
else
echo "Baixando Clonezilla..."
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-5/clonezilla-live-3.2.2-5-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "Falha no download do Clonezilla"; exit 1; }
fi
mkdir -p "$TMP_CLONEZILLA_DIR"
unzip -o "$CLONEZILLA_ZIP" -d "$TMP_CLONEZILLA_DIR"
EXTRACTED_DIR=$(find "$TMP_CLONEZILLA_DIR" -type d -name live -exec dirname {} \; | head -n1)
if [ -z "$EXTRACTED_DIR" ]; then
echo "Diretório com subdiretório 'live' não encontrado após extração."
exit 1
fi
echo "Diretório detectado: $EXTRACTED_DIR"
if [[ -f "$EXTRACTED_DIR/live/vmlinuz" && -f "$EXTRACTED_DIR/live/initrd.img" && -f "$EXTRACTED_DIR/live/filesystem.squashfs" ]]; then
mkdir -p "$CLONEZILLA_DIR"
cp "$EXTRACTED_DIR/live/"{vmlinuz,initrd.img,filesystem.squashfs} "$CLONEZILLA_DIR/"
echo "Clonezilla copiado para $CLONEZILLA_DIR"
else
echo "Arquivos do Clonezilla não encontrados após extração."
exit 1
fi
rm -rf "$TMP_CLONEZILLA_DIR"
fi
# Criar Menu PXE BIOS
echo "Configurando o menu PXE..."
cat < /var/lib/tftpboot/pxelinux.cfg/default
DEFAULT debian
UI menu.c32
PROMPT 1
TIMEOUT 100
MENU TITLE PXE Boot Menu
LABEL debian
MENU LABEL Instale o Debian (PXE)
KERNEL vmlinuz
APPEND initrd=initrd.gz auto=true priority=critical preseed/url=http://$SERVER_IP/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://$SERVER_IP/clonezilla/filesystem.squashfs
LABEL debian-ipxe
MENU LABEL Instalar Debian via iPXE + ISO
KERNEL ipxe.lkrn
APPEND dhcp && chain http://$SERVER_IP/boot/debian.ipxe
EOF
### === CONFIGURAR UEFI PXE COM GRUB ===
echo "Configurando suporte a UEFI PXE com GRUB..."
apt install -y grub-efi-amd64-bin
#mkdir -p /var/lib/tftpboot/EFI/boot
cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /var/lib/tftpboot/EFI/boot/bootx64.efi 2>/dev/null || \
cp /usr/lib/grub/x86_64-efi/grubnetx64.efi /var/lib/tftpboot/EFI/boot/bootx64.efi
#mkdir -p /var/lib/tftpboot/grub
cat < /var/lib/tftpboot/grub/grub.cfg
set default=0
set timeout=10
menuentry "Instalação Automática Debian (PXE)" {
linux /vmlinuz auto=true priority=critical preseed/url=http://$SERVER_IP/debianiso/preseed.cfg ---
initrd /initrd.gz
}
menuentry "Teste de Memória RAM (Memtest86+ UEFI)" {
chainloader /memtest86+.efi
}
EOF
### === CONFIGURAR APACHE ===
echo "Configurando Apache para servir preseed.cfg..."
# Detecta o DocumentRoot do Apache
DOCROOT=$(grep -i "DocumentRoot" /etc/apache2/sites-enabled/000-default.conf | grep -v '#' | awk '{print $2}')
if [ -z "$DOCROOT" ]; then
echo "DocumentRoot não detectado. Usando /var/www/html como padrão."
DOCROOT="/var/www/html"
fi
mkdir -p "$DOCROOT/debianiso"
cp "$PRESEED_PATH" "$DOCROOT/debianiso/"
chmod 644 "$DOCROOT/debianiso/preseed.cfg"
chown www-data:www-data "$DOCROOT/debianiso/preseed.cfg"
# Reinicia o Apache
systemctl restart apache2
### === CONFIGURAR TFTP ===
echo "Configurando tftpd-hpa..."
/etc/default/tftpd-hpa
cat < /dev/null
TFTP_USERNAME="tftp"TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --blocksize 512"
EOF
### === CONFIGURAR DHCP ===
echo "Configurando DHCP Server..."
echo "INTERFACESv4=$INTERFACE" > /etc/default/isc-dhcp-server
cp -n /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
sed -i -E 's/^(option domain-name.*|option domain-name-servers.*)/# &/' /etc/dhcp/dhcpd.conf
if ! grep -qF "option arch code 93 = unsigned integer 16;" /etc/dhcp/dhcpd.conf; then
echo "option arch code 93 = unsigned integer 16;" >> /etc/dhcp/dhcpd.conf
fi
MARKER="# BEGIN SUBNET $DHCP_SUBNET"
if ! grep -qF "$MARKER" /etc/dhcp/dhcpd.conf; then
cat <> /etc/dhcp/dhcpd.conf
$MARKER
# Definir opção de arquitetura PXE (REQUIRED for conditional checks)
option arch code 93 = unsigned integer 16;
subnet $DHCP_SUBNET netmask $DHCP_NETMASK {
range $DHCP_RANGE_START $DHCP_RANGE_END;
option routers $DHCP_ROUTER;
option domain-name-servers 1.1.1.1, 9.9.9.9;
if option arch = 00:07 {
filename "EFI/boot/bootx64.efi"; # UEFI 64-bit
} else {
filename "/pxelinux.0"; # BIOS
}
next-server $DHCP_ROUTER;
}
# END SUBNET $DHCP_SUBNET
EOF
echo "Subnet adicionada no dhcpd.conf."
else
echo "Subnet já configurada, pulando adição."
fi
ifup "$INTERFACE"
systemctl restart isc-dhcp-server
systemctl restart tftpd-hpa
systemctl restart apache2
echo "Servidor PXE configurado com sucesso!"
echo "Menu PXE: Debian PXE | Memtest86+ | Clonezilla | Debian iPXE"
echo "Configure os clientes para bootar via PXE pela rede."
Salve e saia.
$ sudo chmod +x instala-pxe.sh
$ sudo ./instala-pxe.sh
Estrutura de Diretórios do PXE
Estrutura do Apache (/var/www/html/boot)
Ao selecionar no menu o Debian PXE o instalador procura o vmlinuz e o initrd.gz em /var/lib/tftpboot/ e o preseed.cfg em /var/www/html/debianiso/. O script deixa essa estrutura pronta, tenha somente o cuidado de ter certeza de que o preseed.cfg que você quer é o mesmo que está no caminho no início do script, pois é este que será copiado para a pasta debiansio.
Alterando o link na variável NETBOOT_BASE_URL você define a imagem que será baixada, descompactada e configurada.
Alterando o caminho na variável PRESEED_PATH você define o preseed que será utilizado ou você pode copiar manualmente para /var/www/html/debianiso/ cada preseed a cada instalação via PXE.
CUSTOMIZANDO A INSTALAÇÃO 5
2 - PRESEED.CFG
Crie o diretório boot na pasta padrão do Apache2 e coloque dentro o arquivo preseed.cfg, no caso ficou dentro da pasta boot que foi criada em /var/www/html/boot.
Caso você executar o script "3 - IPXE-DEBIAN.SH" com o conteúdo do preseed embutido não é necessário criar o preseed manualmente no diretório /var/www/html/boot.
$ cd /var/www/html
$ sudo mkdir -p boot
$ cd boot
$ sudo vim preseed.cfg
#_preseed_V1
###Preseed para boot PXE sem Interface Grafica###
##Preseed ideal para cluster, podendo ser adaptado##
### Locale e linguagem ###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false
Configuracoes de teclado br-abnt2
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
### Garante que o módulo btrfs está disponivel antes do particionamento
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 \
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'
Salve e saia.
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 192.168.1.101;
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 seu preseed.cfg:
#d-i netcfg/get_hostname string no01
#d-i netcfg/get_hostname seen true
3 - IPXE-DEBIAN.SH
O arquivo ipxe-debian.sh cria o diretório boot em /var/www/html; faz o download do arquivo netboot.tar.gz em /var/www/html/boot e descompacta ele; cria o preseed em /var/www/html/boot ou copia ele, caso você opte em criá-lo manualmente daí tenha o cuidado de descomentar e comentar os trechos no script; cria o script debian.ipxe em /var/www/html/boot e faz o download do kernel ipxe.lkrn para /var/lib/tftpboot.
$ sudo vim ipxe-debian.sh
#!/bin/bash
set -e
### === CONFIGURAÇÕES ===
HTTP_ROOT="/var/www/html" # Caminho do servidor Apache
BOOT_DIR="$HTTP_ROOT/boot"
SERVER_IP="192.168.1.3" # IP do servidor PXE/HTTP
TFTP_DIR="/var/lib/tftpboot"
PRESEED_DIR="/home/kluster/0-Montagem_de_Cluster/PXE"
NETBOOT_URL="https://deb.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz"
### === INSTALAR PACOTES NECESSÁRIOS ===
echo "Instalando pacotes..."
apt update
#aptitude safe-upgrade -y
apt install -y wget cpio unzip
echo "Criando diretório de boot em $BOOT_DIR..."
sudo mkdir -p "$BOOT_DIR"
cd "$BOOT_DIR"
echo "Baixando netboot.tar.gz..."
if [ ! -f "netboot.tar.gz" ]; then
sudo wget -q --show-progress "$NETBOOT_URL"
else
echo "netboot.tar.gz já existe, pulando download."
fi
echo "Extraindo netboot.tar.gz..."
if [ ! -d "$BOOT_DIR/debian-installer/amd64" ]; then
sudo tar -xzf netboot.tar.gz
sudo rm -f netboot.tar.gz
else
echo "Arquivos já extraídos, pulando extração."
fi
#echo "Copiando preseed.cfg para $BOOT_DIR..."
#if [ -f "$PRESEED_DIR/preseed.cfg" ]; then
# sudo cp "$PRESEED_DIR/preseed.cfg" "$BOOT_DIR"
#else
# echo "Arquivo preseed.cfg não encontrado em $PRESEED_DIR" >&2
# exit 1
#fi
echo "Criando PRESEED em $BOOT_DIR/preseed.cfg..."
sudo bash -c 'cat < '"$BOOT_DIR"'/preseed.cfg'
## Coloque aqui o conteúdo do preseed.cfg
EOF
echo "Criando script iPXE em $BOOT_DIR/debian.ipxe..."
sudo bash -c 'cat < '"$BOOT_DIR"'/debian.ipxe'
#!ipxe
echo "Configuracao feita..."
kernel http://192.168.1.3/boot/debian-installer/amd64/linux
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz auto=true priority=critical
boot
EOF
echo "Baixando ipxe.lkrn para $TFTP_DIR..."
if [ ! -f "$TFTP_DIR/ipxe.lkrn" ]; then
sudo wget -q --show-progress https://boot.ipxe.org/ipxe.lkrn -O "$TFTP_DIR/ipxe.lkrn"
else
echo "ipxe.lkrn já existe em $TFTP_DIR, pulando download."
fi
echo ""
echo "Tudo pronto! No menu PXE, use a entrada:"
echo ""
echo "LABEL debian-ipxe"
echo " MENU LABEL Instalar Debian via iPXE (netboot + preseed)"
echo " KERNEL ipxe.lkrn"
echo " APPEND dhcp && chain http://SERVER_IP/boot/debian.ipxe"
echo ""
$ sudo chmod +x ipxe-debian.sh
$ sudo ./ipxe-debian.sh
Caso queira ter o iPXE no seu servidor para compilar os vários tipos faça o seguinte:
1- Instale as dependências:
$ sudo apt update
$ sudo apt install git build-essential libssl-dev
$ git clone https://github.com/ipxe/ipxe.git
$ cd ipxe/src
2- Compile a versão do iPXE para ser usada como Kernel:
$ make bin/ipxe.lkrn
ou
$ make bin/undionly.kpxe
etc.
Caso quiser compilar com arquivo ipxe embutido:
$ make bin/ipxe.lkrn EMBED=/caminho/para/arquivo.ipxe
Depois copie o kernel ipxe gerado para onde seu TFTP serve:
$ sudo cp bin/ipxe.lkrn /var/lib/tftpboot/
Maiores informações:
4 - EMBED-PRESEED.SH
Esse script embute o preseed na raiz do initrd.gz.
Lembrando que a imagem utilizada deve ser, neste caso, obrigatoriamente a netboot:
Escolha netboot.tar.gz
A imagem netboot.tar.gz deve ser descompactada na pasta padrão do Apache2 (no caso /var/www/html/) dentro da pasta boot que você criou em /var/www/html/boot.
Caso você tenha executado o script ipxe-debian.sh o netboot.tar.gz já estará descompactado na pasta.
Na descompactação será criada a pasta debian-installer, além de outros arquivos que serão utilizados na instalação via iPXE.
Caso você opte fazer manualmente instale os pacotes necessários, veja o conteúdo do script para saber quais são.
$ sudo vim embed-preseed.sh
#!/bin/bash
set -e
# === CONFIGURAÇÕES ===
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 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 --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"
Salve e saia.
$ sudo chmod +x embed-preseed.sh
$ sudo ./embed-preseed.sh
Basicamente, depois da descompactação de netboot.tar.gz deverão ter os seguintes diretórios e arquivos em /var/www/html/boot:
:/var/www/html/boot$ ls
debian-installer ldlinux.c32 preseed.cfg pxelinux.cfg version.info
debian.ipxe netboot.tar.gz pxelinux.0 splash.png
Os da sua criação serão somente debian.ipxe e preseed.cfg.
E dentro da pasta /var/www/html/boot/debian-installer/amd64 terá algo assim:
:/var/www/html/boot/debian-installer/amd64$ ls
bootnetx64.efi grub initrd-custom.gz initrd.gz.bak pxelinux.0
boot-screens grubx64.efi initrd.gz linux pxelinux.cfg
5 - DEBIAN.IPXE
Caso você tenha executado o script "2 - IPXE-DEBIAN.SH" o arquivo debian.ipxe já estará na pasta.
Senão crie manualmente em /var/www/html/boot com o seguinte conteúdo:
#!ipxe
echo "Configuracao feita..."
kernel http://192.168.1.3/boot/debian-installer/amd64/linux
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz auto=true priority=critical
boot
Salve e saia.
O arquivo /etc/dhcp/dhcpd.conf deverá ter algo assim no final:
# BEGIN SUBNET 192.168.1.0
# Definir opção de arquitetura PXE (REQUIRED for conditional checks)
option arch code 93 = unsigned integer 16;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.4 192.168.1.11;
option routers 192.168.1.3;
option domain-name-servers 1.1.1.1, 9.9.9.9;
if option arch = 00:07 {
filename "EFI/boot/bootx64.efi"; # UEFI 64-bit
} else {
filename "pxelinux.0"; # BIOS
}
next-server 192.168.1.3;
}
# END SUBNET 192.168.1.0
As configurações do Apache2 deixe no padrão do script instala-pxe.sh, a não ser que você tenha mudado a pasta padrão (/var/www/html), daí altere nos scripts.
São esses arquivos que você deverá cuidar:
$ sudo vim /etc/dhcp/dhcpd.conf
$ sudo vim instala-pxe.sh
$ sudo vim preseed.cfg
$ sudo vim embed-preseed.sh
$ sudo vim /var/lib/tftpboot/pxelinux.cfg/default
$ sudo vim /var/www/html/boot/debian.ipxe
$ sudo vim /etc/default/isc-dhcp-server
$ sudo vim /etc/default/tftpd-hpa
Este último deverá ter o seguinte conteúdo:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --blocksize 512"
O arquivo do Kernel ipxe.lkrn, caso precisar fazer o download manualmente, obtenha aqui:
https://boot.ipxe.org/ipxe.lkrn
e salve ele na pasta /var/lib/tftpboot/ipxe.lkrn.
A coisa funciona assim: a entrada do iPXE no menu PXE (/var/lib/tftpboot/pxelinux.cfg/default) aponta para o DHCP e para o debian.ipxe:
LABEL debian-ipxe
MENU LABEL Instalar Debian via iPXE (netboot e preseed)
KERNEL ipxe.lkrn
APPEND dhcp && chain http://192.168.1.3/boot/debian.ipxe
O arquivo /etc/dhcp/dhcpd.conf aponta automaticamente para os arquivos EFI/boot/bootx64.efi ou pxelinux.0, caso for UEFI ou BIOS.
O arquivo debian.ipxe, por sua vez, aponta para o IP do servidor que você configurou indicando os caminhos para o aplicativo do instalador linux e para o initrd-custom.gz com o preseed.cfg que embutimos na raiz do initrd.
CUSTOMIZANDO A INSTALAÇÃO 6
Instalação via PXE ou iPXE (Método 2)
Utilize este método para instalação em rede, pois é totalmente automatizado sendo que terá de executar os scripts somente uma vez.
O preseed está sem interface gráfica porque é originalmente para cluster, caso queira a instalação em rede com interface gráfica basta alterar o preseed no arquivo ipxe-debian.sh.
Mais informações sobre como alterar para ter interface gráfica veja seção CUSTOMIZANDO A INSTALAÇÃO 1.
Adapte os arquivos para as suas necessidades, principalmente o particionamento e os sistemas de arquivos (usei o btrfs e o xfs).
Essa instalação é para os clientes (ou nós) e deve ser feita no servidor, sendo que depois o servidor acessará os clientes pela rede.
O processo de instalação e configuração do servidor não será demonstrado, pois julgo que o servidor esteja instalado e configurado.
Os clientes (ou nós) devem estar em rede com o servidor através de um switch ou outra solução adequada.
No artigo final será demonstrado o processo completo de Montagem de Cluster.
Nos testes, a placa de rede Broadcom BCM5761, por exemplo, não funciona muito bem com iPXE por causa do firmware dela, apesar de ser mais um pouco mais moderna em relação às placas de rede das máquinas com DDR2, pois essa placa Broadcom BCM5761 é onboard do HP Compaq 6005 Pro SFF que é DDR3.
No menu PXE você tem as duas opções: PXE e iPXE.
Nas máquinas HP Compaq, além de outras, a instalação deu-se via PXE, pois via iPXE dava erro de "No configurations Methods succeeded...", ou seja, a placa de rede não suporta UNDI (Universal Network Device Interface), sendo que o suporte UNDI é oferecido pelo firmware/BIOS da placa de rede, não pelo iPXE.
De qualquer maneira, com este método a instalação ocorre por PXE ou por iPXE (se não dá de um jeito dá do outro).
Utilize os arquivos desta seção.
Sequência de execução dos arquivos:
1º- instala-pxe.sh
2º- ipxe-debian.sh
3º- embed-preseed.sh
Na instalação via iPXE mantenha o preseed embutido no initrd, o arquivo debian.ipxe sem ser embutido no lkrn e para definir os hostnames altere o arquivo /var/www/html/boot/debian.ipxe.
Na instalação via PXE mantenha o preseed via URL (sem ser embutido no initrd) e o debian.ipxe sem ser embutido no lkrn e para setar os hostnames altere o arquivo /var/lib/tftpboot/pxelinux.cfg/default na seção "LABEL debian-pxe" na linha APPEND.
Resumindo: a cada instalação, como não se sabe o firmware da placa de rede, sugiro alterar os hostnames (netcfg/get_hostname=no0X) nos dois arquivos (debian.ipxe e default).
Depois de instalado o sistema no cliente basta acessar pelo servidor com o ssh:
kluster@cservidor:~$ ssh 192.168.1.12
The authenticity of host '192.168.1.12 (192.168.1.12)' can't be established.
ED25519 key fingerprint is SHA256:O/8uXCCGVqSsMNV3TWYzsRJpfBGGnHUByU1zrNVBBk8.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.12' (ED25519) to the list of known hosts.
kluster@192.168.1.12's password:
Linux no02 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Jul 16 16:36:45 2025
kluster@no02:~$
Para acessar também pelo hostname utilizando o ssh você deverá configurar o arquivo /etc/hosts.
Exemplo PXE:
LABEL debian-pxe
MENU LABEL Instale o Debian (PXE)
KERNEL vmlinuz
APPEND initrd=initrd.gz auto=true priority=critical netcfg/get_hostname=no01 netcfg/get_domain=localdomain preseed/url=http://192.168.1.3/debianiso/preseed.cfg ---
Exemplo ipxe (com preseed embutido):
#!ipxe
dhcp
kernel http://192.168.1.3/boot/debian-installer/amd64/linux auto=true priority=critical netcfg/get_hostname=no01 netcfg/get_domain=localdomain ---
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz
boot
1- INSTALA-PXE.SH
#!/bin/bash
set -e
### === VERIFICAÇÃO DE ROOT ===
if [ "$EUID" -ne 0 ]; then
echo "Este script deve ser executado usando sudo)."
exit 1
fi
### === CONFIGURAÇÕES ===
### ALTERE para o teu ambiente ###
##PRESEED_PATH="/home/aristotles/0-Montagem_de_Cluster/PXE/preseed.cfg"
PRESEED_PATH="/home/kluster/0-Montagem_de_Cluster/PXE/preseed.cfg"
INTERFACE="enp3s0"
SERVER_IP="192.168.1.3"
DHCP_SUBNET="192.168.1.0"
DHCP_NETMASK="255.255.255.0"
DHCP_RANGE_START="192.168.1.4"
DHCP_RANGE_END="192.168.1.12"
DHCP_ROUTER="192.168.1.3"
### === INSTALAR PACOTES NECESSÁRIOS ===
echo "Instalando pacotes..."
apt update
#aptitude safe-upgrade -y
apt install -y isc-dhcp-server tftpd-hpa apache2 syslinux syslinux-common pxelinux wget cpio unzip
### === CONFIGURAR PXE COM NETBOOT E TFTP ===
echo "Configurando PXE com netboot e TFTP..."
mkdir -p /var/lib/tftpboot
mkdir -p /var/lib/tftpboot/{pxelinux.cfg,EFI/boot,grub,clonezilla}
# Baixar os arquivos netboot do Debian (amd64)
NETBOOT_BASE_URL="http://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/debian-installer/amd64"
wget -q --show-progress "$NETBOOT_BASE_URL/linux" -O /var/lib/tftpboot/vmlinuz
wget -q --show-progress "$NETBOOT_BASE_URL/initrd.gz" -O /var/lib/tftpboot/initrd.gz
# Personalizar initrd.gz para incluir DNS dentro do initrd
echo "Personalizando initrd.gz para incluir DNS..."
cd /var/lib/tftpboot
mkdir -p initrd-temp
cd initrd-temp
gzip -dc ../initrd.gz | cpio -id --no-absolute-filenames
cat < etc/resolv.conf
nameserver 1.1.1.1
nameserver 9.9.9.9
EOF
# Recriar o initrd.gz customizado
find . | cpio -o -H newc | gzip -c > ../initrd-custom.gz
cd ..
rm -rf initrd-temp
mv initrd-custom.gz initrd.gz
echo "initrd.gz customizado com DNS inserido."
# Copiar arquivos PXELINUX essenciais
cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libutil.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libcom32.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/menu.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /var/lib/tftpboot/
### === BAIXAR E CONFIGURAR MEMTEST86+ 7.20 ===
TMPDIR="/var/lib/tftpboot/tmp"
rm -rf "$TMPDIR"
mkdir -p "$TMPDIR"
echo "Baixando Memtest86+ 7.20..."
wget -q --show-progress https://www.memtest.org/download/v7.20/mt86plus_7.20.binaries.zip -O "$TMPDIR/memtest.zip" || { echo "❌ Falha no download do Memtest86+"; exit 1; }
unzip -o "$TMPDIR/memtest.zip" -d "$TMPDIR"
if [[ -f "$TMPDIR/memtest64.bin" ]]; then
cp "$TMPDIR/memtest64.bin" /var/lib/tftpboot/memtest86+
echo "Memtest86+ copiado como 'memtest86+' (usando memtest64.bin)"
else
echo "Arquivo memtest64.bin não encontrado após extração."
exit 1
fi
rm -rf "$TMPDIR"
### === BAIXAR E INSTALAR CLONEZILLA ===
### Verifique em https://clonezilla.org/downloads/download.php?branch=stable a versao atual e altere abaixo nos wget o numero da versao se for o caso.
CLONEZILLA_ZIP="/var/lib/tftpboot/clonezilla.zip"
CLONEZILLA_DIR="/var/lib/tftpboot/clonezilla"
TMP_CLONEZILLA_DIR="/var/lib/tftpboot/tmp/clonezilla-files"
echo "Verificando Clonezilla..."
# Verifica se já está tudo copiado para o destino final
if [[ -f "$CLONEZILLA_DIR/vmlinuz" && -f "$CLONEZILLA_DIR/initrd.img" && -f "$CLONEZILLA_DIR/filesystem.squashfs" ]]; then
echo "Clonezilla já está configurado em $CLONEZILLA_DIR. Pulando extração e cópia."
else
# Verifica se o zip existe e/ou se está corrompido antes de baixar
if [ -f "$CLONEZILLA_ZIP" ]; then
if unzip -tq "$CLONEZILLA_ZIP" >/dev/null 2>&1; then
echo "Arquivo $CLONEZILLA_ZIP existe e é válido. Pulando download."
else
echo "Arquivo $CLONEZILLA_ZIP está corrompido. Baixando novamente..."
rm -f "$CLONEZILLA_ZIP"
# Baixa o arquivo
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-15/clonezilla-live-3.2.2-15-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "❌ Falha no download do Clonezilla"; exit 1; }
fi
else
echo "Baixando Clonezilla..."
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-15/clonezilla-live-3.2.2-15-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "❌ Falha no download do Clonezilla"; exit 1; }
fi
# Garante que o diretório temporário exista antes de extrair
mkdir -p "$TMP_CLONEZILLA_DIR"
# Extrai o zip na pasta temporária
unzip -o "$CLONEZILLA_ZIP" -d "$TMP_CLONEZILLA_DIR"
# Detecta o diretório que contém o subdiretório "live/"
EXTRACTED_DIR=$(find "$TMP_CLONEZILLA_DIR" -type d -name live -exec dirname {} \; | head -n1)
if [ -z "$EXTRACTED_DIR" ]; then
echo "Diretório com subdiretório 'live' não encontrado após extração."
exit 1
fi
echo "Diretório detectado: $EXTRACTED_DIR"
# Verifica se os arquivos essenciais existem dentro do subdiretório "live"
if [[ -f "$EXTRACTED_DIR/live/vmlinuz" && -f "$EXTRACTED_DIR/live/initrd.img" && -f "$EXTRACTED_DIR/live/filesystem.squashfs" ]]; then
mkdir -p "$CLONEZILLA_DIR"
cp "$EXTRACTED_DIR/live/"{vmlinuz,initrd.img,filesystem.squashfs} "$CLONEZILLA_DIR/"
echo "Clonezilla copiado para $CLONEZILLA_DIR"
else
echo "Arquivos do Clonezilla não encontrados após extração."
exit 1
fi
# Limpeza opcional dos temporários
rm -rf "$TMP_CLONEZILLA_DIR"
fi
# Criar Menu PXE BIOS
echo "Configurando o menu PXE..."
cat < /var/lib/tftpboot/pxelinux.cfg/default
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 netcfg/get_hostname=no01 netcfg/get_domain=localdomain preseed/url=http://$SERVER_IP/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://$SERVER_IP/clonezilla/filesystem.squashfs
LABEL debian-ipxe
MENU LABEL Instalar Debian via iPXE
KERNEL ipxe.lkrn
APPEND dhcp && chain http://$SERVER_IP/boot/debian.ipxe
EOF
### === CONFIGURAR UEFI PXE COM GRUB ===
echo "Configurando suporte a UEFI PXE com GRUB..."
# Instala o GRUB para gerar arquivos UEFI PXE (apenas se ainda não instalado)
apt install -y grub-efi-amd64-bin
# Cria diretório EFI/boot para UEFI PXE boot
#mkdir -p /var/lib/tftpboot/EFI/boot
# Copia o GRUB EFI executável padrão
cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /var/lib/tftpboot/EFI/boot/bootx64.efi 2>/dev/null || \
cp /usr/lib/grub/x86_64-efi/grubnetx64.efi /var/lib/tftpboot/EFI/boot/bootx64.efi
# Cria diretório de configuração do GRUB
#mkdir -p /var/lib/tftpboot/grub
cat < /var/lib/tftpboot/grub/grub.cfg
set default=0
set timeout=10
menuentry "Instalação Automática Debian (PXE)" {
linux /vmlinuz auto=true priority=critical preseed/url=http://$SERVER_IP/debianiso/preseed.cfg ---
initrd /initrd.gz
}
menuentry "Teste de Memória RAM (Memtest86+ UEFI)" {
chainloader /memtest86+.efi
}
EOF
### === CONFIGURAR APACHE ===
echo "Configurando Apache para servir preseed.cfg..."
# Detecta o DocumentRoot do Apache
DOCROOT=$(grep -i "DocumentRoot" /etc/apache2/sites-enabled/000-default.conf | grep -v '#' | awk '{print $2}')
# Se não encontrou, usa padrão seguro
if [ -z "$DOCROOT" ]; then
echo "DocumentRoot não detectado. Usando /var/www/html como padrão."
DOCROOT="/var/www/html"
fi
# Cria diretório e copia o preseed
mkdir -p "$DOCROOT/debianiso"
cp "$PRESEED_PATH" "$DOCROOT/debianiso/"
# Ajusta permissões
chmod 644 "$DOCROOT/debianiso/preseed.cfg"
chown www-data:www-data "$DOCROOT/debianiso/preseed.cfg"
# Reinicia o Apache
systemctl restart apache2
### === CONFIGURAR TFTP ===
echo "Configurando tftpd-hpa..."
/etc/default/tftpd-hpa
cat < /dev/nullTFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --blocksize 512"
EOF
### === CONFIGURA DHCP ===
echo "Configurando DHCP Server..."
# Define interface de rede onde o DHCP deve escutar (ajuste conforme necessário)
echo "INTERFACESv4=$INTERFACE" > /etc/default/isc-dhcp-server
# Backup do dhcpd.conf original, se ainda não existir
cp -n /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
# Comentar opções DNS padrão, se existirem
sed -i -E 's/^(option domain-name.*|option domain-name-servers.*)/# &/' /etc/dhcp/dhcpd.conf
# Adiciona opção de arquitetura PXE global, se não existir ainda
if ! grep -qF "option arch code 93 = unsigned integer 16;" /etc/dhcp/dhcpd.conf; then
echo "option arch code 93 = unsigned integer 16;" >> /etc/dhcp/dhcpd.conf
fi
MARKER="# BEGIN SUBNET $DHCP_SUBNET"
# Adicionar subnet 192.168.1.0/24 com marcador único, se ainda não estiver configurada
if ! grep -qF "$MARKER" /etc/dhcp/dhcpd.conf; then
cat <> /etc/dhcp/dhcpd.conf
$MARKER
# Definir opção de arquitetura PXE (REQUIRED for conditional checks)
option arch code 93 = unsigned integer 16;
subnet $DHCP_SUBNET netmask $DHCP_NETMASK {
range $DHCP_RANGE_START $DHCP_RANGE_END;
option routers $DHCP_ROUTER;
option domain-name-servers 1.1.1.1, 9.9.9.9;
if option arch = 00:07 {
filename "EFI/boot/bootx64.efi"; # UEFI 64-bit
} else {
filename "/pxelinux.0"; # BIOS
}
next-server $DHCP_ROUTER;
}
# END SUBNET $DHCP_SUBNET
EOF
echo "Subnet adicionada no dhcpd.conf."
else
echo "Subnet já configurada, pulando adição."
fi
### === REINICIAR SERVIÇOS ===
ifup "$INTERFACE"
systemctl restart isc-dhcp-server
systemctl restart tftpd-hpa
systemctl restart apache2
echo "Servidor PXE configurado com sucesso!"
echo "Menu PXE: Debian | Memtest86+ | Clonezilla | iPXE"
echo "Configure os clientes para bootar via PXE pela rede."
2- IPXE-DEBIAN.SH
#!/bin/bash
set -e
### === CONFIGURAÇÕES ===
HTTP_ROOT="/var/www/html" # Caminho do servidor Apache
BOOT_DIR="$HTTP_ROOT/boot"
SERVER_IP="192.168.1.3" # IP do servidor PXE/HTTP
TFTP_DIR="/var/lib/tftpboot"
PRESEED_DIR="/home/kluster/0-Montagem_de_Cluster/PXE"
NETBOOT_URL="https://deb.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz"
echo "Criando diretório de boot em $BOOT_DIR..."
sudo mkdir -p "$BOOT_DIR"
cd "$BOOT_DIR"
echo "Baixando netboot.tar.gz..."
if [ ! -f "netboot.tar.gz" ]; then
sudo wget -q --show-progress "$NETBOOT_URL"
else
echo "netboot.tar.gz já existe, pulando download."
fi
echo "Extraindo netboot.tar.gz..."
if [ ! -d "$BOOT_DIR/debian-installer/amd64" ]; then
sudo tar -xzf netboot.tar.gz
sudo rm -f netboot.tar.gz
else
echo "Arquivos já extraídos, pulando extração."
fi
#echo "Copiando preseed.cfg para $BOOT_DIR..."
#if [ -f "$PRESEED_DIR/preseed.cfg" ]; then
# sudo cp "$PRESEED_DIR/preseed.cfg" "$BOOT_DIR"
#else
# echo "Arquivo preseed.cfg não encontrado em $PRESEED_DIR" >&2
# exit 1
#fi
echo "Criando PRESEED em $BOOT_DIR/preseed.cfg..."
sudo tee "$BOOT_DIR/preseed.cfg" > /dev/null <<'EOF'
#_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/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 e senha ###
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
### Garante que os módulos btrfs e xfs estarao disponiveis antes do particionamento ###
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 ###
### Substitua a chave ssh publica que deverá ser gerada no servidor e copiada do ###
### arquivo /home/kluster/.ssh/id_ed25519.pub para o primeiro echo abaixo entre aspas ###
d-i preseed/late_command string \
mkdir -p /target/root/.ssh; \
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFcx6e2Zcm4agOhhb0h2hgHKEAYPCsHnTyOsipaNySEu 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/klustoer; \
chmod 0440 /etc/sudoers.d/klustoer'
EOF
echo "Criando script iPXE em $BOOT_DIR/debian.ipxe..."
sudo tee "$BOOT_DIR/debian.ipxe" > /dev/null <<'EOF'
#!ipxe
dhcp
echo "Obtido IP via DHCP!"
kernel http://192.168.1.3/boot/debian-installer/amd64/linux auto=true priority=critical netcfg/get_hostname=no01 netcfg/get_domain=localdomain ---
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz
boot
EOF
echo "Baixando ipxe.lkrn para $TFTP_DIR..."
if [ ! -f "$TFTP_DIR/ipxe.lkrn" ]; then
sudo wget -q --show-progress https://boot.ipxe.org/ipxe.lkrn -O "$TFTP_DIR/ipxe.lkrn"
else
echo "ipxe.lkrn já existe em $TFTP_DIR, pulando download."
fi
echo ""
echo "Tudo pronto!"
echo ""
3- EMBED-PRESEED.SH
#!/bin/bash
set -e
### Use: sudo ./embed-preseed.sh
# === CONFIGURAÇÕES ===
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 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 criado com sucesso!"
echo "Local: $OUTPUT_INITRD"
echo
Vamos às considerações finais onde tem o arquivo preseed comentado com explicações importantes.
CONSIDERAÇÕES FINAIS
Caso você queria somente instalar o Debian customizado em uma única máquina opte pela instalação com a ISO (CUSTOMIZANDO A INSTALAÇÃO 1).
Talvez tenha ficado algum erro menor ou outro em algum script, procurei testar todos antes de postar, porém, como se trata de um artigo extenso e um pouco complexo, mesmo tendo esmero na realização, ainda assim pode escapar alguma coisa.
Caso a execução de algum script incorra em erro para você, observe o que o erro diz e caso tenha sido um erro seu de digitação ou um erro de formatação ao copiar e colar procure corrigir você mesmo ou poste nos comentários.
Darei algumas explicações sobre preseed, na medida do possível.
Nas referências logo abaixo tem material suficiente para você ter uma boa base, apesar da documentação escassa em alguns pontos cruciais.
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.
Preseed Embutido
Embutir o preseed.cfg diretamente no initrd.gz quando for via PXE e/ou iPXE e preseed embutido na imagem ISO quando for via pendrive, garante que o instalador sempre o carregue — independentemente da forma como o sistema inicializa, porém, em instalações em rede com muitos computadores torna-se contraproducente porque terá de fazer o processo de embutimento a cada instalação.
Por isso, para instalações em rede opte pelo MÉTODO 2 na seção CUSTOMIZANDO A INSTALAÇÃO 6.
Durante a instalação você notará que mesmo com o preseed embutido no initrd.gz, quase ao final da instalação aparecerá uma mensagem "Executando o preseed..." ou algo parecido, porém, essa mensagem diz respeito somente aos comandos pós-instalação (late_command).
Para saber se tudo está correndo bem na instalação via iPXE com preseed embutido, observe logo no começo durante a instalação se o particionamento aplicado corresponde ao do preseed.
Particionamento: ponto crítico:
O expert_recipe é extremamente sensível à formatação.
Algumas observações práticas:
-Não use tabulações, apenas espaços simples;
-Jamais deixe espaços em branco no final das linhas;
-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.
Observações Finais
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.
Não mostrei aqui como configurar mirrors no servidor com esse mesmo esquema apache2/dhcp/tftpd, ou seja, como transformar o servidor em um espelho interno com os pacotes sempre atualizados para que não dependa tanto da internet ao instalar/reinstalar os sistemas na rede.
Trabalhando com imagens ISO e PXE/iPXE você pode instalar Windows na sua rede, bastando para isso utilizar a própria imagem original do Windows e modificar ela com o NTLite:
Apesar de que para instalação em massa do Windows via rede interna o mais aconselhado é criar uma imagem com o Clonezilla (que é baseado no Debian) e instalar em vários computadores ao mesmo tempo com o próprio Clonezilla:
d-i significa Debian Installer.
PRESEED explicado
Abaixo repito o preseed, comentado, onde tem as seções em sequência com o título de cada configuração.
#_preseed_V1
###Preseed para boot PXE sem Interface Grafica###
Este é o preseed ##
O preseed segue uma sequência rígida que é pouco documentada e se você inverte alguma posição a instalação falha silenciosamente. O que se percebe é que, basicamente, a sequência das opções no preseed deve seguir a ordem do instalador do Debian, ou seja, a mesma ordem caso você fizesse tudo manualmente, o instalador pergunta primeiro o local, depois a linguagem e assim por diante.
### 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
Na configuração da rede torna-se imprescindível estabelecer os DNSs, pois senão a instalação pode falhar com a mensagem de que não foi possível encontrar o espelho de rede e dá várias opções incertas do que pode ter acontecido.
### 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
As configurações de usuário e senha são tranquilas e nunca deram problema.
### 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
Caso tenha algum módulo/pacote/programa extra para instalar e pré-carregar coloque nesta parte.
### Instala e pre-carrega os modulos necessarios ###
d-i anna-install string btrfs-modules xfs-modules
Você pode criar vários early_command (pré-comandos), somente no caso de módulos extras tenha o cuidado colocar os módulos numa ordem lógica, senão a instalação falha caso você carregar um módulo antes de outro módulo que dependa deste.
Como utilizei btrfs na partição raiz fez-se necessário habilitar o módulo específico.
Com btrfs na partição raiz é obrigatório ter antes uma partição /boot bootável senão a instalação falha dizendo que não foi possível definir uma partição raiz.
Com o xfs, talvez por ser mais antigo, não é tão necessário, mas coloquei como garantia:
d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true
### Configura o particionamento automatico ###
No particionamento por preseed não pode ter espaços em branco após as linhas, procure evitar tabulação, use somente espaçamento com a barra de espaços e não pode ter comentários no esquema de particionamento.
Pode se observar que evitei colocar acentuação até nos comentários de todo o preseed.
A opções abaixo definem o método de particionamento:
regular: partições usuais para a arquitetura instalada;
lvm: para partições LVM;
crypto: para partições LVM com encriptação.
Podemos definir três tipos de receitas (recipe) pré-definidas:
atomic: todo o particionamento numa única partição;
home: partição /home separada;
multi: partições /home, /var e /tmp separadas.
E podemos também definir a nossa receita de particionamento, no caso, repete-se o nome que vem logo depois da linha "d-i partman-auto/expert_recipe string" que está em seguida:
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root
A partir daqui começa o recipe (receita) de particionamento.
Pode colocar em uma linha lógica só, sem barras no final, mas por uma questão de organização fica melhor com barras ao final de cada linha, porém, não abuse das barras, entre o final e a barra deve ter um espaço em branco e não pode ter espaço em branco após cada barra.
A receita segue uma ordem específica: a partição /boot ou /raiz (caso a partição /boot fique junto com a raiz) devem vir por primeiro e depois a swap.
Depois da swap vem as outras partições.
No caso eu "fechei" o disco colocando 4 partições primárias, mas pode criar partições lógicas.
O parâmetro $bootable{ } é o mesmo que "flag inicializável ligado" da instalação gráfica e só pode ter uma única partição bootável, caso você colocar duas ou mais o instalador falhará.
Os valores do tamanho de cada partição deve ser preferencialmente em MB (MegaBytes).
Entre as chaves sempre deve ter um espaço em branco não importando se tem escritos dentro das chaves, senão a instalação falha silenciosamente.
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{ / } . \
Nesta parte abaixo os parâmetros 512 e -1 significam que é para utilizar todo o espaço vazio restante do SD/HD na partição ali definida com um mínimo de 512 MB, ou seja, a partição começará com 512 MB e ocupará todo o restante do disco.
O parâmetro mountpoint é o mesmo que escolher o tipo de partição ou "Definir manualmente a partição" ou algo parecido na instalação gráfica.
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
Esta parte instala a interface gráfica e pacotes/programas extras, como se pode perceber.
A linha tasksel destina-se aos pacotes básicos padrões do Debian.
A linha "d-i pkgsel" destina-se mais aos pacotes/programas adicionais/extras.
Na seção CUSTOMIZANDO A INSTALAÇÃO 1 tem mais algumas explicações logo no começo.
### 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
Repetindo as linhas com instalação de interface gráfica, no caso, o Cinnamon:
### Pacotes ###
tasksel tasksel/first multiselect standard, cinnamon-desktop, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools mousepad aptitude libu2f-udev gnome-terminal firefox-esr console-setup keyboard-configuration console-data
Aqui instala-se o GRUB na partição /dev/sda ou default.
Coloquei default mesmo tendo um único disco, porém, com dois ou mais discos é necessário ser default porque daí o GRUB será instalado no mesmo disco onde o particionamento recebeu a partição /boot bootável ou a partição raiz bootável.
### GRUB ###
d-i grub-installer/bootdev string default
Neste parâmetro dizemos ao instalador para não perguntar e não parar a instalação com "Retire o disco de instalação e clique em Continuar" ou algo parecido.
### Finalizacao ###
d-i finish-install/reboot_in_progress note
Aqui temos os comandos pós-instalação onde faz-se as configurações extras ou reforça-se alguma configuração cujos d-i não satisfizeram, por exemplo, as configurações de teclado abnt2 tiveram de ser feitas aqui porque os parâmetros ## Configuracoes de teclado ### não foram aplicados, porém, caso se comentar os parâmetros o instalador para e pergunta as opções de teclado, não sei explicar o porquê disso.
### Comandos pos-instalacao ###
d-i preseed/late_command string \
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'
Aqui tem o exemplo oficial (mas deficiente) do Debian:
Referências