Software Engineer @ fuhrmanns
Open Source /#linux
4 min read

Criando uma máquina virtual com libvirt

Se você está tentando debugar aquele problema que você está tendo na sua distribuição Linux, mas não consegue descobrir se o problema é na aplicação ou na sua própria distribuição, a saída é tentar simular o mesmo comportamento em uma máquina virtual. Ou então se você desenvolve para diferentes distribuições Linux e quer testar seus packages pode criar máquinas virtuais de diferentes distribuições para testar suas aplicações.

Uma forma fácil de fazer isso é utilizando o libvirt, sendo uma ferramenta de código aberto utilizada para o gerenciamento de virtualização de máquinas. Ele fornece o servidor e as bibliotecas no host para poder interagir com hypervisors e sistemas guest.

Instalação do libvirt no Fedora

Se você tem instalado no seu computador host o Fedora, pode seguir os passos abaixo para instalar o libvirt:

sudo dnf install @virtualization

No qual será instalado os seguintes pacotes:

Group: Virtualization
Description: These packages provide a graphical virtualization environment.
Mandatory Packages:
 virt-install
Default Packages:
 libvirt-daemon-config-network
 libvirt-daemon-kvm
 qemu-kvm
 virt-manager
 virt-viewer
Optional Packages:
 libguestfs-tools
 python3-libguestfs
 virt-top

Após a instalação inicie o serviço do libvirt:

sudo systemctl start libvirtd

Para ativar o serviço no boot, execute:

sudo systemctl enable libvirtd

E por último verifique se os módulos do kernel foram propriamente carregados:

[root@localhost ~]# lsmod | grep kvm
kvm_amd               114688  0
kvm                   831488  1 kvm_amd

Atenção! Para mais detalhes da instalação do libvirt no Fedora acesse Getting started with virtualization. Para um guia de como instalar no Ubuntu, acesse UbuntuKVMWalkthrough.

Criando o disco dinamicamente alocado

Vamos começar criando um disco alocado dinamicamente para o nosso sistema operacional guest, ou seja, nossa máquina virtual, para isso, execute o comando abaixo:

sudo truncate --size=20480M /var/lib/libvirt/images/fedora36.img

O comando acima irá criar um disco de 20GB que será usado pela nossa máquina virtual no caminho especificado.

Baixando o Fedora 36 Server

Você pode baixar a ISO do Fedora Server aqui. Caso deseje usar a mesma versão deste artigo, o link direto para ISO, clique aqui. Com a ISO baixada vamos agora executar o comando que irá criar nossa guest:

sudo virt-install \
--name fedora36 \
--ram 4096 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/fedora36.img,size=20 \
--os-variant fedora36 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location /tmp/Fedora-Server-dvd-x86_64-36-1.5.iso \
--extra-args 'console=ttyS0,115200n8'

Atenção! Caso você receba um erro de permissão como esse: ‘WARNING /path/to/fedora.iso may not be accessible by the hypervisor. You will need to grant the ‘qemu’ user search permissions for the following directories:’, coloque a ISO do Fedora em um local que o qemu tenha permissão para leitura, neste caso estamos colocando a ISO na pasta /tmp.

Continuando a instalação

Após executar o comando acima será exibido em seu terminal o seguinte texto:

Text mode provides a limited set of installation options. It does not offer
custom partitioning for full control over the disk layout. Would you like to use
VNC mode instead?

1) Start VNC
2) Use text mode

Aqui fica a seu critério caso prefira continuar com a instalação gráfica ou textual. Caso queira continuar com a instalação no modo texto, responda com a opção 2 e tecle Enter.

Caso tenha escolhido o modo texto siga com o setup da forma como você achar melhor para configurar sua nova instalação do Fedora, como por exemplo configurar a timezone, senha do root, criação de um usuário durante a instalação e entre outros. A instalação no modo texto é bem intuitiva e fácil de entender.

Após finalizar a sua configuração no modo texto aperte b para iniciar a instalação e aguarde.

Atenção! Se em algum momento durante a instalação você perder conexão com o console da VM, é possível reconectar a máquina virtual digitando virsh console fedora36:

[root@localhost ~]# virsh console fedora36
Connected to domain fedora36
Escape character is ^]  # Enter key

A instalação será finalizada quando a seguinte mensagem ser exibida:

Installation complete. Press ENTER to quit:

Pressione Entere a VM irá reiniciar.

Atenção! Caso a VM não tenha reiniciado e apenas desligado, você poderá inicializar ela novamente digitando sudo virsh start fedora36:

[root@localhost ~]# sudo virsh start fedora36
Domain 'fedora36' started

Após a instalação

Para conectar novamente ao geust após a reinicialização, execute:

[root@localhost ~]# sudo virsh console fedora36
Connected to domain 'fedora36'
Escape character is ^] (Ctrl + ])

Pressione Enter e o guest irá requisitar um login. Informe o nome do usuário que você configurou para uso durante o processo de instalação ou então logue como o próprio root e informe a senha. A partir daí você terá sua máquina virtual do Fedora rodando disponível para realizar alguns testes, instalar packages entre outros!

Comandos úteis

Lista todos os guests:

[root@localhost ~]# sudo virsh list --all
Id   Nome       Estado
-----------------------------
7    fedora36   executando
-    win11      desligado

Desliga um guest:

[root@localhost ~]# sudo virsh shutdown fedora36
Domain 'fedora36' is being shutdown

Reinicializa um guest:

[root@localhost ~]# sudo virsh reboot fedora36
Domain 'fedora36' is being rebooted

Exibe informações de um guest:

[root@localhost ~]# sudo virsh dominfo fedora36
Id:             8
Nome:           fedora36
Tipo de SO:     hvm
Estado:         executando
CPU(s):         2
Tempo de CPU:   27,5s
Memória máxima: 4194304 KiB
Memória utilizada: 4194304 KiB
Persistente:    sim
Auto-iniciar:   desabilitar
Salvamento gerenciado: não
Modelo de segurança: none
DOI de segurança: 0

Para a lista completa de comandos acesse a ajuda do comando virsh:

[root@localhost ~]# sudo virsh --help
virsh [options]... [<command_string>]
virsh [options]... <command> [args...]

options:
  -c | --connect=URI      hypervisor connection URI
  -d | --debug=NUM        debug level [0-4]
  -e | --escape <char>    set escape sequence for console
  -h | --help             this help
  -k | --keepalive-interval=NUM
                          keepalive interval in seconds, 0 for disable
  -K | --keepalive-count=NUM
                          number of possible missed keepalive messages
  -l | --log=FILE         output logging to file
  -q | --quiet            quiet mode
  -r | --readonly         connect readonly
  -t | --timing           print timing information
  -v                      short version
  -V                      long version
       --version[=TYPE]   version, TYPE is short or long (default short)
commands (non interactive mode):
...
...
...
...

Referências: