Sinistra <- Gestione sistemi - parte finale - Indice Generale - Copertina - Duplicazione di un sistema -> Destra

Sistemi Liberi


Emulazione e virtualizzazione

di Gabriele Pranovi

L'articolo...

Tratta di emulazione, paravirtualizzazione e virtualizzazione dei sistemi operativi. Vengono descritti alcuni software (aperti o liberi) che permettono di utilizzare più sistemi operativi contemporaneamente. Alcuni di tali programmi consentono l'esecuzione di applicazioni create per architetture hardware differenti, quali MIPS o SPARC. Tra i programmi descritti nell'articolo: QEMU, KVM, e VirtualBox.



Virtualizzazione

Tramite virtualizzazione è possibile eseguire uno o più sistemi operativi (ed il relativo software applicativo) da un unico PC, in un ambiente protetto e monitorato che prende il nome di macchina virtuale (VM). Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto ospitante (host) mentre la macchina virtuale è chiamata ospite (guest). Il codice della macchina virtuale viene eseguito direttamente dal sistema ospitante, ma il sistema ospite "pensa" di essere eseguito su una macchina reale priva di emulazione o virtualizzazione hardware.

Si può ottenere virtualizzazione in vari modi:

Qemu

QEMU è un emulatore di processore. Emula l'hardware del sistema ospitante esaminando dinamicamente il codice eseguito all'interno della macchina virtuale traducendolo in istruzioni comprensibili alla macchina ospitante.

QEMU è in grado di emulare numerose architetture hardware, tra cui x86, x86_64, ARM, SPARC, PowerPC, e MIPS. Il sistema ospitante è però vincolato alle architetture x86, x86_64 e PowerPC. Nel caso di architetture x86 esiste un acceleratore (kqemu) in grado di evitare la traduzione dinamica delle istruzioni, permettendo di raggiungere prestazioni attorno al 30-50% di quelle del sistema ospitante (con una emulazione non accelerata le prestazioni calano al solo 5-10%).

Per poter testare le funzionalità dell'emulature è necessario installare i pacchetti qemu, kqemu-common, kqemu-source e vgabios. Tali pacchetti possono essere scaricati ed installati con il comando sudo apt-get install qemu kqemu-common kqemu-source vgabios o utilizzando il gestore di pacchetti della propria distribuzione.

Di seguito vengono indicate alcune opzioni del comando qemu. Per maggiori informazioni vedere la pagina di manuale man qemu 1.

Parametro Significato
-fda file
-fdb file
Utilizza file come immagine del primo o secondo floppy. È possibile indicare /dev/fd0 come nome file, per utilizzare il floppy fisico.
-hda file
-hdb file
-hdc file
-hdd file
Utilizza file come immagine del disco.
-cdrom file
Utilizza file come immagine del cd-rom. È possibile utilizzare un dispositivo fisico indicando /dev/cdrom/ come file.
-boot [a|c|d|n]
Effettua il boot da floppy (a), disco fisso (c), cd-rom (d) o dalla rete (n)
-m mega
Imposta la RAM virtuale a megaMiB. Di default il valore è 128 MiB.

Tabella 1: Opzioni del comando qemu.

Di seguito vengono dati alcuni esempi che permettono di acquisire una maggior dimestichezza con l'emulazione offerta dal comando qemu. Come osservato QEMU è in grado di emulare architetture differenti, quindi può essere interessante sfruttare tali potenzialità per testare dei kernel linux per SPARC o MIPS. Dal sito di QEMU è possibile scaricare alcune immagini di test per tali architetture.

Nei vari esempi riportati, per "rilasciare" il controllo dalla macchina virtuale al sistema ospitante utilizzare la combinazione di tasti Ctrl+Alt.

Debian 2.6.18-3 per MIPS

Per questo test è necessario scaricare il pacchetto http://bellard.org/qemu/mips-test-0.2.tar.gz dal sito di QEMU, e scompattare i file immagine in una cartella sul proprio sistema. Dopo aver fatto cd nella cartella appena creata, lanciare i comandi

qemu-img create mips_hda 1G
qemu-system-mips \
	-kernel vmlinux-2.6.18-3-qemu \
	-initrd initrd.gz \
	-append "console=ttyS0 init=/bin/sh" \
	-nographic \
	-m 128 \
	-hda mips_hda

