Macchine Virtuali: il PC che si accende con un clic

Gli informatici, e in particolare gli amministratori di sistema, parlano abbastanza spesso di virtualizzazione. In effetti come parola suona bene e fa molta scena, ma cosa vuol dire virtualizzare un sistema operativo? Cos'è una macchina virtuale, e a cosa serve?

In questo articolo cerchiamo di rispondere a queste domande, come al solito partendo da zero, spiegando la teoria, e concludendo con un esempio pratico.

Macchine Virtuali

Virtualizzare un sistema operativo vuol dire, a grandi linee, simulare la sua esecuzione all'interno di un normale programma per computer. Vediamo più in dettaglio come funziona questa simulazione.

Abbiamo tutti un'ida di come funziona, più o meno, un sistema operativo come Windows o GNU/Linux: molto grossolanamente il suo compito è quello di dialogare con l'hardware della macchina e manovrarlo per soddisfare le richieste dell'utente o delle altre applicazioni. Questi sono alcuni esempi di dialogo tra sistema operativo (Windows, GNU/Linux, OSX, etc.) e hardware (mouse, tastiera, scheda madre, DVD, etc.):

  • Quando muovo il mouse, il sistema operativo dovrà "parlare" col mouse stesso per valutare di quanto è stato spostato fisicamente, e poi con la scheda grafica, per disegnare la freccia sullo schermo nella sua nuova posizione.

  • Quando copio un file su una chiavetta usb il sistema operativo dovrà contattare il disco fisso per leggere il file originale, e manovrare la porta USB su cui ho inserito la chiavetta, in modo da inviare il file.

  • Quando ascolto un CD audio, il sistema operativo dovrà contattare prima il lettore CD per leggere la musica, e poi la scheda audio per riprodurla sulle casse.

Di esempi come questi potremmo farne a migliaia, il concetto importante è che il compito principale di un sistema operativo è "parlare" direttamente con l'hardware della macchina: tutti gli accessi all'hardware devono sempre e comunque passare per il sistema operativo.

Virtualizzare il sistema vuol dire usare un programma che sia in grado di ingannare il sistema stesso, mettendogli "sotto il naso" una macchina simulata (detta appunto macchina virtuale), che in realtà non esiste. Come? Semplicemente (si fa per dire) intercettando tutti i segnali che il sistema (detto sistema guest, ospite) dovrebbe inviare e ricevere dall'hardware normale e sostituendoli con altri segnali "finti", prodotti e controllati dal programma stesso. Un programma in grado di tenere in piedi questa farsa viene detto hypervisor, o Virtual Machine Manager (VMM) e ha quindi il compito delicato di riprodurre esattamente il funzionamento di tutti i pezzi che compongono un normale computer (scheda madre, CPU, scheda video, mouse, tastiera, porte USB, e via dicendo).

Il risultato della virtualizzazione tipicamente è vedere il sistema guest dentro un monitor virtuale, che altro non è che una finestra prodotta dall'hypervisor nel sistema operativo vero e proprio della macchina (detto host, ospitante). Questo è proprio quello che si vede nella figura seguente:

Windows 7 eseguito in una Macchina Virtuale sotto Linux
Il sistema operativo guest (Windows 7) è eseguito in una finestra della Macchina Virtuale (VirtualBox). La Macchina Virtuale è una normale applicazione, in esecuzione sul sistema operativo host (GNU/Linux).

Ok... ma perchè?

Tutto questo meccanismo è sicuramente ingegnoso e complesso da pensare e realizzare; allo stesso tempo, però, uno potrebbe chiedersi perchè complicarsi la vita in questo modo, quando si potrebbe semplicemente usare i PC veri e propri come si è sempre fatto.

Ci sono diverse situazioni in cui la virtualizzazione è vantaggiosa. Anzitutto uno potrebbe non avere un PC "reale" su cui installare il sistema. Ad esempio, a volte capita di voler provare una nuova distribuzione GNU/Linux, o l'ultima beta di Windows, senza però cancellare o intaccare il sistema operativo che già abbiamo sul computer: creare una macchina virtuale ad hoc in questo caso è molto comodo e veloce.

Una macchina virtuale può essere utile anche quando serve usare un certo sistema operativo ogni tanto, ma non così spesso da volerlo installare normalmente. Ad esempio, molti utenti GNU/Linux hanno una macchina virtuale Windows su cui far girare i programmi per Win, quando servono.

La virtualizzazione viene anche usata per ragioni di sicurezza, quando è necessario eseguire programmi pericolosi, che potrebbero danneggiare il sistema: in questo caso meglio far saltare una macchina virtuale che una vera no?

