Configurando Instalação Remota de Máquinas Virtuais KVM via Rede no CentOS 7

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.

  1. 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

  1. 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.

  1. 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/

  1. 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.

  1. 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

  1. 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

  1. 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

  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

Tags: CentOS 7 PXE Boot kvm virtualização Kickstart

Publicado em 6-24 21:28