Introduzione alla virtualizzazione con KVM

9

kvm

La virtualizzazione è una tecnologia che sta prendendo sempre più piede nell’informatica moderna grazie alla diffusione di hardware sempre più potente, in grado di far girare più sistemi operativi in maniera concorrente.

In questo articolo introdurremo i concetti di base della virtualizzazione e ci soffermeremo su KVM, uno dei progetti liberi più attivi nel campo della virtualizzazione.


Pro e contro della virtualizzazione

La virtualizzazione che in quest’ultimo periodo occupa un sacco di spazio sulle riviste specializzate e sembra essere l’ultimo baluardo tecnologico, è in realtà una tecnologia che ha origini addirittura negli anni ’60, nei laboratori di IBM dove nacque il CP-40, precursore del sistema CP-67 e di tutta la “VM Family” di IBM, che era alla base dei sistemi operativi per i mainframe IBM s370 prima e s390 dopo.

Ma come mai solo ora la virtualizzazione (e il suo diretto discendente il Cloud Computing) sta tornando così di moda e occupa in maniera prepotente una fetta sempre più grande del mercato?

Come accennato poco sopra, ogni mese l’hardware diventa sempre più potente ed economico, basti pensare all’evoluzione dei processori che dai modelli single core di pochi anni fa siamo arrivati a sei core impacchettati sul singolo processore.

Grazie a questa potenza smisurata, siamo in grado di poter far girare più sistemi operativi sullo stesso hardware in maniera concorrente, senza dover ogni volta riavviare per passare da un sistema all’altro, tramite tecniche di virtualizzazione.

Come dice il nome stesso, la virtualizzazione permette di creare dei sistemi virtuali all’interno del sistema operativo vero e proprio, in modo da far girare un qualsiasi sistema operativo su dell’hardware virtuale messo a disposizione del sistema di virtualizzazione.

In questo modo, avendo abbastanza risorse hardware a disposizione potremo far girare sulle nostre workstation una serie sterminata di virtual machine con i più disparati sistemi operativi, da varie distribuzioni Linux ad altri sistemi proprietari come Windows e MacOs (a patto di rispettare le licenze, ovviamente!).

Il vantaggio più grande è proprio quello di poter disporre di sistemi di test per i più svariati usi, ad esempio uno sviluppatore potrà testare i propri software sui vari sistemi senza avere una pletora di installazioni diverse, mentre un sistemista potrà testare diverse configurazioni in tutta tranquillità senza dover cercare server per creare gli ambienti di test.

Se ci spostiamo invece su ambienti più grandi, come quelli aziendali, la virtualizzazione permette di ridurre i costi e consolidare la propria infrastruttura aziendale, accorpando su un sistema fisico più macchine virtuali, in modo da ridurre sia il costo dell’hardware che i consumi energetici (che spesso e volentieri sono la spesa più grande del reparto IT delle aziende).
Il cloud computing porta addirittura al limite il concetto di virtualizzazione, creando pool di risorse virtuali sparse su vari nodi, proprio nell’ottica di sfruttare sempre meglio le risorse inutilizzate dei vari server.

Ovviamente non è tutto oro quello che luccica, virtualizzare un sistema, specialmente quando si tratta di server, pone seri problemi di performance e ridondanza, visto che bisogna calcolare con molta precisione quante macchine virtuali potranno essere ospitate dal singolo sistema di virtualizzazione per evitare di sovraccaricare la macchina fisica e avere performance poco soddisfacenti, e predisporre sistemi di migrazione automatici delle virtual machine su altri nodi di virtualizzazione per evitare che in caso di guasto hardware si perda una serie di servizi che possono essere vitali, ma questi sono temi decisamente avanzati rispetto allo scopo di questo articolo.


KVM in dettaglio

KVM sta per Kernel-based Virtual Machine e, come dice il nome, è composto da un modulo integrato nel kernel linux (dalla release 2.6.20) che permette di sfruttare le estensioni di virtualizzazione dei processori moderni.

Di per sè KVM non effettua nessun tipo di emulazione, si limita ad attivare le estensioni della CPU e a mettere a disposizione dello userspace un dispositivo in grado di riservare le risorse hardware da mettere a disposizione dei sistemi virtuali.
Un programma userspace (in particolare le libvirt o QEMU, come vedremo in fase di implementazione nel prossimo articolo) si occuperà di richiedere al modulo di riservare questa o quella risorsa e di svolgere le operazioni necessarie per l’esecuzione della VM.
Inoltre si KVM occupa di aggiungere una terza modalità all’esecuzione del kernel, la Guest Mode.