Il primo comando qemu-img create serve per creare un'immagine da 1Gb da utilizzare come disco fisso per il sistema operativo emulato. Il secondo richiama una versione specifica di qemu per l'emulazione di architetture MIPS. Come parametri vengono passati l'immagine del disco fisso, la quantità di memoria RAM da utilizzare, ed i percorsi al file immagine del kernel ed alla relativa immagine di boot.

[Console Linux 2.6.18 MIPS]

Figura 1: Console Linux 2.6.18 MIPS (QEMU).

FreeDOS

Sempre dal sito di QEMU è disponibile l'immagine floppy di FreeDOS http://odin.fdos.org/odin2005/odin1440.img. In questo caso il test di virtualizzazione è più elementare, in quanto richiede unicamente di effettuare l'avvio dall'immagine floppy scaricata. Il comando è qemu -fda odin1440.img -boot a. Si osservi come venga utilizzata l'opzione -fda per impostare l'immagine del primo disco floppy, e come il parametro -boot indichi a QEMU di avviarsi da tale unità.

[FreeDos]

Figura 2: FreeDOS (QEMU).

Live CD

Molte distribuzioni, rilasciano immagini live che è possibile provare avviandole da cd-rom. Qemu si presta bene ai test di tali distribuzioni, senza richiedere un riavvio del PC. Per provare è possibile, ad esempio, scaricare una variante di Ubuntu molto usata in attività di analisi forense: Helix. Una volta scaricata l'immagine iso del cdrom è possibile lanciare il comando sudo qemu -cdrom Helix2008R1.iso -boot d per avere all'interno del nostro sistema linux, una live cd pronta all'uso. In questo caso è stato utilizzato il comando sudo qemu in modo da ottenere l'accesso senza errori al file /dev/kqemu e sfruttare le potenzialità dell'acceleratore kqemu.

[Helix LiveCD]

Figura 3: Helix Live CD (QEMU).

Facendo alcuni test su diverse distribuzioni ed analizzando le prestazioni ottenute, si vedrà che purtroppo la velocità dell'emulazione offerta da QEMU non è paragonabile a quelle ottenibili da un sistema fisico non emulato. I limiti dell'emulazione risiedono principalmente nella necessità di traduzione delle istruzioni, e nell'emulazione dell'hardware.

KVM

KVM (Macchine Virtuali basate su Kernel) è una soluzione di virtualizzazione completa per Linux, utilizzabile su architetture x86 dotate delle estensioni alla virtualizzazione hardware (Intel VT o AMD-V). Il componente kernel di KVM è disponibile dalle versioni 2.6.16 per AMD e 2.6.15 per Intel. Le opzioni dei comandi kvm e kvm-img sono analoghe a quelle di qemu e qemu-img. QEMU è un pacchetto richiesto per il corretto funzionamento di KVM.

Per l'installazione di KVM è necessario che il sistema supporti la virtualizzazione hardware, tramite svm per i processori AMD o le estensioni vt per i processori Intel. Per controllare che il proprio sistema supporti tali estensioni lanciare il comando egrep '^flags.*(vmx|svm)' /proc/cpuinfo, se appare qualcosa si può procedere con l'installazione del pacchetto kvm.

Una volta installato il pacchetto, KVM utilizzerà due moduli: il modulo kvm.ko fornisce funzionalità di base ed è comune ad entrambe le architetture (AMD ed Intel), ed un modulo kvm-intel.ko per processori Intel, o kvm-amd.ko per i processori AMD.

Nella sottosezione seguente si vedrà come installare un sistema Windows Xp Professional in una macchina virtuale sfruttando KVM.

Windows Xp Professional (KVM)

Come osservato in precedenza, i parametri utilizzabili per i comandi kvm-img e kvm, sono gli stessi che si possono utilizzare per QEMU. Il primo passo per la creazione di una nuova macchina virtuale è la creazione di un disco immagine da utilizzare come disco di avvio.

$ kvm-img create disk1.img 5G
Formatting 'disk1.img', fmt=raw, size=5242880 kB

Con questo comando viene creato un file immagine disk1.img in formato raw della dimensione di 5GB che verrà utilizzato come disco principale per l'installazione di Windows Xp. I formati utilizzabili per la creazione dei file immagine sono gli stessi di QEMU e vengono riportati nello schema seguente. Per maggiori informazioni consultare la pagina man di kvm-img.

