Configurar recursos de máquinas virtuais com libvirt

LinuxBeginner
Pratique Agora

Introdução

A administração de máquinas virtuais envolve mais do que criar e iniciar um domínio. Frequentemente, os operadores assumem o controle de uma VM existente e precisam alterar sua definição persistente de recursos: aumentar a memória, disponibilizar CPUs virtuais adicionais, anexar armazenamento, ativar a inicialização automática e comprovar que o estado em execução corresponde à configuração solicitada.

Na terminologia do libvirt, uma máquina virtual é um domínio. Um domínio persistente possui uma definição salva — conceitualmente, seu projeto de hardware — mesmo quando nenhum processo QEMU está em execução. Iniciar o domínio cria uma instância em execução a partir dessa definição; interrompê-lo remove a instância em execução, mas preserva o projeto. Manter a configuração persistente separada do estado de execução é a ideia central deste laboratório.

Neste laboratório, um domínio libvirt desligado chamado lfcs-config já está definido com um pequeno disco de inicialização, 64 MiB de memória e uma vCPU. Você inspecionará essa configuração inicial e usará comandos de gerenciamento de recursos do virsh para reconfigurá-la. O ambiente não disponibiliza /dev/kvm, portanto o QEMU usa emulação por software, e os discos não contêm um sistema operacional convidado. Ainda assim, o fluxo de gerenciamento e a configuração persistente do libvirt são reais.

Inspecionar a configuração existente do domínio

Nesta etapa, você verificará a configuração persistente e o estado de execução do domínio lfcs-config antes de fazer alterações.

Acesse o diretório do projeto.

cd /home/labex/project

Liste todos os domínios. A opção --all inclui os domínios interrompidos, portanto lfcs-config deverá aparecer no estado shut off.

sudo virsh list --all

Sem --all, virsh list normalmente exibe apenas os domínios ativos. Ver um nome interrompido na lista expandida confirma que o libvirt ainda conhece sua definição persistente, embora a VM não esteja consumindo tempo de CPU como um convidado em execução.

Inspecione o resumo do domínio.

sudo virsh dominfo lfcs-config

dominfo reúne informações sobre identidade, ciclo de vida, CPU, memória, persistência e inicialização automática. Neste momento, interprete esses dados como uma referência inicial, não como o estado final: a saída posterior deverá mudar apenas nos campos que você reconfigurar deliberadamente.

Concentre-se nos campos estáveis da configuração:

Name:           lfcs-config
State:          shut off
CPU(s):         1
Max memory:     65536 KiB
Used memory:    65536 KiB
Persistent:     yes
Autostart:      disable

O libvirt informa a memória em KiB neste ponto. Como 1 MiB equivale a 1024 KiB, 65536 KiB corresponde a 64 MiB. Persistent: yes significa que a definição permanece após o desligamento, enquanto Autostart: disable indica que o libvirt não iniciará automaticamente esse domínio quando o serviço de virtualização for iniciado.

Liste os dispositivos de bloco anexados. vda é o disco raiz preparado, e sua origem é a imagem qcow2 existente.

sudo virsh domblklist lfcs-config --details

Nesta tabela, Target é o nome do dispositivo apresentado ao convidado, enquanto Source é o caminho no host onde os dados são armazenados. O disco virtio chamado vda é equivalente a uma unidade virtual conectada à VM; o arquivo de origem qcow2 é a imagem de suporte dessa unidade no host.

Essa referência inicial separa o que já existe das alterações de recursos que serão feitas nas etapas seguintes.

Configurar memória persistente e vCPUs

Nesta etapa, você aumentará a memória máxima persistente, a alocação de memória atual e o número de vCPUs do domínio enquanto ele estiver desligado.

O libvirt diferencia o limite máximo de memória da quantidade atribuída na próxima inicialização. Primeiro, defina o máximo persistente como 128 MiB. A opção --config altera a definição salva do domínio, em vez de um valor temporário de execução.

sudo virsh setmaxmem lfcs-config 128M --config

O limite deve ser suficientemente grande para comportar a quantidade atribuída. Pense em max memory como a capacidade de memória da máquina virtual e em current memory como a quantidade solicitada para uso normal. Como o domínio está desligado, alterar a configuração com --config é previsível e terá efeito na próxima inicialização.

