[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 834.   QEMU e KVM

QEMU(1) è un pacchetto di emulatori hardware di vari tipi di piattaforme, con la particolarità, nel caso l'hardware reale e quello emulato siano entrambi di tipo x86, di poterlo utilizzare direttamente, se il sistema operativo lo consente. In altri termini QEMU è un emulatore che in certi casi può sconfinare verso la virtualizzazione.

KVM è una funzionalità del kernel Linux per i microprocessori x86 con le estensioni necessarie alla virtualizzazione. Il programma usato per sfruttare la virtualizzazione attraverso tali funzionalità del kernel Linux, si usa sostanzialmente nello stesso modo di QEMU e, in mancanza delle estensioni per la virtualizzazione, si avvale di QEMU stesso.

834.1   Due tipi fondamentali di emulazione

Il pacchetto che costituisce QEMU, una volta compilato per il sistema ospitante in cui deve essere utilizzato, dispone normalmente di file eseguibili differenti, a seconda della piattaforma che si va a emulare. Ma questi eseguibili sono divisibili in due gruppi: quelli che emulano l'hardware e si prestano per l'esecuzione di un sistema ospitato e quelli che invece si limitano a eseguire un programma, realizzato per lo stesso sistema operativo ospitante, ma per un'altra piattaforma hardware. Pertanto, i file eseguibili il cui nome corrisponde al modello seguente, sono adatti a emulare l'hardware, indipendentemente dal sistema operativo:

qemu-system-hardware

Al contrario, i nomi corrispondenti al modello seguente consentirebbero di utilizzare programmi per lo stesso sistema operativo, ma per un'altra piattaforma hardware:

qemu-hardware

In generale, il programma con il nome qemu dovrebbe corrispondere a quello che emula la stessa piattaforma hardware reale, a favore di un sistema ospitato completo.

834.2   Emulazione per gli applicativi

Il livello più semplice di emulazione offerto da QEMU riguarda la possibilità di eseguire programmi compilati per altre piattaforme, purché per lo stesso sistema operativo nel quale si sta agendo. In tal caso, oltre al programma è necessario disporre delle librerie dinamiche, di cui questo si avvale.

Per poter verificare questa cosa occorre procurarsi un programma molto semplice, il quale si avvalga esclusivamente delle librerie C standard. Per esempio si potrebbe recuperare una versione della shell Dash che utilizza solo la libreria libc.so.6, mettendo il file eseguibile dash nella directory /tmp/x/bin/ e i file del pacchetto che contiene la libreria libc.so.6 nella directory /tmp/x/lib/. Supponendo che il file eseguibile e i file della libreria siano compilati per la piattaforma ARM, si potrebbe usare il comando seguente per avviare Dash:

qemu-arm -L /tmp/x/ /tmp/x/bin/dash[Invio]

L'opzione -L sta per library e indica la posizione di partenza per la ricerca delle librerie richieste dal programma. Così facendo, quando il programma cerca il file /lib/libc.so.6, l'emulatore gli offre invece il file /tmp/x/lib/libc.so.6.

Se l'emulazione funziona, la shell avviata in questo modo si comporta come se fosse stata compilata per la piattaforma reale del proprio elaboratore.

834.3   Emulazione per un sistema completo

Per l'emulazione di un sistema completo, di norma è sufficiente disporre di un file-immagine che riproduca un disco avviabile: può essere un dischetto, un disco suddiviso in partizioni o un CD/DVD-ROM. Per esempio, per avviare un sistema contenuto nel file sistema.iso9660, si può usare QEMU nel modo seguente:

qemu -cdrom sistema.iso9660 -boot d[Invio]

Il programma eseguibile qemu corrisponde a quello che emula la stessa architettura hardware di quella reale, altrimenti si possono usare i programmi qemu-system-hardware, se ciò che serve è qualcosa di diverso.

Per comprendere il senso dell'esempio mostrato e per poter fare altri tipi di esperimenti, occorre conoscere almeno un gruppo essenziale di opzioni, come si vede nella tabella successiva.

Tabella 834.1. Alcune opzioni per l'uso di QEMU, allo scopo di emulare una piattaforma hardware completa.

-fda file
-fdb file
Indica di usare un certo file da considerare come la prima o la seconda unità a dischetti. Il file può essere un file-immagine, oppure un file di dispositivo.
-hda file
-hdb file
-hdc file
-hdd file
Indica di usare un certo file da considerare come primo, secondo, terzo o quarto disco PATA. Il file può essere un file-immagine, oppure un file di dispositivo.
-cdrom file
Indica di usare un certo file da considerare come unità ATAPI (CD-ROM o DVD-ROM).
-boot a
Richiede di avviare il sistema attraverso un dischetto (come stabilito con l'opzione -fda).
-boot c
Richiede di avviare il sistema attraverso un disco PATA (come stabilito con l'opzione -hda).
-boot d
Richiede di avviare il sistema attraverso un disco ATAPI (come stabilito con l'opzione -cdrom).
-m n
Richiede di offrire al sistema emulato n Mibyte. Se non si usa questa opzione, il valore predefinito è di 128 Mibyte.

Va osservato che per l'uso «normale» di QEMU, è necessario agire attraverso la grafica di X, in modo da consentire a QEMU anche l'emulazione della grafica per il sistema ospitato. Altrimenti, per un uso differente, è necessaria un po' di esperienza con QEMU, ma qui non viene mostrato alcun esempio diverso dai casi più semplici da realizzare. La figura successiva mostra l'avvio di QEMU attraverso un comando impartito con un terminale grafico, mentre il risultato visibile dell'emulazione appare in una finestra apposita.

Figura 834.2. Avvio di un sistema nanoLinux da un file-immagine che rappresenta un DVD-ROM.

nanoLinux avviato da QEMU

834.4   Console di QEMU

L'incarnazione grafica di QEMU che esegue un sistema operativo, viene considerata dalla documentazione originale come la «console» di QEMU. A questo proposito si parla anche di «console virtuali», ma queste non vanno confuse con quelle del sistema GNU/Linux che probabilmente ha il ruolo di sistema ospitante. Quando la finestra della console di QEMU è attiva, valgono le combinazioni di tasti descritti nella tabella successiva.

Tabella 834.3. Combinazioni di tasti per il controllo della console di QEMU, funzionante in modalità grafica.

Combinazione di tasti Descrizione
[Ctrl Alt] Aggancia o sgancia la tastiera e il mouse dal sistema eseguito da QEMU.
[Ctrl Alt f] Espande la finestra a occupare lo schermo intero, oppure riporta il funzionamento all'interno di una finestra.
[Ctrl Alt 1] Seleziona la prima console virtuale di QEMU, corrispondente al sistema ospitato in esecuzione.
[Ctrl Alt 2] Seleziona la seconda console virtuale di QEMU che dovrebbe corrispondere al «monitor», ovvero un terminale di controllo del funzionamento di QEMU.
[Ctrl Alt 3] Seleziona la terza console virtuale di QEMU che dovrebbe corrispondere a un terminale associato alla porta seriale, ammesso che ciò sia stato previsto.
[Ctrl Alt 4] Seleziona la quarta console virtuale di QEMU che dovrebbe corrispondere a un terminale associato alla porta parallela, ammesso che ciò sia stato previsto.

Nella console di QEMU, la cosa più importante è quello che viene chiamato «monitor», ovvero una console virtuale con una shell che consente di impartire dei comandi a QEMU, durante il suo funzionamento. La tabella successiva descrive alcuni di questi comandi.

Tabella 834.4. Alcuni comandi del monitor di QEMU.

Comando Descrizione
help [comando]
? [comando]
Mostra l'elenco dei comandi disponibili o una guida sintetica di quello indicato come argomento.
quit
q
Conclude il funzionamento di QEMU.
system_reset
Riavvia il sistema ospitato controllato da QEMU.
screendump file
Salva l'immagine della prima console virtuale di QEMU in un file in formato PPM. Il file indicato si intende collocato nel file system del sistema ospitante.
stop
resume
Ferma o fa riprendere l'emulazione.
sendkey tasti
Invia al sistema ospitato controllato dall'emulatore la combinazione di tasti indicata; per esempio, sendkey ctrl-alt-f1 invia la combinazione di tasti [Ctrl Alt F1], la quale, se fosse premuta realmente, verrebbe intercettata dal sistema grafico, passando così alla prima console virtuale del sistema GNU/Linux ospitante.

834.5   Unità di memorizzazione e file-immagine

I file-immagine usati per rappresentare le unità di memorizzazione necessarie all'emulazione, possono avere formati differenti. Il formato più «semplice» è quello grezzo (viene individuato dalla parola chiave raw) e può essere realizzato con gli strumenti comuni del sistema operativo ospitante. Altri formati possono essere utili per ridurre la dimensione occupata effettivamente nel file system ospitate, oppure per poter accedere a file-immagine di altri ambienti.

Per generare i formati particolari di file-immagine si utilizza il programma qemu-img, ma qui non ne viene descritta la sintassi. A ogni modo non c'è nulla di complicato e si può consultare la pagina di manuale qemu-img(1).

Oltre ai file-immagine, QEMU può accedere direttamente ai file di dispositivo, ammesso che sia avviato con i privilegi necessari. A questo proposito va osservato che con le opzioni -hda, -hdb,... -hdd si può fare riferimento a un file di dispositivo che rappresenta un disco intero, come /dev/hda, /dev/hdb,... mentre non è possibile indicare soltanto una partizione.

Per quanto riguarda l'accesso diretto ai file di dispositivo delle unità di memorizzazione, occorre considerare che questo non può avvenire in modo concorrente con il sistema operativo ospitante, perché si otterrebbe certamente un file system incoerente. In altri termini, nell'ambito dell'emulazione, se si accede a unità di memorizzazione a cui accede anche il sistema ospitante, è necessario limitarsi alla sola lettura.

È possibile offrire al sistema ospitato (sotto il controllato dell'emulatore) l'accesso a una directory del sistema operativo ospitante, mostrando questa directory come un'unità di memorizzazione avente un file system Dos-FAT. L'esempio seguente fa sì che il sistema ospitato veda la directory /tmp/mia/ del sistema ospitante come se fosse la prima partizione del secondo disco PATA:

qemu -cdrom sistema.iso9660 -boot c -hdb fat:/tmp/mia[Invio]

È bene chiarire che l'opzione è -hdb, ma in questo caso, si considera come se fosse la prima partizione.

Se si vuole fare la stessa cosa, ma mostrando che si tratta di un dischetto, occorre modificare leggermente il comando:

qemu -cdrom sistema.iso9660 -boot c -fda fat:floppy:/tmp/mia[Invio]

834.6   L'acceleratore KQEMU

Quando il sistema ospitante è GNU/Linux, è possibile compilare un modulo che dovrebbe consentire di ottenere qualche miglioramento nella velocità di funzionamento del sistema ospitato tramite QEMU. Questo modulo è noto con il nome KQEMU, ma non fa parte dei sorgenti standard del kernel Linux.

Per procedere alla compilazione ci possono essere varie modalità, ma se si parte dai sorgenti originali del kernel Linux, occorre compilare un proprio kernel, installarlo assieme ai moduli relativi, quindi, senza cancellare i vari file-oggetto, si procede alla compilazione del modulo KQEMU. In questa sezione viene mostrato un esempio a tale proposito, ma va tenuto in considerazione che ci può essere un metodo più semplice se si segue l'organizzazione della propria distribuzione GNU/Linux

Si suppone di avere installato i sorgenti del kernel Linux nella directory /usr/src/linux-2.6.22.6/ e di avere installato quelli del modulo KQEMU nella directory /usr/src/kqemu-1.3.0/. Si procede con la configurazione del kernel Linux, che non richiede accorgimenti particolari per quanto riguarda QEMU:

cd /usr/src/linux-2.6.22.6[Invio]

make menuconfig[Invio]

La compilazione e l'installazione non viene descritta, ma si tratta solo di seguire il procedimento che si usa normalmente, con l'accortezza di non eliminare i file-oggetto generati dalla compilazione. Al termine si passa a configurare e compilare il modulo KQEMU:

cd /usr/src/kqemu-1.3.0[Invio]

./configure --kernel-path=/usr/src/linux-2.6.22.6[Invio]

make[Invio]

Se la compilazione si conclude con successo, si trova il file kqemu.ko nella directory /usr/src/kqemu-1.3.0/; questo file va copiato nella directory /lib/modules/2.6.22.6/misc/:

mkdir /lib/modules/2.6.22.6/misc[Invio]

cp kqemu.ko /lib/modules/2.6.22.6/misc[Invio]

Una volta riavviato il sistema GNU/Linux ospitante, per far sì che il kernel in funzione sia quello appena compilato, si può caricare manualmente il modulo kqemu.ko:

insmod /lib/modules/2.6.22.6/misc/kqemu.ko[Invio]

Ma logicamente conviene predisporre uno script e organizzare la procedura di avvio in modo che il modulo venga caricato automaticamente a ogni riavvio.

834.7   KVM

KVM, ovvero Kernel based virtual machine, è un metodo di virtualizzazione basato su kernel Linux per architetture x86, con la possibilità di gestire la virtualizzazione (ospitando sistemi per la stessa architettura). Il codice in questione fa parte dei sorgenti del kernel standard.

KVM è utile quando il microprocessore dispone di estensioni adatte alla virtualizzazione. Per verificare se queste sono disponibili basta controllare nel file /proc/cpuinfo, dove deve apparire la sigla vmx oppure svm, tra gli indicatori (flag).

A fianco dei moduli che vengono prodotti dalla compilazione del kernel Linux si usa un programma per avviare l'esecuzione del sistema ospitato. Questo programma dovrebbe essere kvm:

kvm opzioni

La sintassi per l'uso del programma kvm è sostanzialmente la stessa di QEMU, quando riguarda l'emulazione per ospitare un sistema completo. A questo proposito va osservato che, in mancanza delle estensioni hardware per la virtualizzazione, kvm si avvale di qemu, anche se in tal caso l'emulazione è molto più lenta rispetto a quanto si otterrebbe con la virtualizzazione assistita dalle estensioni hardware.

834.8   Riferimenti


1) QEMU   GNU GPL


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome qemu_e_kvm.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory