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.