## page was renamed from Emulatori/Kvm/GestioneOspiti
## page was renamed from FabioMarconi/Prove10
#format wiki
##Page updated 13-06-2011
#language it
<<BR>>
<<Indice(depth=2)>>
<<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?t=371617"; rilasci="10.04")>>


= Introduzione =

In questa pagina viene spiegata la gestione delle macchine virtuali da riga di comando o da interfaccia grafica.

= Gestione da terminale =

Per la gestione delle macchine virtuali da terminale usare [[http://help.ubuntu-it.org/current/ubuntu/serverguide/it/libvirt.html|Virsh]]. 

 * Per ottenere l'elenco dei comandi utilizzabili digitare:{{{
help
}}} 
 * Per informazioni aggiuntive su uno specifico comando, digitare:{{{
help commando
}}}

== Definizione della nuova Macchina Virtuale ==

Prima di gestire la macchina virtuale con '''virsh''', è necessario definirla:{{{
 virsh --connect qemu:///system
Connecting to uri: qemu:///system
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # define /etc/libvirt/qemu/newvm.xml
Domain newvm defined from /etc/libvirt/qemu/newvm.xml
}}}

Per elencare la nuova macchina virtuale, si deve usare '''list --inactive''' oppure '''list --all''', dato che list senza opzioni elenca solo le macchine attualmente in esecuzione.

== Come elencare le MV ==

'''Virsh''' consente di elencare le macchine virtuali presenti sull'host:

{{{
yhamon@paris:/etc/libvirt/qemu$ virsh --connect qemu:///system
Connecting to uri: qemu:///system
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # help list
  NAME
    list - list domains

  SYNOPSIS
    list [--inactive | --all]

  DESCRIPTION
    Returns list of domains.

  OPTIONS
    --inactive       list inactive domains
    --all            list inactive & active domains

virsh # list
 Id Name                 State
----------------------------------
 15 mirror               running
 16 vm2                  running

virsh # list --all
 Id Name                 State
----------------------------------
 15 mirror               running
 16 vm2                  running
  - test5                shut off
}}}

== Definire, indefinire, avviare, spegnere e distruggere macchine virtuali ==

Le macchine virtuali visualizzate con '''list --all''' sono definite da un file `XML`. Ogni macchina virtuale è configurata tramite un file `XML` in `/etc/libvirt/qemu`. 

 * Per rimuovere una macchina virtuale dall'elenco occorre indefinirla:{{{
virsh # undefine test5   # WARNING: undefine will delete your XML file!
Domain test5 has been undefined

virsh # list --all
 Id Name                 State
