# Tecnologie di virtualizzazione

Al giorno d'oggi la virtualizzazione è diffusa in tutti gli ambiti informatici, dai computer desktop ai grandi datacenter. L'evoluzione delle tecnologie software e hardware la hanno portata ad essere uno strumento indispensabile. In questa lezione parleremo delle tecnologie che consentono la virtualizzazione e brevemente gli aspetti tecnici ed economici che ne comporta l'uso.

## La virtualizzazione

La virtualizzazione è un insieme di tecniche applicate a un server o a un cluster di server, volte a presentare ai suoi utenti risorse virtuali, ovvero un'astrazione di risorse computazionali (cpu, memoria, dischi, I/O, ecc.). Queste risorse virtuali possono avere:
* la stessa interfaccia delle risorse fisiche
* un'interfaccia differente (in questo caso si parla di emulazione)
Le tecniche di virtualizzazione possono essere viste come un layer che mappa le risorse virtuali a un insieme di risorse gestite (il termine inglese managed resources è molto più usato). Le managed resources possono essere risorse fisiche oppure risorse virtuali; in quest'ultimo caso abbiamo layer di virtualizzazione impilati uno sull'altro. Un mapping può inoltre avvenire:
* una risorsa virtuale - tante risorse managed (aggregation)
* tante risorse virtuali - una risorsa managed (sharing)

### Tecniche di virtualizzazione