Ci sono poi tanti altri usi della virtualizzazione in ambito professionale, uno su tutti l'affitto di server. Esistono infatti molte compagnie che guadagnano soldi affittando macchine connesse a Internet per gli usi più disparati (tipicamente webserver). Uno dei servizi più diffusi è detto VPS (Virtual Private Server); questo significa che la compagnia affitta una sola macchina "fisica" a più persone, virtualizzando un sistema ciascuno. Questa tipologia di server è più economica, perchè alla compagnia costa meno, e permette di gestire meglio le risorse, perchè le prestazioni delle macchine virtuali possono essere regolate in base all'utilizzo che se ne fa.

Prestazioni

Non bisogna dimenticare un aspetto importante della virtualizzazione: un sistema virtualizzato sarà sempre più lento di uno "normale".

Questo perchè, mentre normalmente un sistema operativo dialoga direttamente con l'hardware della macchina, un sistema che gira su macchina virtuale deve passare prima dall'hypervisor, che dovrà passare le richieste al sistema operativo "vero" (host) della macchina, il quale finalmente interagirà con l'hardware.

Anche se nel corso del tempo sono state sviluppate molte soluzioni per velocizzare la virtualizzazione, questi passaggi in più riducono necessariamente la velocità del software guest.

Altri tipi di virtualizzazione

Anche se l'abbiamo messa un po' sul semplice, il capitolo "Virtualizzazione" in informatica è piuttosto ampio, ed esistono molte altre tecniche, oltre alle macchine virtuali, per raggiungere lo stesso scopo. Vediamo le principali:

  • Full virtualization (macchine virtuali) - È la tipologia che abbiamo descritto nei paragrafi precedenti: un hypervisor simula completamente il comportamento di un computer reale, "ingannando" il sistema operativo che viene eseguito al suo interno. Ci sono due modi di ottenere questo risultato (più dettagli su Wikipedia):

    • Tipo 1 (detto anche native o bare metal) - L'hypervisor "parla" direttamente con la macchina, sostituendo di fatto il sistema operativo host; si tratta di una soluzione più complicata da realizzare, ma più veloce, perchè richiede meno "intermediari". È il caso di VMware ESXi e ESX e Microsoft Hyper-V.
    • Tipo 2 (detto anche hosted) - L'hypervisor è una normale applicazione eseguita sul proprio sistema operativo. È il caso di VMware Workstation, Qemu, Microsoft Virtual PC e VirtualBox, che useremo in questo articolo per sperimentare la virtualizzazione di Ubuntu.

  • Paravirtualization - Il sistema operativo guest non viene più "ingannato", ma viene modificato in modo che "sappia" di essere eseguito su un hypervisor anzichè su una macchina reale, e possa quindi comunicare esplicitamente con esso. Questo metodo richiede lo sforzo di modificare il sistema operativo guest (che non è sempre ppossibile), ma va a vantaggio della velocità, perchè le funzioni più complesse possono essere richieste direttamente, anzichè simulate dall'hypervisor. Software per la para-virtualizzazione sono Xen e User Mode Linux (UML).

  • Container virtualization - Si tratta del tipo più "debole" di virtualizzazione, in cui viene usato direttamente l'hardware della macchina (non c'è nessuna simulazione quindi). Il sistema operativo presente sulla macchina viene però duplicato in modo da poterne eseguire diverse copie separate sullo stesso hardware. Il vantaggio in questo caso sono le prestazioni, che sono praticamente invariate. Alcuni sistemi container sono OpenVZ, Virtuozzo o FreeBSD Jails.

Un esempio: installare Ubuntu su VirtualBox

È ora di passare alla parte pratica dell'articolo: in questa sezione faremo qualche esperimento con una macchina virtuale di tipo 2, VirtualBox. In particolare, metteremo in piedi una VM (Virtual Machine), su cui installeremo una versione di Ubuntu Linux.

Preparare l'ambiente

Per iniziare, ci servirà...

  • VirtualBox - È un software di virtualizzazione prodotto da Sun Microsystems (ora Oracle) molto veloce e facile da usare. Esiste una versione open source, distribuita con licenza GNU/GPL. Possiamo scaricare VirtualBox a questo indirizzo:
    https://www.virtualbox.org/wiki/Downloads

    Il programma, disponibile per Windows, OSX e GNU/Linux è molto semplice da installare: basta scaricare il file corrispondente alla propria piattaforma, eseguirlo e seguire i passi di installazione. Se usi GNU/Linux dai un'occhiata nel tuo gestore pacchetti: alcune distribuzioni includono la versione open source di VirtualBox nei repository.

  • Il disco di installazione di Ubuntu - Non ci serve un CD vero e proprio in realtà: l'immagine che scarichiamo dal sito ufficiale è sufficiente. Possiamo scaricare il CD di installazione di Ubuntu da qui:
    http://www.ubuntu.com/download/desktop

    Terminato il download avremo un'immagine ISO del CD di installazione di Ubuntu: teniamola a portata di mano, ci servirà tra poco.

Se abbiamo fatto tutto correttamente, possiamo avviare VirtualBox. Il programma dovrebbe presentarsi così:

