Por: @vitorp Publicado em: 2020-04-15

Virtualização: Libvirt + CentOS 8

Este laboratório tem como objetivo:

  • Orientar na instalação dos pacotes para funcionamento do libvirt no CentOS 8;
  • Demonstrar o uso das conexões de rede;
  • Demonstrar funcionamento do XML do libvirt.

Sistema Operacional: CentOS 8.1.1911

Instalação

yum install @virt libguestfs-tools virt-install virt-manager
systemctl start libvirtd

Comandos básicos

  • Ligar VM: virsh start $domain

  • Desligar VM: virsh shutdown $domain

  • Rebootar VM: virsh reboot $domain

  • Forçar Desligamento da VM: virsh destroy $domain

  • Coletar informações da VM: virsh dominfo $domain

  • Verificar informações das interfaces de rede: virsh domiflist $domain - Busca informações das interfaces conforme o que está em execução. Se alterar algo no XML e não reiniciar para aplicar, não aparecerá.

Criar VM

  • Utilizar o utilitário “virt-install” para criar as VM’s.
virt-install --connect qemu:///system \
--name $domain \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/teste03.qcow2,format=qcow2,bus=virtio,cache=none \
--network type=direct,source=enp1s0,model=virtio,mac=52:54:00:ce:c1:94 \
--network bridge=br50,model=virtio,mac=52:54:00:ce:c1:91 \
--cdrom /var/lib/libvirt/images/centos8.iso \
--vnc --os-type=generic \
--accelerate --noautoconsole --keymap=br-abnt2

Deletar VM

virsh destroy $domain                           # Desliga máquina Virtual
virsh undefine $domain                          # Deleta a máquina Virtual
rm -rf /var/lib/libvirt/images/teste01.qcow2    # Apaga VHD da máquina Virtual

Obs: Para saber quais discos estão vinculados às máquinas, pode ser usado o comando abaixo:

virsh domblklist $domain --inactive --details

Snapshot da VM

  • Criar SNAPSHOT
virsh snapshot-create-as --domain $domain \
--name "snp-01" \
--description "ASD" \

Obs: A VM é pausada enquanto o SNAPSHOT é criado

  • Listar SNAPSHOTS:
virsh snapshot-list --domain $domain

Interfaces de rede

Redes Internas do QEMU

  • O único modo de interface que deve ser criado, é o modo interno do libvirt. As demais são somente associadas no momento da configuração.

  • Para criar redes, é necessário gerar um .xml e executar o comando chamando o XML:

Exemplo de XML:

/tmp/net01.xml

<network>
  <name>net01</name>
  <forward mode="route"/>
  <mac address="52:54:00:2d:44:e9"/>                            # Opcional, se não for adicionado o libvirt gera automaticamente
  <bridge name="virbr1" stp="on" delay="0"/>                    # Opcional, pode ser utilizado para setar o nome  do device bridge
  <domain name="network"/>
  <ip address="192.168.200.1" netmask="255.255.255.0">
    <dhcp>                                                      # Opcional, já que é possível criar a rede sem DHCP
      <range start="192.168.200.128" end="192.168.200.254"/>
    </dhcp>
  </ip>
</network>

Criar rede e iniciar:

virsh net-define /tmp/net01.xml
virsh net-start net01
virsh net-autostart net01
  • Podem ser usadas as redes com mode “route”, “nat” e outros. Porém a diferença entre eles está nas regras de firewall criadas. Como o FW iTFlex apaga as regras, todas ficam com a mesma funcionalidade. Podemos utilizar sempre o mode “route” e configurar só as demais opções.

  • Após criar as redes, o virsh cria uma bridge no NetworkManager. Talvez para simplificar estas opções podem ser abstraídas e o usuário seria obrigado a criar uma bridge comum nas conexões do servidor.

Redes Externas vínculas ao Virtualizador

  • As interfaces de rede do libvirt têm relação com as INTERFACES da máquina, não há nenhum tipo de relação com as conexões do NetworkManager.

  • As interfaces podem ser adicionadas em dois formatos básicos (type):

  • Bridge: Associada há uma interface bridge criada na máquina física. Neste modo o IP da bridge da máquina física se comunica normalmente com os IP’s adicionados na máquina virtual.

Exemplo de associação ao criar VM:

--network bridge=br50,model=virtio,mac=52:54:00:ce:c1:91 \
  • Direct: Associada há uma interface ethernet, bond ou vlan criada na máquina física. Neste modo é criada uma interface macvtap na máquina física, isso impossibilita que a máquina física se comunique com a VM.

Exemplo de associação ao criar VM:

--network type=direct,source=enp1s0,model=virtio,mac=52:54:00:ce:c1:94 \

Criar discos

  • Utilizar o utilitário qemu-img.
qemu-img create -f $format $nome-do-arquivo.qcow2 $tamanho

Exemplo: qemu-img create -f qcow2 /var/lib/libvirt/images/teste02.qcow2 200G

Referências de parâmetros suportados: https://linux.die.net/man/1/qemu-img

Editar hardware da VM

  • Utilizar o utilitário “virsh”.

Interfaces de rede

As interfaces podem ser adicionadas e removidas com a máquina em execução através dos comandos virsh.

