#format wiki
#LANGUAGE it
< >
<>
<>
= Introduzione =
Questa pagina descrive la gestione delle macchine virtuali da [[AmministrazioneSistema/Terminale|riga di comando]] o tramite [[AmbienteGrafico/AmbientiDesktop|interfaccia grafica]].
<>
= Gestione da console Virsh =
Per la gestione delle macchine virtuali da terminale utilizzare '''Virsh'''.
Per iniziare è necessario stabilire una connessione all'hypervisor '''[[Virtualizzazione/Kvm|KVM]]'''/'''[[Virtualizzazione/Qemu|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'''.
{{{#!wiki note
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
}}}
{{{#!wiki note
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
}}}
{{{#!wiki note
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 [[#shutdown|spento]] la macchina virtuale, è possibile '''rimuoverla''' rendendola '''indefinita''':{{{
undefine test5
}}}L'output sarà;{{{
Domain test5 has been undefined
}}}
{{{#!wiki important
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):
<>
0. Esportare il file `xml` della macchina virtuale da modificare (dump).
0. Modificare il file `xml`.
0. 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 '''S'''ymmetric '''M'''ulti'''P'''rocessing. Per allocare due CPU a una macchina virtuale:
0. Effettuare il dump del file `xml` come descritto [[#dump|in precedenza]].
0. Modificare e salvare il file `xml` per includere:{{{
...
2
...
}}}
0. Definire la macchina virtuale come descritto [[#dump|in precedenza]].
== Aggiunta di memoria ==
Per modificare l'allocazione di memoria in una macchina virtuale:
0. Effettuare il dump del file `xml` come descritto [[#dump|in precedenza]].
0. Modificare e salvare il file `xml` per includere:{{{
...
262144262144
...
}}}
{{{#!wiki note
Tenere presente che l'allocazione di memoria è in kilobyte. Quindi, per allocare 512 MB di memoria, utilizzare 512 * 1024, ovvero 524288.
}}}
0. Definire la macchina virtuale come descritto [[#dump|in precedenza]].
== Cambiare modello scheda rete ==
'''[[Virtualizzazione/Kvm|KVM]]''' e '''[[Virtualizzazione/Qemu|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:
0. Effettuare il dump del file `xml` come descritto [[#dump|in precedenza]].
0. Modificarlo per avere ad esempio '''virtio''':{{{
...
...
...
}}}
0. Definire la macchina virtuale come descritto [[#dump|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 [[Sicurezza/AppArmor|Apparmor]] sull'host per consentire a [[Virtualizzazione/Qemu|QEMU]] l'accesso diretto all'hardware USB.
== Modifica di Apparmor ==
Per consentire a un software di accedere correttamente a un dispositivo USB, è necessario modificare [[Sicurezza/AppArmor|Apparmor]].
0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione] e un [[Ufficio/EditorDiTesto|editor di testo]] 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,
}}}
0. Salvare e chiudere il file.
0. '''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.
0. '''Identificazione del dispositivo USB''': [[Hardware/Periferiche/IdentificarePeriferiche|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'''.
0. '''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 `` del file XML della VM. Ad esempio per un controller USB 3.0:{{{
windowsxp
…
…
}}}Se si utilizza '''virt-manager''' questo può essere aggiunto graficamente nelle impostazioni hardware della VM.
0. '''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 ``:{{{
windowsxp
…
…
}}}È 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 [[Virtualizzazione/Qemu|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
}}}
= Ulteriori risorse =
* [[https://help.ubuntu.com/community/KVM/Managing|Documento originale]]
----
CategoryVirtualizzazione