Skip to main content

Criando sua Imagem de Cloud do Zero com Libvirt

Este método permite criar uma imagem customizada modificando uma imagem oficial de nuvem já existente.Utilizaremos o Libvirt e suas ferramentas (virt-manager) para este guia.

Ubuntu24.04

Neste exemplo, iremos modificar a imagem do Ubuntu 24.04 LTS e instalaremos o Gerenciador de Containers e máquinas virtuais Incus para simular uma aplicação de usuário.

Passo 1: Baixar a imagem base

  • Primeiro, baixe a imagem oficial de cloud do Ubuntu. Em seguida, utilize o qemu-img para criar uma cópia da imagem base, que será o disco da sua nova máquina virtual. Você deve criar uma cópia para que a imagem original permaneça intacta.

    wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
    qemu-img create -f qcow2 -F qcow2 -b noble-server-cloudimg-amd64.img custom-ubuntu.qcow2

Passo 2: Crie um arquivo ISO com o user-data

  • Para garantir que o cloud-init configure a sua máquina virtual com a sua chave SSH na primeira inicialização, você precisa criar um arquivo .iso com as informações do usuário.

  • A ferramenta padrão para essa tarefa é o genisoimage (ou mkisofs).

  • Em um diretório temporário, crie um arquivo chamado meta-data (que pode ficar vazio) e um arquivo chamado user-data com o seguinte conteúdo:

    Dica

    Certifique-se de substituir ssh-rsa AAA... pela sua chave SSH pública.

    #cloud-config
    users:
    - name: ubuntu
    groups: sudo
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
    - ssh-rsa AAA...
  • No exemplo usado, foi criado um diretório chamado cloud-init/ contendo os arquivos mencionados acima:

    tree .          
    .
    ├── cloud-init
    │ ├── meta-data
    │ └── user-data
    ├── custom-ubuntu.qcow2
    └── noble-server-cloudimg-amd64.img

    2 directories, 4 files
  • Use o comando genisoimage para criar o arquivo .iso a partir desses arquivos. A flag \-r preserva permissões de leitura, e a \-V define o rótulo do volume, que é importante para que o cloud-init o detecte.
    Exemplo:

    $ genisoimage -o user-data.iso -V cidata -r cloud-init/
  • Para testar a imagem .iso gerada, podemos montar essa imagem em um diretório auxiliar e verificar o conteúdo:

    mkdir -p iso/
    sudo mount user-data.iso -o loop iso/
    cat iso/user-data
    #cloud-config
    users:
    - name: ubuntu
    groups: sudo
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
    - ssh-rsa AAA...
  • Este arquivo user-data.iso será utilizado como um disco anexado à sua VM na próxima etapa para que ela se configure automaticamente.

Passo 3: Iniciar a VM no virt-manager

  • Utilize o virt-install ou a interface gráfica do virt-manager para iniciar uma máquina virtual usando a imagem custom-ubuntu.qcow2 como disco.

  • O virt-install permitirá que você injete uma chave SSH e configure o cloud-init na primeira inicialização da VM, tornando o processo de configuração inicial mais seguro e simples.

  • Após abrir o virt-manager clique em “Create a new virtual machine”:

    Criar nova VM
  • Em seguida selecione “Import existing disk image”:

    Importar imagem existente
  • Selecione o disco custom-ubuntu.qcow2 criado nos passos anteriores:

    Selecionar disco
  • No “step 3”, selecione a quantidade de RAM e de CPU’s a serem utilizados. Para o nosso exemplo 2GB de RAM e 2 vCPU são mais que suficientes:

    Selecionar quantidade RAM e CPU
  • Nesse momento iremos adicionar o arquivo user-data.iso na VM. Para isso selecione a checkbox “Customize configuration before install” e clique em “Finish”:

    Selecionar arquivo
  • Clique no botão “Add Hardware”, selecione “Storage, selecione a checkbox “Select or create a custom storage”, clique em “Manage” e “Browse Local” para encontrar o arquivo user-data.iso criado nos passos anteriores.

  • Altere o “Device type” para “CDROM device” e clique em “Finish”:

    Selecionar device type
  • Para finalizar clique em “Begin Installation” no topo superior direito da aplicação:

    Iniciar instalação
  • Após esses passos a máquina virtual irá inicializar, e através do IP da máquina é possível se conectar a mesma via SSH:

    Inicialização VM
  • (Opcional): Customização do sistema: Dentro da VM que acabou de ser criada, você pode instalar e configurar os pacotes necessários. Neste caso, para o gerenciador de containers e VMs Incus, execute os seguintes comandos no terminal da sua máquina virtual:

    sudo apt update
    sudo apt install -y incus
    sudo incus admin init --auto

Passo 4: Generalizar a imagem

  • Essa é a etapa mais crítica do processo, pois a generalização remove informações específicas da máquina que poderiam causar conflitos quando a imagem for instanciada na Magalu Cloud.

  • Para generalizar a imagem, basta executar estes comandos na VM:

    # Remove SSH keys, logs, and temp data.
    $ sudo rm -f /etc/ssh/ssh_host_*
    $ sudo rm -f /root/.ssh/authorized_keys /home/ubuntu/.ssh/authorized_keys
    $ sudo rm -rf /tmp/* /var/tmp/* /var/lib/cloud/seed/nocloud-net/
    # Clean cloud-init logs
    $ sudo cloud-init clean --logs
    # Clean the /etc/machine-id files
    $ sudo sh -c 'echo -n > /etc/machine-id && rm -f /var/lib/dbus/machine-id'
    # Clean apt downloaded packages
    $ sudo apt-get clean
    $ sudo rm -rf /var/lib/apt/lists/*
    # Remove bash history
    $ sudo rm -f /root/.bash_history /home/ubuntu/.bash_history
    # Poweroff
    $ sudo systemctl poweroff

Passo 5: Converter para imagem final

  • Após generalizar a imagem, e desligar a VM, execute o comando qemu-img convert para criar a imagem final, removendo o vínculo com a imagem de base e criando um arquivo .qcow2 final, otimizado para o ambiente de produção.

    qemu-img convert -f qcow2 -O qcow2 -o compat=1.1,lazy_refcounts=off custom-ubuntu.qcow2 final-incus-image.qcow2

    Agora sua imagem .qcow2 está pronta para ser importada na Magalu Cloud.

Importante

Para garantir que sua imagem esteja compatível com a plataforma revise os Pré-requisitos obrigatórios de importação. Para otimizar desempenho, segurança e manutenção das suas imagens, consulte também o Guia de Boas Práticas de Imagens Customizadas.