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: 373 ]

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

Problema no GRUB no Debian Squeeze 6.0.7 [Resolvido]

Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla

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

Compilação de Kernel

Resolver problemas de Internet

Leitura recomendada

Ubuntu 18.04 LTS - LAMP - Linux, Apache, MySQL ou MariaDB, PHP 7.2

Instalação de servidor Slackware 10.2

Como configurar o Apache com PHP e SSL de um jeito mais seguro e sem complicações

Eu cavo, tu cavas, ele cava... tutorial de DIG

Teste de estresse entre software livre e soluções proprietárias

  
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