Installare qemu-kvm in Ubuntu 19.10

A seguito di “attività sul campo” presso piccoli datacenter di alcuni clienti, abbiamo deciso di adottare e proporre una guida semplificata alla installazione e configurazione iniziale del virtualizzatore qemu-kvm nel sistema operativo Ubuntu 19.10, a beneficio dei vari sysadmin collegati ai task operativi che impazzivano nella relativa configurazione, specialmente della rete condivisa host/guest.

PREMESSA

Moltissimi utenti di sistemi operativi linux utilizzano Virtualbox come virtualizzatore; si tratta di una ottima soluzione, che però non offre le stesse prestazioni di kwm (virtualbox è un hypervisor di tipo 2, mentre kvm è di tipo 1); quando si utilizzi un sistema che non ha grande potenza di calcolo – come per esempio un notebook – è preferibile adottare kvm (le prestazioni si avvicinano molto a quelle della macchina fisica).

Mentre l’installazione di Virtualbox è piuttosto semplice, quella di kvm è più complessa; ci sono numerose guide, ma – per quantoabbiamo potuto constatare- nessuna di esse specifica chiaramente come impostare il network bridge, che risulta la configurazione obbligatoria da adottare quando occorre collegare la scheda di rete (virtuale) della VM direttamente alla scheda fisica.

Inoltre, le ultime versioni di Ubuntu hanno adottato Netplan, per la configurazione delle schede di rete; questo implica un diverso approccio rispetto alla situazione precedente, che tutti conoscevano da anni.

I PASSI DA SEGUIRE

Partiamo da una installazione pulita di Ubuntu Desktop 19.10 a 64 bit (le istruzioni valgono anche per Ubuntu 19.04), possibilmente in configurazione minimale; ovviamente occorre un sistema recente, dotato di CPU che supporta la virtualizzazione ed almeno 4GB di RAM.

Installiamo i pacchetti necessari con il seguente comando da CLI:

$ sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

Adesso occorre creare un bridge tra la scheda di rete fisica ed il virtualizzatore kwm; la configurazione di Netplan si trova al percorso /etc/netplan/, in un file dal nome similare a 01-network-manager-all.yaml; indico la configurazione che l’installer crea di default:

network:
   version: 2
   renderer: NetworkManager

Diamo un comando per scoprire quale scheda di rete è presente:

$ ip a

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
     inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever
 2: enp0s25:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
     link/ether 34:64:a9:d2:e7:a4 brd ff:ff:ff:ff:ff:ff
     inet 192.168.1.91/23 brd 192.168.1.255 scope global dynamic noprefixroute enp0s25
        valid_lft 604402sec preferred_lft 604402sec
     inet6 fe80::e5e8:3aff:41a5:18f/64 scope link noprefixroute
        valid_lft forever preferred_lft forever
 3: wlo1:  mtu 1500 qdisc fq_codel state DORMANT group default qlen 1000
     link/ether 30:10:b3:e5:88:03 brd ff:ff:ff:ff:ff:ff

 

Al punto 2 si osserva la scheda di rete fisica (in questo caso enp0s25); negli altri casi può essere ovviamente diversa; andiamo a creare il bridge e lo configuriamo, modificando come segue:

network:
   version: 2
   renderer: networkd

 ethernets:
     enp0s25:
       dhcp4: false 
       dhcp6: false 
       #addresses: [192.168.1.3/24]
       #gateway4: 192.168.1.1
       #mtu: 1500
       #nameservers:
       #  addresses: [8.8.8.8]

 bridges:
     br0:
       interfaces: [enp0s25]
       addresses: [192.168.1.3/24]
       gateway4: 192.168.1.1
       mtu: 1500
       nameservers:
         addresses: [8.8.8.8]
       parameters:
         stp: true
         forward-delay: 4
       dhcp4: no
       dhcp6: no

Riavviare il sistema e controllare se la connettività IP funziona correttamente; è possibile controllare anche il funzionamento del bridge tramite il comando:

$ networkctl

IDX LINK             TYPE               OPERATIONAL      SETUP

  1 lo               loopback           carrier          unmanaged

  2 enp0s25          ether              enslaved         configured

  3 br0              bridge             routable         configured

  4 wlo1             wlan               dormant          unmanaged

Se tutto funziona come deve, possiamo impostare il virtual network per usare il bridge br0; creare un file dal nome host-bridge.xml (anche nella home dell’utente), con il seguente codice:

<network>
  <name>host-bridge</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>

Successivamente impostare libvirt network per utilizzare il bridge, tramite questo file:

virsh net-define host-bridge.xml
virsh net-start host-bridge
virsh net-autostart host-bridge

Controllare se tutto è andato a buon fine tramite il comando:

virsh net-list --all 

Name          State      Autostart   Persistent
 default       inactive   no          yes
 host-bridge   active     yes         yes

A questo punto, sulle macchine virtuali che creeremo tramite la GUI virtual machine manager (virt-manager), potremo impostare il bridge che consente l’accesso diretto alla scheda fisica, tramite la quale è possibile operare come se si fosse fisicamente collegati con lo switch di rete (ad esempio per ricevere un ip tramite dhcp fornito dal router o firewall principale).

Aggiornamento: appena disponiile la versione 20.04 di Ubuntu (atteso a fine aprile), pubblicheremo la pagina aggiornata delle configurazioni funzionanti per tale versione.