Formato Descrizione
raw Si tratta del formato utilizzato se non viene indicato qualcosa di diverso con l'opzione -f. Il formato è semplice e facilmente esportabile verso altri emulatori. Ha il vantaggio di riservare spazio unicamente per i settori effettivamente scritti nell'immagine.
qcow2 Si tratta del formato immagine di QEMU, ed è quello più versatile. Da utilizzare se si vogliono creare immagini di minori dimensioni, utilizzare la cifratura AES o la compressione tramite zlib.
qcow Il vecchio formato immagine di QEMU. Esiste unicamente per compatibilità, quindi non andrebbe utilizzato.
cow E' l'unico formato per QEMU in grado di aumentare di dimensione, adattandosi dinamicamente. Si tratta anche in questo caso di un formato supportato per retro-compatibilità, e non andrebbe utilizzato. Non funziona sotto win32.
vmdk Formato immagine di VMware 3 e 4.

Tabella 2: Formati Immagine QEMU e KVM.

A questo punto si procede all'installazione.

kvm -hda disk1.img -cdrom it_winxp_pro_with_sp2.iso -smp 2 -m 1024 -boot d

Il comando kvm viene utilizzato per effettuare l'avvio del sistema operativo, usando un'immagine iso del cd-rom di installazione ed il disco creato in precedenza. Trattandosi di un sistema dual core, si è utilizzata l'opzione -smp per richiedere l'uso di due processori.

Di seguito vengono allegate un paio di immagini che illustrano il processo di installazione.

[Windows xp installazione con kvm]

Figura 4: Windows Xp Installazione (KVM).

[Windows xp installazione con kvm]

Figura 5: Windows Xp Installazione (KVM).

Al termine della fase di installazione si ha a disposizione un desktop Xp completamente funzionante. Avviamo la macchina virtuale con:

$ kvm -hda disk1.img -smp 2 -m 1024 -boot c

In cui viene utilizzato il disco disk1.img per effettuare l'avvio.

La virtualizzazione con KVM è sufficientemente intelligente da creare autonomamente una rete virtuale tra il sistema ospitante ed il sistema ospite. Per testare tale sottorete è possibile, ad esempio, lanciare il comando ipconfig /all in Windows Xp per individuare il gateway predefinito, e poi da start -> esegui digitare il comando \\GATEWAY\ per visualizzare le condivisioni di rete del sistema ospitante. Nel caso in figura, il sistema ospitante utilizza Samba per condividere le stampanti e le directory home degli utenti.

[Windows xp in rete con kvm]

Figura 6: Windows Xp Rete Virtuale (KVM).

La rete virtuale definita in KVM permette anche la condivisione dell'indirizzo IP del sistema ospitante ed il NAT è completamente automatico. Nella figura seguente si può osservare come la macchina virtuale navighi in rete, dato il fatto che il sistema ospitante è dotato di una connessione Internet attiva e funzionante.

[Windows xp in rete con kvm]

Figura 7: Windows Xp Rete Virtuale (KVM).

VirtualBox OSE

VirtualBox è un ottimo software che permette la creazione e la configurazione di macchine virtuali in modo visuale tramite un'interfaccia grafica completa ed intuitiva.

Di seguito viene dato un elenco delle principali funzionalità offerte da questo programma

  1. Nessuna virtualizzazione hardware necessaria. VirtualBox non richiede la presenza di estensioni VT-x o AMD-V per poter generare macchine virtuali. Se non diversamente specificato il programma utilizza una completa virtualizzazione software monitorata dal programma di controllo. Questo permette la definizione di macchine virtuali su pc "datati", e non muniti di estensioni hardware per la virtualizzazione.
  2. Portabilità. Il programma supporta vari sistemi operativi come sistemi ospitanti (Windows, Linux, Mac OS e Solaris). Le macchine virtuali create sono facilmente portabili da un sistema all'altro, tramite una elementare operazione di copia/incolla.
  3. Aggiunte Ospite. VirtualBox permette l'installazione nella macchina virtuale di un'applicazione, denominata "aggiunte ospite", in grado di migliorarne le prestazioni. Tale pacchetto permette ad esempio il ridimensionamento automatico della finestra contenente la macchina virtuale, o la creazione di condivisioni di rete tra il sistema ospitante e quello ospite.
  4. Configurazione xml. Il programma utilizza file di configurazione xml, sia per la configurazione globale dell'applicazione che per quella delle singole macchine virtuali. L'uso di questo formato permette una miglior portabilità delle macchine virtuali su altri sistemi.
  5. Supporto hardware. VirtualBox supporta
  6. Fotografie. VirtualBox permette di scattare delle "fotografie" di un sistema ospitato, e di riavviarlo nella condizione fotografata. Questa funzionalità è molto utile per riportare una macchina virtuale in uno stato precedente. Si può fotografare il sistema prima di un'operazione delicata, in modo tale da poterlo ripristinare facilmente in caso di errori o malfunzionamenti.

