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.
$ cat /proc/cpuinfo|grep svm |
e ovviamente kvm che trovate su slacky
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.
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?
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