Guida verificata con Ubuntu: 22.04 24.04 25.04 25.10
Problemi in questa pagina? Segnalali in questa discussione
Introduzione
Questa pagina descrive la gestione delle macchine virtuali da riga di comando o tramite interfaccia grafica.
Gestione da console Virsh
Per la gestione delle macchine virtuali da terminale utilizzare Virsh.
Per iniziare è necessario stabilire una connessione all'hypervisor KVM/QEMU locale. Questo si ottiene utilizzando l'opzione --connect:
virsh --connect qemu:///system
L'output sarà del tipo:
Connecting to uri: qemu:///system
Welcome to virsh, the virtualization interactive terminal.
Type:  'help' for help with commands
       'quit' to quit
virsh #Una volta connessi si accede al prompt interattivo virsh.
I comandi elencati nel proseguo di questa guida si intendono inseriti nel prompt virsh subito dopo la sigla virsh #
Elenco dei comandi disponibili
- Per visualizzare l'elenco dei comandi disponibili digitare nel prompt virsh: - help 
- Per informazioni aggiuntive su un comando specifico, digitare: - help NOME_COAMANDO - sostituire NOME_COAMANDO con il comando specifico. 
Definire nuova VM
- Prima di gestire la macchina virtuale con virsh, è necessario definirla. Digitare nel prompt virsh: - define /etc/libvirt/qemu/newvm.xml - che restituirà: - Domain newvm defined from /etc/libvirt/qemu/newvm.xml - Ogni macchina virtuale è configurata tramite un file XML in /etc/libvirt/qemu. 
Elencare VM
Virsh consente di elencare le macchine virtuali presenti sull'host attraverso il comando list.
- Visualizzare lista parametri del comando list: - help list - si ottiene: - NAME list - list domains SYNOPSIS list [--inactive | --all] DESCRIPTION Returns list of domains. OPTIONS --inactive list inactive domains --all list inactive & active domains- Le macchine virtuali visualizzate con list --all sono definite dal file XML. 
 Il comando list senza opzioni mostra solo le macchine attualmente in esecuzione.
