Difference between revisions of "KVM (Italiano)"

From ArchWiki
Jump to: navigation, search
m (changed category)
(update templates, see Help:Style)
Line 11: Line 11:
 
I kernel Arch a partire dalla versione 2.6.22 forniscono i moduli kvm appropriati. Si può verificare se il proprio kernel supporti kvm tramite il seguente comando:
 
I kernel Arch a partire dalla versione 2.6.22 forniscono i moduli kvm appropriati. Si può verificare se il proprio kernel supporti kvm tramite il seguente comando:
  
{{cli|# modprobe -l 'kvm*'}}
+
{{bc|# modprobe -l 'kvm*'}}
  
 
KVM richiede inoltre una versione modificata di QEMU (presente nel pacchetto qemu-kvm all'interno del repository EXTRA) per lanciare ed eseguire macchine virtuali. Alternativamente si può scegliere di installare una versione di qemu uguale o superiore a 0.9.0 che va in conflitto con il pacchetto qemu-kvm ma fornisce un eseguibile qemu-kvm (qemu -enable-kvm) che si avvantaggia di questa tecnologia.
 
KVM richiede inoltre una versione modificata di QEMU (presente nel pacchetto qemu-kvm all'interno del repository EXTRA) per lanciare ed eseguire macchine virtuali. Alternativamente si può scegliere di installare una versione di qemu uguale o superiore a 0.9.0 che va in conflitto con il pacchetto qemu-kvm ma fornisce un eseguibile qemu-kvm (qemu -enable-kvm) che si avvantaggia di questa tecnologia.
  
{{cli|# pacman -S kernel26 qemu-kvm}}
+
{{bc|# pacman -S kernel26 qemu-kvm}}
 
o
 
o
{{cli|# pacman -S kernel26 qemu}}
+
{{bc|# pacman -S kernel26 qemu}}
  
 
=== Configurare i moduli del kernel ===
 
=== Configurare i moduli del kernel ===
Line 23: Line 23:
 
È possibile verificare che il proprio computer supporti l'accelerazione hardware tramite questo comando (deve restituire un qualche tipo di output) :
 
È possibile verificare che il proprio computer supporti l'accelerazione hardware tramite questo comando (deve restituire un qualche tipo di output) :
  
{{cli|# egrep '^flags.*(vmx<nowiki>|</nowiki>svm)' /proc/cpuinfo}}
+
{{bc|# egrep '^flags.*(vmx<nowiki>|</nowiki>svm)' /proc/cpuinfo}}
  
 
Innanzitutto è necessario aggiungere il proprio utente al gruppo kvm in modo da consentirgli di utilizzare la periferica /dev/kvm
 
Innanzitutto è necessario aggiungere il proprio utente al gruppo kvm in modo da consentirgli di utilizzare la periferica /dev/kvm
  
{{cli|# gpasswd -a <Your_Login_Name> kvm}}
+
{{bc|# gpasswd -a <Your_Login_Name> kvm}}
  
 
Successivamente, caricare i moduli ''kvm'' e ''kvm-intel'' se si possiede un processore Intel
 
Successivamente, caricare i moduli ''kvm'' e ''kvm-intel'' se si possiede un processore Intel
  
{{cli|# modprobe kvm}}
+
{{bc|# modprobe kvm}}
{{cli|# modprobe kvm-intel}}
+
{{bc|# modprobe kvm-intel}}
  
 
oppure i moduli ''kvm'' e ''kvm-amd'' nel caso si possieda un processore AMD
 
oppure i moduli ''kvm'' e ''kvm-amd'' nel caso si possieda un processore AMD
  
{{cli|# modprobe kvm}}
+
{{bc|# modprobe kvm}}
{{cli|# modprobe kvm-amd}}
+
{{bc|# modprobe kvm-amd}}
  
 
Se il caricamento del modulo kvm dovesse andare a buon fine, ma si dovessero riscontrare problemi nel caricamento di kvm-intel o kvm-amd (nonostante /proc/cpuinfo confermi la presenza di estensioni di virtualizzazione), verificare le impostazioni del proprio BIOS, in quanto alcuni produttori (sopratutto di sistemi portatili) disabilitano la VT di default.
 
Se il caricamento del modulo kvm dovesse andare a buon fine, ma si dovessero riscontrare problemi nel caricamento di kvm-intel o kvm-amd (nonostante /proc/cpuinfo confermi la presenza di estensioni di virtualizzazione), verificare le impostazioni del proprio BIOS, in quanto alcuni produttori (sopratutto di sistemi portatili) disabilitano la VT di default.
  
Se si vuole che questi moduli vengano caricati all'avvio, sfruttare {{filename|/etc/rc.conf}}
+
Se si vuole che questi moduli vengano caricati all'avvio, sfruttare {{ic|/etc/rc.conf}}
  
 
=== Come utilizzare KVM ===
 
=== Come utilizzare KVM ===
  
 
# Creare un'immagine del sistema guest
 
# Creare un'immagine del sistema guest
  {{cli|$ qemu-img create -f qcow2 <Image_Name> <size>}}
+
  {{bc|$ qemu-img create -f qcow2 <Image_Name> <size>}}
 
# Installare il sistema guest. Per l'installazione può essere utilizzata un'immagine cd/dvd (file ISO)
 
# Installare il sistema guest. Per l'installazione può essere utilizzata un'immagine cd/dvd (file ISO)
  {{cli|$ qemu-kvm -hda <Image_Name> -m 512 -cdrom </Path/to/the/ISO/Image> -boot d -vga std}}
+
  {{bc|$ qemu-kvm -hda <Image_Name> -m 512 -cdrom </Path/to/the/ISO/Image> -boot d -vga std}}
 
# Eseguire il sistema
 
# Eseguire il sistema
  {{cli|$ qemu-kvm -hda <Image_Name> -m 512 -vga std}}
+
  {{bc|$ qemu-kvm -hda <Image_Name> -m 512 -vga std}}
  
 
{{Nota| La memoria di default di KVM è di 128MB, per modificarla utilizzare il parametro -m. Tenere presente inoltre che i sistemi Microsoft più recenti (testato con Vista e Seven) richiedono il tipo di immagine qcow2, restituendo altrimenti un codice di errore 0x80070057 durante l'installazione.}}
 
{{Nota| La memoria di default di KVM è di 128MB, per modificarla utilizzare il parametro -m. Tenere presente inoltre che i sistemi Microsoft più recenti (testato con Vista e Seven) richiedono il tipo di immagine qcow2, restituendo altrimenti un codice di errore 0x80070057 durante l'installazione.}}
Line 64: Line 64:
 
Una periferica a blocchi virtio richiede l'opzione -drive anzichè la semplice -hd*, più if=virtio:
 
Una periferica a blocchi virtio richiede l'opzione -drive anzichè la semplice -hd*, più if=virtio:
 
    
 
    
{{cli|$ qemu-kvm -drive file<nowiki>=</nowiki>drive.img,if<nowiki>=</nowiki>virtio,boot<nowiki>=</nowiki>on}}
+
{{bc|$ qemu-kvm -drive file<nowiki>=</nowiki>drive.img,if<nowiki>=</nowiki>virtio,boot<nowiki>=</nowiki>on}}
  
 
{{Nota| boot<nowiki>=</nowiki>on è assolutamente necessario se si desidera eseguire il boot da questa periferica. Non c'è alcun tipo di autorilevamento, come invece avviene con -hd*}}
 
{{Nota| boot<nowiki>=</nowiki>on è assolutamente necessario se si desidera eseguire il boot da questa periferica. Non c'è alcun tipo di autorilevamento, come invece avviene con -hd*}}
Line 70: Line 70:
 
All'incirca lo stesso metodo si utilizza per le periferiche di rete
 
All'incirca lo stesso metodo si utilizza per le periferiche di rete
 
    
 
    
{{cli|$ qemu-kvm -net nic,model<nowiki>=</nowiki>virtio}}
+
{{bc|$ qemu-kvm -net nic,model<nowiki>=</nowiki>virtio}}
  
 
==== Preparare un sistema guest (arch)linux ====
 
==== Preparare un sistema guest (arch)linux ====
  
 
Per utilizzare periferiche virtio, i seguenti moduli possono essere caricati nel sistema guest: '''virtio, virtio_pci, virtio_blk, virtio_net e virtio_ring''' ( per sistemi guest a 32 bit, il modulo virtio specifico non è necessario).
 
Per utilizzare periferiche virtio, i seguenti moduli possono essere caricati nel sistema guest: '''virtio, virtio_pci, virtio_blk, virtio_net e virtio_ring''' ( per sistemi guest a 32 bit, il modulo virtio specifico non è necessario).
Se si vuole eseguire il boot da un disco-vitio, il ramdisk iniziale deve essere [[mkinitcpio (Italiano)|rigenerato]]. Aggiungere i moduli appropriati all'interno di {{filename|/etc/mkinitcpio.conf}} in questo modo:
+
Se si vuole eseguire il boot da un disco-vitio, il ramdisk iniziale deve essere [[mkinitcpio (Italiano)|rigenerato]]. Aggiungere i moduli appropriati all'interno di {{ic|/etc/mkinitcpio.conf}} in questo modo:
  
{{File|name=/etc/mkinitcpio.conf|content=MODULES<nowiki>=</nowiki>"virtio virtio_blk virtio_pci virtio_net virtio_ring"}}
+
{{hc|/etc/mkinitcpio.conf|MODULES<nowiki>=</nowiki>"virtio virtio_blk virtio_pci virtio_net virtio_ring"}}
 
e rigenerare:
 
e rigenerare:
  
{{cli|# mkinitcpio -p kernel26}}
+
{{bc|# mkinitcpio -p kernel26}}
  
I dischi virtio sono rilevati col prefisso '''v''' (come ad esempio vda, vdb, etc...). Devono quindi essere effettuate le opportune modifiche all'interno di {{filename|/etc/fstab}} e {{filename|/boot/grub/menu.lst}} (se si esegue il boot da uno di questi dischi; ovviamente se si utilizza un sistema che fa riferimento ai dischi tramite [[Persistent block device naming (Italiano)|uuids]], non deve essere modificato nulla.)
+
I dischi virtio sono rilevati col prefisso '''v''' (come ad esempio vda, vdb, etc...). Devono quindi essere effettuate le opportune modifiche all'interno di {{ic|/etc/fstab}} e {{ic|/boot/grub/menu.lst}} (se si esegue il boot da uno di questi dischi; ovviamente se si utilizza un sistema che fa riferimento ai dischi tramite [[Persistent block device naming (Italiano)|uuids]], non deve essere modificato nulla.)
  
Grub ha alcuni problemi nel riconoscimento di dischi virtio. Perciò, se il bootloader non è installato, o se lo si vuole re-installare, è necessario modificare (o creare, nel caso non sia presente, eventualità molto frequente) anche il file {{filename|/boot/grub/device.map}} in maniera coerente:
+
Grub ha alcuni problemi nel riconoscimento di dischi virtio. Perciò, se il bootloader non è installato, o se lo si vuole re-installare, è necessario modificare (o creare, nel caso non sia presente, eventualità molto frequente) anche il file {{ic|/boot/grub/device.map}} in maniera coerente:
  
{{File|name=/boot/grub/device.map|content=(hd0) /dev/vda}}
+
{{hc|/boot/grub/device.map|(hd0) /dev/vda}}
  
 
Bisogna ora eseguire Grub con l'opzione --device-map
 
Bisogna ora eseguire Grub con l'opzione --device-map
  
{{cli|# grub --device-map /boot/grub/device.map}}
+
{{bc|# grub --device-map /boot/grub/device.map}}
  
 
All'interno della shell interattiva, definire la partizione di boot; nel caso in esempio vda1
 
All'interno della shell interattiva, definire la partizione di boot; nel caso in esempio vda1
{{cli|> root (hd0,0)}}
+
{{bc|> root (hd0,0)}}
 
Installare il bootloader, qui su vda
 
Installare il bootloader, qui su vda
{{cli|> setup (hd0)}}
+
{{bc|> setup (hd0)}}
 
se non si sono verificati errori, uscire dalla shell
 
se non si sono verificati errori, uscire dalla shell
{{cli|> quit}}
+
{{bc|> quit}}
  
 
Sfortunatamente questa installazione manuale di grub è necessaria per la versione di arch corrente al momento della scrittura di questo wiki (arch-release-media 2010.05).
 
Sfortunatamente questa installazione manuale di grub è necessaria per la versione di arch corrente al momento della scrittura di questo wiki (arch-release-media 2010.05).
Line 104: Line 104:
 
Perciò durante l'installazione di Archlinux, è possibile installare Grub spostandosi in un altro Terminale Virtuale {{keypress|Ctrl}}+{{keypress|Alt}}+{{keypress|F2}} ed eseguendo questi comandi:
 
Perciò durante l'installazione di Archlinux, è possibile installare Grub spostandosi in un altro Terminale Virtuale {{keypress|Ctrl}}+{{keypress|Alt}}+{{keypress|F2}} ed eseguendo questi comandi:
  
{{cli|# grub
+
{{bc|# grub
 
> device (hd0) /dev/vda
 
> device (hd0) /dev/vda
 
> root (hd0,0)
 
> root (hd0,0)
Line 114: Line 114:
  
 
Una volta completata l'installazione di Grub, ritornare al Terminale Virtuale precedente.
 
Una volta completata l'installazione di Grub, ritornare al Terminale Virtuale precedente.
 
  
 
Ulteriori informazioni sulla paravirtualizzazione in KVM:
 
Ulteriori informazioni sulla paravirtualizzazione in KVM:
Line 124: Line 123:
 
Convertirla in immagine raw, espandere la sua dimensione con dd, riconvertirla in qcow2, rimpiazzare la partizione con una più grande, effettuare un fsck e ridimensionare il filesystem.
 
Convertirla in immagine raw, espandere la sua dimensione con dd, riconvertirla in qcow2, rimpiazzare la partizione con una più grande, effettuare un fsck e ridimensionare il filesystem.
  
{{cli|$ qemu-img convert -O raw image.qcow2 image.img}}
+
{{bc|$ qemu-img convert -O raw image.qcow2 image.img}}
{{cli|$ dd if<nowiki>=</nowiki>/dev/zero of<nowiki>=</nowiki>image.img bs<nowiki>=</nowiki>1G count<nowiki>=</nowiki>0 seek<nowiki>=</nowiki>[NUMBER_OF_GB]}}
+
{{bc|$ dd if<nowiki>=</nowiki>/dev/zero of<nowiki>=</nowiki>image.img bs<nowiki>=</nowiki>1G count<nowiki>=</nowiki>0 seek<nowiki>=</nowiki>[NUMBER_OF_GB]}}
{{cli|$ qemu-img convert -O qcow2 -o cluster_size<nowiki>=</nowiki>64K image.img imageplus.qcow2}}
+
{{bc|$ qemu-img convert -O qcow2 -o cluster_size<nowiki>=</nowiki>64K image.img imageplus.qcow2}}
{{cli|$ qemu-kvm -hda imageplus.qcow2 -m 512 -cdrom </Path/to/the/ISO/Image> -boot d -vga std}}
+
{{bc|$ qemu-kvm -hda imageplus.qcow2 -m 512 -cdrom </Path/to/the/ISO/Image> -boot d -vga std}}
 
Tenere presente che il successivo comando cancellerà la partizione, creandone una nuova che andrà ad occupare l'intero disco.
 
Tenere presente che il successivo comando cancellerà la partizione, creandone una nuova che andrà ad occupare l'intero disco.
{{cli|$ fdisk /dev/sda}}
+
{{bc|$ fdisk /dev/sda}}
{{cli|$ e2fsck -f /dev/sda1}}
+
{{bc|$ e2fsck -f /dev/sda1}}
{{cli|$ resize2fs /dev/sda1}}
+
{{bc|$ resize2fs /dev/sda1}}
  
 
=== Abilitare KSM ===
 
=== Abilitare KSM ===
 
KSM (Kernel Samepage Merging) è una funzione del kernel Linux introdotta con la versione 2.6.32. KSM consente alle applicazioni registrate di condividere alcune delle loro pagine di memoria. Per quanto riguarda KVM, il meccanismo KSM consente alle macchine virtuali create di operare questa condivisione. In uno scenario all'interno del quale siano presenti diversi sistemi operativi guest simili tra loro, questa scelta può comportare un significativo risparmio di memoria impiegata.
 
KSM (Kernel Samepage Merging) è una funzione del kernel Linux introdotta con la versione 2.6.32. KSM consente alle applicazioni registrate di condividere alcune delle loro pagine di memoria. Per quanto riguarda KVM, il meccanismo KSM consente alle macchine virtuali create di operare questa condivisione. In uno scenario all'interno del quale siano presenti diversi sistemi operativi guest simili tra loro, questa scelta può comportare un significativo risparmio di memoria impiegata.
 
Per abilitare KSM, assicurarsi per prima cosa di disporre di una versione di qemu-kvm uguale o superiore alla 0.12.
 
Per abilitare KSM, assicurarsi per prima cosa di disporre di una versione di qemu-kvm uguale o superiore alla 0.12.
{{command|# pacman -Qi qemu-kvm <nowiki>|</nowiki> grep Version|Version        : 0.12.1.2-1}}
+
{{hc|# pacman -Qi qemu-kvm <nowiki>|</nowiki> grep Version|Version        : 0.12.1.2-1}}
 
e di una versione del kernel uguale o superiore alla 2.6.32.
 
e di una versione del kernel uguale o superiore alla 2.6.32.
{{command|# uname -r|2.6.32-ARCH}}
+
{{hc|$ uname -r|2.6.32-ARCH}}
Se i due requisiti sono soddisfatti, dovrebbe quindi essere presente la directory {{filename|/sys/kernel/mm/ksm/}}, contenente vari file. È possibile abilitare/disabilitare KSM modificando ad 1 o 0 il file {{filename|/sys/kernel/mm/ksm/run}}
+
Se i due requisiti sono soddisfatti, dovrebbe quindi essere presente la directory {{ic|/sys/kernel/mm/ksm/}}, contenente vari file. È possibile abilitare/disabilitare KSM modificando ad 1 o 0 il file {{ic|/sys/kernel/mm/ksm/run}}
{{cli|# echo 1 > /sys/kernel/mm/ksm/run}}
+
{{bc|# echo 1 > /sys/kernel/mm/ksm/run}}
Se KSM è in esecuzione, e ci sono pagine da condividere (ad esempio, se sono in esecuzione due o più macchine virtuali simili) allora il file {{filename|/sys/kernel/mm/ksm/pages_shared}} avrà un valore diverso da 0. Come spiegato nella documentazione del kernel {{filename|Documentation/vm/ksm.txt}} lo stato effettivo di KSM e di MADV_MERGEABLE è mostrato all'interno di {{filename|/sys/kernel/mm/ksm/}}:
+
Se KSM è in esecuzione, e ci sono pagine da condividere (ad esempio, se sono in esecuzione due o più macchine virtuali simili) allora il file {{ic|/sys/kernel/mm/ksm/pages_shared}} avrà un valore diverso da 0. Come spiegato nella documentazione del kernel {{ic|Documentation/vm/ksm.txt}} lo stato effettivo di KSM e di MADV_MERGEABLE è mostrato all'interno di {{ic|/sys/kernel/mm/ksm/}}:
 
   
 
   
 
  pages_shared    - how many shared unswappable kernel pages KSM is using
 
  pages_shared    - how many shared unswappable kernel pages KSM is using
Line 155: Line 154:
 
Una maniera semplice per varificare le effettive performance del KSM, consiste nello stampare il contenuto dei file in questa directory
 
Una maniera semplice per varificare le effettive performance del KSM, consiste nello stampare il contenuto dei file in questa directory
  
{{command|# for ii in /sys/kernel/mm/ksm/* ; do echo -n "$ii: " ; cat $ii ; done|/sys/kernel/mm/ksm/full_scans: 151
+
{{hc|# for ii in /sys/kernel/mm/ksm/* ; do echo -n "$ii: " ; cat $ii ; done|/sys/kernel/mm/ksm/full_scans: 151
 
  /sys/kernel/mm/ksm/max_kernel_pages: 246793
 
  /sys/kernel/mm/ksm/max_kernel_pages: 246793
 
  /sys/kernel/mm/ksm/pages_shared: 92112
 
  /sys/kernel/mm/ksm/pages_shared: 92112
Line 172: Line 171:
 
Consultare anche [[QEMU#Tap_Networking_with_QEMU]] and [[QEMU#Networking_with_VDE2]].
 
Consultare anche [[QEMU#Tap_Networking_with_QEMU]] and [[QEMU#Networking_with_VDE2]].
  
{{cli|# pacman -S bridge-utils}}
+
{{bc|# pacman -S bridge-utils}}
Salvare questo script all'interno di {{filename|/etc/qemu-ifup}}
+
Salvare questo script all'interno di {{ic|/etc/qemu-ifup}}
{{file|name=script|content=#!/bin/sh
+
{{hc|script|#!/bin/sh
 
  echo "Executing /etc/qemu-ifup"
 
  echo "Executing /etc/qemu-ifup"
 
  echo "Bringing up $1 for bridged mode..."
 
  echo "Bringing up $1 for bridged mode..."
Line 182: Line 181:
 
  sleep 2}}
 
  sleep 2}}
 
modificare i permessi allo script ed alla directory
 
modificare i permessi allo script ed alla directory
{{cli|#chmod 755 /etc/qemu-ifup/script}}
+
{{bc|#chmod 755 /etc/qemu-ifup/script}}
{{cli|#chmod 755 /etc/qemu-ifup}}
+
{{bc|#chmod 755 /etc/qemu-ifup}}
  
 
Utilizzare quindi questo script per avviare KVM, modificando la linea ARGS in base alle proprie esigenze:
 
Utilizzare quindi questo script per avviare KVM, modificando la linea ARGS in base alle proprie esigenze:
  
{{file|name=start_bridged|content= #!/bin/sh
+
{{hc|start_bridged|2= #!/bin/sh
 
  ARGS="-hda win2k.img -boot c -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup -m 256 -localtime"
 
  ARGS="-hda win2k.img -boot c -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup -m 256 -localtime"
 
  echo "Starting QEMU with..."
 
  echo "Starting QEMU with..."
Line 199: Line 198:
 
Per evitare che il mouse venga catturato quando si clicca  
 
Per evitare che il mouse venga catturato quando si clicca  
 
all'interno della finestra del sistema guest aggiungere l'opzione "-usbdevice tablet". Ciò significa che qemu sarà in grado di rilevare la posizione del mouse senza doverlo catturare. Quando attivata, questa opzione sovrascrive inoltre l'emulazione della porta PS/2.
 
all'interno della finestra del sistema guest aggiungere l'opzione "-usbdevice tablet". Ciò significa che qemu sarà in grado di rilevare la posizione del mouse senza doverlo catturare. Quando attivata, questa opzione sovrascrive inoltre l'emulazione della porta PS/2.
{{cli|$ qemu-kvm -hda <Image_Name> -m 512 -vga std -usbdevice tablet}}
+
{{bc|$ qemu-kvm -hda <Image_Name> -m 512 -vga std -usbdevice tablet}}
  
 
=== Montare immagini qemu ===
 
=== Montare immagini qemu ===
{{cli|# modprobe nbd max_part<nowiki>=</nowiki>63}}
+
{{bc|# modprobe nbd max_part<nowiki>=</nowiki>63}}
{{cli|# qemu-nbd -c /dev/nbd0 [image.img]}}
+
{{bc|# qemu-nbd -c /dev/nbd0 [image.img]}}
{{cli|# mount /dev/nbd0p1 [/mnt/qemu]}}
+
{{bc|# mount /dev/nbd0p1 [/mnt/qemu]}}
  
 
=== Eseguire le macchine virtuali all'avvio ===
 
=== Eseguire le macchine virtuali all'avvio ===
 
Consultare [[QEMU#Starting_qemu_virtual_machines_on_boot]]
 
Consultare [[QEMU#Starting_qemu_virtual_machines_on_boot]]

Revision as of 12:39, 3 December 2011

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.


Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어


External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

KVM, Kernel Based Virtual Machine, è un hypervisor inserito direttamente all'interno del kernel 2.6 a partire dalla versione 2.6.20. Il suo utilizzo ha scopi simili a quelli di Xen ma è più immediato. Per cominciare ad utilizzare l'hypervisor è sufficiente caricare i moduli appropriati. Come per la virtualizzazione completa di Xen, anche per utilizzare KVM è necessario disporre di un processore che supporti le estensioni VT di Intel, o Pacifica in caso di sistema AMD.

Utilizzando KVM, è possibile avviare macchine virtuali multiple che eseguano immagini non modificate di Linux, Windows, o di molti altri sistemi. (Consultare Guest Support Status). Ogni macchina virtuale ha il suo hardware virtualizzato privato: scheda di rete, adattatore grafico, etc. Consultare KVM Howto

Le differenze tra KVM, Xen, VMware e QEMU sono elencate su KVM FAQ.

Installare i pacchetti

I kernel Arch a partire dalla versione 2.6.22 forniscono i moduli kvm appropriati. Si può verificare se il proprio kernel supporti kvm tramite il seguente comando:

# modprobe -l 'kvm*'

KVM richiede inoltre una versione modificata di QEMU (presente nel pacchetto qemu-kvm all'interno del repository EXTRA) per lanciare ed eseguire macchine virtuali. Alternativamente si può scegliere di installare una versione di qemu uguale o superiore a 0.9.0 che va in conflitto con il pacchetto qemu-kvm ma fornisce un eseguibile qemu-kvm (qemu -enable-kvm) che si avvantaggia di questa tecnologia.

# pacman -S kernel26 qemu-kvm

o

# pacman -S kernel26 qemu

Configurare i moduli del kernel

È possibile verificare che il proprio computer supporti l'accelerazione hardware tramite questo comando (deve restituire un qualche tipo di output) :

# egrep '^flags.*(vmx|svm)' /proc/cpuinfo

Innanzitutto è necessario aggiungere il proprio utente al gruppo kvm in modo da consentirgli di utilizzare la periferica /dev/kvm

# gpasswd -a <Your_Login_Name> kvm

Successivamente, caricare i moduli kvm e kvm-intel se si possiede un processore Intel

# modprobe kvm
# modprobe kvm-intel

oppure i moduli kvm e kvm-amd nel caso si possieda un processore AMD

# modprobe kvm
# modprobe kvm-amd

Se il caricamento del modulo kvm dovesse andare a buon fine, ma si dovessero riscontrare problemi nel caricamento di kvm-intel o kvm-amd (nonostante /proc/cpuinfo confermi la presenza di estensioni di virtualizzazione), verificare le impostazioni del proprio BIOS, in quanto alcuni produttori (sopratutto di sistemi portatili) disabilitano la VT di default.

Se si vuole che questi moduli vengano caricati all'avvio, sfruttare /etc/rc.conf

Come utilizzare KVM

  1. Creare un'immagine del sistema guest
$ qemu-img create -f qcow2 <Image_Name> <size>
  1. Installare il sistema guest. Per l'installazione può essere utilizzata un'immagine cd/dvd (file ISO)
$ qemu-kvm -hda <Image_Name> -m 512 -cdrom </Path/to/the/ISO/Image> -boot d -vga std
  1. Eseguire il sistema
$ qemu-kvm -hda <Image_Name> -m 512 -vga std
Nota: La memoria di default di KVM è di 128MB, per modificarla utilizzare il parametro -m. Tenere presente inoltre che i sistemi Microsoft più recenti (testato con Vista e Seven) richiedono il tipo di immagine qcow2, restituendo altrimenti un codice di errore 0x80070057 durante l'installazione.

Consultare QEMU per tutte le altre informazioni, e la sezione Using the Kernel-based Virtual Machine.

Sistema guest paravirtualizzato (virtio)

KVM offre ai sistemi guest la possibilità di utilizzare la paravirtualizzazione di periferiche a blocchi e di rete, che consente migliori prestazioni e minor sovraccarico. Linux ha questa capacità con i suoi moduli virtio dalla versione 2.6.25. Per windows un driver di periferica di rete paravirtualizzata è disponibile a questo indirizzo.

Una periferica a blocchi virtio richiede l'opzione -drive anzichè la semplice -hd*, più if=virtio:

$ qemu-kvm -drive file=drive.img,if=virtio,boot=on
Nota: boot=on è assolutamente necessario se si desidera eseguire il boot da questa periferica. Non c'è alcun tipo di autorilevamento, come invece avviene con -hd*

All'incirca lo stesso metodo si utilizza per le periferiche di rete

$ qemu-kvm -net nic,model=virtio

Preparare un sistema guest (arch)linux

Per utilizzare periferiche virtio, i seguenti moduli possono essere caricati nel sistema guest: virtio, virtio_pci, virtio_blk, virtio_net e virtio_ring ( per sistemi guest a 32 bit, il modulo virtio specifico non è necessario). Se si vuole eseguire il boot da un disco-vitio, il ramdisk iniziale deve essere rigenerato. Aggiungere i moduli appropriati all'interno di /etc/mkinitcpio.conf in questo modo:

/etc/mkinitcpio.conf
MODULES="virtio virtio_blk virtio_pci virtio_net virtio_ring"

e rigenerare:

# mkinitcpio -p kernel26

I dischi virtio sono rilevati col prefisso v (come ad esempio vda, vdb, etc...). Devono quindi essere effettuate le opportune modifiche all'interno di /etc/fstab e /boot/grub/menu.lst (se si esegue il boot da uno di questi dischi; ovviamente se si utilizza un sistema che fa riferimento ai dischi tramite uuids, non deve essere modificato nulla.)

Grub ha alcuni problemi nel riconoscimento di dischi virtio. Perciò, se il bootloader non è installato, o se lo si vuole re-installare, è necessario modificare (o creare, nel caso non sia presente, eventualità molto frequente) anche il file /boot/grub/device.map in maniera coerente:

/boot/grub/device.map
(hd0) /dev/vda

Bisogna ora eseguire Grub con l'opzione --device-map

# grub --device-map /boot/grub/device.map

All'interno della shell interattiva, definire la partizione di boot; nel caso in esempio vda1

> root (hd0,0)

Installare il bootloader, qui su vda

> setup (hd0)

se non si sono verificati errori, uscire dalla shell

> quit

Sfortunatamente questa installazione manuale di grub è necessaria per la versione di arch corrente al momento della scrittura di questo wiki (arch-release-media 2010.05). Nonostante Aif riconosca e imposti correttamente i prefissi ai dischi virtio, il file device.map deve essere creato manualmente prima della configurazione del bootloader.

Perciò durante l'installazione di Archlinux, è possibile installare Grub spostandosi in un altro Terminale Virtuale Template:Keypress+Template:Keypress+Template:Keypress ed eseguendo questi comandi:

# grub
> device (hd0) /dev/vda
> root (hd0,0)
> setup (hd0)
> quit
Nota: La numerazione (hd0,0) potrebbe cambiare in base alla propria configurazione. Riferimento: [[1]]

Una volta completata l'installazione di Grub, ritornare al Terminale Virtuale precedente.

Ulteriori informazioni sulla paravirtualizzazione in KVM: [2] sezione nel qemu-book tedesco: [3]

Ridimensionare l'immagine

È possibile incrementare la dimensione di un'immagine qcow2 successivamente, almeno con ext3. Convertirla in immagine raw, espandere la sua dimensione con dd, riconvertirla in qcow2, rimpiazzare la partizione con una più grande, effettuare un fsck e ridimensionare il filesystem.

$ qemu-img convert -O raw image.qcow2 image.img
$ dd if=/dev/zero of=image.img bs=1G count=0 seek=[NUMBER_OF_GB]
$ qemu-img convert -O qcow2 -o cluster_size=64K image.img imageplus.qcow2
$ qemu-kvm -hda imageplus.qcow2 -m 512 -cdrom </Path/to/the/ISO/Image> -boot d -vga std

Tenere presente che il successivo comando cancellerà la partizione, creandone una nuova che andrà ad occupare l'intero disco.

$ fdisk /dev/sda
$ e2fsck -f /dev/sda1
$ resize2fs /dev/sda1

Abilitare KSM

KSM (Kernel Samepage Merging) è una funzione del kernel Linux introdotta con la versione 2.6.32. KSM consente alle applicazioni registrate di condividere alcune delle loro pagine di memoria. Per quanto riguarda KVM, il meccanismo KSM consente alle macchine virtuali create di operare questa condivisione. In uno scenario all'interno del quale siano presenti diversi sistemi operativi guest simili tra loro, questa scelta può comportare un significativo risparmio di memoria impiegata. Per abilitare KSM, assicurarsi per prima cosa di disporre di una versione di qemu-kvm uguale o superiore alla 0.12.

# pacman -Qi qemu-kvm | grep Version
Version        : 0.12.1.2-1

e di una versione del kernel uguale o superiore alla 2.6.32.

$ uname -r
2.6.32-ARCH

Se i due requisiti sono soddisfatti, dovrebbe quindi essere presente la directory /sys/kernel/mm/ksm/, contenente vari file. È possibile abilitare/disabilitare KSM modificando ad 1 o 0 il file /sys/kernel/mm/ksm/run

# echo 1 > /sys/kernel/mm/ksm/run

Se KSM è in esecuzione, e ci sono pagine da condividere (ad esempio, se sono in esecuzione due o più macchine virtuali simili) allora il file /sys/kernel/mm/ksm/pages_shared avrà un valore diverso da 0. Come spiegato nella documentazione del kernel Documentation/vm/ksm.txt lo stato effettivo di KSM e di MADV_MERGEABLE è mostrato all'interno di /sys/kernel/mm/ksm/:

pages_shared     - how many shared unswappable kernel pages KSM is using
pages_sharing    - how many more sites are sharing them i.e. how much saved
pages_unshared   - how many pages unique but repeatedly checked for merging
pages_volatile   - how many pages changing too fast to be placed in a tree
full_scans       - how many times all mergeable areas have been scanned
Un rapporto alto tra pages_sharing e pages_shared indica una buona condivisione, ma 
un rapporto alto tra pages_unshared e pages_sharing indica tentativi inutili
pages_volatile è funzione di diversi tipi di attività, ma un valore alto potrebbe indicare un uso limitato di madvise MADV_MERGEABLE.

Una maniera semplice per varificare le effettive performance del KSM, consiste nello stampare il contenuto dei file in questa directory

# for ii in /sys/kernel/mm/ksm/* ; do echo -n "$ii: " ; cat $ii ; done
/sys/kernel/mm/ksm/full_scans: 151
 /sys/kernel/mm/ksm/max_kernel_pages: 246793
 /sys/kernel/mm/ksm/pages_shared: 92112
 /sys/kernel/mm/ksm/pages_sharing: 131355
 /sys/kernel/mm/ksm/pages_to_scan: 100
 /sys/kernel/mm/ksm/pages_unshared: 123942
 /sys/kernel/mm/ksm/pages_volatile: 1182
 /sys/kernel/mm/ksm/run: 1
 /sys/kernel/mm/ksm/sleep_millisecs: 20

Agevolazioni per i nuovi utenti

Se è stato installato il pacchetto qemu, è possibile utilizzare delle interfacce grafiche, come qtemu, per gestire le proprie macchine virtuali (è necessario modificare il valore di "QEMU start command" nel pannello di configurazione da "qemu" a "qemu-kvm"/"qemu-system-x86_64" o aggiungere -enable-kvm alle opzioni di avvio addizionali. Con le nuove versioni di qemu, potrebbe non essere più necessario utilizzare il comando qemu-kvm, qemu dovrebbe rilevare l'esecuzione di kvm e partire con i corretti parametri. Se si avvia la propria macchina virtuale tramite un'interfaccia grafica, e si riscontra una installazione mlto lenta, sarà il caso di verificare la corretta esecuzione di KVM.

Connessioni bridged

Consultare anche QEMU#Tap_Networking_with_QEMU and QEMU#Networking_with_VDE2.

# pacman -S bridge-utils

Salvare questo script all'interno di /etc/qemu-ifup

script
#!/bin/sh
 echo "Executing /etc/qemu-ifup"
 echo "Bringing up $1 for bridged mode..."
 sudo /sbin/ifconfig $1 0.0.0.0 promisc up
 echo "Adding $1 to br0..."
 sudo /usr/sbin/brctl addif br0 $1
 sleep 2

modificare i permessi allo script ed alla directory

#chmod 755 /etc/qemu-ifup/script
#chmod 755 /etc/qemu-ifup

Utilizzare quindi questo script per avviare KVM, modificando la linea ARGS in base alle proprie esigenze:

start_bridged
#!/bin/sh
 ARGS="-hda win2k.img -boot c -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup -m 256 -localtime"
 echo "Starting QEMU with..."
 echo $ARGS
 echo "...."
 exec qemu $ARGS

Ora la macchina virtuale dovrebbe essere in grado di ottenere un indirizzo ip dal server dhcp del sistema, e potrà essere raggiunta tramite quell'ip all'interno della rete locale.

Integrazione del mouse

Per evitare che il mouse venga catturato quando si clicca all'interno della finestra del sistema guest aggiungere l'opzione "-usbdevice tablet". Ciò significa che qemu sarà in grado di rilevare la posizione del mouse senza doverlo catturare. Quando attivata, questa opzione sovrascrive inoltre l'emulazione della porta PS/2.

$ qemu-kvm -hda <Image_Name> -m 512 -vga std -usbdevice tablet

Montare immagini qemu

# modprobe nbd max_part=63
# qemu-nbd -c /dev/nbd0 [image.img]
# mount /dev/nbd0p1 [/mnt/qemu]

Eseguire le macchine virtuali all'avvio

Consultare QEMU#Starting_qemu_virtual_machines_on_boot