Criação da imagem QCOW2 base para o LAB

1. Objetivo

Antes de criar as máquinas do laboratório, precisamos de uma imagem-base comum.

A proposta é criar uma imagem Alpine Linux mínima que possa ser utilizada por todas as VMs do projeto. Essa imagem deve conter somente o que é comum a todas as máquinas, enquanto as configurações específicas de cada função serão aplicadas posteriormente por scripts externos.

2.1. Preparação do ambiente

Primeiro, baixar a imagem ISO do Alpine Linux destinada a ambientes virtualizados.

wget https://dl-cdn.alpinelinux.org/alpine/v3.24/releases/x86_64/alpine-virt-3.24.1-x86_64.iso
2.2 Criação do disco QCOW2

Criar o disco que será utilizado para instalar o sistema:

qemu-img create -f qcow2 base_alpine.qcow2 1G
2.3. Primeira inicialização do QEMU

A VM é iniciada utilizando o disco recém-criado e a ISO do Alpine:

#!/bin/bash

qemu-system-x86_64 \
  -enable-kvm \
  -m 256 \
  -smp 1 \
  -drive file=base_alpine.qcow2,format=qcow2 \
  -nic user,id=rt0,model=virtio,mac=52:54:00:00:01:01 \
  -cdrom alpine-virt-3.24.1-x86_64.iso \
  -boot d
2.4. Instalação do Alpine

Com o Alpine iniciado, configurei apenas o teclado para o padrão ABNT, o repositorio para o mais rapido e instalei o sistema no disco.

setup-keymap
setup-apkrepos
setup-disk
2.5. Primeiro marco da imagem

Depois da instalação, a VM é desligada.

Nesse momento temos o primeiro estado estável da imagem:

base_alpine.qcow2

  • Alpine instalado
  • teclado configurado
  • repositórios configurados
  • sistema inicial funcionando

Então criamos o primeiro snapshot interno:

qemu-img snapshot -c snapshot_01 base_alpine.qcow2

Esse snapshot representa o primeiro marco do desenvolvimento da imagem.

A partir daqui, o laboratório passa a ter uma referência do estado inicial funcional do sistema.

2.6. Separação entre sistema e configuração

Fiz a configuração voltada a executar scripts externos montados internamente via virtio-9p. Criei o script principal que irá execurar os outros realizando todas as configurações ao iniciar a VM. Em vez de colocar todos os scripts de configuração diretamente dentro da imagem, eles ficam fora da imagem, no diretório do laboratório.

vi /etc/local.d/00_config.start
#!/bin/sh
mount -t 9p -o trans=virtio scripts_config /mnt/config
/mnt/config/config.sh
umount /mnt/config
mkdir -p /mnt/config
chmod +x /etc/local.d/00_config.start

Habilitei o serviço que inicia os scripts após o boot

rc-update add local default

Agora todos os scripts externos com as configuraçoes serão executados internamente, o objetivo é ter um sistema onde posso errar e consertar as configuraçoes apenas alterando o script de configuraçoes externo e reiniciando a VM. A persistencia das configuraçoes existem apenas no script externo, isso me permite ter 30 VMs rodando ao mesmo tempo com a mesma imagem QCOW2.

2.7 Finalização da imagem

E agora um segundo snapshot fechando esse ciclo de criação da imagem base

qemu-img snapshot -c snapshot_02 base_alpine.qcow2

Exemplo do script base da VM.

#!/bin/bash

qemu-system-x86_64 \
  -enable-kvm \
  -m 256 \
  -smp 1 \
  -drive file=base_alpine.qcow2,format=qcow2 \
  -nic user,id=rt0,model=virtio,mac=52:54:00:00:01:01 \
  -virtfs local,path=.,mount_tag=scripts_config,security_model=none \
  --snapshot

Esse modelo permite executar múltiplas VMs simultaneamente utilizando a mesma imagem-base, já que as alterações de cada execução são mantidas separadamente e não são gravadas no QCOW2 original. Como todo o LAB é tentativa e erro acredito que ainda possam existir novas alterações na imagem base, com melhorias e atualizações, pois o parametro  --snapshot no script de execução da VM gera um consumo de RAM mais alto e muitas alterações em uma unica inicialização podem tornar meus 16GB insuficientes.