- Esempio di comando list senza opzioni: - list - si ottiene un output del tipo: - Id Name State ---------------------------------- 15 mirror running 16 vm2 running 
- Esempio di comando list con opzione --all: - list --all - si ottiene un output del tipo: - Id Name State ---------------------------------- 15 mirror running 16 vm2 running - test5 shut off 
Spegnere VM
- Per spegnere nel modo più "delicato" una VM digitare: - shutdown mirror - che restituirà - Domain mirror is being shutdown 
- Un metodo più brutale, equivalente a un'interruzione dell'alimentazione sul sistema, è dato dal comando: - destroy mirror - Relativo output: - Domain mirror destroyed 
Rimuovere VM
- Dopo aver spento la macchina virtuale, è possibile rimuoverla rendendola indefinita: - undefine test5 - L'output sarà; - Domain test5 has been undefined - Rendere una indefinita una macchina virtuale può cancellare il relativo file di configurazione XML. 
Riavviare VM
- Se vengono eseguiti cambiamenti al file di configurazione XML, è necessario che KVM lo ricarichi prima di riavviare la macchina virtuale. Digitare nella console virsh: - define /etc/libvirt/qemu/mirror.xml - che restituirà: - Domain mirror defined from /etc/libvirt/qemu/mirror.xml 
- Quindi per riavviare la macchina virtuale: - start mirror - Output: - Domain mirror started 
Sospensione/ripristino VM
- Per sospendere una macchina virtuale digitare: - suspend mirror - Output: - Domain mirror suspended 
- Per riavviarla: - resume mirror - Output: - Domain mirror resumed 
Modifica attributi
Libvirt memorizza la sua configurazione in formato .xml in /etc/libvirt/qemu. Il file è simile ai file .vmx di VMware. È possibile modificare questi file direttamente e riavviare libvirt affinché i cambiamenti abbiano effetto.
Il metodo raccomandato per la modifica degli attributi di una macchina virtuale è tramite virsh o virt-manager (se supporta i cambiamenti hardware desiderati):
- Esportare il file xml della macchina virtuale da modificare (dump). 
- Modificare il file xml. 
- Importare il file xml (define). 
Ad esempio, per modificare la macchina chiamata foo (per l'elenco utilizzare virsh list --all), eseguire:
virsh dumpxml foo > /tmp/foo.xml
modificare /tmp/foo.xml come necessario e quindi digitare:
virsh define /tmp/foo.xml
Aggiunta di CPU
KVM consente di creare ospiti Symmetric MultiProcessing. Per allocare due CPU a una macchina virtuale:
- Effettuare il dump del file xml come descritto in precedenza. 
- Modificare e salvare il file xml per includere: - <domain type='kvm'> ... <vcpu>2</vcpu> ... </domain> 
- Definire la macchina virtuale come descritto in precedenza. 
Aggiunta di memoria
Per modificare l'allocazione di memoria in una macchina virtuale:
- Effettuare il dump del file xml come descritto in precedenza. 
- Modificare e salvare il file xml per includere: - <domain type='kvm'> ... <memory>262144</memory> <currentMemory>262144</currentMemory> ... </domain> - Tenere presente che l'allocazione di memoria è in kilobyte. Quindi, per allocare 512 MB di memoria, utilizzare 512 * 1024, ovvero 524288. 
- Definire la macchina virtuale come descritto in precedenza. 
Cambiare modello scheda rete
KVM e QEMU possono emulare diversi modelli di schede di rete.
Il modello di NIC raccomandato per le massime prestazioni in una macchina virtuale KVM è virtio, che sfrutta le ottimizzazioni para-virtualizzate. Altri modelli, come e1000 o rtl8139, sono disponibili per compatibilità con sistemi operativi guest meno recenti o in casi specifici, ma offrono prestazioni inferiori.
Per utilizzare un NIC alternativo:
- Effettuare il dump del file xml come descritto in precedenza. 
- Modificarlo per avere ad esempio virtio: - <domain type='kvm'> ... <interface type='network'> ... <model type='virtio'/> </interface> ... </domain>
- Definire la macchina virtuale come descritto in precedenza. 
Aggiunta dispositivi USB passanti
Limitazioni
- Il dispositivo deve essere collegato all'host prima dell'avvio della macchina virtuale.
- Potrebbe essere necessario configurare opportunamente il controller USB emulato nella VM (es. USB 2.0/3.0) per la massima compatibilità e prestazioni.
- È necessario modificare le policy di sicurezza come Apparmor sull'host per consentire a QEMU l'accesso diretto all'hardware USB. 
Modifica di Apparmor
Per consentire a un software di accedere correttamente a un dispositivo USB, è necessario modificare Apparmor.
- Aprire con i privilegi di amministrazione] e un [[Ufficio/EditorDiTesto il file /etc/apparmor.d/abstractions/libvirt-qemu e decommentare alcune righe: - # WARNING: uncommenting these gives the guest direct access to host hardware. # This is required for USB pass through but is a security risk. You have been # warned. /sys/bus/usb/devices/ r, /sys/devices/*/*/usb[0-9]*/** r, /dev/bus/usb/*/[0-9]* rw, 
- Salvare e chiudere il file.
- Apparmor deve essere riavviato digitando nel il comando: - sudo systemctl restart apparmor 
Aggiunta di dispositivi USB
Per aggiungere un dispositivo USB alla macchina virtuale è fondamentale identificare il Vendor ID e il Product ID del dispositivo. Successivamente è necessario configurare correttamente la macchina virtuale per emulare un controller USB adeguato al dispositivo e aggiungere il passthrough nel file XML.
- Identificazione del dispositivo USB: identificare, relativamente all'USB, il codice del costruttore Vendor ID e del prodotto Product ID: - lsusb - Il risultato sarà simile al seguente: - Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 005 Device 012: ID 0a5c:2110 Broadcom Corp. Bluetooth Controller Bus 005 Device 003: ID 0483:2016 SGS Thomson Microelectronics Fingerprint Reader Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub - Se, ad esempio, è necessario aggiungere Broadcom Corp. Bluetooth Controller, i codici identificativi ID del costruttore e del prodotto sono rispettivamente 0a5c e 2110. 
- Configurazione del Controller USB della VM: per supportare dispositivi USB 2.0 o 3.0 è cruciale che la macchina virtuale abbia un controller USB emulato del tipo corretto (es. usb2 per EHCI, usb3 per XHCI). Questo può essere aggiunto nella sezione <devices> del file XML della VM. Ad esempio per un controller USB 3.0: - <domain type='kvm'> <name>windowsxp</name> … <devices> … <hostdev mode='subsystem' type='usb'> <source> <vendor id='0x0a5c'/> <product id='0x2110'/> </source> </hostdev> </devices> </domain>- Se si utilizza virt-manager questo può essere aggiunto graficamente nelle impostazioni hardware della VM. 
- Aggiunta del dispositivo USB al profilo XML: con il controller USB appropriato configurato è possibile aggiungere il dispositivo USB specifico utilizzando i Vendor ID e Product ID ottenuti. Ciò può essere fatto tramite virsh con il comando: - sudo virsh edit domain - inserendo la seguente configurazione nella sezione <devices>: - <domain type='kvm'> <name>windowsxp</name> … <devices> … <hostdev mode='subsystem' type='usb'> <source> <vendor id='0x0a5c'/> <product id='0x2110'/> </source> </hostdev> </devices> </domain>- È importante assicurarsi che i valori id siano preceduti da 0x per indicare che sono in formato esadecimale. 
Ottenere nuovi ID
Quando si crea una nuova macchina virtuale o si desidera modificarne una esistente, potrebbe essere necessario assegnarle un nuovo indirizzo MAC (Media Access Control) o uno UUID (Universally Unique Identifier) univoco. Questo aiuta a evitare conflitti di rete o a garantire l'unicità dell'identificatore della VM.
- Per ottenere un nuovo indirizzo MAC da inserire nel file xml di configurazione della macchina virtuale, utilizzare il seguente comando. Il prefisso 52:54: è lo standard utilizzato da QEMU per gli indirizzi MAC virtuali: - MACADDR="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/')"; echo $MACADDR 
- Per ottenere un nuovo UUID per il file xml, utilizzare il comando standard uuidgen: - uuidgen 
