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

Por: Buckminster em 28/07/2025


CUSTOMIZANDO A INSTALAÇÃO 4



Sequência de scripts

Toda a instalação explicada na página anterior pode ser feita automatizada com a sequência de scripts a seguir.
Ao final da página 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.
CUSTOMIZANDO A INSTALAÇÃO 4
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


### Altere para o teu ambiente ###

Caso utilizar IP fixo por MAC no DHCP comente as 2 linhas do range ##



e mais abaixo na subnet do DHCP comente a linha range $DHCP_RANGE_START $DHCP_RANGE_END; ##

##PRESEED_PATH="/home/usuario/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

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
Aqui imagem diretorios.jpg

Estrutura do Apache (/var/www/html/boot)
CUSTOMIZANDO A INSTALAÇÃO 4
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.
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

Compilando kernel no Debian Squeeze

Compilação do Kernel

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

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

Descritores de Arquivos e Swappiness

Leitura recomendada

Dhcp3-server e Bind9 no Debian 4 Etch Linux

Personalizando um DVD de instalação do Ubuntu Linux

Turbinando o Openbox nativo do Debian 10 LXDE

Instalando e configurando um Webserver

Como fazer: Chroot Dosemu (Clipper no Linux)

  
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