Normalmente il kernel ha due modalità di esecuzione, la Kernel mode (o Ring0) in cui solo software fidato (quindi, di fatto, solo il kernel) può essere eseguito con la massima priorità per operazioni privilegiate come l’accesso diretto all’hardware, e la User Mode, in cui vengono eseguite tutte le operazioni non privilegiate relative ai programmi userspace.

L’introduzione di KVM ha introdotto la Guest Mode, una modalità particolare in cui il kernel del sistema host (che è il sistema vero e proprio che ospita i sistemi guest, cioè le virtual machine) permette ai kernel dei sistemi virtualizzati di eseguire operazioni privilegiate come l’accesso diretto all’hardware virtuale.

Il punto di forza di KVM sta proprio in questa sua semplicità, il cuore del sistema di virtualizzazione (l’hypervisor come vedremo poco più avanti) svolge poche fondamentali operazioni, mentre tutta la parte di emulazione dell’hardware viene demandata a componenti esterne e specializzate (come le libvirt o Qemu).

La semplicità dell’hypervisor è però legata anche al suo punto debole (se così si può definire) di KVM: la dipendenza da hardware specializzato.
KVM riesce ad essere così semplice e rapido proprio grazie all’utilizzo delle estensioni speciali inserite nei processori x86 di ultima generazione: AMD-V per i processori AMD e VT-x per i processori Intel, senza le quali KVM non può proprio funzionare.


Come funziona

Abbiamo parlato dei vantaggi e svantaggi della virtualizzazione, ed in particolare di KVM, ma esattamente cosa sta sotto a questa meravigliosa tecnologia?
In tutti i sistemi di virtualizzazione dai primi sistemi di IBM (il CP-40 nato alla fine degli anni ’60), passando per Xen, VMWare e KVM troviamo un elemento comune chiamato Hypervisor.

L’hypervisor è quel componente (sia esso hardware come nel CP-40 di IBM o software come avviene oggi) che si inserisce tra i sistemi guest (le virtual machine) e l’hardware sottostante e gestisce i meccanismi di virtualizzazione dell’hardware da mettere a disposizione dei sistemi guest.

Hypervisor Architecture
Architettura di un sistema di virtualizzazione

Si possono riconoscere due tipologie di hypervisor, i cosiddetti “Native” (o “Bare Metal”) e gli hypervisor “Hosted”.
La prima famiglia è la più anziana e trova le sue origini sempre nei laboratori di IBM: si tratta di un piccolissimo strato di software che gira direttamente su hardware specializzato e permette la gestione dei sistemi host.

I sistemi ‘Hosted’ invece, sono i più giovani, si tratta di hypervisor che girano come processo all’interno di sistemi operativi general purpose, i software di virtualizzazione come VirtualBox o VMWare Workstation ne sono un esempio.

Ovviamente come in tutte le cose la distinzione non è più così netta, KVM ad esempio è un ibrido tra le due famiglie dal momento che necessita sia di hardware specializzato (le estensioni per la virtualizzazione del processore), sia di un sistema operativo che permetta a tutti i suoi compontenti di essere eseguiti.

Hypervisor-KVM
Architettura di KVM

Come si può vedere dalla figura, la parte dell’hypervisor (in arancione) è divisa in due parti, la prima legata allo userspace, le libvirt e QEMU che si occupano di fornire la parte di emulazione dell’hardware (forniscono cioè i virtual device che verranno visti dai sistemi guest), mentre la seconda risiede all’interno del kernel, il modulo di KVM, l’hypervisor appunto che permette la gestione dell’hardware di virtualizzazione (le famose estensioni VTX e AMD-V) e che espone un device file in /dev/kvm usato per associare i sistemi guest alle risorse assegnate.


Conclusioni

La virtualizzazione è un mercato in continua espansione, sempre più vendor stanno impegnando risorse nella ricerca e nello sviluppo di soluzioni alternative.
In questo calderone di soluzioni emergenti, il primo beneficiario è senza dubbio Linux, che grazie alla sua architettura flessibile sta giocando un ruolo chiave per lo sviluppo di nuove tecnologie come KVM che, assieme a lguest e Xen stanno portando a grossi cambiamenti volti all’incremento di performance di tutto il kernel.