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

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

Instalação do PAP (PostgreSL, Apache2 e PHP7) no Debian Jessie

Criar entrada (menuentry) ISO no Grub

Compilação do Squid 3 no Debian Wheezy

ClamAV, o kit de ferramentas antivírus

Atualizar o macOS no Mac - Opencore Legacy Patcher

Leitura recomendada

Gerenciamento centralizado de usuários de rede com GOSA

Instalando Servidor ELASTIX (PABX-IP)

Configurando o CACIC (parte 4)

Instalação dos servidores web Apache e Thttpd no Debian Linux

Apache + Virtual Host + DNS no Debian Lenny

  
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