Macchine virtuali con libvirt+qemu/kvm per fuss-server e fuss-client

Per fare test di fuss-server e fuss-client è utile avere a disposizione delle macchine virtuali; specialmente se si lavora su debian stretch o successive (dove VirtualBox non è più disponibile) è comodo usare qemu/kvm tramite libvirt.

Installazione e configurazione

Installazione di libvirt

  • Installare i seguenti pacchetti:

    apt install qemu libvirt-clients libvirt-daemon virtinst \
    libvirt-daemon-system virt-viewer virt-manager dnsmasq-base
    
  • Aggiungere il proprio utente ai gruppi libvirt e kvm:

    adduser $UTENTE libvirt
    adduser $UTENTE kvm
    

Una volta che l’utente fa parte dei gruppi (ad esempio previo logout/ri-login) si può usare virt-manager per gestire macchine virtuali e reti tramite un’interfaccia grafica simile a quella di VirtualBox.

Volendo invece usare la riga di comando, si può proseguire con questa guida.

Configurazione della rete

fuss-server richiede la configurazione di almeno due, in alcuni casi tre o quattro, schede di rete: una con accesso ad internet e due o tre su rete isolata.

Per creare queste interfacce di rete da riga di comando se ne deve scrivere il file di configurazione e passarlo al comando virsh net-define

Per la rete nattata, creare il file natted.xml con i seguenti contenuti, sostituendo a 9.9.9.9 l’indirizzo di un server dns opportuno:

<network>
  <name>natted</name>
  <forward mode='nat' />
  <bridge name='virbr7' stp='on' delay='0'/>
  <dns>
    <forwarder addr='9.9.9.9'/>
  </dns>
  <ip address='192.168.7.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.7.128' end='192.168.7.254'/>
    </dhcp>
  </ip>
</network>

Suggerimento

Con questa configurazione sull’host verrà configurata un’interfaccia di rete virbr7 con assegnato l’indirizzo 192.168.7.1.

Le macchine virtuali avranno invece a disposizione un dchp che assegnerà loro indirizzi nel range da 192.168.7.128 a 192.168.7.254, e le richieste DNS verranno inoltrate al server 9.9.9.9..

quindi lanciare, come root:

# virsh net-define natted.xml
# virsh net-start natted

Similmente, per le interfacce isolate si può usare quanto segue, nel file isolated.xml:

<network>
  <name>isolated</name>
  <bridge name='virbr6' stp='on' delay='0'/>
  <ip address='192.168.6.253' netmask='255.255.255.0'>
  </ip>
</network>

e nel file isolated2.xml:

<network>
  <name>isolated2</name>
  <bridge name='virbr8' stp='on' delay='0'/>
  <ip address='192.168.8.253' netmask='255.255.255.0'>
  </ip>
</network>

e nel file isolated3.xml:

<network>
  <name>isolated2</name>
  <bridge name='virbr9' stp='on' delay='0'/>
  <ip address='192.168.9.253' netmask='255.255.255.0'>
  </ip>
</network>

E come prima, sempre con utente root:

# virsh net-define isolated.xml
# virsh net-start isolated
# virsh net-define isolated2.xml
# virsh net-start isolated3
# virsh net-define isolated3.xml
# virsh net-start isolated2

In questo modo le interfacce sono definite, ma non verranno avviate automaticamente; per farlo usare i seguenti comandi:

# virsh net-autostart natted
# virsh net-autostart isolated
# virsh net-autostart isolated2
# virsh net-autostart isolated3

oppure usare net-start per ciascuna interfaccia quando se ne ha bisogno.

Creazione delle macchine virtuali

Per creare la macchina che ospiterà il server, dopo aver abilitato le interfacce di rete e scaricato l”iso di fuss-server lanciare il seguente comando:

$ virt-install --connect qemu:///system --name fuss_server --memory 2048 \
  --cdrom $PATH_ISO_FUSS-SERVER --network network=natted \
  --network network=isolated --network network=isolated2 \
  --network network=isolated3 \
  --disk size=16,format=qcow2 --os-variant debian13

questo creerà una macchina virtuale che fa il boot dall’iso dell’installer e aprirà una finestra di virt-viewer per controllarla. Alla fine dell’installazione si può fare login e procedere con l”Installazione di Fuss Server

Una volta che il server è installato e configurato si può fare la stessa cosa per una (o più) macchine client:

$ virt-install --connect qemu:///system --name fuss_client --memory 2048 \
  --cdrom $PATH_ISO_FUSS-CLIENT --network network=isolated \
  --disk size=64,format=qcow2 --os-variant debian13

