Este guia demnostra como preparar um ambiente de instalação automatizada de máquinas virtuais KVM utilizando boot pela rede (PXE) em um servidor CentOS 7. O processo envolve configurar serviços como DHCP, TFTP e um servidor web para disponibilizar os arquivos de instalação do sistema operacional.
- Preparação do Ambiente e Instalação dos Pacotes Base
# Instalar os componentes necessários
yum install -y nginx dhcp tftp-server syslinux
# Montar a imagem ISO do CentOS 7
mkdir -p /mnt/centos7
mount -o loop /opt/imagens/CentOS-7-x86_64-DVD-1810.iso /mnt/centos7
# Iniciar e habilitar o serviço TFTP
systemctl start tftp.socket
systemctl enable tftp.socket
- Configuração do Servidor DHCP
Copie o modelo de configuração e adapte-o para a sua rede:
# Copiar o arquivo de exemplo
cp /usr/share/doc/dhcp-*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
# Editar a configuração principal do DHCP
cat > /etc/dhcp/dhcpd.conf << 'EOF'
default-lease-time 900;
max-lease-time 10800;
authoritative;
subnet 10.0.50.0 netmask 255.255.255.0 {
range dynamic-bootp 10.0.50.100 10.0.50.150;
option routers 10.0.50.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
next-server 10.0.50.10;
filename "pxelinux.0";
}
EOF
# Reiniciar o serviço DHCP
systemctl restart dhcpd
systemctl enable dhcpd
Certifique-se de que o campo next-server aponte para o endereço IP do servidor TFTP e que filename especifique o bootloader PXE correto.
- Preparação do Diretório TFTP e Arquivos de Boot
# Criar a estrutura de diretórios do TFTP
mkdir -p /var/lib/tftpboot/pxelinux.cfg
# Copiar os arquivos de boot do instalador
cp /mnt/centos7/images/pxeboot/vmlinuz /var/lib/tftpboot/
cp /mnt/centos7/images/pxeboot/initrd.img /var/lib/tftpboot/
# Copiar o bootloader PXE do syslinux
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# Copiar também os arquivos auxiliares do menu
cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/
cp /usr/share/syslinux/libutil.c32 /var/lib/tftpboot/
cp /usr/share/syslinux/libcom32.c32 /var/lib/tftpboot/
- Definição do Menu de Inicialização PXE
cat > /var/lib/tftpboot/pxelinux.cfg/default << 'EOF'
UI menu.c32
PROMPT 0
TIMEOUT 50
MENU TITLE Instalacao Remota CentOS 7
LABEL centos7_auto
MENU LABEL ^Instalar CentOS 7 (Automatizado)
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=http://10.0.50.10/repos/centos7 inst.ks=http://10.0.50.10/kickstart/ks7.cfg net.ifnames=0 biosdevname=0
LABEL centos7_manual
MENU LABEL ^Instalar CentOS 7 (Manual)
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=http://10.0.50.10/repos/centos7 net.ifnames=0 biosdevname=0
EOF
Os parâmetros net.ifnames=0 e biosdevname=0 restauram a nomenclatura tradicional das interfaces de rede (eth0, eth1, etc.), facilitando a automação em ambientes com múltiplas placas de rede.
- Configuração do Servidor Web (Nginx) para Distribuição dos Arquivos
# Criar o diretório para o repositório de pacotes
mkdir -p /usr/share/nginx/html/repos/centos7
# Montar a ISO dentro do diretório do servidor web
mount -o loop /opt/imagens/CentOS-7-x86_64-DVD-1810.iso /usr/share/nginx/html/repos/centos7
# Criar o diretório para arquivos kickstart
mkdir -p /usr/share/nginx/html/kickstart
Para habilitar a listagem de diretórios no Nginx, adicione as seguintes diretivas dentro do bloco server em /etc/nginx/nginx.conf:
server {
listen 80;
server_name _;
location /repos/ {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /kickstart/ {
autoindex on;
types { text/plain cfg; }
}
}
Reinicie o Nginx para aplicar as alterações:
nginx -t && systemctl restart nginx
systemctl enable nginx
- Criação do Arquivo Kickstart para Instalação Automatizada
Salve o conteúdo abaixo em /usr/share/nginx/html/kickstart/ks7.cfg:
# Gerado para instalacao automatizada do CentOS 7
install
text
lang pt_BR.UTF-8
keyboard br-abnt2
timezone America/Sao_Paulo --isUtc
# Rede configurada via DHCP na primeira interface
network --bootproto=dhcp --device=eth0 --onboot=yes --activate
# Repositorio dos pacotes via HTTP
url --url="http://10.0.50.10/repos/centos7"
# Seguranca
rootpw --iscrypted $6$SaltExemplo$HashGeradoAqui
selinux --disabled
firewall --enabled --service=ssh
# Particionamento do disco
zerombr
clearpart --all --initlabel
bootloader --location=mbr
part /boot/efi --fstype="efi" --size=200 --ondisk=sda
part /boot --fstype="xfs" --size=300 --ondisk=sda
part pv.01 --size=1 --grow --ondisk=sda
volgroup vg_sistema pv.01
logvol / --vgname=vg_sistema --size=8192 --name=lv_root --fstype=xfs
logvol swap --vgname=vg_sistema --size=2048 --name=lv_swap
logvol /var --vgname=vg_sistema --size=4096 --name=lv_var --fstype=xfs
# Reiniciar apos a instalacao
reboot
# Pacotes a serem instalados
%packages
@core
@base
vim-enhanced
net-tools
wget
htop
iotop
%end
# Scripts executados ao final da instalacao
%post --log=/root/ks-post.log
#!/bin/bash
echo "Executando configuracoes pos-instalacao..."
# Baixar e executar script de inicializacao do sistema
curl -sL http://10.0.50.10/scripts/init_system.sh -o /tmp/init_system.sh
chmod +x /tmp/init_system.sh
/tmp/init_system.sh
%end
- Criação da Máquina Virtual KVM com Boot via Rede
Utilize o comando virt-install para provisionar a VM diretamente a partir do repositório remoto:
virt-install \
--name vm_centos7_web01 \
--virt-type kvm \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm_centos7_web01.qcow2,size=40,format=qcow2 \
--network bridge=br-mgmt,model=virtio \
--os-type linux \
--os-variant centos7.0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--extra-args="inst.ks=http://10.0.50.10/kickstart/ks7.cfg console=ttyS0,115200n8" \
--location=http://10.0.50.10/repos/centos7 \
--wait -1
- Cuidados Importantes
- Espaço em disco da VM: A partição raiz deve ter no mínimo 2 GB; caso contrário, o instalador pode falhar com erros de espaço insuficiente durante a extração de pacotes.
- Partição /boot: Aloque pelo menos 300 MB; partições menores podem interromper o processo de instalação e exigir intervenção manual.
- Sincronia de hora: Configure NTP no servidor PXE para evitar problemas com certificados TLS durante a transferência de arquivos via HTTPS.
- Firewall: Certifique-se de que as portas 67/68 (DHCP), 69 (TFTP) e 80 (HTTP) estejam abertas no firewall do servidor.
# Abrir as portas necessarias no firewall
firewall-cmd --permanent --add-service=dhcp
firewall-cmd --permanent --add-service=tftp
firewall-cmd --permanent --add-service=http
firewall-cmd --reload