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.

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. D'altro canto però ho modo di liberare facilmente una partizione abbastanza grande, quindi installerò il nuovo sistema da zero usando l'installer di Debian Lenny per amd64, versione 5.0.4 (quella attuale).

Ah, il sistema di virtualizzazione scelto, naturalmente, è OpenVZ ;-)

Installazione

Per prima cosa mi serve un'immagine di un cd di installazione da scrivere su un CD: una netinstall o il CD n. 1 vanno benissimo.

Dovendo installare da zero su di un portatile mi sono preoccupato di procurarmi preventivamente il firmware della scheda wifi: l'installer Debian è in grado di caricare il firmware da un archivio posto per es. in una chiavetta USB, come indicato chiaramente nel manuale di installazione.

Partizioni

E' fortemente raccomandato di mantenere i file delle macchine virtuali in una partizione separata rispetto alla partizione di root, perchè in certi casi una macchina virtuale potrebbe riempire tutto lo spazio disponibile nella partizione: se questa fosse la root tutto il sistema andrebbe in blocco, e questo non sarebbe bello -_-

In fin dei conti, per questa installazione mi servono 3 partizioni:

  • partizione di root: ci deve entrare solo il sistema di base, quindi 1GB dovrebbe bastare ampiamente
  • partizione per i container: qui staranno i file delle macchine virtuali, quindi più spazio c'è meglio è ;-)
  • partizione di swap: quella che ho già va benissimo, ma in caso si dovesse creare da zero è consigliata una dimensione doppia rispetto a quella della RAM installata

Filesystem

Per poter disporre delle quote disco, OpenVZ si appoggia alla gestione delle quote del filesystem sottostante, ma al momento è supportato solo ext3: se le quote disco non interessano si può scegliere quello che si preferisce. Per la partizione di root la scelta è libera, io userò ext3 anche per la root, ma se preferite potete fare diversamente.