Per oltre un decennio ho usato senza problemi VirtualBox come sistema di virtualizzazione desktop. Non avevo mai usato KVM/QEMU perchè l’esperienza di utilizzo mi è sempre sembrata inferiore per i miei casi d’uso, così non ho mai smesso di usare VirtualBox. Qualche settimana fa, però, dopo avere avuto problemi nell’installazione di VirtualBox su una macchina con SecureBoot, ho deciso di provare KVM/QEMU visto che era già praticamente preinstallato nella mia distribuzione. Ha funzionato bene fin da subito e, dopo qualche giorno di utilizzo è diventata la mia nuova prima scelta per la virtualizzazione.

Questa non è una guida su come effettuare il setup di KVM/QEMU; è invece una lista di alcuni suggerimenti su come usarlo con libvirt. Visto che il mio primo utilizzo ha richiesto la risoluzione di alcuni problemi (comuni), questo post li riassume così da tenerli annotati per il futuro.

Tutti i comandi mostrati e le configurazioni sono specifiche di Fedora, quindi usando altre distribuzioni potrebbero cambiare leggermente.

GUI - virt-manager

Gnome boxes è un’interfaccia grafica per la gestione di VM e container che è presente in molte distribuzioni Linux. Ignoratela e installate virt-manager che espone molte più funzionalità.

$ sudo dnf install virt-manager

Tutte e due le applicazioni usano le API di libvirt per interagire con QEMU/KVM ma l’interfaccia di virt-manager offre molte più funzionalità rispetto a Gnome-boxes.

Network

Avviando una macchina virtuale che utilizza il NAT di default di virt-manager (libvirt), la connessione a Internet potrebbe non funzionare come previsto. Questo è stato il problema più noioso da risolvere nonostate la soluzione sia nota. Basta modificare il file /etc/libvirt/network.conf e impostare firewall_backend=iptables sull’ultima riga.

# Master configuration file for the network driver.
# All settings described here are optional - if omitted, sensible
# defaults are used.

# firewall_backend:
#
#   determines which subsystem to use to setup firewall packet
#   filtering rules for virtual networks.
#
#   Supported settings:
#
#     iptables - use iptables commands to construct the firewall
#     nftables - use nft commands to construct the firewall
#
#   If firewall_backend isn't configured, libvirt will choose the
#   first available backend from the following list:
#
#     [nftables, iptables]
#
#   If no backend is available on the host, then the network driver
#   will fail to start, and an error will be logged.
#
#   (NB: switching from one backend to another while there are active
#   virtual networks *is* supported. The change will take place the
#   next time that libvirtd/virtnetworkd is restarted - all existing
#   virtual networks will have their old firewalls removed, and then
#   reloaded using the new backend.)
#
firewall_backend = "iptables"

A questo punto è necessario riavviare il demone di libvirt assicurandoci di non avere macchine virtuali in esecuzione.

$ sudo systemctl restart libvirtd

Il backend nftables impostato di default non funziona in automatico, così è necessario passare a iptables. Nonostante le differenze, il backend iptables è sempre basato su ntftables): per questo motivo è importante controllare se il package iptables-nft è presente sulla macchina (e in caso non lo sia, installarlo).

Migrare da VirtualBox OVA a QEMU

Usiamo tar per estrarre i file VMDK dall’archivio OVA.

$ tar -xvf myvm.ova
myvm.ovf
myvm-disk001.vmdk

Poi convertiamo il file disco VMDK nel formato qcow2 (di QEMU) usando qemu-img.

$ qemu-img convert -O qcow2 myvm-disk001.vmdk myvm.qcow2

Il comando qemu-img è una utility offerta da QEMU che permette di creare, convertire e modificare le immagini dei dischi. Supporta molti formati e per conoscerli tutti è sufficiente lanciare il comando mostrato qui sotto.

$ qemu-img -h | tail -n1
Supported formats: vvfat vpc vmdk vdi sheepdog raw host_cdrom host_floppy
host_device file qed qcow2 qcow parallels nbd dmg tftp ftps ftp https http
cow cloop bochs blkverify blkdebug

Aumentare la dimensione di un disco QEMU qcow2

Un’altra necessità comune è quella di dover ridimensionare un’immagine qcow e, anche in questo caso, qemu-img è lo strumento di cui abbiamo bisogno. Per aumentare la dimensione del disco basta usare il comando qemu-img resize filename.qcow2 +SIZE come mostrato qui sotto.

# Increase the image adding 30GB
$ qemu-img resize FreeBSD-14.3-RELEASE-amd64-zfs.qcow2 +30G

L’argomento SIZE rappresenta il numero di byte ma può essere seguito da un suffisso che interpreta in modo diverso il numero (vedi la documentazione di qemu-img):

SIZE is the disk image size in bytes.
Optional suffixes are supported:
    k or K (kilobyte, 1024)
    M (megabyte, 1024k)
    G (gigabyte, 1024M)
    T (terabyte, 1024G)
    b is ignored

Dopo il ridimensionamento sarà necessario anche estendere le partizioni al livello del sistema operativo ma questa è un’attività specifica per ogni combinazione di SO/file system e quindi non è riportata in questo post.