Per installare VirtualBox è possibile scaricare il pacchetto relativo alla propria distribuzione, direttamente dal sito. Per sistemi che utilizzano apt è possibile eseguire il comando:

sudo apt-get install virtualbox-ose

In questo modo viene installato il pacchetto virtualbox-ose. Una volta installato si può lanciare il programma dal menu Applicazioni -> Accessori -> VirtualBox OSE.

[Schermata iniziale virtualbox]

Figura 8: Schermata iniziale (VirtualBox).

Windows Vista

Per installare una nuova macchina virtuale, è necessario premere il pulsante "Nuova", quindi seguire i passaggi evidenziati dal programma. Come primo passo si rende necessario creare un disco virtuale che verrà utilizzato dal sistema ospite. Le immagini che seguono illustrano il processo di installazione.

[Creazione macchina virtuale Virtualbox]

Figura 9: Creazione nuova macchina virtuale (VirtualBox).

[Creazione macchina virtuala Virtualbox]

Figura 10: Riepilogo configurazione (VirtualBox).

Una volta creato il disco e la macchina virtuale è necessario accedere al pannello di configurazione della VM per eseguire l'avvio da cd o da una immagine iso del sistema operativo che si vuole installare. Il pannello di configurazione è accessibile cliccando l'icona "Impostazioni" in alto a sinistra. La figura seguente mostra come sia possibile configurare VirtualBox in modo che utilizzi un'immagine iso per effettuare l'installazione.

[Configurazione cdrom Virtualbox]

Figura 11: Configurazione CD-ROM (VirtualBox).

A questo punto basta avviare la macchina virtuale premendo sul nome della vm (inserito in una maschera precedente) nella finestra principale di VirtualBox, o premendo l'icona "Avvia" in alto a sinistra. L'installazione si avvia e la si può portare a compimento.

[Installazione Vista Virtualbox]

Figura 12: Installazione Vista (VirtualBox).

Una volta terminata l'installazione ed avviata la macchina virtuale è consigliabile installare il pacchetto "aggiunte ospite" dal menu Dispositivi -> Installa GuestAdditions. Questo pacchetto, come spiegato precedentemente, migliora sensibilmente le funzionalità e l'usabilità della macchina virtuale.

[Installazione Aggiunte Ospite Virtualbox]

Figura 13: Installazione "Aggiunte Ospite" (VirtualBox).

Xen

Esistono soluzioni di virtualizzazione più performanti rispetto alle precedenti, che permettono la creazione di server dedicati alla virtualizzazione tramite l'uso di kernel modificati. Una soluzione rilasciata sotto licenza GPL, che permette una virtualizzazione di questo genere è Xen.

In Xen ogni macchina virtuale ospitata viene detta Dominio. Esistono due domini principali: il Dom0 è riferito al kernel principale con supporto alla virtualizzazione, in cui vengono creati e gestiti gli altri domini. I domini DomU sono invece associati alle macchine virtuali ospitate da Xen. Il solo Dom0 è in grado di accedere direttamente all'hardware fisico del server.