Creazione delle macchine virtuali con cloud init

In alternativa all’installazione da netinst si possono usare le immagini cloud init ufficiali pubblicate su https://cloud.debian.org/images/cloud/ .

Scaricare l’ultima immagine -generic- disponibile per la distribuzione che si vuole usare, ad esempio:

Creare i seguenti file: meta-data-server:

instance-id: fuss_server
dsmode: local

Creare i seguenti file: meta-data-client:

instance-id: fuss_client
dsmode: local

user-data-server:

#cloud-config

fqdn: fuss.virtual.local
manage_etc_hosts: true
timezone: Europe/Rome
users:
  - name: root
    ssh_authorized_keys:
      - ssh-rsa <fingerprint_chiave> <id_chiave>

user-data-client:

#cloud-config

fqdn: client.virtual.local
manage_etc_hosts: true
timezone: Europe/Rome
users:
  - name: root
    ssh_authorized_keys:
      - ssh-rsa <fingerprint_chiave> <id_chiave>

network-data-server:

network:
  version: 2
  ethernets:
    enp1s0:
      dhcp4: true
    enp2s0:
      dhcp4: false
      addresses:
        - 192.168.6.1/24

Copiare l’immagine scaricata per creare lo storage per la macchina virtuale per il server (attenzione, per accedere alla directory /var/lib/libvirt/images/ è necessario essere root:

# cp debian-13-generic-amd64-daily.qcow2 /var/lib/libvirt/images/fuss_server.qcow2

e ridimensionarla ad una dimensione opportuna, sempre come root (le partizioni verranno ridimensionate automaticamente da cloud-init:

# qemu-img resize /var/lib/libvirt/images/fuss_server.qcow2 16G

infine creare la macchina virtuale con il comando:

$ virt-install --name fuss_server --import --os-variant debian13 \
  --network network=natted --network network=isolated \
  --network network=isolated2 \
  --disk /var/lib/libvirt/images/fuss_server.qcow2 \
  --cloud-init meta-data=meta-data-server,user-data=user-data-server,network-config=network-config-server

E ripetere similmente per il client:

# cp debian-13-generic-amd64-daily.qcow2 /var/lib/libvirt/images/fuss_client.qcow2

ridimensionare ad una dimensione opportuna, sempre come root:

# qemu-img resize /var/lib/libvirt/images/fuss_client.qcow2 64G

infine creare la macchina virtuale con il comando:

$ virt-install --name fuss_client --import --os-variant debian13 \
  --network network=isolated \
  --disk /var/lib/libvirt/images/fuss_client.qcow2 \
  --cloud-init meta-data=meta-data-client,user-data=user-data-client

Gestione

Boot delle macchine

Per avviare le volte successive le macchine è necessario:

  • Se l’host è stato spento, e non è stato configurato l’autoavvio delle interfacce di rete, abilitarle:

    # virsh net-start natted
    # virsh net-start isolated
    # virsh net-start isolated2
    
  • Avviare la macchina di cui si ha bisogno:

    $ virsh --connect qemu:///system start fuss-server
    
  • Se necessario, avviare una sessione grafica sulla macchina:

    $ virt-viewer --connect qemu:///system fuss-server
    

Snapshot

Per creare uno snapshot di una macchina:

virsh -c qemu:///system snapshot-create-as fuss-server <nome> "<descrizione>"

Per vedere l’elenco degli snapshot disponibili:

virsh -c qemu:///system snapshot-list fuss-server

Per riportare la macchina ad uno snapshot, eliminando tutte le modifiche effettuate nel frattempo:

virsh -c qemu:///system snapshot-revert fuss-server <nome>

oppure, per usare lo snapshot corrente (sempre perdendo le modifiche):

virsh -c qemu:///system snapshot-revert fuss-server --current

Configurazioni del sistema

Configurazione della rete

All’interno del fuss-server, le interfacce di rete come definite in questa pagina possono essere configurate aggiungendo a /etc/network/interfaces le seguenti righe:

allow-hotplug enp1s0
iface enp1s0 inet dhcp

allow-hotplug enp2s0
iface enp2s0 inet static
    address 192.168.6.1
    netmask 255.255.255.0

In fuss-client non è invece necessaria nessuna configurazione, dato che viene usato dhcp come da default.

Vedi anche

In caso di problemi o per approfondire l’uso da riga di comando di libvirt è molto utile la pagina su Libvirt della wiki di Arch Linux , la maggior parte della quale si applica anche a sistemi Debian o Debian-based.