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.