Defina a memória atribuída na próxima inicialização como 96 MiB.

sudo virsh setmem lfcs-config 96M --config

O sufixo M instrui o virsh a interpretar o valor em mebibytes. Mais adiante, a saída de dominfo converterá 128 MiB em 131072 KiB e 96 MiB em 98304 KiB; são as mesmas quantidades expressas em unidades diferentes.

O número máximo de vCPUs deve ser aumentado antes que a alocação persistente atual possa usar duas CPUs.

sudo virsh setvcpus lfcs-config 2 --config --maximum

Este primeiro comando de CPU altera o limite superior na definição salva. Ele não atribui, por si só, duas vCPUs utilizáveis. Separar o máximo da alocação ativa permite que uma definição de VM reserve capacidade para expansão futura.

Defina duas vCPUs para a próxima inicialização.

sudo virsh setvcpus lfcs-config 2 --config

O segundo comando define a alocação persistente dentro do novo limite. A ordem é importante: solicitar duas vCPUs atribuídas enquanto o máximo ainda for uma fará a operação falhar.

Inspecione a definição persistente atualizada.

sudo virsh dominfo lfcs-config

Os campos relevantes deverão agora exibir:

CPU(s):         2
Max memory:     131072 KiB
Used memory:    98304 KiB

Criar e anexar um disco de dados persistente

Nesta etapa, você criará uma segunda imagem qcow2 e a anexará como um disco virtio persistente chamado vdb.

Crie uma imagem qcow2 esparsa de 64 MiB no diretório de imagens do libvirt.

sudo qemu-img create -f qcow2 /var/lib/libvirt/images/lfcs-config-data.qcow2 64M

O comando cria um contêiner de disco virtual, não um sistema de arquivos nem um diretório montado. -f qcow2 seleciona o formato de imagem copy-on-write do QEMU, e 64M define sua capacidade virtual. Inicialmente, uma imagem esparsa recém-criada ocupa muito menos armazenamento no host do que seu tamanho virtual e cresce conforme os dados são gravados pelo convidado.

Permita que o processo QEMU deste ambiente de treinamento abra a imagem descartável.

sudo chmod 666 /var/lib/libvirt/images/lfcs-config-data.qcow2

O modo 666 concede permissão de leitura e gravação a todas as classes de usuários. Essa permissão ampla mantém este laboratório descartável independente das configurações específicas de usuário e grupo do QEMU no host, mas não é uma recomendação para produção. Em um host real, prefira a propriedade, o grupo, o rótulo SELinux ou a política do AppArmor exigidos pelo serviço libvirt local.

Anexe o arquivo a lfcs-config. A opção --target vdb define o nome do dispositivo de bloco no convidado, --subdriver qcow2 registra o formato da imagem e --config modifica a definição persistente para a próxima inicialização.

sudo virsh attach-disk lfcs-config \
  /var/lib/libvirt/images/lfcs-config-data.qcow2 \
  vdb --targetbus virtio --subdriver qcow2 --config

O caminho de origem pertence ao host; vdb é o nome que o convidado verá. --targetbus virtio seleciona uma interface de disco paravirtualizada, normalmente usada para obter eficiência em convidados Linux. Como o domínio está desligado e o comando usa --config, o libvirt registra o dispositivo no projeto salvo em vez de tentar conectá-lo dinamicamente.

Liste a configuração persistente dos dispositivos de bloco.

sudo virsh domblklist lfcs-config --details

A saída deverá conter agora vda e vdb, com vdb apontando para lfcs-config-data.qcow2.

Neste ponto, o arquivo de imagem e a conexão com o domínio são dois fatos distintos. Criar um arquivo qcow2, por si só, não o conecta a uma VM, e remover um disco posteriormente não excluirá automaticamente o arquivo de origem.

Ativar a inicialização automática e validar o estado de execução

Nesta etapa, você ativará a inicialização automática do domínio, iniciará a VM agora e comparará seus recursos em execução com as configurações persistentes.

Ative a inicialização automática para que o libvirt marque este domínio para ser iniciado quando o serviço de virtualização for iniciado.

sudo virsh autostart lfcs-config