Una volta installato Xen (dai pacchetti della propria distribuzione o dai sorgenti disponibili sul sito http://www.xen.org) è necessario effettuare l'avvio dal nuovo kernel. Nell'esempio che segue viene indicato come creare una nuova macchina virtuale Xp. In primo luogo si crea una cartella per memorizzare le macchine virtuali, ed un Disco Virtuale da utilizzare per l'installazione.

$ mkdir -p /home/xen/vm/winxp
$ sudo dd if=/dev/zero of=/home/xen/vm/winxp/disk.img bs=1M count=4096

A questo punto bisogna creare un file di configurazione in /etc/xen/, ad esempio /etc/xen/winxp.cfg, ed aggiungervi la descrizione della nuova macchina virtuale:

kernel = '/usr/lib/xen/boot/hvmloader'
builder = 'hvm'
memory = '1024'
device_model='/usr/lib/xen/bin/qemu-dm'# Disks
disk = [ 'file:/home/xen/vm/winxp/disk.img,ioemu:hda,w','file:$PERCORSO_ISO/winxp.iso ,ioemu:hdc:cdrom,r' ]

# Nome della macchina virtuale
name = 'winxp'

# Rete
vif = ['type=ioemu, bridge=xenbr0']

# Comportamento
boot='d'
vnc=1
vncvi

Molti dei parametri di configurazione sono abbastanza intuitivi. Si osservi che Xen utilizza una tipologia di virtualizzazione nota come HVM (Macchine Virtuali Hardware) in grado di sfruttare le estensioni VT e AMD-V. Il parametro vnc=1 serve per consentire l'accesso alla macchina virtuale tramite il comando vnc winxp, ed è molto utile pensando al controllo di un server dedicato alla virtualizzazione.

Una volta editato il file di configurazione, è possibile lanciare la macchina virtuale e proseguire con l'installazione. Al termine dell'installazione si dovrà modificare il parametro di boot (in 'c') per consentire l'avvio da disco e non da cd. Il comando per avviare la macchina virtuale è xm create /etc/xen/winxp.cfg.

Conclusioni

Come si può immaginare, in questo articolo abbiamo solamente "graffiato" la superfice di un argomento complesso come la Virtualizzazione dei sistemi operativi. Per ragioni di spazio e tempo non sono state considerate tutte le problematiche relative alla configurazione delle reti virtuali, o dei backup in sistemi virtualizzati.

Abbiamo però evidenziato parecchi vantaggi della virtualizzazione :

  1. In primo luogo il ritorno di investimento dovuto all'utilizzo di un server di virtualizzazione. Spesso i server non lavorano a pieno carico, e tramite virtualizzazione è possibile ottenere un miglior sfruttamento delle risorse hardware.
  2. Le macchine virtuali create tramite QEMU, KVM o VirtualBox possono essere facilmente spostate da un PC a un'altro, dando un nuovo significato alla mobilità degli utenti ed alla portabilità dei sistemi operativi
  3. Tramite l'emulazione è possibile eseguire applicativi o sistemi non più supportati, oppure creati per differenti architetture hardware.
  4. Sfruttando la virtualizzazione dei sistemi possiamo dimenticarci dei sistemi dual boot e lavorare direttamente su più sistemi. Si pensi alla comodità di effettuare operazioni di copia/incolla tra diverse macchine virtuali, una funzionalità avanzata offerta da VirtualBox.

Di certo la virtualizzazione sarà sempre più presente nel futuro di tutti.

Riferimenti bibliografici

[1] Documentazione di QEMU:
http://bellard.org/qemu/qemu-tech.html

[2] QEMU guida utente:
http://bellard.org/qemu/qemu-doc.html

[3] Immagini per QEMU liberamente scaricabili:
http://www.oszoo.org/wiki/index.php/Category:OS_images

[4] MIPS Linux 2.6 immagine di test:
http://bellard.org/qemu/mips-test-0.2.tar.gz

[5] FreeDOS disco immagine floppy:
http://odin.fdos.org/odin2005/odin1440.img

[6] Helix pagina di download:
http://helix.e-fense.com/Download.php

[7] KVM homepage:
http://kvm.qumranet.com/kvmwiki

[8] KVM whitepaper:
http://www.qumranet.com/files/white_papers/KVM_Whitepaper.pdf

[9] VirtualBox homepage:
http://www.virtualbox.org/

[10] VirtualBox 2.1.0 per Linux:
http://www.virtualbox.org/wiki/Downloads

[11] VirtualBox manuale utente:
http://download.virtualbox.org/virtualbox/2.1.0/UserManual.pdf

[12] Progetto Xen (università di Cambridge):
http://www.cl.cam.ac.uk/research/srg/netos/xen/

[13] Xen download page:
http://www.xen.org/download/



L'autore

Gabriele Pranovi è laureato in Ing. Elettronica all'Università di Brescia. Si occupa prevalentemente di progettazione e sviluppo di applicazioni Web in ambiente Microsoft .Net, e di gestione di database SqlServer. Programma in ASP.NET e C#. Ha lavorato come sistemista Windows e Red Hat, e da sempre è patito di Linux e di tutto ciò che fa parte del mondo Open.


Sinistra <- Gestione sistemi - parte finale - Indice Generale - Copertina - Duplicazione di un sistema -> Destra