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:
https://ipxe.org/
https://boot.ipxe.org/
https://ipxe.org/docs
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:
https://www.blogger.com/blog/post/edit/6574197232745836823/3517909214014597510#
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.