Per gestire le risorse, i sistemi di virtualizzazione possono avere 4 funzioni basilari:
* insulation (isolamento): le risorse virtuali sono presentate all'utente senza alcuna dipendenza dal sottosistema fisico, permettendo così di sostituire l'hardware senza modifica delle risorse virtuali.
* emulation (emulazione): le risorse virtuali possono avere un'interfaccia diversa da quelle fisiche (ad esempio emulare un processore ARM su una macchina x86)
* sharing (condivisione): più risorse virtuali vengono associate alla stessa risorsa fisica (esempi: CPU condivisa, l'accesso alla rete, ecc.)
* aggregation (aggregazione): più risorse fisiche vengono mappate alla stessa risorsa virtuale, per unire le caratteristiche (un tipo esempio è lo spazio disco, ovvero il RAID)
Una particolare attenzione va data agli emulatori: come già detto hanno il compito di offrire risorse virtuali aventi architettura differente da quella fisica; questo consiste nel tradurre le istruzioni eseguite dalla risorsa virtuale in istruzioni eseguibili dalla macchina fisica che ha un ISA differente. Ovviamente questa traduzione comporta uno spreco di risorse computazionali, per questo motivo la macchina fisica dovrà essere molto più performante della macchina virtuale voluta. Agli emulatori è inoltre spesso richiesto anche di emulare dispositivi I/O non presenti sulla macchina fisica (ad esempio: touchscreen, sensori, etc.).
Diffusi esempi di emulatore sono la Java Virtual Machine e gli emulatori per le piattaforme mobili (Android, iOS) su PC.

## Server Virtualization

Quando si parla di server virtualization si intende un insieme di tecniche di virtualizzazione in cui sono presenti almeno una delle seguenti funzionalità:
* condivisione (sharing/partitioning) delle risorse hardware
* isolamento (insulation) delle risorse virtuali con quelle hardware
* incapsulamento (encapsulation), ovvero la possibilità di salvare lo stato e recuperarlo in futuro
Altre funzionalità non essenziali possono essere:
* aggregazione (aggregation)
* indipendenza dall'hardware (emulazione)

## Tipologie di virtualizzazione

La virtualizzazione può essere intesa sotto diversi aspetti e ottenuta attraverso tecnologie differenti. Nell'immagine sottostante vengono presentate la principale suddivisione delle tipologie di virtualizzazione, descritte nei paragrafi seguenti.

### Livello hardware vs Livello OS

La prima grande distinzione riguarda che tipo di risorse virtuali si vuole presentare all'utente: macchine virtuali oppure partizioni isolate. Nel primo caso all'utente del sistema di virtualizzazione viene presentata un'interfaccia su cui installare un sistema operativo, nel secondo caso all'utente viene presentata una partizione del sistema operativo corrente, su cui installare applicazioni che rimangono isolate in essa.
Si dice che la virtualizzazione è:
* OS-level (o container-level): quando offre contenitori per applicazioni.
** Vantaggi: basso overhead per il context-switch, basso overhead di memoria
** Svantaggi: non può ospitare sistemi operativi differenti, l'isolamento non può essere del tutto perfetto
* hardware-level: quando offre macchine virtuali.
** Vantaggi/Svantaggi: v. successivi paragrafi
La virtualizzazione OS-level è composta da un solo kernel (quello del sistema operativo host) e multiple istanze isolate di user-space (chiamate anche partizioni o contenitori), che possono essere avviate e spente in maniera indipendente tra loro. Viene garantito l'isolamento del filesystem, IPC e network. Inoltre fornisce un sistema di gestione delle risorse quali CPU, memoria, rete e operazioni I/O.
Nella virtualizzazione hardware, i sistemi operativi vengono eseguiti in modo concorrente sullo stesso hardware e possono solitamente essere eterogenei. L'hypervisor (chiamato anche Virtual Machine Monitor) si occupa di multiplexare l'accesso alle risorse hardware e garantire protezione e isolamento tra le macchine.

### Para-virtualization vs Full-virtualization

La virtualizzazione hardware può poi a sua volta essere suddivisa in:
* para-virtualization: la macchina virtuale presenta un'interfaccia differente confrontata con una macchina fisica. Questo comporta dover modificare il sistema operativo guest per consentire l'esecuzione all'interno della macchina virtuale stessa. L'hypervisor espone un insieme di API che il sistema operativo guest dovrà utilizzare, in particolare per utilizzare le istruzioni privilegiate. Le chiamate a queste funzioni sono usualmente definite Hypercall.
* full-virtualization: nella full-virtualization (caso oggi molto più comune) fornisce macchine virtuali che hanno la medesima interfaccia di una macchina virtuale fisica. Idealmente il sistema operativo guest non può identificare che si trova su una macchina virtuale (in realtà di solito è sempre possibile dedurlo attraverso opportune tecniche). Il grande vantaggio della virtualizzazione completa è il non dover modificare il sistema operativo, in questo caso l'hypervisor adotterà un sistema di TRAP per gestire le istruzioni privilegiate (meglio spiegato nel prossimo paragrafo).

#### Il problema dei ring

Tutte le CPU moderne implementano un sistema chiamato CPU Rings o Livelli di CPU con lo scopo di limitare le istruzioni che un'applicazione può eseguire, in base al tipo dell'applicazione stessa. In particolare, si cerca di limitare l'esecuzione delle istruzioni privilegiate ai programmi facenti parte del kernel.
Nell'architettura x86, come indicato in figura, sono presenti quattro ring (numerati come 0,1,2,3), anche se oggi nei moderni kernel e nelle moderne CPU ne vengono utilizzati solo due (ring 0 e ring 3).
Un'applicazione che esegue istruzioni nel ring 0 si dice essere nel kernel space mentre le applicazioni che possono eseguire solo istruzioni nel ring 3 fanno parte del user space. Questo pone un grande problema per la virtualizzazione: come può un sistema operativo guest eseguire istruzioni privilegiate se esso si trova nello user space? Vedremo nei prossimi paragrafi che questo è possibile attraverso due tecniche: binary translation o virtualizzazione hardware-assisted.

### Tipo 1 e Tipo 2

Si definisce virtualizzazione di tipo 1 o bare-metal un sistema di virtualizzazione nel quale il sistema operativo host è assente e le sue funzioni vengono sostituite dall'hypervisor.
Si definisce virtualizzazione di tipo 2 o hosted un sistema di virtualizzazione nel quale l'hypervisor è un normale processo utente sul sistema operativo host (a meno di specifici moduli da integrare nel kernel).
Gli hypervisor di tipo 1 possono a loro volta essere suddivisi in:
* monolitici: tutte le funzioni dell'hypervisor vengono eseguite dall'hypervisor stesso;
* microkernel: alcune funzioni vengono delegate a una macchina virtuale speciale, chiamata Service VM.

### Hardware assisted vs traduzione binaria

La tecnologia hardware assisted, seppur di concezione degli anni '70, compare nel 2006 sui processori Intel e AMD, in alternativa alla traduzione binaria (binary translation).
La traduzione binaria consiste nel riscrivere dinamicamente a run-time parti del codice del sistema operativo guest per inserire meccanismi di traps, al fine di gestire le istruzioni privilegiate. Per migliorare le performance, parti del codice vengono messe in un'apposita cache dell'hypervisor.
L'hardware assisted virtualization invece, consiste nell'aggiungere un nuovo ring all'architettura standard x86, chiamato Ring -1. In questo caso, il sistema operativo host e hypervisor vengono eseguiti nel nuovo ring -1, mentre il sistema operativo guest è eseguito nel Ring 0. Così facendo il sistema operativo guest può eseguire le istruzioni privilegiate, sotto però il controllo dell'hypervisor.

## Applicazioni

Oggi le applicazioni e i casi d'uso della virtualizzazione sono tantissimi ed è difficile raggrupparli tutti. Tra questi ricordiamo i principali:
* Server consolidation: poche e più potenti macchine che eseguono numerose applicazioni grazie alla distribuzione. L'idea è ridurre il problema del sotto-utilizzo della macchina
* Software development: testare sistemi distribuiti e applicazioni con differenti sistemi operativi (come meglio spiegato nella lezione DevOps)
* Virtual desktop: centralizzare i PC in un'azienda, sostituendoli con virtual machine su uno o più server (maggior facilità di gestione, aggiornamento, sicurezza, ecc.)
* Cloud Computing