KVM




Premessa

Kvm è un modulo del kernel che permette la virtualizzazione dei sistemi operativi

,come applicazione in user space invece usiamo una particolare versione di qemu chiamata qemu-kvm.

I vantaggi sono molteplici:tutto open-source,modulo direttamente nel kernel quindi possiamo evitare

tranquillamente le patch alle quali vmware e compagnia ci avevano abituato,e infine..la velocità

nettamente superiore alle altre applicazioni(perlomeno a vmware),va anche sottolineato che kvm

funziona benissimo da user,una qualità fondamentale per la sicurezza.

Ovviamente abbiamo anche svantaggi,uno su tutti la pessima gestione dell'acpi,ancora incompleta

ma sulle macchine virtuali non credo sia essenziale;oltretutto alcuni sistemi anziani come nt4 e windows

98 neppure partono.

Requisiti
Un processore che supporti l'istruzione vmx per intel  o svm per amd,per saperlo

$ cat /proc/cpuinfo|grep svm  


e ovviamente kvm che trovate su slacky

Preparativi
L'uso di kvm,è facilissimo praticamente si tratta di qemu modificato,se avete già usato qemu

non dovrebbero esserci problemi.

In ogni caso ecco qualche dritta,inanzitutto dovete inserire in /etc/groups,una riga simile a questa

kvm:x:106:nomeutente

poi controllate che abbiate in udev queste regole

KERNEL=="kvm", NAME="kvm", OWNER="root", GROUP="kvm", MODE="0660"
KERNEL=="tun", NAME="net/%k", OWNER="root", GROUP="kvm", MODE="0660"

fatto questo riavviate udev rules

#/etc/rc.d/rc.udev reload


ora riloggatevi e infine date

#modprobe kvm_amd


pronti!Adesso potete avviare la prima macchina virtuale.

Avvio
Come macchina virtuale di esempio prendiamo windows 2008.

Dobbiamo creare inanzitutto un disco virtuale ,potete crearlo

di quanti gb volete(tanto contano quelli che effetivamente usate

essendo un disco a espansione dinamica)

,per windows 2008 usiamo 100gb

$qemu-img create disco 100G


adesso installiamo la macchina virtuale con

$ qemu-system-x86_64 -drive file=Windows2008,if=virtio,boot=on -cdrom /dev/cdrom -net nic,model=virtio,vlan=0 -net tap,ifname=tap1,script=no,downscript=no -soundhw ac97 -m 512 -usb -usbdevice tablet


ovviamente col disco di installazione inserito...

in breve le opzioni

-drive file=Windows2008,if=virtio,boot=on : Usiamo i dispotivi paravirtualizzati che ci offrono più prestazioni rispetto ai dischi emulati


-cdrom:non ha bisogno di spiegazioni..potete usare sia il cdrom vero,che
un immagine iso

-net nic,model=virtio,vlan=0 crea una scheda di rete virtuale e da il numero 0
a questa rete,volendo si possono avviare altre macchine virtuali
collegate tra loro con ifname=tap1,tap2 e via dicendo
Attenzione:prima di avviare la macchina virtuale avviate la rete

-soundhw:crea una scheda audio virtuale

-m :indica la quantità di memoria fisica da usare

-usb -usbdevice tablet:Attivano usb,necessarie su alcuni sistemi operativi(Windows 2008)


Dischi e reti paravirtualizzati

Per installare questi dischi,è necessario procurarsi il l'immagine cd e floppy dei drivers sotto Windows che trovate in questo sito

avviate windows con l'immagine del floppy(-fda virtio-win-1.1.11-0.vfd) e installate i drivers.

Una volta installato il sistema usate l'immagine cd per installare i drivers della scheda di rete.

Sotto linux la procedura è meno complessa,infatti è sufficiente avviare il sistema,tranne su Slackware ove (attualmente) non sono stati inseriti i drivers virtio nel kernel all'avvio,risolviamo con questa procedura all'installazione

# cd /

#mount /dev/dvd mnt

#cp mnt/slackware/a/kernel-modules* .

# xz -d kernel-modules* && tar -xvf kernel-modules*

#insmod /lib/modules/2.6.33.4/kernel/drivers/virtio/virtio.ko

#insmod /lib/modules/2.6.33.4/kernel/drivers/block/virtio_blk.ko

#insmod /lib/modules/2.6.33.4/kernel/drivers/virtio/virtio_ring.ko

#insmod /lib/modules/2.6.33.4/kernel/drivers/virtio/virtio_balloon.ko

#insmod /lib/modules/2.6.33.4/kernel/drivers/virtio/virtio_pci.ko #attenzione..l'ordine potrebbe non essere corretto.

# umount mnt

Fatto questo dovreste poter gestire i device virtuali di rete e disco(/dev/vd*),installate normalmente riferndovi a vd* al posto di sd*,se usate LVM o dischi cifrati attenzione al initrd.gz che deve includere i modulli virtio elencati sopra.

