Virtualizzazioni in Linux (Parte 2 - KVM)
by admin on Oct.21, 2010, under Hacking, Linux
Nella puntata precedente, ho mostrato come impostare un server virtuale Debian Lenny eseguito sotto UML su Ubuntu 10.04.
In questo secondo articolo, ancora in tema di virtualizzazione, esamineremo KVM.
KVM sta per “kernel-based virtual machine”, disponibile a partire dalla versione 2.6.20 del kernel.
Passo per passo esamineremo stavolta:
1. i requisiti hardware per KVM
2. come impostare Ubuntu 10.04 come hosting OS.
3. come lanciare Puppy Linux come guest OS image
3. come installare BackTrack 4 R1 come guest OS image
4. come avviare ed eseguire il guest OS sotto KVM
5. come eseguire il KVM OS guest su un host con una singola interfaccia di rete col bridge networking
Prerequisiti: Virtualizzazione Hardware
Per ottenere le migliori performance il processore deve supportare la virtualizzazione hardware. Per scoprire se il proprio processore possieda il supporto hardware native alla virtualizzazione (HVM), si dia questo comando nella shell:
# egrep '^flags.*(vmx|svm)' /proc/cpuinfo
Se qualcosa viene emesso in output, significa che il processore fornisce il supporto alla virtualizzazione hardware ed è utilizzabile con KVM.
Senza supporto hardware, KVM ripiega sulla considerevolmente più lenta emulazione basata su QEMU.
Il processore Intel Core i3 dell’ammiraglia dei miei laptop non dovrebbe avere problemi a fornire una adeguata capacità di virtualizzazione hardware:
# egrep '^flags.*(vmx|svm)' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat tpr_shadow vnmi flexpriority ept vpid
In realtà questo non era sufficiente, dato che impartendo un:
# modprobe kvm_intel
ottenevo infatti un bel messaggio di “Operation not supported”.
Per fortuna il dmesg si rivelava meno laconico indicando chiaramente che il supporto alla virtualizzazione hardware era disattivato nel BIOS.
Effettuata la necessaria modifica tutto è proceduto senza intoppi.
Verifichiamo se i moduli kernel siano già caricati:
# lsmod |grep kvm kvm_intel 39416 0 kvm 244969 1 kvm_intel # modinfo kvm filename: /lib/modules/2.6.32-25-generic/kernel/arch/x86/kvm/kvm.ko license: GPL author: Qumranet srcversion: F0C69C7192C4B21232EB958 depends: vermagic: 2.6.32-25-generic SMP mod_unload modversions 586 parm: oos_shadow:bool parm: ignore_msrs:bool # modinfo kvm_intel filename: /lib/modules/2.6.32-25-generic/kernel/arch/x86/kvm/kvm-intel.ko license: GPL author: Qumranet srcversion: BDE3ADC0C2485840173870E depends: kvm vermagic: 2.6.32-25-generic SMP mod_unload modversions 586 parm: bypass_guest_pf:bool parm: vpid:bool parm: flexpriority:bool parm: ept:bool parm: unrestricted_guest:bool parm: emulate_invalid_guest_state:bool parm: ple_gap:int parm: ple_window:int
È il momento di mandare in esecuzione una virtual machine sotto KVM.
Ho scaricato a questo scopo la iso più recente di una delle distro live che va per la maggiore, Puppy Linux 5.1.1:
# kvm -cdrom lupu-511.iso -boot d -m 256
Questo comando è servito a montare lupu-511.iso come un CD-ROM (”-cdrom” opzione), avviare KVM con 256MB Ram (”-m 256″ opzione) ed effettuare il boot da cdrom (”-boot d” opzione). Una volta lanciato il comando kvm in una finestra terminale, un’altra finestra terminale compare mostrando gli abituali messaggio di boot.

Se il boot ha successo si otterrà la tipica schermata di Puppy.

Il comando appena utilizzato avvia da cdrom e l’ OS kvm guest dispone solo di un CD-ROM device corrispondente ad un file immagine ISO. Non vi è alcun disk device o disk image.
Vediamo perciò qualcosa di più completo utilizzando come OS image, al posto di Puppy, la BackTrack 4 R1 Release ISO, che oltre ad essere utilizzabile come distro live, è anche installabile in maniera permanente.
Per installare BackTrack 4 R1 come KVM guest OS, occorre una disk image. Dal momento che kvm deriva da qemu, si può usare il comando qemu-img per creare la disk image.
# qemu-img create backtrack-kvm 10G
Formatting 'backtrack-kvm', fmt=raw size=10737418240
In tal modo si è creata una disk image di 10GB sparsi destinata a essere usata per l’installazione di una BackTrack 4 R1 (1.9 Gb).
10GB dovrebbero costituire una dimensione sufficiente.
Se in Debian, kvm usa lo script /etc/kvm/kvm-ifup per inizializzare la rete per la virtual machine (host side) quando essa viene avviata, in Ubuntu tale compito viene svolto da /etc/qemu-ifup. /etc/qemu-ifup si presenta così:
#!/bin/sh
switch=$(/sbin/ip route list | awk '/^default / { print $5 }')
/sbin/ifconfig $1 0.0.0.0 up
/usr/sbin/brctl addif ${switch} $1
Evidentemente, esso assume che il sistema host usi un bridge.
Pertanto lo imposteremo nel sistema host:
# vi /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.1.11
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
# /etc/init.d/networking restart
* Reconfiguring network interfaces...
# ifconfig eth0; ifconfig br0
eth0 Link encap:Ethernet HWaddr 54:42:49:62:95:b0
inet6 addr: fe80::5642:49ff:fe62:95b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10327 errors:0 dropped:0 overruns:0 frame:0
TX packets:8300 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9898036 (9.8 MB) TX bytes:1153209 (1.1 MB)
Interrupt:18
br0 Link encap:Ethernet HWaddr 54:42:49:62:95:b0
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::5642:49ff:fe62:95b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3054 errors:0 dropped:0 overruns:0 frame:0
TX packets:2301 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2278110 (2.2 MB) TX bytes:363995 (363.9 KB)
Ora effettuiamo il download della distro Backtrack:
# wget ftp://ftp.uio.no/linux/backtrack/bt4-r1.iso
quindi testiamola come distro live in KVM, attivandone il networking in bridge mode:
# kvm -hda /backtrack-kvm -cdrom ./bt4-r1.iso -m 256 -boot d -net nic -net tap,name=br0


Avviando l’interfaccia grafica KDE di backtrack si ha subito la possibilità di installare permanentemente la distro nella partizione indicata.


Se l’installazione permanente ha avuto successo, dopo aver effettuato un completo shutdown e non un semplice reboot, come sarebbe normale se non fosse avvenuta su una macchina virtuale, l’ultimo passo da compiere rimane quello di dire a KVM di avviarsi dalla disk image:
# kvm -hda ./backtrack-kvm -m 256 -boot c -net nic -net tap,name=br0

Nonostante l’assurdo riferimento a Ubuntu 8.10, abbiamo ottenuto il nostro scopo:

Se si desidera mandare in esecuzione la virtual machine come daemon, si possono passare a kvm i parametri “-nographic” e “-daemonize” come argomenti.
# kvm -hda ./backtrack-kvm -m 256 -boot c -net nic -net tap,name=br0 -nographic -daemonize