A inicialização automática é uma política salva, não uma solicitação para iniciar o domínio imediatamente. Ela é útil para serviços de infraestrutura que devem retornar automaticamente após a reinicialização do host ou do serviço libvirt.

Inicie o domínio usando sua definição persistente atualizada.

sudo virsh start lfcs-config

A inicialização cria um processo QEMU a partir da definição salva que você editou: duas vCPUs, os novos limites de memória e os dois discos. O comando informa que o domínio foi iniciado; dominfo e domblklist fornecem as evidências de que seu estado corresponde à configuração pretendida.

Aguarde alguns segundos para que o QEMU entre no estado de execução.

sleep 3

Inspecione o domínio. Ele deverá estar em execução com duas vCPUs, 128 MiB de memória máxima e a inicialização automática ativada.

sudo virsh dominfo lfcs-config

Neste domínio emulado por software, o campo Used memory normalmente será de 128 MiB durante a execução, embora a solicitação persistente de currentMemory seja de 96 MiB. Não há um sistema operacional convidado nem um driver balloon cooperando com o libvirt para reduzir a alocação em execução. Inspecione o XML inativo para confirmar que a configuração da próxima inicialização ainda registra 96 MiB:

sudo virsh dumpxml lfcs-config --inactive | grep -E '<memory|<currentMemory|<vcpu'

dumpxml --inactive solicita a definição salva, em vez da visão do QEMU em execução. O pipe encaminha esse XML para grep, que exibe apenas os elementos de memória e CPU. Essa comparação concentrada evita que uma diferença esperada na forma de informar o estado de execução seja confundida com uma alteração de configuração malsucedida.

Os valores estáveis incluem <memory unit='KiB'>131072</memory>, <currentMemory unit='KiB'>98304</currentMemory> e um valor de vCPU igual a 2. Essa comparação mostra por que a configuração persistente e os recursos informados em tempo de execução devem ser verificados separadamente.

Liste os discos do domínio ativo.

sudo virsh domblklist lfcs-config --details

vda e vdb deverão aparecer. Isso demonstra que a configuração salva foi aplicada quando o QEMU foi iniciado.

Parar a VM e confirmar o estado persistente

Nesta etapa, você interromperá o processo convidado preservando o domínio configurado, o armazenamento e a configuração de inicialização automática.

Como os discos de treinamento não contêm um sistema operacional, um desligamento normal do convidado não pode ser concluído. Use destroy para interromper imediatamente o processo QEMU. Isso altera o estado de execução, mas não exclui a definição persistente do domínio.

sudo virsh destroy lfcs-config

Apesar do nome, virsh destroy se aproxima mais de cortar a energia do que de excluir uma VM. Ele é apropriado aqui somente porque o exercício não possui sistema operacional convidado nem dados importantes. Para um convidado real em execução, prefira virsh shutdown e permita que o sistema operacional grave os dados pendentes e seja encerrado corretamente.

Confirme que o domínio está parado.

sudo virsh domstate lfcs-config

A saída deverá ser:

shut off

Inspecione a configuração persistente uma última vez.

sudo virsh dominfo lfcs-config

O estado esperado shut off descreve apenas o estado de execução. CPU, memória, discos anexados e inicialização automática permanecem na definição persistente. Remover essa definição exigiria uma operação diferente, como virsh undefine; mesmo remover a definição de um domínio não necessariamente exclui os arquivos de imagem dos discos.

Liste todos os domínios e seus estados de inicialização automática. O domínio lfcs-config, embora parado, deverá continuar definido e marcado para inicialização automática.

sudo virsh list --all --autostart

A VM está agora parada, mas pronta para ser iniciada posteriormente com a configuração de recursos que você criou.

Resumo

Você assumiu o controle de um domínio libvirt existente e alterou sua configuração persistente de recursos sem reescrever o XML. Aumentou a memória máxima e atribuída, configurou duas vCPUs, criou e anexou um segundo disco qcow2, ativou a inicialização automática, validou a configuração em um domínio QEMU em execução e interrompeu o processo preservando a VM gerenciada. Essa é a diferença prática entre simplesmente explorar o ciclo de vida de uma VM e configurá-la para atingir um estado-alvo solicitado.