Virtualizzazione basata su container: OpenVZ

Document-page-setup.png Attenzione: questo articolo è ancora incompleto e in fase di scrittura da parte del suo autore.

Sentitevi liberi di contribuire, proponendo modifiche alla guida tramite l'apposita pagina di discussione, in modo da non interferire con il lavoro portato avanti sulla voce. Per altre informazioni si rimanda al template.



Introduzione

Già da un po' di tempo si fa un gran parlare di virtualizzazione, e sono nati già parecchi prodotti software che implementano questo concetto in modi anche molto differenti. Possiamo individuare almeno tre tipi distinti di virtualizzazione:

  • emulazione
  • paravirtualizzazione
  • virtualizzazione nativa


Emulazione

In emulazione, il sistema di virtualizzazione simula tutto l'hardware su cui viene installato il sistema operativo ospite, detto guest: questo sistema ha il vantaggio di poter ospitare in modo relativamente semplice molti tipi di sistemi operativi guest senza la necessità di modificarli, anche differenti dal sistema operativo host (quello di base), a costo di un certo consumo di risorse (overhead) causato dallo strato software aggiuntivo necessario. Software di questo tipo sono Qemu, KVM, VirtualBox, VMware.

Per migliorare le prestazioni di questi sistemi ne sono state pensate tante. Il primo ad aver pubblicato qualcosa di utile, ed è subito diventato famoso per questo, è stato Fabrice Bellard con il suo Qemu, che implementa la cosiddetta dynamic translation. L'idea di fondo è piuttosto semplice: dal momento che nella grande maggioranza dei casi si finisce per emulare la stessa CPU su cui sta girando il sistema host, risulta molto più veloce passare le istruzioni al vero processore e recuperare i risultati, emulando solo quando è strettamente necessario.
In ogni caso, sempre alla ricerca di prestazioni, tutti questi emulatori hanno finito per portare parte del loro codice al livello kernel: questo significa che il sistema host necessita di un kernel leggermente modificato (di solito è sufficiente l'aggiunta di un modulo o due).

Paravirtualizzazione

Se da un lato la virtualizzazione ha subito suscitato un forte interesse in ambito enterprise, soprattutto dal momento che l'hardware disponibile iniziava ad essere sufficientemente potente, dall'altro l'overhead causato dalla virtualizzazione andava ad impattare ancora parecchio sulle performance generali, e questo significa che una fetta della spesa effettuata per acquistare hardware veniva vanificata dal semplice uso della virtualizzazione.

Per migliorare la situazione è stato sviluppato il concetto di paravirtualizzazione, in cui il software di virtualizzazione, detto Hypervisor, non emula completamente l'hardware, ma si limita ad offrire una speciale interfaccia ottimizzata ai sistemi operativi guest. Le prestazioni migliorano, ma per interfacciarsi con l'hypervisor si rendono necessarie modifiche profonde al kernel dei sistemi guest: per risparmiare sull'acquisto di hardware ci si sobbarca una grossa mole di lavoro in termini di programmazione al livello kernel, sia dal lato host che da quello guest.

Xen è il principale prodotto ad utilizzare questo tipo di approccio.

Virtualizzazione nativa

Seguendo ancora la strada del risparmio economico, e quindi la riduzione dell'overhead, la virtualizzazione nativa rinuncia completamente alla possibilità di far funzionare sistemi guest di tipo differente da quello usato per l'host. In pratica, l'hypervisor è sostituito da un vero e proprio kernel, modificato in modo da poter gestire in modo estremamente efficiente diversi sistemi operativi guest semplicemente ospitati in container differenti. Dal punto di vista pratico, i file dei sistemi guest risiedono semplicemente in differenti directory, mentre il loro spazio di memoria viene mantenuto isolato dal kernel. Il kernel e i programmi di base necessari per far funzionare l'host vengono in questo modo condivisi dai guest, e l'overhead viene normalmente limitato all'1-3%.

OpenVZ implementa questo concetto con host e guest Linux.

Scenario

Un cliente ha richiesto l'installazione di un piccolo server per ospitare un'applicazione web di tipo groupware, dedicata ad una rete LAN privata.

Per motivi di scalabilità del sistema è stato deciso, di comune accordo con il cliente, di utilizzare un sistema di virtualizzazione: questo permetterà effettuare backup e/o upgrade hardware in modo semplice. Inoltre, questa soluzione mi permette di iniziare l'installazione della macchina virtuale ancora prima di avere il server sotto mano, utilizzando il mio portatile come host.

Questo in effetti mi creerà qualche piccola difficoltà aggiuntiva: per cominciare sul portatile ho una Debian Squeeze/Sid con un kernel recente non ancora supportato dal progetto, e poi il sistema che ho installato a suo tempo è a 32 bit, mentre ora che devo rinnovare vorrei sfruttare l'architettura x86_64... ma così è un po' più divertente, no? ;-)
Ah, il sistema di virtualizzazione scelto, naturalmente, è OpenVZ.