----------------------------------
 15 mirror               running
 16 vm2                  running
}}}

 per indefinire una macchina virtuale bisogna innanzitutto spegnerla:{{{
virsh # shutdown mirror
Domain mirror is being shutdown
}}}

 questo comando avvia lo spegnimento dolce della macchina virtuale (simile all'esecuzione dello shutdown da linea di comando), ma è anche possibile usare '''destroy'''.

 Il modo più brutale per spegnere una macchina virtuale, equivalente a un'interruzione dell'alimentazione sul sistema è:{{{
virsh # destroy mirror
Domain mirror destroyed
}}}

 * Se vengono eseguiti cambiamenti al file di configurazione `XML` è necessario che '''KVM''' lo ricarichi prima di riavviare la macchina virtuale:{{{
virsh # define /etc/libvirt/qemu/mirror.xml
Domain mirror defined from /etc/libvirt/qemu/mirror.xml
}}}

 * Quindi per riavviare la macchina virtuale:{{{
virsh # start mirror
Domain mirror started
}}}

== Sospensione e ripristino di una macchina virtuale ==

'''Virsh''' consente di sospendere e riavviare facilmente una macchina virtuale:{{{
virsh # suspend mirror
Domain mirror suspended

virsh # resume mirror
Domain mirror resumed
}}}

= Modifica degli attributi di una macchina virtuale =

'''Libvirt''' memorizza la sua configurazione come `.xml` in `/etc/libvirt/qemu`. Il file `.xml` è facilmente comprensibile, ed è simile ai file `*.vmx` di '''VMware''', quindi è possibile editare questi file sul posto e riavviare '''libvirt''' di modo che i cambiamenti abbiano effetto. 

Il metodo raccomandato per la modifica degli attributi  di una macchina virtuale è tramite '''virsh''' oppure '''virt-manager''' (sempre che supporti i cambiamenti hardware che volete effettuare):

 0. Esportare il file `xml` della macchina virtuale da editare (aka 'dump')
 0. Editare il file `xml`.
 0. Importare il file `xml`. (aka 'define')

Per esempio, per editare la macchina chiamata '''foo''' (per avere l'elenco delle macchine usare '''virsh list --all'''), eseguire:{{{
 virsh dumpxml foo > /tmp/foo.xml
(editare /tmp/foo.xml come necessario)
 virsh define /tmp/foo.xml
}}}

= Aggiunta di CPU =

'''KVM''' permette di creare ospiti SMP. 

Per allocare due CPU in una macchina virtuale, fare il dump del file `xml` come sopra, quindi editarlo per avere:{{{
<domain type='kvm'>
  ...
  <vcpu>2</vcpu>
  ...
</domain>
}}}

Definire la macchina virtuale come sopra.

= Aggiunta di memoria =

Per cambiare l'allolocazione di memoria in una macchina virtuale, fare il dump del file `xml` come sopra, quindi editarlo per avere:{{{
<domain type='kvm'>
  ...
  <memory>262144</memory>
  <currentMemory>262144</currentMemory>
  ...
</domain>
}}}

Definire la macchina virtuale come sopra.  

Tenere a mente che l'allocazione di memoria è in kilobytes, quindi per allocare 512 MB di memoria, usare 512 * 1024, oppure 524288.

= Cambiare il modello di scheda di rete =

'''kvm''' e '''qemu''' attualmente e in maniera prestabilita usano il NIC «rtl8139». 

I NIC supportati in  '''Ubuntu 8.04''' sono «i82551», «i82557b», «i82559er», «ne2k_pci», «pcnet», «rtl8139», «e1000», e «virtio». 

Per usare un NIC alternativo, fare il dump del file `xml` come sopra, quindi editarlo per avere:{{{
<domain type='kvm'>
  ...
    <interface type='network'>
      ...
      <model type='e1000'/>
    </interface>
  ...
</domain>
}}}

Ridefinire la macchina virtuale come sopra.

= Aggiunta di dispositivi USB passanti =

== Limitazioni ==

 * Solamente il protocollo USB 1.1 
 * Il dispositivo deve essere collegato prima dell'avvio di '''KVM'''.
 * È necessario modificare Apparmor

== Modifica di Apparmor ==

Per consentire a un programma software di accedere correttamente a un dispositivo usb è necessario modificare Apparmor. 

 * Per fare ciò [[Ufficio/EditorDiTesto|editare]] il file `/etc/apparmor.d/abstractions/libvirt-qemu` e decommentare alcune linee:{{{
# 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,
}}}

 * Dopo le variazioni apparmor deve essere riavviato digitando in una finestra di terminale:{{{
 sudo /etc/init.d/apparmor restart
}}}

== Aggiunta di dispositivi USB ==

Cercare, relativamente all'USB il codice del costruttore (Vendor ID) e del prodotto (Product ID).

Per fare ciò digitare il seguente comando in una finestra di terminale:{{{
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 per esempio bisogna aggiungere «Broadcom Corp. Bluetooth Controller» i codici identificativi (ID) del costruttore e del prodotto sono rispettivamente «0a5c» e «2110».

Questi valori vanno inseriti nel profilo `xml`. Ciò può essere fatto tramite '''virsh''' con il comando '''edit <domain>''':{{{
<domain type='kvm'>
  <name>windowsxp</name>
  …
  <devices>
    …
    <hostdev mode='subsystem' type='usb'>
      <source>
        <vendor id='0x0a5c'/>
        <product id='0x2110'/>
      </source>
    </hostdev>
  </devices>
</domain>
}}}

= Ottenere nuovi ID =

 * Per avere nuovi indirizzi macchina da copiare nel file `xml`, usare questo comando:{{{
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`, usare:{{{ 
uuidgen
}}}

= Ulteriori risorse =

 * [[https://help.ubuntu.com/community/KVM/Managing|Documento originale]]
----
CategoryVirtualizzazione CategoryDaRevisionare