Creare la macchina virtuale

Usiamo il pulsante "New" in alto a sinistra, o usiamo la combinazione di tasti Ctrl+N, per creare la macchina virtuale su cui andremo a installare Ubuntu.

Una procedura guidata ci accompagnerà nella creazione della macchina. I primi quattro passi, mostrati nelle figure qui sotto, sono molto intuitivi:

Al quarto passo, selezioniamo "Create new hard disk" per creare il disco virtuale su cui installeremo Ubuntu. Lasciamo le impostazioni predefinite per i passi successivi:

  • File type: VDI (VirtualBox Disk Image)
  • Storage details: dynamically allocated
  • Size: 8GB

Osserviamo che il disco che abbiamo appena creato non è nient'altro che un file sul computer, con estensione .vdi; VirtualBox si occuperà di leggere e scrivere su quel file ogni volta che il sistema operativo guest (Ubuntu, che avvieremo nel prossimo paragrafo) chiederà di accedere al disco. L'opzione dynamically allocated si riferisce al fatto che, pur avendo creato un disco da 8GB, il file .vdi inizialmente occuperà molto meno: VirtualBox ingrandirà il file mano a mano che viene usato spazio sul disco virtuale.

Terminata la procedura per la creazione del disco, non ci resta che confermare la creazione della macchina virtuale:

Il primo avvio

Ora che abbiamo creato la macchina virtuale, possiamo "accenderla" cliccando col tasto destro su di essa e scegliendo "Start" (o semplicemente cliccando bottone "Start" sulla barra degli strumenti):

In teoria non dovrebbe succedere niente, perchè quella che abbiamo sotto mano è una macchina funzionante, ma con l'hard disk completamente vuoto (l'abbiamo appena creato), e senza CD inseriti.

VirtualBox però si accorge di questa situazione, e ci mostra quindi un'altra procedura guidata che ci aiuta a configurare la macchina per il primo avvio. Quello che vogliamo fare è inserire il CD di Ubuntu nel lettore CD virtuale della macchina. Possiamo farlo seguendo i passi del wizard, e selezionando l'immagine di Ubuntu che abbiamo scaricato all'inizio, come mostrato nelle prossime figure:

Tutto qui: la nostra macchina Ubuntu è pronta per l'uso!

Installare Ubuntu

A questo punto possiamo installare Ubuntu proprio come se stessimo lavorando su un computer normale. Basterà scegliere l'opzione "Installa" all'avvio del CD o, se siamo già sul desktop di Ubuntu, usare l'apposita icona.

Ricordiamo sempre che, siccome stiamo lavorando in una macchina virtuale, possiamo fare tutte le prove che vogliamo, senza rischiare di danneggiare il sistema operativo "vero". Finchè lavoriamo nella virtual machine possiamo eseguire virus, cancellare file a caso, formattare il disco e via dicendo: se proprio facciamo un danno... basterà cancellare la macchina virtuale e crearne una nuova!


Non facciamoci spaventare da schermate come questa: il disco che stiamo cancellando è quello virtuale: finchè lavoriamo all'interno della macchina virtuale i dati e i programmi che abbiamo sul computer sono al sicuro!

In breve...

In questo articolo abbiamo visto che...

  • La tecnica della virtualizzazione, largamente usata in informatica, consiste nell'usare programmi che simulano il funzionamento di computer veri e propri, creando delle macchine virtuali, che esistono solo come software all'interno di un computer vero.
  • Ci sono diversi motivi per cui la virtualizzazione è spesso conveniente:
    • Provare sistemi operativi diversi senza doverli installare sul proprio PC di casa.
    • Utilizzare software pericoloso in un ambiente sicuro e separato dal resto del sistema.
    • In ambito professionale, limitare il numero di macchine fisiche: è più conveniente per una compagnia avere un grande server che gestisce 50 macchine virtuali, piuttosto che 50 macchine singole reali.
  • Siccome le macchine virtuali si comportano esattamente come quelle reali, possiamo installarci sopra un normale sistema operativo, come faremmo su un qualsiasi computer fisso o portatile.
    • Il sistema operativo virtualizzato è detto sistema operativo guest.
    • Il software che gestisce la macchina virtuale (ad esempio VirtualBox) è detto hypervisor.
    • Il sistema operativo "vero", su cui è installato l'hypervisor è detto sistema operativo host.
  • Il compito dell'hypervisor è "ingannare" il sistema guest, intercettando tutti i suoi segnali e facendogli credere di avere "sotto il naso" un computer vero e proprio.
  • Esistono anche altri tipi di virtualizzazione, ma per un utente comune generalmente le macchine virtuali di tipo 2 sono le più appropriate. Un esempio di macchina virtuale di tipo 2 è VirtualBox, su cui è possibile eseguire un sistema operativo come Ubuntu in pochi e semplici passi.