Prima di riavviare quindi facciamo chroot e sistemiamo tutto

#mount -o bind /dev/ mnt/dev

#mount -o bind /proc/ mnt/proc

#chroot /mnt

# mkinitrd -c -k 2.6.33.4 -R /dev/vda1 -m ext4:virtio_pci:virtio_balloon:virtio_blk:virtio

Poi modificate queste righe in Lilo.conf(o aggiungetele)

boot=/dev/vda

disk=/dev/vda bios=0x80 max-partitions=7

root=/dev/vda1

Diamo infine gli ultimi comandi

# lilo -v

# exit

# umount mnt/*

# umount mnt

Trucchi

Come monto un disco virtuale di kvm?

mount  -o loop,offset=32256 nomedisco puntodimount

Come posso catturare uno screenshot?

Ctrl-alt-2 si sposta in una "console" di kvm,li digitate screendump nomefile
le immagini vengono salvate sulla cartella dove eseguite kvm in formato ppm.

Come posso creare una rete virtuale tra la mia macchina(host) e le varie vm?

Inanzitutto installate uml-utils.o tunctl e bridge-utils,poi avviate questo script

#!/bin/sh

kvmrete_start()

{

#!/bin/sh

USER=1000

IP=$(/sbin/ifconfig eth0 | awk '/inet addr:/ {print substr($2, 6)}')

BCAST=$(/sbin/ifconfig eth0 | awk '/inet addr:/ {print substr($3, 7)}')

NETMASK=$(/sbin/ifconfig eth0 | awk '/inet addr:/ {print substr($4, 6)}')

DEFGW=$(/sbin/route -n | awk '/^0\.0\.0\.0/ {print $2}')

echo "IP=$IP, BCAST=$BCAST, NETMASK=$NETMASK, DEFGW=$DEFGW"

start_tap()

{

TAP="tap$1"

/sbin/ifconfig $TAP 1>/dev/null 2>/dev/null

if [ $? -ne 0 ]; then

echo "Creating device $TAP..."

TAP=$(tunctl -b -t $TAP -u $USER)

/sbin/ifconfig $TAP 0.0.0.0 promisc up

fi

}

/sbin/modprobe tun

/sbin/modprobe bridge

echo "Setting up bridge br0..."

brctl addbr br0

/sbin/ifconfig eth0 0.0.0.0 promisc up

/sbin/ifconfig br0 $IP netmask $NETMASK broadcast $BCAST up

brctl stp br0 off

brctl setfd br0 1

brctl sethello br0 1

brctl addif br0 eth0

for i in 0 1 2 3 4; do

start_tap $i

brctl addif br0 tap$i

done

/sbin/route add default gw $DEFGW

}

kvmrete_stop()

{

tunctl -d tap0

brctl delif br0 eth0

ifconfig br0 down

brctl delbr br0

tunctl -d tap1

tunctl -d tap2

tunctl -d tap3

tunctl -d tap4

/etc/rc.d/rc.inet1 restart&

}

kvmrete_restart()

{

kvmrete_stop;

kvmrete_start;

}

case "$1" in

'start')

kvmrete_start

;;

'stop')

kvmrete_stop

;;

'restart')

kvmrete_restart

;;

*)

echo "usage $0 start|stop|restart"

esac

questo script crea 4 interfaccie tap che sarebbero le schede

delle vm,e le collega(bridge) alla vostra scheda di rete,una

volta fatto questo potete configurare la vm con un vero ip

(purchè sia nella vostra stessa sottorete) mentre come gw e dns

usate l'ip del vostro pc,o del vostro router.

Con questa configurazione i parametri per la rete saranno

-net nic,model=rtl8139,vlan=0 -net tap,ifname=tap1,script=no,downscript=no
-net nic,model=rtl8139,vlan=0 -net tap,ifname=tap2,script=no,downscript=no

notate tap1 per la prima vm avviata e tap2 per la seconda,vlan=0 invece indica

che stanno tutte nella stessa rete.

Posso avviare openbsd?

Certo ma solo su 64bit(x86_64) per quanto concerne la 4.5

mentre la 4.4 non dovrebbe dare problemi per l'architettura.

Avviate con questa linea

$ qemu-system-x86_64 -hda vostrodiscovirtuale -cdrom /dev/cdrom -localtime -m 512 -net nic,model=e1000,vlan=0 -net tap,ifname=tap0,script=no,downscript=no -soundhw ac97

Notare "e1000" come scheda di rete,installate normalmente,poi al primo avvio digitate bsd -c

poi nella shell del kernel date "disable mpbios" e "quit",una volta loggati date "config -ef /bsd" e ripetete "disable mpbios" e "quit".

Immagini















Ultimo aggiornamento: 2010-09-03


Torna all'indice