Os comandos só funcionarão caso a máquina esteja ligada, caso esteja parada deve ser usada a flag --config, assim a interface será adicionada mas só terá efeito após ligar a máquina.

Adicionar:

Bridge: virsh attach-interface --domain teste04 --type bridge --source br0 --model virtio

Direct: virsh attach-interface --domain teste04 --type direct --source enp2s0 --model virtio

Remover:

Bridge: virsh detach-interface --domain teste04 --type bridge --mac 52:54:00:1e:f7:a6

Direct: virsh detach-interface --domain teste04 --type direct --mac 52:54:00:1e:f7:a6

Editar:

  • Modelo do dispositivo:

É necessário alterar diretamente no XML. Alterar no bloco de configuração da interface:

<interface type='direct'>
      <mac address='52:54:00:af:e8:9d'/>
      <source dev='enp2s0' mode='vepa'/>
      <model type='e1000'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>

Alterar “model type”: e1000, virtio, rtl8139

Memória

Existem dois valores relacionados à memória: Alocação Atual e Alocação Máxima

A alocação atual pode ser ajustada em execução e a alocação máxima somente após desligar a máquina e ligar novamente.

No produto o ideal seria inicialmente obrigar o usuário a desligar a máquina e depois alterar os parâmetros.

virsh  setmaxmem $domain 3G --config
virsh  setmem $domain 3G --config

CPU

Existem dois valores relacionados à CPU: Alocação Atual e Alocação Máxima

A alocação atual pode ser ajustada em execução e a alocação máxima somente após desligar a máquina e ligar novamente.

No produto o ideal seria inicialmente obrigar o usuário a desligar a máquina e depois alterar os parâmetros.

virsh setvcpus $domain 4 --config --maximum
virsh setvcpus $domain 4 --config

Disco

Adicionar:

virsh attach-disk $domain /var/lib/libvirt/images/teste04-b.qcow2 $device --driver qemu --subdriver qcow2 --targetbus $barramento --cache none

  • DEVICE: A opção $device é o device dentro do SO, exemplo: vda, vdb, vdc… Podemos buscar os discos que já tem na máquina e adicionar automaticamente na sequência.

Comando para verificar os discos vinculados às máquinas: virsh domblklist $domain --inactive --details

  • BARRAMENTO: A opção $barramento é a opção que deve ser selecionada na interface: virtio, usb, scsi, sata, ide

PS: caso a máquina esteja desligada, é necessário adicionar --config no comando.

Remover:

virsh detach-disk $domain $caminho_arquivo

  • CAMINHO_ARQUIVO: é o caminho do arquivo no sistema. Ex: /var/lib/libvirt/images/teste04-b.qcow2

PS: caso a máquina esteja desligada, é necessário adicionar --config no comando.

Editar:

Modelo do dispositivo: é necessário alterar diretamente no XML.

CDROM

Adicionar Drive:

virsh attach-disk $domain "" $device --type cdrom --mode readonly --config

  • DEVICE: A opção $device é o device dentro do SO, exemplo: hda, hdb, hdc… Podemos buscar os dispositivos que já tem na máquina e adicionar automaticamente na sequência.

Comando para verificar os discos vinculados às máquinas: virsh domblklist $domain --inactive --details

PS: A máquina precisa ser desligada e ligada novamente para o cdrom ser adicionado PS1: Também podemos criar o drive já com o disco. Ex: virsh attach-disk $domain /var/lib/libvirt/images/centos8.iso $device --type cdrom --mode readonly --config

Remover:

virsh detach-disk $domain $device --config

  • DEVICE: A opção $device é o device dentro do SO, exemplo: hda, hdb, hdc.

Comando para verificar os discos vinculados às máquinas: virsh domblklist $domain --inactive --details

PS: A máquina precisa ser desligada para o disco ser removido de fato.

Gerenciar ISO associada ao CDROM:

Adicionar:

Podemos realizar o dump do xml e editar o cdrom:

virsh dumpxml $domain > /tmp/$domain.xml
vim /tmp/$domain.xml

Para adicionar uma iso ao cdrom, devemos encontrar o bloco de configuração do disco cdrom e editá-lo:

    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/var/opt/vms/centos-7-itflex.iso'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>

A linha “source file” indica o caminho da ISO.

Para aplicar as configurações, o comando define deve ser executado:

virsh define /tmp/teste02.xml
Remover:

Podemos realizar o dump do xml e editar o cdrom:

virsh dumpxml $domain > /tmp/$domain.xml
vim /tmp/$domain.xml

Para adicionar uma iso ao cdrom, devemos encontrar o bloco de configuração do disco cdrom e editá-lo:

    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>

A linha “source file” deve ser removida.

Para aplicar as configurações, o comando define deve ser executado:

virsh define /tmp/teste02.xml

Ordem de boot

Necessário editar via “virsh edit”

  • Dentro do bloco do disco, é necessário adicionar o conteúdo:

<boot order='1'/>

O número indica a ordem: 1, 2, 3..

A configuração pode ser realizada somente no disco que está habilitado no boot e alterada conforme ordem configurada na interface.

PS: A máquina precisa ser desligada para a alteração ter efeito. Pode ser alterado em execução, mas só muda após desligar a máquina e ligar novamente.

REFERÊNCIAS

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-statlists