Customizar a Instalação do Linux Debian com Preseed

Entenda como customizar/personalizar a imagem ISO, configurar o arquivo /etc/network/interfaces, /etc/sudoers (além de outros), acoplar programas, etc, em suma: customizar a ISO para instalar seu Debian personalizado tanto em um único computador quanto em rede.

[ Hits: 416 ]

Por: Buckminster em 28/07/2025


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:
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.
Página anterior     Próxima página

Páginas do artigo
   1. INTRODUÇÃO
   2. CUSTOMIZANDO A INSTALAÇÃO 1
   3. CUSTOMIZANDO A INSTALAÇÃO 2
   4. CUSTOMIZANDO A INSTALAÇÃO 3
   5. CUSTOMIZANDO A INSTALAÇÃO 4
   6. CUSTOMIZANDO A INSTALAÇÃO 5
   7. CUSTOMIZANDO A INSTALAÇÃO 6
   8. CONSIDERAÇÕES FINAIS
Outros artigos deste autor

Instalação do Ventoy, programa para criar pendrives inicializáveis

Instalação do PostgreSQL com Apache 2, PHP 5, OpenSSL no Debian Wheezy 7.7 64 bits com systemd e chroot

Como um monte de letras de um código fonte transforma-se em voltagens?

Enviar mensagem ao usuário trabalhando com as opções do php.ini

Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg

Leitura recomendada

Instalando o Nagios no Ubuntu Linux

Instalando placa wireless Intel 3945ABG no Debian

Configurando o NSCA no Nagios

Timezones - Uma questão de ponto de vista

Configurando o Bandwithd (monitoração gráfica)

  
Comentários
[1] Comentário enviado por Zoiudo em 28/07/2025 - 16:24h

@Buckminster, tem que falar isso (agradecer a IA) praquele cara que postou que estava com problema na máquina e não quis testar recomendações dadas "porque eram de IA"; deve estar f*did* até agora, hehehe...


#
##
###
#### Conhecimento não vem de graça, valorize o aprendizado e a ajuda recebida! ####



#
##
###
#### Conhecimento não vem de graça, valorize o aprendizado e a ajuda recebida! ####

[2] Comentário enviado por Buckminster em 28/07/2025 - 20:55h

Aqui a formatação dos scripts e do artigo ficaram um pouco melhor:
https://julioseibei.blogspot.com/2025/07/customizar-instalacao-do-linux-debian.html


[b]_________________________________________________________[/b]
[i]Rule number one: Always listen 'to' Buck![/i]
Enquanto o cursor estiver pulsando, há vida!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts