Gestione di Macchine Virtuali in Ambiente Cloud TR 1 Giuseppe CALARCO Indice 1 Introduzione 6 2 Installazioni automatiche 8 2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2 Windows Seven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2.1 Answer File . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Installazione silenziosa di applicazioni . . . . . . . . . . . . . . . . . . 15 2.3 3 Cloud Computing 18 3.1 I diversi paradigmi di calcolo distribuito . . . . . . . . . . . . . . . . 19 3.2 Architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3 Virtualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.4 CLEVER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.4.1 La comunicazione . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.4.2 La gestione dello storage . . . . . . . . . . . . . . . . . . . . . 27 1 INDICE 2 3.4.3 La virtualizzazione . . . . . . . . . . . . . . . . . . . . . . . . 4 La Virtualizzazione 29 32 4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.2 Modalità di virtualizzazione . . . . . . . . . . . . . . . . . . . . . . . 34 4.3 Virtual Machine e Hypervisor . . . . . . . . . . . . . . . . . . . . . . 37 4.4 Tipologie di virtualizzazione dei sistemi . . . . . . . . . . . . . . . . . 41 4.4.1 Esempi di virtualizzatori . . . . . . . . . . . . . . . . . . . . . 49 Lo standard OVF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.5.1 Virtual Appliance . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.5.2 Obiettivi di progettazione . . . . . . . . . . . . . . . . . . . . 55 4.5 5 Descrizione dell’implementazione 5.1 62 Agente CreateImage . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 5.1.1 CreateImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 5.1.2 Creazione del disco . . . . . . . . . . . . . . . . . . . . . . . . 69 5.2 Shell di amministrazione . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.3 OVF Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 5.3.1 OVF Wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 5.3.2 Agente OVFCompute . . . . . . . . . . . . . . . . . . . . . . . 84 INDICE 3 6 Test sperimentali 86 6.1 Configurazione delle macchine . . . . . . . . . . . . . . . . . . . . . . 86 6.2 Scenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7 Conclusioni e sviluppi futuri 91 Elenco delle figure 2.1 Confronto fra installazione automatica e manuale . . . . . . . . . . . 9 2.2 Interfaccia Windows SIM . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1 Panoramica dei paradigmi di calcolo distribuito . . . . . . . . . . . . 20 3.2 Architettura Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3 Infrastruttura hardware per il middleware CLEVER . . . . . . . . . . 26 4.1 Virtualizzazione del sistema operativo . . . . . . . . . . . . . . . . . . 37 4.2 Tipo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.3 Tipo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.4 Livelli di protezione dell’architettura x86 . . . . . . . . . . . . . . . . 42 4.5 Virtualizzazione completa. . . . . . . . . . . . . . . . . . . . . . . . . 44 4.6 Hardware assisted virtualization. . . . . . . . . . . . . . . . . . . . . 45 4.7 Paravirtualization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.8 Containers virtualization. . . . . . . . . . . . . . . . . . . . . . . . . . 47 4 ELENCO DELLE FIGURE 4.9 5 Hosted virtualization. . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.10 Virtual Appliance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.1 Diagramma delle classi CreateImage . . . . . . . . . . . . . . . . . . 65 5.2 Diagramma delle classi OVF . . . . . . . . . . . . . . . . . . . . . . . 80 5.3 Diagramma delle classi OVFComputeAgent . . . . . . . . . . . . . . 84 6.1 Scenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Capitolo 1 Introduzione Il lavoro di tesi si inserisce nell’ambito del cloud computing, che si sta diffondendo notevolmente nel mondo IT e la cui diffusione è destinata a crescere in futuro. Per questo si è determinata una rapida evoluzione ed un notevole incremento dei servizi offerti disponibili su richiesta al singolo utente, il quale potrà gestirli come preferisce indipendentemente dalla macchina che si trova ad utilizzare ed in qualunque parte del mondo si trovi. In tal senso l’Università degli Studi di Messina, in particolare la Facoltà di Ingegneria, ha sviluppato un’architettura cloud open source, di nome CLEVER (CLoud-Enabled Virtual EnviRonment) [17]. Essa ha il vantaggio di essere flessibile, scalabile, modulare e fault-tolerance, nonchè di utilizzare un approccio a plugin rendendo semplice la modifica della struttura, l’integrazione di nuove tecnologie e l’aggiunta di nuove funzionalità. Il lavoro svolto nella presente tesi si è incentrato sul concetto di virtualizzazione in 6 CAPITOLO 1. INTRODUZIONE 7 CLEVER. Tale tecnologia, che fonda le sue radici nel passato, ormai gode di notevole diffusione grazie al fatto che garantisce numerosi benefici in termini di flessibilità, scalabilità della struttura e notevole riduzione dei costi. L’obiettivo considerato ha portato ad estendere le funzionalità del cloud, al fine di poter permettere a ciascun utente di disporre di un proprio ambiente virtuale, realizzato secondo le sue esigenze. In questo modo, il generico fruitore dei servizi del cloud potrà creare un disco immagine con il sistema operativo desiderato, al quale sarà possibile accedere solo con un proprio account personale. Una volta creato il disco, l’utente potrà creare ed avviare la macchina virtuale associata tramite delle operazioni già implementate in CLEVER. Un ulteriore sviluppo ha portato all’introduzione in CLEVER dello standard OVF (Open Virtualization Format), che descrive un formato aperto, sicuro, portabile ed efficiente per la distribuzione di macchine virtuali. Esso è indipendente dall’hypervisor utilizzato, non si basa sull’impiego di una piattaforma host specifica e per questo è indipendente dalla piattaforma di virtualizzazione e dal sistema operativo guest. Tali file OVF sono stati adattati secondo i requisiti richiesti ed è stato, quindi, implementato il parsing di questi file, utilizzando apposite librerie [20]. La prima parte del lavoro di tesi si incentra sullo studio di tecniche di installazione automatica in ambienti Windows. A seguire vengono approfonditi i concetti relativi al cloud computing e le sue relazioni con la virtualizzazione. Successivamente, viene descritto lo standard OVF, come meccanismo di distribuzione di applicazioni virtuali, fornendo infine una trattazione dettagliata dell’implementazione mediante l’uso del linguaggio UML. Capitolo 2 Installazioni automatiche 2.1 Introduzione L’installazione automatica è una tecnologia utilizzata per l’installazione o l’aggiornamento di un sistema operativo con un intervento minimo o nullo da parte dell’utente, ecco perché essa spesso viene definita unattended (non presidiata). L’installazione automatica è meno conosciuta e meno usata rispetto a quella manuale. Quest’ultima richiede l’avvio da CD-ROM, procedendo attraverso una serie di menu che permettono di personalizzare determinate opzioni, di contro, quella automatica richiede una fase di configurazione iniziale, necessaria a creare uno o più file di risposta (answer file). Un file di risposta è un file di testo formattato in modo opportuno che indica al programma di installazione le informazioni necessarie per installare e configurare il sistema operativo. 8 CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 9 Figura 2.1: Confronto fra installazione automatica e manuale Un’installazione automatica, tipicamente, viene utilizzata in relazione a setup di larga scala. Ad esempio, data un’istanza iniziale di un applicativo software o di un sistema operativo da attivare su più siti, risulterebbe molto utile avvalersi di un’installazione di tipo unattended. L’installazione automatica arreca dunque numerosi vantaggi agli utenti, nonché agli assemblatori, agli amministratori di sistema e, in generale, a chi debba configurare un elevato numero di macchine in modo standardizzato. CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 10 Alcuni vantaggi sono i seguenti. • si realizzano meno errori durante l’installazione. Mediante un’installazione automatica non vi è la minima interazione da parte degli amministratori e tecnici durante il processo di installazione e questo riduce il numero di errori che si presentano durante il processo di installazione. • sussiste una maggiore coerenza nel corso di un setup di larga scala. Utilizzando lo stesso file di risposte per installare e configurare il sistema operativo, è possibile garantire che tutti i computer di un’organizzazione siano impostati esattamente nello stesso modo. • si riducono i tempi di installazione. L’installazione automatica è più veloce rispetto a quella interattiva perché non è necessario attendere che gli amministratori o i tecnici inseriscano le informazioni di configurazione richieste; al programma di installazione, infatti, basterà leggere il file delle risposte precedentemente settato. • si determinano minori costi di supporto. Riducendo al minimo gli errori durante il processo di installazione, aumentando la coerenza dei computer di una struttura, e riducendo il tempo necessario al setup, è possibile ridurre i costi globali di sostegno all’interno di un’organizzazione aziendale. Molti sono i sistemi operativi che permettono di eseguire delle installazioni automatiche, tra cui anche i sistemi Linux e Microsoft Windows, ed il principio di funzionamento è piuttosto simile nei vari casi. Di seguito si esaminerà l’installazione unattended di Windows Seven. CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 2.2 11 Windows Seven A partire dal sistema operativo Windows Vista, il programma di installazione ha subito notevoli cambiamenti che hanno reso le installazioni più veloci e più consistenti rispetto a quelle di Windows XP. Si utilizza, infatti, l’Image Based Setup(IBS), una nuova tecnologia basata sull’utilizzo di più file immagine in formato WIM (Windows Imaging) con le seguenti proprietà: • Memorizzazione di più immagini all’interno dello stesso file. • Riduzione della dimensione del file immagine, utilizzando specifiche tecniche di compressione. • Personalizzazione del file immagine senza ricrearlo aggiungendo aggiornamenti oppure drivers. • File .wim sono bootabili. • Installazione più semplice e veloce. Per questo, l’immagine del sistema operativo è memorizzata in un unico file, install.wim, memorizzato all’interno della cartella sources. Vi è poi un ulteriore file immagine, boot.wim, necessario per l’avviamento del programma di installazione. Questa nuova tecnologia permette di poter installare, in base alla Product Key, diverse versioni del sistema operativo, come: Windows Seven Home premium, Professional, Ultimate. L’installazione di Windows Seven può essere divisa nelle seguenti fasi. CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 12 Preinstallation Phase In questa fase viene configurata l’installazione del sistema operativo. Le attività eseguite possono essere cosı̀ suddivise: • Configurazione di Windows Setup: l’installazione viene configurata utilizzando le finestre di dialogo (interattiva) oppure il file di risposta (unattended ), successivamente viene configurato il disco e le impostazione sulla lingua. • Configurazione di Windows PE: vengono applicate le impostazioni lette nel file di risposta. • Configurazione del disco: l’hard disk viene formattato e partizionato per l’installazione del sistema operativo. • Copia dell’immagine di Windows: l’immagine del disco (install.wim) viene copiata nel disco. • Configurazione delle informazioni di boot: è possibile configurare sia singolo che multi-boot. • Configurazione dei servizi offline: vengono applicati gli aggiornamenti nell’immagine di Windows 7, tra cui correzioni software, language pack ed altri aggiornamenti di sicurezza. Online Configuration Phase Durante questa fase, Windows 7 esegue attività di personalizzazione relative all’identità del computer, che rendono questa nuova installazione di Windows unica. CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 13 Windows Welcome Phase Durante un’installazione manuale viene richiesto di scegliere un nome utente, il nome del computer, uno sfondo del desktop e cosi via; mentre se è presente la sezione oobeSystem nel file di risposta quest’ultima viene elaborata. Infine vi è l’esecuzione della sezione Windows Welcome, che è conosciuta anche come Machine Out-Of-BoxExperience (OOBE), durante la quale si possono eseguire personalizzazioni finali, come la creazione di account aggiuntivi. 2.2.1 Answer File Il file di risposta di Windows Seven è un file XML (AutoUnattend.xml ), grazie al quale è possibile automatizzare tutto o parte del processo di installazione. Esso può essere creato mediante l’ausilio di Windows Automated Installation Kit (AIK), che comprende un insieme di tool atti a realizzare immagini di Windows personalizzate. In particolare l’utility che permette di creare il file di risposta prende il nome di Windows SIM (System Image Manager). L’interfaccia grafica di Windows SIM presenta cinque riquadri distinti: • Distribution share. In cui è possibile inserire, ad esempio, eventuali driver aggiuntivi da installare. • Windows Image. In questo riquadro viene visualizzata l’immagine di Windows attualmente aperta (è necessario aprire un file .wim per creare un file di risposta). CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 14 Figura 2.2: Interfaccia Windows SIM • Answer file. In cui si crea o si modifica il file di risposta. • Properties. Dove si consente di configurare i componenti e i pacchetti selezionati. • Messages. Mostra errori, warning e messaggi informativi riguardanti la sintassi del file creato. Una volta aperto il file install.wim attraverso Windows SIM, è possibile creare il file di risposta aggiungendo ai passi di configurazione i componenti desiderati. I passi di configurazione sono suddivisi in: • Windows PE. I componenti aggiunti a questo passo configurano la fase di Windows PE. CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 15 • Offline servicing. Passo di configurazione utilizzabile per aggiungere dei driver all’immagine di Windows. • Specialize. Passaggio utilizzato dal sistema per configurare impostazioni specifiche di rete. • AuditSystem. Si realizza il passaggio solo quando l’installazione avviene in modalità di controllo. Questa modalità è utilizzata per l’aggiunta di varie personalizzazioni a un’immagine di Windows e salta la fase finale di Windows Welcome dell’installazione; in questo modo le configurazioni avvengono prima che l’utente esegua il login. • AuditUser. Passaggio simile al precedente ma eseguito solo dopo che l’utente ha effettuato il login. • OobeSystem. Corrisponde alla terza ed ultima fase del programma d’installazione. 2.3 Installazione silenziosa di applicazioni L’installazione silenziosa è una modalità di installazione dei programmi in cui non c’è interazione con l’utente, quindi non si realizza una visualizzazione di un’interfaccia oppure di finestre di dialogo. In questo modo, il programma si installerà con le impostazioni di default, cioè: • accettazione automatica della licenza; CAPITOLO 2. INSTALLAZIONI AUTOMATICHE 16 • creazione di scorciatoie; • installazione dei tool aggiunti. Per eseguire un’installazione silenziosa, basta eseguire il file di installazione con determinati parametri. Il metodo classico per ricavare i parametri di installazione è quello di utilizzare il comando “/?”. La procedura però, non è delle più veloci e non sempre questo comando funziona. Possiamo però utilizzare un comodo strumento (che si integra nel menù contestuale) per la determinazione dei parametri di installazione silenziosa: CMenu. Una volta scaricato ed installato, cliccate con il tasto destro del mouse, sul file di installazione di cui volete conoscere i parametri di installazione silenziosa, scegliete dal menù contestuale “More Options” ⇒ “Installer Tools” ⇒ “Identify Installer”. Tali parametri variano in base al “package installer”, dipendono cioè dal sistema d’installazione utilizzato per la specifica applicazione. I parametri più comuni di installazione silenziosa sono “/s, /S, SILENT, silent, /qn”. Le sintassi per lanciare l’installazione di un programma sono quindi: “setup.exe /s”, “setup.exe /S”, “setup.exe /SILENT”. I più comuni package installer sono: • Inno Setup; • Install Shield Installer; • Nullsoft Scriptable Install System (NSIS); CAPITOLO 2. INSTALLAZIONI AUTOMATICHE • Windows Installer Service (MSI packages); • Wise Installer. 17 Capitolo 3 Cloud Computing Il Cloud Computing, secondo il National Institute of Standards and Technology (NIST): è un modello per rendere possibile un accesso via rete, su richiesta e in maniera conveniente, a un insieme condiviso di risorse configurabili (ad esempio reti, server, storage, applicazioni e servizi) che possono essere rapidamente fornite e rilasciate con costi di gestione o interazioni con il fornitore minimali [8]. L’ambito è quello di calcolo distribuito e lo scenario è quindi quello di un utente che con un qualsiasi device (PC, tablet, smartphone) ed una connessione ad Internet può accedere al cloud che gli fornisce tutti i servizi e i dati richiesti [9]. È evidente cosı̀ come il Cloud Computing faccia in campo IT ciò che quotidianamente viene fatto mediante la fornitura di elettricità, gas o altri tipi di servizi di uso comune. Tali servizi vengono forniti all’utente su richiesta senza che debba preoccuparsi di come siano forniti: l’utente chiede e il servizio viene fornito nella quantità desiderata. In un modello di business cloud-based, il cliente, quindi, paga il provider in base al consumo 18 CAPITOLO 3. CLOUD COMPUTING 19 che effettivamente si verificherà. Il Cloud Computing offre, inoltre, a sviluppatori ed utenti di applicazioni una visione astratta dei servizi che semplifica, ignorando molti dei dettagli implementativi e dei funzionamenti interni dei servizi stessi [10]. 3.1 I diversi paradigmi di calcolo distribuito La definizione di Cloud Computing può essere comparata alle tecnologie esistenti, come Grid Computing, Utility Computing, Service Computing, e calcolo distribuito in generale. In particolare, il Cloud Computing può essere considerato l’evoluzione del Grid Computing, da cui prende le mosse. L’evoluzione è la conseguenza di un cambiamento di scenario che si è realizzato col passaggio da una tecnologia che fornisce storage e grandi risorse di elaborazione (nel caso del Grid), ad una la cui economia è fondata sull’erogazione di servizi e risorse più astratte. Per quanto riguarda, invece, l’Utility Computing, esso non consiste in un nuovo paradigma di infrastruttura di calcolo, ma anzi consiste in un modello di business nel quale le risorse di calcolo sono confezionate come servizi dosati, simili all’elettricità ed alla rete telefonica. L’Utility Computing è, tipicamente, implementato utilizzando altre infrastrutture di calcolo, come le griglie, e aggiungendo dei servizi aggiuntivi di monitoraggio. Un’infrastruttura cloud può essere invece utilizzata all’interno di una società oppure esposta pubblicamente come Utility Computing. La figura 3.1 ci mostra una panoramica del rapporto fra il Cloud Computing e gli CAPITOLO 3. CLOUD COMPUTING 20 altri domini ai quali viene contrapposto. Il Web 2.0 copre quasi l’intero spettro di applicazioni orientate ai servizi. Figura 3.1: Panoramica dei paradigmi di calcolo distribuito Supercomputing e Computing Cluster si basano sulle tradizionali applicazioni noservices. Il Grid Computing si sovrappone a tutti questi domini, però presenta una minore scalabilità rispetto ai supercomputer ed ai clouds. Il Grid Computing si propone di consentire la condivisione delle risorse e di problemsolving in organizzazioni virtuali dinamiche e multi-istituzionali [11]. Caratteristica chiave di questo modello è rappresentata dal fatto che le griglie provvedono a fornire un paradigma di calcolo distribuito che si estende su più organizzazioni virtuali (VO), in cui ognuna di essa può essere costituita da istituzioni fisicamente distribuite o progetti correlati logicamente. L’obiettivo di tale paradigma è quello di consentire la condivisione delle risorse associate ad ambienti distribuiti dinamici. L’approccio adottato come standard de facto [12], è quello di costruire un ambiente uniforme di calcolo mediante la definizione di protocolli di rete standard, fornendo dei middleware CAPITOLO 3. CLOUD COMPUTING 21 per mediare l’accesso a una vasta gamma di risorse eterogenee. Secondo Ian Foster [13] una griglia deve coordinare risorse che non sono soggette a controllo centralizzato, utilizzare protocolli ed interfacce standard, open e generalpurpose e offrire qualità di servizio non banali. I punti di vista di cloud e grid sono molto simili, i dettagli e le tecnologie utilizzate possono essere diverse, ma le due comunità sono alle prese con molti degli stessi problemi. 3.2 Architettura L’infrastruttura cloud consiste in un ampio pool di risorse di calcolo e di storage, a cui è possibile accedere tramite protocolli standard attraverso un’interfaccia astratta. Vi sono moltissime definizioni di architettura per i clouds, una di queste si basa su quattro strati: Figura 3.2: Architettura Cloud CAPITOLO 3. CLOUD COMPUTING 22 • fabric che contiene le risorse grezze a livello hardware, come risorse di calcolo, le risorse storage e di rete. • unified resource che contiene le risorse astratte, incapsulate (di solito per effetto della virtualizzazione), in modo che possano essere esposte allo strato superiore, ad esempio, un computer virtuale, cluster, un database, ecc... • platform che aggiunge una collezione di strumenti specializzati, middleware e servizi per fornire una piattaforma di distribuzione. • application che contiene le applicazioni che girano nel cloud. I clouds, generalmente, possono fornire servizi che principalmente possono essere ricondotti a tre tipi fondamentali [14]: • SaaS (Software as service). E’ il livello più alto di servizi forniti. Attraverso questa tecnologia è possibile avviare e utilizzare programmi in remoto. I clienti non pagano per il possesso del software bensı̀ per l’utilizzo dello stesso. Essi utilizzano il software tramite API accessibili via web, spesso come Web Services o REST. Alcuni esempi di servizi SaaS sono un accesso webmail, un CRM e le classiche “Google Apps”. • PaaS. È l’acronimo di Platform as a Service, cioè la virtualizzazione di una piattaforma. L’utente che utilizza tale servizio non deve occuparsi di gestire l’infrastruttura sottostante, in quando questa operazione è stata già effettuata dal fornitore del servizio. Ciò rappresenta anche una limitazione in quanto CAPITOLO 3. CLOUD COMPUTING 23 l’utente per realizzare la propria applicazione dovrà necessariamente utilizzare un’infrastruttura predefinita senza poterla adattare alle proprie esigenze. • IaaS. È l’acronimo di Infrastructure as a Service ed è il servizio più vicino a ciò che forma il cloud. Al cliente viene fornito un “computer virtuale” caratterizzato da una certa quantità di ram, un certo numero di cpu, un’interfaccia di rete e una certa quantità di storage. L’utente ha la possibilità di installare un qualsiasi sistema operativo e di installare i programmi che preferisce. Inoltre, ha a disposizione un “computer virtuale”, quindi non dovrà preoccuparsi di eventuali guasti al sistema, in quanto vengono gestiti dal fornitore del servizio. Generalmente tale servizio è tariffato ad ore di utilizzo, anche se esistono delle soluzioni flat con fatturazione periodica. Un esempio è il servizio EC2/S3 fornito da amazon. 3.3 Virtualizzazione La virtualizzazione è la caratteristica che differenzia maggiormente il Cloud Computing dal precedente paradigma di calcolo distribuito Grid Computing. Cosı̀ come i thread sono stati introdotti per fornire l’illusione, come se all’interno di un computer fossero in esecuzione simultaneamente più attività, e ciascuna di esse utilizzasse tutte le risorse disponibili, all’interno di un cloud è necessario eseguire applicazioni per utenti multipli contemporaneamente ed in cui ciascuna di esse possa utilizzare tutte le risorse disponibili. La virtualizzazione consente che ogni applicazione sia incapsulata, in modo tale da CAPITOLO 3. CLOUD COMPUTING 24 poterla configurare, distribuire, lanciare, migrare, sospendere, stoppare, ecc... Tutto questo fornisce una migliore sicurezza, gestione ed isolamento. Ci sono molti altri motivi per cui i cloud tendono ad adottare la virtualizzazione. • Per esempio perché viene garantito il consolidamento dei server e delle applicazioni: più applicazioni possono essere eseguite sullo stesso server, più le risorse possono essere utilizzate in modo efficiente. • Si permette poi la configurazione, tramite cui le risorse necessarie per le varie applicazioni potrebbero differire in modo significativo, dato che alcune di esse potrebbero richiedere grandi dimensioni di memorizzazione, e altre maggiori risorse di elaborazione. Al fine di configurare in modo dinamico e combinare le risorse per le varie esigenze, è necessaria la virtualizzazione, perchè non è realizzabile altrimenti a livello hardware. • La virtualizzazione consente comunque una maggiore affidabilità, perché permette un recupero veloce da interruzioni non pianificate, e inoltre, gli ambienti virtuali possono essere sottoposti a backup e migrazione senza interruzione del servizio. • Con il nuovo modello, poi, si determina maggiore reattività, in quanto possono essere automatizzati sia provisioning delle risorse che monitoraggio e manutenzione, e le risorse comuni possono essere memorizzate all’interno della cache e riutilizzate successivamente. CAPITOLO 3. CLOUD COMPUTING 3.4 25 CLEVER Il progetto CLEVER (Cloud Enabled Virtual EnviRonment) nasce con lo scopo di creare un middleware distribuito per la gestione di un’infrastruttura di cloud computing e, allo stesso tempo, per consentire l’interconnessione con altri cloud al fine di formare un cloud federato. CLEVER è interamente sviluppato in linguaggio Java ed offre un’architettura altamente scalabile, modulare, tollerante ai guasti e flessibile; quest’ultimo requisito è stato raggiunto integrando nella struttura di CLEVER il paradigma a plug-in, grazie al quale è possibile modificare alcune parti del middleware o aggiungerne di nuove senza mettere mani nel codice, bensı̀ modificando degli opportuni file di configurazione [17]. CLEVER è stato pensato per essere eseguito su un’infrastruttura hardware costituita da un numero di nodi variabile e non necessariamente costante nel tempo, connessi tra loro per mezzo di una rete internet. Non è dunque strettamente necessario che i nodi fisici del cluster risiedano tutti sulla stessa rete locale. A supporto di tale infrastruttura, come riportato in fig 3.3, è però necessaria la presenza di un server XMPP, che rappresenta il cuore delle comunicazioni inter-modulo e di un database distribuito, su cui verranno salvati tutti i dati necessari al corretto funzionamento e ripristino del middleware. CLEVER è strutturato in maniera gerarchica e modulare, ed alla base troviamo dei moduli denominati Host Manager, i cui compiti sono quelli di amministrare gli ambienti virtuali sotto il loro controllo e collaborare con il sistema operativo dell’host sottostante per monitorarne le risorse fisiche. Sopra gli Host Manager troviamo CAPITOLO 3. CLOUD COMPUTING 26 Figura 3.3: Infrastruttura hardware per il middleware CLEVER un Cluster Manager, che ha una duplice funzione: monitora lo stato generale del cluster, decidendo eventualmente la migrazione delle macchine virtuali da un host ad un altro, in base alle condizioni di carico del cluster e si interfaccia con gli utenti ricevendo comandi, eseguendo le operazioni specificate e restituendo ai primi i risultati relativi a tali operazioni. I moduli Cluster Manager e Host Manager sono a loro volta costituiti da sotto-moduli, rappresentati da un nucleo centrale, che coordina l’intero modulo, e dagli agenti, ciascuno dei quali è deputato a svolgere un compito ben preciso. Gli agenti a loro volta implementano un plug-in, attraverso il quale possono eseguire le proprie operazioni. Per il corretto funzionamento del middleware è necessario che su ogni host sia presente CAPITOLO 3. CLOUD COMPUTING 27 un modulo Host Manager, e almeno un Cluster Manager per tutto il cluster. Tuttavia per aumentare la fault tollerance dell’architettura, saranno contemporaneamente presenti, su host differenti, più Cluster Manager. Solo uno di questi svolgerà il ruolo di coordinatore del cluster, gli altri serviranno da rimpiazzo nel caso quest’ultimo andasse incontro ad un qualche errore che ne comporterebbe la terminazione. 3.4.1 La comunicazione In Clever si distinguono principalmente due tipi di comunicazioni, quella interna e quella esterna. La comunicazione interna avviene all’interno dello stesso modulo, e viene sfruttato il bus di sistema (D-Bus). Ogni agente infatti è un processo a sé stante, ed è quindi possibile la comunicazione fra i vari agenti sfruttando il bus di sistema. La comunicazione esterna è necessaria per lo scambio di messaggi fra il Cluster Manager e gli Host Manager; i moduli girano infatti su nodi differenti e non è quindi possibile utilizzare il bus di sistema per la comunicazione. Per permettere la comunicazione inter-nodo si è scelta un’architettura client-server in cui tutti i nodi risultano connessi attraverso la rete ad un server XMPP, che ha il compito di smistare i messaggi verso il nodo corretto. 3.4.2 La gestione dello storage Per la gestione dello storage ad alto livello [22], CLEVER utilizza una struttura ad albero gerarchica, ovvero un catalogo logico in grado di gestire l’accesso ai file all’in- CAPITOLO 3. CLOUD COMPUTING 28 terno del cluster. In tal senso, l’utente può decidere di caricare immediatamente un dato all’interno del cluster, oppure in alternativa ha la facoltà di specificare un’ubicazione esterna, che può essere un server FTP o HTTP di sua proprietà. Il catalogo logico rende CLEVER un unico File System Virtuale (VFS: Virtual File System), in quanto fornisce un livello di astrazione che nasconde le differenze tra FS diversi. L’albero che descrive tale catalogo virtuale prevede la presenza di tre tipi di nodi: • Clever node che rappresenta un nodo virtuale che l’utente può creare in qualsiasi momento e che al suo interno può contenere altri nodi clever oppure nodi link o nodi mount. • Link node che rappresenta un collegamento ad un qualsiasi altro nodo logico dell’albero. Si può fare un link anche ad uno specifico path fisico all’interno del file system (mount node) in maniera del tutto trasparente. È un nodo foglia, il che significa che non può avere nodi figli. • Mount node che è un particolare nodo del file system nel quale sono effettivamente contenuti dei dati che è possibile esplorare. Anch’esso è un nodo foglia, pertanto non è possibile creare dei sotto-nodi. Fornendo un’analogia con i file system reali, i nodi clever rappresentano le directory, mentre i nodi link ed i nodi mount sono i file che possono risiedere all’interno di tali directory. I nodi dell’albero possono avere lo stesso nome, ma devono essere raggiungibili da path differenti, come accade in un normalissimo FS. I clever node ed i link node hanno un significato logico più ad alto livello, mentre i nodi mount sono quelli che hanno CAPITOLO 3. CLOUD COMPUTING 29 un significato fisico più a basso livello. L’utente, specificando un determinato path, è in grado di eseguire l’attraversamento dell’albero in modo del tutto trasparente. Tale path è costituito da due parti, il path logico che è il percorso dalla root ad un qualsiasi nodo clever (clever node,link node, mount node ) e il path fisico che è il percorso interno al file system. Giungere ad un nodo di tipo mount significa entrare all’interno del FS e dunque, esplorarne il suo contenuto. 3.4.3 La virtualizzazione Tutta la gestione delle macchine virtuali ad alto livello è affidata al componente Virtualization Manager presente nel modulo Cluster Manager. Mediante la classe VirtualizationManagerClever vengono offerte molte funzionalità quali: registazione (register ), creazione (createVM ), avvio (startVm) ed arresto (stopVm) di una VM. La registrazione di un macchina virtuale consiste nella creazione da parte dell’utente di un file XML, all’interno del quale vengono specificate tutte le caratteristiche della VM. L’intero meccanismo si fonda sulla classe VEDescription e sulle classi ad essa collegate. Per una maggiore trattazione sull’implementazione delle suddette classi si rimanda il lettore al seguente lavoro di tesi [21]. In dettaglio, i parametri dell’ambiente virtuale (VE-Virtual Enviroment) sono visibili nel seguente codice XML: <?xml version="1.0" encoding="UTF-8"?> <org.clever.Common.VEInfo.VEDescription> <os_guest_id>ubuntuGuest</os_guest_id> CAPITOLO 3. CLOUD COMPUTING 30 <name>vvl</name> <storage> <org.clever.Common.VEInfo.StorageSettings> <diskPath>peppecal/localftp/peppeXP_github.img</diskPath> </org.clever.Common.VEInfo.StorageSettings> </storage> <cpu> <numCpu>1</numCpu> <coresXCpu>1</coresXCpu> <frequency>0.0</frequency> <architecture>X86_64</architecture> </cpu> <mem> <size>512000</size> </mem> <network> <org.clever.Common.VEInfo.NetworkSettings></org.clever.Common.VEInfo.NetworkSettings> </network> <desktop> <username></username> <password_user></password_user> <password_vnc_vm></password_vnc_vm> <ip_vnc></ip_vnc> <port></port> </desktop> </org.clever.Common.VEInfo.VEDescription> Ai fini dello storage, riveste un ruolo importante il tag diskPath in cui l’utente dovrà specificare il percorso virtuale dell’immagine. La creazione di una macchina virtuale consiste nel provvedere al recupero dell’immagine del disco, rendendola disponibile all’hypervisor. Si recupera l’oggetto VEDescription, lo si de-serializza e si estrae il diskPath relativo all’ubicazione dell’immagine della VM. Se le informazioni relative al nuovo ambiente virtuale sono corrette, nel senso che non esiste già una VM con lo stesso nome oppure l’immagine del disco è realmente presente nel path logico fornito, allora mediante il processo di creazione CAPITOLO 3. CLOUD COMPUTING 31 viene copiato il disco all’interno del repository di Clever. L’operazione di avvio provvederà al lancio della macchina virtuale appena registrata e creata. Capitolo 4 La Virtualizzazione 4.1 Introduzione La virtualizzazione è espressione di un trend in evoluzione negli ultimi anni in ambito informatico che comunque affonda le sue radici nel passato, come qualsiasi avvenimento legato alla tecnologia. Si tratta di un sistema di tipo time-sharing che consente a più utenti di accedere allo stesso computer e i suoi inizi si datano intorno agli anni ’60, quando in aziende, come IBM per esempio, nasceva l’esigenza di consolidare i numerosi server, sparsi fisicamente, in un’unica macchina fisica, lasciando inalterate le caratteristiche principali (indrizzo IP, servizi, ecc.) ma riducendo fortemente il consumo elettrico. I sistemi di virtualizzazione non sono stati semplici da implementare. Inizialmente, infatti, la maggior parte degli ingegneri aveva pensato di rendere i sistemi operativi tradizionali maggiormente interattivi al fine di permettere a più utenti di entrare nello 32 CAPITOLO 4. LA VIRTUALIZZAZIONE 33 stesso sistema, ma in questo modo il sistema operativo stesso diventava estremamente complesso. Un gruppo di ingegneri IBM di Cambridge, Mass., adottò poi un nuovo approccio che permetteva a ciascun utente di accedere allo stesso sistema attraverso una propria macchina virtuale (VM). In tal modo non si ravvisavano difficoltà nell’implementazione del sistema operativo perché doveva supportare un singolo utente. Tecnicamente, con il termine virtualizzazione si intende la possibilità di astrarre le componenti hardware degli elaboratori al fine di renderle disponibili al software in forma di risorsa virtuale. L’insieme delle componenti hardware virtuali (Hard Disk, RAM, CPU, NIC) prende il nome di macchina virtuale e su di esse possono essere installati i software, come i sistemi operativi e le relative applicazioni. I principali benefici derivati dall’avvento della virtualizzazione sono rappresentati: • Scalabilità dell’infrastruttura, sia per un’eventuale richiesta di maggiore potenza di calcolo, sia per una richiesta di disponibilità di spazio per la memorizzazione. • Riduzione dei costi: la riduzione di server e delle relative risorse hardware diminuisce le esigenze di spazio e le esigenze di alimentazione e raffreddamento. Con l’ausilio di strumenti di gestione ottimizzati è possibile migliorare il rapporto server gestiti per amministratore e, di conseguenza, ridurre le esigenze di personale. • Migrazione: esecuzione di backup sicuri e migrazione di interi ambienti virtuali senza interruzioni operative. Eliminazione dei downtime pianificati e ripristino immediato in caso di imprevisti. CAPITOLO 4. LA VIRTUALIZZAZIONE 34 • Sicurezza: possibilità di controllare e interrompere eventuali attività pericolose in quanto tutte confinate nella virtual machine sotto il completo controllo del sistema che ne governa l’esecuzione (hypervisor). 4.2 Modalità di virtualizzazione Complessivamente, le aree di virtualizzazione sono quattro, a seconda che il processo avvenga al livello delle applicazioni, di rete, del sistema di archiviazione o dei sistemi operativi. Virtualizzazione dei server di applicazioni Questo tipo di virtualizzazione è nato con i primi servizi di bilanciamento del carico, ragion per cui viene spesso definito virtualizzazione delle applicazioni. In effetti, gli strumenti di bilanciamento del carico estendono il concetto di virtualizzazione del server a un gruppo di server distribuiti tramite un proxy inverso, permettendo di accedere a numerosi servizi applicativi in maniera trasparente tramite un’applicazione o un servizio specifico. In un normale deployment, un proxy inverso ospita un’interfaccia virtuale accessibile per l’utente a livello front-end. A livello back-end, ovvero del sistema di produzione interno che comprende i server critici dell’azienda, quali i server del data center o, in certi casi, i server di applicazioni, il proxy inverso distribuisce il carico fra i vari server e applicazioni, come ad esempio i server Web. L’interfaccia virtuale, spesso denominata IP virtuale o VIP, diventa a questo punto CAPITOLO 4. LA VIRTUALIZZAZIONE 35 il server Web effettivo, che gestisce le connessioni in entrata e in uscita a livello del server a seconda delle esigenze. Questo permette al servizio di bilanciamento del carico di gestire più applicazioni o server Web in modo centralizzato, come un’istanza unica, offrendo una topologia più sicura e resistente rispetto a un’architettura con accesso diretto a ogni server Web. Si tratta di un modello di virtualizzazione uno-amolti applicabile a qualsiasi tipo di architettura e deployment di applicazioni, in cui un unico server rappresenta più server accessibili tramite un proxy inverso. Virtualizzazione di rete La virtualizzazione di rete consiste nella possibilità di riferirsi a risorse di rete senza utilizzare la loro reale locazione fisica. Un esempio può essere visto attraverso la VLAN (Virtual Local Area Networks). Essa consiste in un gruppo di host che comunicano tra di loro come se fossero collegati allo stesso cablaggio, a prescindere dalla loro posizione fisica. Le VLAN servono a creare vari gruppi di lavoro nell’ambito di una LAN o MAN senza la necessità che i componenti di un gruppo occupino spazi fisicamente contigui. I vantaggi che ne derivano sono l’isolamento del traffico multicast e broadcast dei vari gruppi di lavoro al livello Data Link e, di conseguenza, l’aumento della sicurezza del trasporto dei dati e la diminuzione del carico di tutta la rete. Un altro esempio è dato dalla VPN (Virtual Area Network). Essa è una tecnologia che grazie all’utilizzo di internet od un’altra rete intermedia garantisce il collegamento fra computer con reti di computer remote, altrimenti inaccessibili. La VPN offre sicurezza, in quanto il traffico inviato attraverso la rete instaurata rimane isolato CAPITOLO 4. LA VIRTUALIZZAZIONE 36 dagli altri computer presenti nella rete intermedia. Virtualizzazione dei dispositivi di storage La virtualizzazione del sistema di storage permette di rappresentare i dati indipendentemente dalla posizione e dalle caratteristiche dello storage, rendendo possibile un miglior utilizzo delle risorse, un ripristino delle risorse più rapido e una semplificazione dei requisiti di spazio, energia e raffreddamento. Tuttavia, l’efficacia dei vantaggi ottenibili con tale tecnologia dipende dalla completezza della soluzione di virtualizzazione del sistema di storage e dalla qualità della sua integrazione con l’architettura per la gestione dei dati critici. Virtualizzazione del sistema operativo Oltre a rappresentare il tipo di virtualizzazione più diffuso, i sistemi operativi virtualizzati, o macchine virtuali, sono un componente indispensabile dell’infrastruttura IT, che permette di eseguire sulla stessa piattaforma hardware più sistemi standard, fornendo agli utenti degli ambienti di esecuzione isolati e dedicati (Virtual Enviroment). Si definiscono: • Host machine: la macchina reale sulla quale viene effettuata la virtualizzazione. • Guest machine: la macchina virtuale vera e propria che viene generata Un Virtual Environment non è altro che un insieme di componenti hardware e periferiche implementate via software, conosciuto con il nome di Virtual Machine (Macchina CAPITOLO 4. LA VIRTUALIZZAZIONE 37 Figura 4.1: Virtualizzazione del sistema operativo Virtuale). La Virtual Machine permette l’esecuzione di un sistema operativo guest ed una o più applicazioni che eseguono sopra di esso. Ogni Virtual Machine a sua volta esegue sopra ad uno strato di virtualizzazione chiamato tecnicamente Hypervisor (Supervisore), il quale possiede un Virtual Machine Monitor (VMM). L’hypervisor è il componente chiave che idealmente deve operare in maniera trasparente senza pesare con la propria attività sul funzionamento e sulle prestazioni dei sistemi operativi. 4.3 Virtual Machine e Hypervisor In dipendenza delle specifiche applicazioni, è possibile distinguere differenti classi di Virtual Machine. Quelle maggiormente significative e utilizzate sono tre - sandbox, emulation e native - e possono essere cosı̀ descritte: • Sandbox - Macchine Virtuali di processo. Si fa riferimento ad un meccanismo CAPITOLO 4. LA VIRTUALIZZAZIONE 38 di sicurezza per incapsulare programmi in esecuzione, fornendo un set di risorse altamente controllato. Le macchine virtuali appartenenti a questa classe possono quindi essere utilizzate per l’esecuzione di codice non testato o programmi non fidati, per restringere l’accesso a specifiche risorse per una data applicazione o ancora per eseguire applicazioni sviluppate e compilate per specifici sistemi operativi su altri sistemi. In una sandbox, la memoria, il filesystem, la connessione di rete e in generale tutte le risorse, sono rese accessibili tramite delle interfacce API fornite direttamente dalla sandbox stessa, la quale cosı̀ è in grado di monitorare e controllare ogni tipo di accesso a tali risorse. Esempi di sandbox largamente utilizzate al giorno d’oggi sono la Java Virtual Machine [1], l’Adobe’s Flash Player o ancora l’antivirus Avast! • Emulation - Macchine Virtuali di sistema Hosted. Queste macchine virtuali emulano il completo funzionamento di un sistema operativo e con esse è possibile pertanto eseguire sistemi operativi basati anche su architetture di processori differenti. Ne sono esempi QEMU [2] o Bochs [3]. • Native - Macchine Virtuali di sistema Nativo. Anche questa classe di macchine virtuali, come la classe emulation, tenta di eseguire un sistema operativo guest per intero. Essa sfrutta le caratteristiche di virtualizzazione proprie dell’hardware che utilizza, come le VT-X di Intel o le SVM di AMD, garantendo cosı̀ delle prestazioni migliori. Per esempio, considerando l’estensione di virtualizzazione di Intel VT-X 6, possono essere introdotte in particolare due transizioni: CAPITOLO 4. LA VIRTUALIZZAZIONE 39 VMentry e VMExit, e, semplificando il discorso, si può verificare una VMentry quando il controllo passa dal monitor VMM alla VM guest e analogamente si verifica una VMexit quando il controllo passa dalla VM guest al VMM. Esempi di VM di tipo native sono KVM [4] o VMware. Il VMM, o hypervisor, viene definito come un software in esecuzione sulla macchina reale che ha il completo controllo delle risorse hardware. Esso crea degli ambienti d’esecuzione, detti macchine virtuali, che forniscono agli utenti l’illusione di un accesso diretto alle risorse della macchina fisica. Un VMM deve possedere le seguenti caratteristiche: • Equivalenza: gli effetti dell’esecuzione di un programma attraverso il VMM devono essere identici a quelli dello stesso programma eseguito direttamente sulla macchina fisica, ad eccezione al più del tempo d’esecuzione dovuto all’overhead del VMM, alla ridotta disponibilità di risorse, che potrebbe fare andare in swap il programma in esecuzione, ed ai dispositivi I/O agganciati, perché se la VM non prevede periferiche collegate alla macchina reale (scheda di rete, USB, scheda audio) potrebbe non poter accedere ad esse. • Efficienza: l’ambiente virtuale deve essere efficiente. La maggior parte delle istruzioni eseguite all’interno di tali ambienti deve essere eseguita direttamente dal processore reale senza che il VMM intervenga. Le istruzioni che non possono essere eseguite direttamente dal processore reale sono interpretate dal VMM. • Controllo delle Risorse: il controllo delle risorse hardware deve essere di esclusiva competenza del VMM, senza interferenze da parte delle VM. CAPITOLO 4. LA VIRTUALIZZAZIONE 40 L’hypervisor può essere suddiviso in tre generici moduli: dispatcher, allocator ed interpreter. Il compito del dispatcher è di intercettare le istruzioni sensibili eseguite dalle VM e passare il controllo ai moduli preposti a gestire tali operazioni. L’allocator si preoccupa di fornire alle macchine virtuali le risorse necessarie evitando i conflitti. Mentre l’interpreter si rende necessario in quanto le macchine virtuali non possono avere accesso diretto alle risorse fisiche e non conoscono lo stato dell’hardware reale, ma solo quello del loro ambiente virtuale. Le istruzioni che fanno riferimento alle risorse vengono quindi simulate dall’interpreter. Si possono individuare due tipologie di VMM [5] in base alla collocazione nell’ambiente della macchina fisica: • Il VMM di tipo 1 è posto immediatamente sopra l’hardware e dispone di tutti i meccanismi di un normale kernel per quello che riguarda la gestione delle memoria, delle periferiche e del processore. Figura 4.2: Tipo 1 CAPITOLO 4. LA VIRTUALIZZAZIONE 41 • Il VMM di tipo 2 è un normale processo in esecuzione nell’ambito del sistema operativo host. Gestisce direttamente le macchine virtuali, che sono suoi sottoprocessi, mentre la gestione hardware è demandata al sistema ospitante. In virtù di quanto detto la sua implementazione dovrebbe essere più semplice rispetto al VMM di tipo 1. Figura 4.3: Tipo 2 4.4 Tipologie di virtualizzazione dei sistemi Un concetto importante riguarda i livelli di protezione dell’architettura x86 (ring level ). Il livello 0 ha i privilegi più alti e, normalmente, in esso vi è il sistema operativo. Il codice eseguito in questo livello può essere in esecuzione in modalità: system space, kernel mode oppure supervisor mode. Qualsiasi altro tipo di codice, come CAPITOLO 4. LA VIRTUALIZZAZIONE 42 le applicazioni del sistema operativo, operano in livelli meno privilegiati (livello 3). L’hypervisor viene eseguito direttamente nell’hardware del sistema host nel ring 0. Figura 4.4: Livelli di protezione dell’architettura x86 Esso gestisce le richieste hardware per conto del sistema operativo guest. Esistono comunque scenari dove alcune operazioni non possono essere eseguite dal sistema operativo guest se non ha diretto contatto con l’hardware. Per questo motivo l’hypervisor deve implementare una metodologia per intrappolare queste richieste di operazioni delicate e trasformarle in operazioni eseguibili correttamente, il tutto operando in maniera dinamica. Tale obiettivo è raggiungibile mediante diversi approcci [6]. Full Virtualization Essa consente l’esecuzione di sistemi operativi non modificati (o non modificabili per ragioni di licenza) in un ambiente totalmente ricreato ed isolato dal sistema operativo che lo ospita; tale ambiente è realizzato da un apposito software che si occupa di emulare l’hardware necessario traducendo le istruzioni eseguite dal sistema ospite in CAPITOLO 4. LA VIRTUALIZZAZIONE 43 qualcosa che il sistema operativo ospitante sia in grado di eseguire. Come è possibile intuire, la traduzione di ogni singola istruzione è molto onerosa a livello di potenza di calcolo, per ovviare a ciò è necessario eseguire la maggior parte delle istruzioni in modo nativo. Sebbene quindi esistano emulatori di CPU differenti dall’architettura x86, come ad esempio Qemu che è in grado di emulare ARM, Alpha, MIPS, SPARC o Hercules che emula System/370, ESA/390 e z/Architecture, questi emulatori tendono ad essere molto lenti poiché devono tradurre ogni istruzione verso l’architettura x86, eseguirla, e quindi tradurne il risultato verso l’architettura emulata. Imponendo quindi un limite sull’architettura virtualizzata (x86 virtualizza solo x86), è possibile velocizzare notevolmente l’esecuzione dei sistemi guest mappando direttamente memoria e CPU (per quanto riguarda le istruzioni accessibili). Questo limite rende però impossibile virtualizzare sistemi x86 64 se il sistema operativo di base è i386 (come nel caso di VMWare ESX). Questo succede perché l’architettura i386 prevede l’esecuzione di codice in due modalità: • Real Mode: dove ogni processo ha completo accesso a tutto l’hardware (tale modalità è quantomeno rischiosa e preclude il concetto di virtualizzazione); • Protected Mode: vengono creati diversi livelli di protezione che possono essere immaginati come anelli (RING) concentrici sempre più restrittivi man mano che si procede verso l’esterno. CAPITOLO 4. LA VIRTUALIZZAZIONE 44 Figura 4.5: Virtualizzazione completa. Hardware Assisted Virtualization Conosciuta anche come Accelerated Virtualization oppure con nomi diversi a seconda del produttore, ad esempio Xen la chiama Hardware Virtual Machine (HVM), Virtual Iron la chiama Native Virtualization. Questa tecnica si appoggia a speciali funzioni della CPU (Intel VT e AMD-V) e permette l’esecuzione direttamente in hardware di alcune chiamate della macchina virtuale. La più importante conseguenza di questo supporto in hardware è il superamento del limite della Full Virtualization: grazie a queste estensioni è infatti possibile avere come guest sistemi x86 64 nonostante il sistema ospitante sia i386. Occorre precisare che l’attuale virtualizzazione assistita si occupa di aiutare solamente funzioni di CPU e memoria; tutte le funzionalità di I/O sono ancora emulate. Esistono già delle specifiche per permettere a diverse istanze virtuali di condividere schede PCI Express. Vengono introdotte due nuove modalità operative, trasversali ai livelli di protezione dell’architettura (ring level): la modalità Root e la modalità non Root. Sia i guest che CAPITOLO 4. LA VIRTUALIZZAZIONE 45 gli host potranno operare sempre al giusto ring-level (generalmente 0 in kernel-mode, 3 in user-mode), ma solo il VMM potrà accedere alla modalità Root, che fornisce l’accesso a tutte le funzionalità di gestione della virtualizzazione implementate dalle estensioni. Figura 4.6: Hardware assisted virtualization. CAPITOLO 4. LA VIRTUALIZZAZIONE 46 ParaVirtualization Essa è una tecnica in cui il sistema operativo virtualizzato riesce a comunicare direttamente con il Motore di Virtualizzazione (hypervisor). Questo comporta la necessità di modificare il kernel del sistema operativo da virtualizzare risultando problematico nel caso di prodotti come Windows che, per motivi di licenza, non permettono la modifica del codice. Xen, ad esempio, permette l’installazione di sistemi operativi Linux con kernel modificato e driver personalizzati. Il vantaggio nell’usare la ParaVirtualization consiste nella maggior velocità di esecuzione delle applicazioni utente. Xen e Microsoft Virtual Server sono esempi di software che utilizzano ParaVirtualization. Figura 4.7: Paravirtualization. CAPITOLO 4. LA VIRTUALIZZAZIONE 47 Containers Questa tipologia di Virtualizzazione è ancora più slegata dall’hardware fisico e più legata al sistema operativo stesso. Containers prevede che sia in esecuzione un solo kernel unico che crea diverse istanze in user space; in questo modo si ha un bassissimo overhead, ma anche un bassissimo isolamento: un kernel panic sarebbe fatale per tutti i sistemi contenuti nello stesso hardware. Una ovvia conseguenza è che avendo un unico kernel, i sistemi operativi ospitati avranno ovviamente la stessa versione di kernel. Semplificando al massimo, questa tecnologia si avvicina molto al concetto di chroot. Figura 4.8: Containers virtualization. CAPITOLO 4. LA VIRTUALIZZAZIONE 48 Hosted L’ultima tipologia di virtualizzazione forse è più familiare all’utente rispetto le altre. Tutti i prodotti desktop di virtualizzazione, come VMware Workstation, VMware Fusion, Parallels Desktop per Mac, e Microsoft Virtual PC implementano una virtualizzazione di tipo hosted. Gli utenti possono installare un prodotto di virtualizzazione sul proprio pc come qualsiasi altra applicazione, e continuare a usare il loro sistema operativo desktop. Figura 4.9: Hosted virtualization. CAPITOLO 4. LA VIRTUALIZZAZIONE 4.4.1 49 Esempi di virtualizzatori Di seguito vengono trattati alcuni tipi di virtualizzatori. Qemu Qemu, acronimo di Quick EMUlator, è un software che implementa un particolare sistema di emulazione che permette di ottenere un’architettura nuova e disgiunta in un’altra che si occuperà di ospitarla. Esso ha due modi di operare: • Full system emulation. In questo caso Qemu emula l’intero sistema, incluso il processore e le periferiche. Può essere utilizzato per lanciare differenti sistemi operativi senza il riavvio del PC. • User mode emulation (solo per Linux). Qemu può essere lanciato come processo Linux compilato per una CPU o per un’altra. KVM Kernel-based Virtual Machine è un sistema full-virtualization esclusivamente per GNU Linux, su piattaforma x86, che può essere facilmente installato su qualsiasi distribuzione, l’unico prerequisito è possedere un processore con istruzioni Intel-VT o AMD-V. Esso consiste in un modulo kernel (kvm.ko) che fornisce la virtualizzazione dell’infrastruttura di base ed un modulo specifico per il processore in uso (kvm-intel.ko o CAPITOLO 4. LA VIRTUALIZZAZIONE 50 kvm-amd.ko) a seconda dei casi. KVM presenta un approccio diverso rispetto ad altri sistemi di virtualizzazione professionale. Esso non prevede infatti l’utilizzo di un hypervisor a se stante, ma utilizza il kernel Linux a questo scopo, questa è una scelta strategica decisiva che porta numerosi vantaggi. Uno tra tutti è il fatto che grazie a questo, il team di sviluppo di KVM, non deve preoccuparsi di scrivere da sé driver per le periferiche o tool di gestione, tutto ciò è offerto dal kernel Linux. L’integrazione di KVM con il kernel è cosı̀ profonda, che le virtual machine sono nel sistema dei semplici processi. Il fatto che le singole virtual machine vengano viste dal sistema come semplici processi, consente al kernel di trattarli come tali e questo ne aumenta notevolmente la facilità di gestione. Grazie a ciò infatti la macchina che ospita la VM, se dotata di hardware sufciente, risulta sempre uida e dimostra buona velocità di risposta, anche quando il sistema ospitato è sotto sforzo. VirtualBox VirtualBox è una piattaforma di virtualizzazione prodotta da Sun Microsystems, che abilita una full virtualization. Supporta Windows, Mac, Linux e Solaris come sistemi operativi host e permette l’esecuzione di ambienti virtuali a sistemi di ogni tipo, sia x86 che x86 64. VirtualBox ha un’architettura modulare con interfacce di programmazione interne ben definite e una chiara divisione tra codice client e server. Questo rende possibile controllare agevolmente una macchina virtuale tramite diverse interfacce: ad esempio, è possibile creare una macchina virtuale tramite l’interfaccia grafica per poi control- CAPITOLO 4. LA VIRTUALIZZAZIONE 51 larla da riga di comando. VirtualBox funziona allo stesso modo su tutte le piattaforme e le macchine virtuali possono essere facilmente importate ed esportate utilizzando lo standard OVF (Open Virtualization Format). Per quanto riguarda lo storage virtuale, viene utizzato un file immagine sul disco fisico ed esso sarà presentato al sistema guest come hard disk virtuale. Quando il sistema operativo guest effettua operazioni di lettura o scrittura su disco, l’hypervisor di VirtualBox redireziona la richiesta verso questo file. I formati del file supportati sono VDI, VMDK, VHD ed HDD. Oltre all’interfaccia grafica, VirtualBox presenta diversi front-end: • VBoxManage; è la CLI di Virtualbox e fornisce funzionalità avanzate non accessibili tramite l’interfaccia grafica. • VBoxSDL; è un’interfaccia grafica con un insieme limitato di funzioni, designata per visualizzare macchine virtuali controllate con VBoxManage. • VBoxHeadless; non fornisce nessun tipo di output sull’host e agisce unicamente da server RDP. Inoltre, VirtualBox permette di attivare un server RDP, che prende il nome di VRDP (VirtualBox RDP), grazie al quale è possibile visualizzare e controllare una macchina virtuale in remoto attraverso un client RDP standard. Di default il server VRDP utilizza la porta TCP standard di RDP (3389). CAPITOLO 4. LA VIRTUALIZZAZIONE 4.5 52 Lo standard OVF La rapida adozione delle infrastrutture virtuali ha messo in luce la necessità di un modello standard e portabile per la distribuzione di macchine virtuali fra le diverse piattaforme di virtualizzazione. La creazione di un’applicazione con un determinato sistema operativo nel quale è certificato che essa possa essere trasferita fra differenti ISV(Indipendent Software Vendor) come un’unità pre-configurata, risulta essere molto vantaggioso ed allettante. Si tratta di applicazioni che possono essere lanciate attraverso macchine virtuali e sono chiamate Virtual Appliance. Al fine di sviluppare il concetto in larga scala è importante che i produttori adottino uno standard neutrale per il confezionamento delle macchine virtuali ed utilizzino dei meta-dati necessari per un’installazione automatica e sicura, nonché per la configurazione ed il lancio della Virtual Appliance in qualsiasi piattaforma di virtualizzazione. Le Virtual Appliance hanno cambiato il paradigma di distribuzione del software perché permettono agli sviluppatori di ottimizzare le fasi di creazione del software per la loro applicazione. Quindi per i fornitori, la creazione di una Virtual Appliance risulta essere più semplice ed economicamente più conveniente rispetto ad un Hardware Appliance dato che l’applicazione è direttamente distribuita con il sistema operativo riducendo cosı̀ la necessità di effettuare certificazioni e i test di compatibilità applicazione/OS. Per gli utenti finali, le Virtual Appliance offrono l’opportunità di semplificare drasticamente la gestione del ciclo di vita del software attraverso l’utilizzo di un set di processi standard, automatizzati ed efficienti. Una Virtual Appliance è descritta attraverso un formato run-time che illustra la con- CAPITOLO 4. LA VIRTUALIZZAZIONE 53 figurazione delle immagini dei dischi adatti ad un particolare tipo di hypervisor. Tali formati sono ottimizzati per l’esecuzione, mentre per un’efficiente distribuzioni sono necessarie ulteriori caratteristiche che includono la portabilità, l’indipendenza dalla piattaforma, la verifica ed i termini di licenza. L’Open Virtual Machine Format (OVF) [7] è indipendente dall’hypervisor utilizzato, efficiente, facilmente estensibile e descrive Virtual Appliance composte da una o più macchine virtuali. Esso mira a facilitare l’automazione, la gestione sicura non solo delle singole macchine virtuali ma della Virtual Appliance vista come un’unita funzionale. 4.5.1 Virtual Appliance Una Virtual Appliance è un’applicazione preconfigurata che comprende una o più macchine virtuali. Ciascuna VM è un’entità indipendente, installabile run-time, che contiene un sistema operativo, informazioni riguardanti specifiche applicazioni e la descrizione dell’hardware virtuale richiesto da ciascuna VM. Il concetto di Virtual Appliance racchiude tutte quelle applicazioni per utenti finali Figura 4.10: Virtual Appliance. CAPITOLO 4. LA VIRTUALIZZAZIONE 54 accessibili dalla rete, come server DNS, database, o soluzioni CRM complete. Di regola, un servizio software è implementato come un’applicazione multistrato composta da più macchine virtuali e comunicante attraverso la rete. I servizi spesso comprendono altri servizi, i quali a loro volta possono essere applicazioni multistrato oppure altri servizi. Questo modello è conosciuto come Service-Oriented-Architecture (SOA). Il modello SOA si adatta chiaramente ad un’infrastruttura basata su Virtual Appliance. Ad esempio, consideriamo una tipica web application composta da 3 livelli, un livello web che implementa una presentazione logica, uno strato in cui vi è un application server che implementa una logica di business ed uno strato rappresentante un database di back-end. In primo luogo si potrebbe pensare di suddividere l’applicazione in tre macchine virtuali, una per ogni livello. In questo modo, sarebbe possibile scalare da uno a tre host fisici. Un altro approccio riguarda la possibilità di trattare ciascun livello come un servizio in se stesso. Quindi ciascun livello potrebbe essere considerato come un servizio multi-VM che fornisce una soluzione di tipo clusterizzata. Questo approccio potrebbe fornire una grande scalabilità rispetto ai soli tre host fisici. Un tipico scenario sarebbe quello di avere molti server web, un numero inferiore di application server ed uno o due database server. In questo modo, ciascun livello potrebbe avere una scalabilità di poche o molte macchine fisiche, a seconda della richiesta, ed inoltre ciascun livello potrebbe supportare più istanze di servizio di macchine virtuali. CAPITOLO 4. LA VIRTUALIZZAZIONE 4.5.2 55 Obiettivi di progettazione L’Open Virtual Machine Format (OVF) descrive un formato aperto, sicuro, portabile, efficiente ed estensibile per la distribuzione ed il raggruppamento di collezioni di macchine virtuali. Diverse sono le proprietà principali del formato. È ottimizzato per la distribuzione e supporta la verifica dei contenuti e il controllo di integrità secondo uno standard, fornendo inoltre uno schema di base per la gestione delle licenze software. Offre, poi, un approccio robusto e naturale per semplificare il processo d’installazione della macchina virtuale nella piattaforma di virtualizzazione. I meta-dati nel file OVF pilotano l’hypervisor nella creazione della macchina virtuale verificando la compatibilità con l’hardware virtuale locale. Il formato inoltre supporta l’aggregazione in un singolo package con la descrizione di molteplici macchine virtuali ed è portabile in quanto supporta una piattaforma di virtualizzazione neutrale. Esso, inoltre, è compatibile per l’intera gamma di formati di disco rigido virtuale utilizzati per le VMs di oggi, ed è studiato per essere facilmente estensibile a formati che potrebbero sorgere in futuro. Bisogna anche aggiungere che il formato OVF non si basa sull’impiego di una piattaforma host specifica, e per questo è indipendente dalla piattaforma di virtualizzazione e dal sistema operativo guest. Da un punto di vista tecnico, OVF è un meccanismo di trasporto di macchine virtuali. Come tale, esso si distingue dai vari formati di dischi virtuali: VMDK, VHD oppure QCOW. Essi, infatti, non risolvono il problema della portabilità e non aiutano nella personalizzazione della macchina virtuale al momento dell’installazione. Nell’ambito di OVF è insito il concetto di certificazione ed integrità di una Virtual CAPITOLO 4. LA VIRTUALIZZAZIONE 56 Appliance, permettendo cosı̀ alla piattaforma di virtualizzazione di determinare la provenienza dell’applicazione, in maniera tale che l’utente sia in grado di fare le scelte appropriate. OVF definisce sia un formato per la distribuzione di software da utilizzare attraverso le macchine virtuali (OVF Package), che un ambiente nel quale esse verranno eseguite (OVF Environment). In particolare, OVF Package contiene un file xml che descrive la Virtual Appliance ed un insieme di contenuti aggiuntivi, tipicamente dei dischi virtuali. Nella versione 1.0, il file è suddiviso in sezioni, ognuna di esse definisce il funzionamento di una porzione dell’applicazione, ad esempio: virtual hardware, dischi, la rete, le risorse richieste ed i parametri di personalizzazione. Tale file è estensibile, cosicché alcune risorse possono essere aggiunte in un secondo momento. Inoltre sono supportati tutti i formati di dischi virtuali utilizzati dagli hypervisor moderni. Di seguito è mostrato un esempio di file descrittore. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns1:Envelope xmlns:ns2="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/ CIM_VirtualSystemSettingData"xmlns: ns1="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ns4="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/ CIM_ResourceAllocationSettingData" xmlns:ns3="http://schemas.dmtf.org/wbem/wscim/1/common"> <ns1:References> <ns1:File ns1:href="file:///srv/quickposta-0.1.qemu" ns1:id="master"/> </ns1:References> <ns1:DiskSection> <ns1:Disk ns1:capacity="2048MB" ns1:diskId="master"/> </ns1:DiskSection> <ns1:NetworkSection> <Info>Logical networks used in the package</Info> <Network ns1:name="VM Network" custom:desiredCapacity="1 Gbit/s"/> </ns1:NetworkSection> <ns1:VirtualSystem ns1:id="Yavin-prova"> CAPITOLO 4. LA VIRTUALIZZAZIONE 57 <ns1:ProductSection ns1:class="net.emotivecloud.utils.ovf.OVFWrapper"> <ns1:Info>Some configuration information for the VM </ns1:Info> <ns1:Property ns1:value="hda" ns1:type="string" ns1:key="master.target"/> <ns1:Property ns1:value="ext3" ns1:type="string" ns1:key="master.format"/> <ns1:Property ns1:value="hd" ns1:type="string" ns1:key="BOOT"/> <ns1:Property ns1:value="kvm" ns1:type="string" ns1:key="HYPERVISOR"/> </ns1:ProductSection> <ns1:OperatingSystemSection ns1:id="76"> <ns1:Info>Specifies the operating system installed</ns1:Info> <ns1:Description>Microsoft Windows Server 2008</ns1:Description> </ns1:OperatingSystemSection> <ns1:Info>VM description</ns1:Info> <ns1:VirtualHardwareSection> <ns1:Info>Virtual Hardware requirements</ns1:Info> <ns1:Item> <ns4:Description>Number of Virtual CPUs</ns4:Description> <ns4:ElementName>1 virtual CPU</ns4:ElementName> <ns4:InstanceID>0</ns4:InstanceID> <ns4:ResourceType>3</ns4:ResourceType> <ns4:VirtualQuantity>1</ns4:VirtualQuantity> </ns1:Item> <ns1:Item> <ns4:AllocationUnits>MegaBytes</ns4:AllocationUnits> <ns4:Description>Memory Size</ns4:Description> <ns4:ElementName>500 MB of Memory</ns4:ElementName> <ns4:InstanceID>1</ns4:InstanceID> <ns4:ResourceType>4</ns4:ResourceType> <ns4:VirtualQuantity>500</ns4:VirtualQuantity> </ns1:Item> <ns1:Item> <ns4:AutomaticAllocation>true</ns4:AutomaticAllocation> <ns4:Connection>VM Network</ns4:Connection> <ns4:ElementName>Ethernet adapter on "VM Network "</ns4:ElementName> <ns4:InstanceID>3</ns4:InstanceID> <ns4:ResourceType>10</ns4:ResourceType> <ns1:/Item> <ns1:Item> <ns4:AutomaticAllocation>true</ns4:AutomaticAllocation> <ns4:ElementName>Hardisk 1</ns4:ElementName> <ns4:HostResource>ovf://file/master</ns4:HostResource> CAPITOLO 4. LA VIRTUALIZZAZIONE 58 <ns4:HostResource>ovf://disk/master</ns4:HostResource> <ns4:InstanceID>6</ns4:InstanceID> <ns4:ResourceType>17</ns4:ResourceType> </ns1:Item> </ns1:VirtualHardwareSection> </ns1:VirtualSystem> </ns1:Envelope> I file descrittori presentano una serie di sezioni. Come sopra mostrato, le prime sezioni definiscono i riferimenti ad un insieme di file esterni utilizzati dalla Virtual Appliance, l’insieme dei dischi virtuali e le reti utilizzate dall’applicazione. A ciascun file, disco o rete è dato un identificatore univoco. Il vero contenuto di un file OVF è elencato all’interno del tag VirtualSystem. Nell’esempio esso contiene cinque sezioni: • Product Section, che fornisce informazioni quali il nome del prodotto, il fornitore ed ulteriori proprietà che possono essere utilizzate per la personalizzazione della Virtual Appliance. Queste proprietà possono essere configurate al momento dell’installazione, in genere chiedendo all’utente. Possono esserci più sezioni di questo tipo. • AnnotationSection, che è una libera forma di annotazione. • EulaSection, che fornisce i termini di licenza della Virtual Appliance. • HardwareSection, che descrive l’hardware virtuale. Questa è una sezione necessaria che descrive il tipo di hardware virtuale e l’insieme dei dispositivi che la macchina virtuale necessita. Nel caso particolare è specificato: 500 MB di memoria ram, una CPU, una rete virtuale ed un disco virtuale. • OperatingSystemSection, che descrive il sistema operativo ospite. CAPITOLO 4. LA VIRTUALIZZAZIONE 59 Creazione È possibile creare un OVF semplicemente esportando da una piattaforma di virtualizzazione la macchina virtuale esistente in un OVF Package ed aggiungendo i dati rilevanti necessari per la corretta installazione ed esecuzione, come ad esempio driver o tools necessari per la gestione della memoria o dei dispositivi di I/O. Durante questo processo, i dischi della macchina virtuale saranno compressi per rendere il package più conveniente per la distribuzione. Deployment In questa fase, le macchine virtuali comprese nell’OVF Package vengono trasformate in un formato run-time dipendente dalla piattaforma di virtualizzazione di destinazione, assegnando le risorse adeguate e l’hardware virtuale corretto. Durante questo processo, la piattaforma verifica l’integrità dell’OVF, accertando che lOVF Package non sia stato modificato in transito, e controllando che sia compatibile con l’hardware virtuale locale. Inoltre, vengono configurate le reti, fisiche o virtuali, alle quali le macchine virtuali devono connettersi e vengono assegnate le risorse di storage, configurate le CPU e personalizzate le proprietà livello di applicazione. La fase di deployment istanzia una o più macchine virtuali con un profilo hardware che sia compatibile con i requisiti posti nel descrittore OVF, e un insieme di dischi virtuali con il contenuto specificato nel Package OVF. CAPITOLO 4. LA VIRTUALIZZAZIONE 60 Portabilità Il raggruppamento di macchine virtuali in OVF Package non garantisce una portabilità universale e non assicura una corretta installazione in tutte le piattaforme di virtualizzazione gestite da diversi hypervisor. Di seguito vi sono alcuni fattori che limitano la portabilità. • Le macchine virtuali all’interno dei Package OVF possono contenere dischi in formato non conosciuto dall’hypervisor che sta tentando l’installazione. • Il software ospite installato può non supportare l’hardware virtuale gestito dall’hypervisor. • Il software ospite può non supportare l’architettura della CPU. • La piattaforma di virtualizzazione potrebbe non capire una funzione richiesta nel file OVF. La portabilità di un OVF può essere suddivisa nei tre seguenti livelli: • Funziona solo su un particolare prodotto di virtualizzazione e/o architettura di CPU e/o hardware virtuale. • Funziona solo per una specifica famiglia di hardware virtuale. • Funziona su diverse famiglie di hardware virtuale. Questa distinzione fa sı̀ che, per un uso all’interno di un’organizzazione, i primi due livelli potrebbero bastare dato che il Package OVF è diffuso all’interno di un ambiente CAPITOLO 4. LA VIRTUALIZZAZIONE 61 controllato. Mentre per le Virtual Appliance utilizzate a livello commerciale è necessario il terzo tipo di portabilita. La descrizione dell’hardware virtuale all’interno del file OVF supporta tutti i tipi di portabilità visti precedentemente, in quanto nella virtualhardwaresection è possibile introdurre qualunque descrizione hardware richiesta ed, addirittura, specificare diverse alternative di configurazione. Capitolo 5 Descrizione dell’implementazione Passando adesso alla descrizione specifica dell’implementazione, bisogna dire che il lavoro svolto nella presente tesi si è incentrato sul concetto di virtualizzazione in CLEVER, un’architettura cloud open-source sviluppata all’interno dell’Università di Messina e l’obiettivo è stato quello di estendere le funzionalità del cloud, al fine di poter permettere a ciascun utente di utilizzare un ambiente virtuale secondo le sue esigenze. In particolare, si è cercato di far sı̀ che qualsiasi fruitore dei servizi del cloud sia in grado di creare un disco immagine con installato il sistema operativo desiderato, a cui sarà possibile accedere solo tramite un account personale. A ciò si aggiunga che esiste un elenco di applicazioni primarie installabili in maniera silenziosa, anche solo eventualmente. Nel capitolo che segue vengono descritte le soluzioni implementative adottate per soddisfare le eventuali esigenze emergenti. Il linguaggio di programmazione utilizzato per la parte implementativa è Java, per 62 CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 63 restare in linea con l’intero processo di progettazione di CLEVER che si basa sul modello della programmazione ad oggetti. Avvalendosi del paradigma a plug-in di CLEVER, si è pensato di integrare all’interno del Cluster Manager un agente in grado di occuparsi della creazione e gestione del disco con il sistema operativo installato. Una scelta implementativa riguarda poi l’utilizzo dell’hypervisor necessario per la gestione delle istanze delle macchine virtuali. A tal fine sarà possibile scegliere senza alcuna differenza particolare la soluzione open-source, VirtualBox, oppure utilizzare gli strumenti per la gestione di piattaforme di virtualizzazione forniti dalle API di Libvirt, che permettono di utilizzare le più importanti tecnologie di virtualizzazione, come ad esempio Qemu e KVM. Inoltre, si è introdotto in CLEVER lo standard OVF, versione 1.0, strumento che descrive le caratteristiche delle macchine virtuali già adoperato in altre infrastrutture cloud, come ad esempio OpenNebula. Per il parsing di questo tipo di file è stato necessario l’utilizzo di specifiche librerie. 5.1 Agente CreateImage Per l’implementazione del CreateImageAgent sono state seguite le linee guide fornite nella documentazione di CLEVER. Si è utilizzato quindi un approccio a plug-in. Nel dettaglio il CreateImageAgent estende la classe CmAgent, ed eredita da quest’ultima il logger e la funzione main che gli permette di essere eseguito come un processo separato. CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 64 Il costruttore di default di CreateImageAgent richiama il costruttore di default della classe padre, e in questo modo viene correttamente configurato il ModuleCommunicator che permette la comunicazione intra-modulo in CLEVER attraverso il D-Bus di sistema. Inoltre sempre nel costruttore di default viene settato il nome del logger (ereditato dalla classe padre) attraverso il metodo getLogger implementato nella classe Logger. Essendo la classe CmAgent una classe astratta, è stato necessario implementare nell’agente tutti i metodi astratti di tale classe ovvero initialization() e shutdown(). La funzione initialization() provvede a creare un’istanza della classe CreateImagePlugin. Nel plugin CreateImage è stato implementato un metodo (setOwner ) che permette di passare l’handle del CreateImageAgent al plugin. Questa funzione viene richiamata nell’inizialization() del CreateImageAgent subito dopo la creazione del plugin. In figura 5.1 è raffigurato il diagramma delle classi. CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE Figura 5.1: Diagramma delle classi CreateImage 65 CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 5.1.1 66 CreateImage La classe CreateImage implementa le funzionalità principali del progetto in modo da raggiungere con successo l’obiettivo desiderato. Possiamo descrivere il processo di creazione del disco in tre parti. La prima è relativa alla creazione dell’immagine del sistema operativo da installare sul disco, mediante un processo di installazione automatica. I file ISO dei sistemi operativi potranno essere reperibili da una repository dalla quale si effettuerà il download. La seconda parte descrive appunto l’installazione attraverso l’hypervisor di VirtualBox oppure utilizzando gli strumenti per la gestione di piattaforme di virtualizzazione forniti dall’open-source API Libvirt. Grazie ai quali è possibile utilizzare KVM e Qemu. Una volta terminato il processo di installazione, in output vi sarà un file immagine rappresentante il disco con il sistema operativo installato. Esso avrà un formato dipendente dall’hypervisor utilizzato. La terza, ed ultima parte implementerà la copia del file appena creato all’interno di un nodo del filesystem di CLEVER. Si elencano di seguito i metodi della classe. DownloadFromRepo I file per la configurazione del sistema operativo da installare, se esplicitamente richiesto, saranno scaricati da una repository. Il metodo implementa questa funzionalità. Ad esso è necessario passare come parametro il path logico del nodo del filesystem di CLEVER che funge da repository. Tale metodo, innanzitutto, interroga lo Storage Manager per sapere se effettivamente il nodo esiste. Se sı̀, verrà effettuato il download dei file di configurazione relativi al CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 67 sistema operativo che si vuole installare. Inoltre, sarà scaricato il file contenente gli eseguibili delle applicazioni da installare in modo silenzioso. CreateAnswerFile Il presente metodo si occupa della creazione dei file di risposta di Windows XP (Winnt.sif ), di Windows Vista e Seven (AutoUnattend.xml ). A tal fine, sono necessari i seguenti parametri di configurazione: • Nome utente; • Password; • Organizzazione; • Nome del computer; • Sistema operativo da installare; • Lista delle applicazioni da installare. Naturalmente, potrebbero essere considerati anche dei parametri aggiuntivi per ottenere l’installazione desiderata, come ad esempio per la creazione di più partizioni del disco, avere una risoluzione del display differente, etc... Nel presente elaborato si è tenuta in considerazione un’installazione automatica del sistema operativo, e per questo il file di risposta è creato in modo tale che non vi sia interazione con l’utente durante il processo di installazione. Sarà possibile, poi, personalizzare l’ambiente virtuale con applicazioni che saranno CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 68 installate al primo avvio del sistema in maniera silenziosa. Fra queste vi sono AVG Antivirus, Scilab e LibreOffice. CreateISO La funzione non fa altro che copiare il file di risposta all’interno della directory desiderata dell’immagine del sistema operativo da installare. In particolare: • per Windows XP, nella cartella i386; • per Windows Vista o Seven, nella root. Successivamente, sarà necessario creare un nuovo CD avviabile. A tal fine, esistono delle specifiche applicazioni (come nLite) che permettono di creare dei CD di installazione del sistema operativo personalizzati. In questo lavoro di tesi, è stato utilizzato il comando mkisofs: mkisofs -b boot.ima -c Catalog -o filename.iso pathname/ dove: • -o filename.iso è il nome del file ISO che sarà creata; • pathname/ è la directory entro la quale ci sono i file dai quali si creerà la ISO; • -b boot.ima, è specificata l’immagine di boot da utilizzare per creare un CD avviabile; • -c Catalog, è specificato il file che rappresenta il catalogo da utilizzare. CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 5.1.2 69 Creazione del disco Dopo aver creato l’immagine del sistema operativo, si potrà procedere nella creazione del disco. Sono stati cosı̀ valutati e studiati due hypervisor: VirtualBox e Qemu-KVM. A tal proposito sono state create due classi, di seguito analizzate, per la creazione e la gestione della macchina virtuale e, nello specifico, del disco associato, CallVbox e CallLvirt. CallVbox Questa classe implementa le funzionalità principali di gestione dell’hypervisor di VirtualBox. A tal fine, sono state utilizzate delle librerie apposite, scritte in linguaggio Java [18], che permettono l’interazione con VirtualBox. Dopo aver creato un’istanza di VirtualBox attraverso il costruttore di classe, possono essere richiamati i seguenti metodi. Il metodo createvm riceve come parametri di ingresso: • il sistema operativo da installare, • il nome della macchina virtuale, • la dimensione del disco desiderata, • il path della directory locale dove salvare il disco. L’obiettivo da raggiungere è creare una macchina virtuale e predisporla all’installazione del sistema operativo e delle applicazioni scelte. In particolare, verrà creato CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 70 il disco con la dimensione prescelta che sarà, quindi, montato in un IDE Controller precedentemente progettato. Successivamente, tramite il metodo mountISO verranno collegate, ai dispositivi di lettura DVD creati, l’ immagine del sistema operativo ed il file immagine contenente le applicazioni da installare. Una volta fatto ciò, è tutto pronto per avviare il processo di installazione vero e proprio, mediante il metodo launchVM. Esso avrà il compito di lanciare la virtual machine, all’interno della quale partirà l’installazione automatica del sistema operativo. CallLvirt Anche questa classe ha come obiettivo la creazione del disco che si realizza tramite un sistema operativo che però in questo caso viene installato utilizzando come hypervisor Qemu oppure KVM. Sono state adoperate le librerie Libvirt Virtualization API [19]. Inizialmente, mediante il costruttore di classe, viene creata una connessione verso l’hypervisor locale oppure remoto. Successivamente, è necessario definire un dominio attraverso il metodo createvm che prende come parametri in ingresso: • il sistema operativo da installare, • il nome della macchina virtuale, • la dimensione del disco desiderata, • il path della directory locale dove salvare il disco. CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 71 Tale metodo richiama ToXML che permette la creazione di un file XML, necessario per la definizione dominio della macchina virtuale, grazie al quale verrà creato un disco in formato raw. Di seguito ‘e possibile vedere un esempio di dominio: <domain type="kvm"> <name>WindowsXP</name> <memory>512000</memory> <os> <type arch="i686">hvm</type> <boot dev="cdrom" /> </os> <features> <acpi /> <apic /> </features> <devices> <interface type="network"> <source network="default" /> </interface> <emulator>/usr/bin/kvm</emulator> <disk type="file" device="cdrom"> <source file="/home/peppecal/Scrivania/Vmachine/WindowsVista.iso" /> <target dev="hdb" /> </disk> <disk type="file" device="disk"> <source file="/home/peppecal/Scrivania/Vmachine/peppeXP13.img" /> <target dev="hda" /> </disk> <disk type="file" device="cdrom"> <source file="/home/peppecal/Scrivania/Vmachine/file.iso" /> <target dev="hdc" /> </disk> <graphics type="vnc" port="5904" /> </devices> </domain> CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 72 Si può notare come sia necessario definire il nome della macchina virtuale, la memoria RAM, il tipo di sistema operativo che in questo caso è hvm (hardware virtual machine), attraverso cui si abilita una full virtualization. All’interno del tag features si indicano dei parametri che devono essere abilitati oppure no, in questo caso acpi e apic sono inerenti alla configurazione e gestione energetica controllata dal sistema operativo. All’interno del tag devices viene definita l’interfaccia di rete, l’emulatore (in questo caso kvm) ed i dischi immagine utilizzati. Infine nel tag graphics viene inserito il tipo di server da lanciare per visualizzare, ad esempio, una macchina virtuale in stato di running nel desktop remoto. Una volta definito il dominio è possibile andarlo a creare, mediante il metodo startVM, che in definitiva permetterà la creazione del disco, lanciando la macchina virtuale e quindi il programma di installazione del sistema operativo. Copia del disco Una volta creato il disco, l’agente CreateImage prevede di effettuare la copia all’interno del path logico di CLEVER. Questo è implementato dal metodo storedisk, che riceve come parametro in ingresso il path di un nodo del filesystem di CLEVER all’interno del quale memorizzare il disco creato. Di seguito è mostrato il codice. public void storedisk(String path) throws CleverException, FileSystemException{ ArrayList params = new ArrayList(); params.add(path); params.add(""); MethodInvoker mi=new MethodInvoker("StorageManagerAgent","discoveryNode", true, params); VFSDescription res=(VFSDescription)this.mc.invoke(mi); VirtualFileSystem dest = new VirtualFileSystem(); CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 73 dest.setURI(res); FileObject file_d=dest.resolver(res, dest.getURI(),res.getPath1()); FileSystemManager mgr = VFS.getManager(); FileObject file_s = mgr.resolveFile(this.temp_path+this.machine+".img"); dest.cp(file_s, file_d); } Rimozione della VM Dopo aver copiato il disco all’interno di uno specifico nodo del filesystem di CLEVER, il passo successivo consiste nella rimozione completa della virtual machine creata nel Cluster Manager. Tale operazione è svolta dal metodo destroyVm() implementato nelle classi CallVbox e CallLvirt. 5.2 Shell di amministrazione CLEVER è dotato di una shell di amministrazione, che permette di eseguire le principali operazioni per la gestione e l’utilizzo del middleware. Si tratta di una shell testuale, grazie alla quale vengono invocate le funzioni fornite dagli agenti di CLEVER, passando gli eventuali parametri. La shell di CLEVER, per lo scambio di messaggi con il middleware CLEVER, utilizza lo stesso server XMPP che permette la comunicazione inter-nodo in CLEVER. Il ClusterCoordinator è infatti in ascolto su una stanza del server XMPP riservata alla shell ed è quindi in grado di ricevere le richieste provenienti dalla shell e smistarle verso l’agente di destinazione. Con l’introduzione in CLEVER del CreateImageAgent è stata necessaria la creazione CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 74 di un nuovo comando per la shell, in modo da permettere di creare e gestire il disco col sistema operativo installato. createimage -f /path/local/file -p /path/logic [-r /path/logic/repo] Tale comando prende in ingresso 3 parametri: • (-f /path/local/file), il percorso locale del file XML che contiene le informazioni necessarie per la creazione del disco; • (-p /path/logic), il percorso logico del nodo del filesystem di CLEVER, all’interno del quale verrà memorizzato il disco. • -r /path/logic/repo, è parametro opzionale. Se è indicato, fa in modo che il Cluster Manager effettui il download da una repository della ISO del sistema operativo da installare. Se, invece, si omette implica la ricerca dei file all’interno di un path locale. • (-xml ), opzione che permette di mostrare a video le richieste e risposte in formato XML. 5.3 OVF Descriptor Il comando della shell di amministrazione di CLEVER riceve come primo parametro il path del file contenente tutte le informazioni necessarie alla creazione dell’immagine del disco. A tal fine si è scelto l’utilizzo di un file OVF. Di seguito ne è presente un esempio. CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 75 <?xml version="1.0" encoding="UTF-8"?> <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/ cim-schema/2/CIM_VirtualSystemSettingData" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/ cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xsi:schemaLocation="http://schemas.dmtf.org/ovf/envelope/1 ../dsp8023.xsd"> <References> <File ovf:id="file1" ovf:href="/home/peppecal/Scrivania/Vmachine/WindowsXP.iso"/> <File ovf:id="file2" ovf:href="/home/peppecal/Scrivania/Vmachine/file.iso"/> </References> <VirtualSystem ovf:id="peppeXP"> <ProductSection ovf:class="net.emotivecloud.utils.ovf"> <Property ovf:value="virtualbox" ovf:type="string" ovf:key="HYPERVISOR"/> </ProductSection> <ProductSection ovf:class="com.install.account"> <Property ovf:value="peppecal" ovf:type="string" ovf:key="USERNAME"/> <Property ovf:value="image" ovf:type="string" ovf:key="PASSWORD"/> <Property ovf:value="casa" ovf:type="string" ovf:key="ORG"/> <Property ovf:value="pc_virt" ovf:type="string" ovf:key="PCNAME"/> <Property ovf:value="10000000000" ovf:type="long" ovf:key="DISKSIZE"/> <Property ovf:value="GuestAdditions" ovf:type="string" ovf:key="app0"/> <Property ovf:value="avg" ovf:type="string" ovf:key="app1"/> <Property ovf:value="scilab" ovf:type="string" ovf:key="app2"/> <Property ovf:value="LibreOffice" ovf:type="string" ovf:key="app3"/> </ProductSection> <OperatingSystemSection ovf:id="67"> <Info>Guest Operating System</Info> <Description>WindowsXP</Description> </OperatingSystemSection> <VirtualHardwareSection> <Info>Virtual hardware requirements for a virtual machine</Info> <Item> <rasd:Caption>1 virtual CPU</rasd:Caption> <rasd:Description>Number of virtual CPUs</rasd:Description> <rasd:InstanceId>1</rasd:InstanceId> <rasd:ResourceType>3</rasd:ResourceType> <rasd:VirtualQuantity>1</rasd:VirtualQuantity> CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE </Item> <Item> <rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits> <rasd:Caption>512 MB of memory</rasd:Caption> <rasd:Description>Memory Size</rasd:Description> <rasd:InstanceId>2</rasd:InstanceId> <rasd:ResourceType>4</rasd:ResourceType> <rasd:VirtualQuantity>512</rasd:VirtualQuantity> </Item> <Item> <rasd:Address>1</rasd:Address> <rasd:BusNumber>1</rasd:BusNumber> <rasd:Caption>ideController0</rasd:Caption> <rasd:Description>IDE Controller</rasd:Description> <rasd:InstanceId>4</rasd:InstanceId> <rasd:ResourceSubType>PIIX4</rasd:ResourceSubType> <rasd:ResourceType>5</rasd:ResourceType> </Item> <Item> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Caption>Ethernet adapter on ’NAT’</rasd:Caption> <rasd:Connection>NAT</rasd:Connection> <rasd:InstanceId>5</rasd:InstanceId> <rasd:ResourceSubType>PCNet32</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> </Item> <Item> <rasd:AddressOnParent>0</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Caption>cdrom1</rasd:Caption> <rasd:Description>CD-ROM Drive</rasd:Description> <rasd:HostResource>ovf://file/file1</rasd:HostResource> <rasd:InstanceId>9</rasd:InstanceId> <rasd:Parent>4</rasd:Parent> <rasd:ResourceType>15</rasd:ResourceType> </Item> <Item> <rasd:AddressOnParent>1</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Caption>cdrom2</rasd:Caption> 76 CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 77 <rasd:Description>CD-ROM Drive</rasd:Description> <rasd:HostResource>ovf://file/file2</rasd:HostResource> <rasd:InstanceId>10</rasd:InstanceId> <rasd:Parent>4</rasd:Parent> <rasd:ResourceType>15</rasd:ResourceType> </Item> </VirtualHardwareSection> </VirtualSystem> </Envelope> Come è possibile notare, si tratta di un file descrittore XML adattato alle esigenze dell’Agente CreateImage. In particolare, dopo un’intestazione conforme allo standard, sono presenti diverse sezioni. Nella sezione References sono presenti le caratteristiche dei file esterni utilizzati e, nel caso particolare, sono presenti i due file immagine ISO necessari per l’installazione del sistema operativo con le applicazioni desiderate. VirtualSystem è la sezione principale. Essa ha id come attributo, contenente come valore il nome della macchina virtuale che si vuole creare. È risultata di grande aiuto la possibilità di poter inserire all’interno di questa sezione più istanze di ProductSection, cosicché si potessero descrivere differenti gruppi di informazioni. Nell’esempio sono presenti due classi: • net.emotivecloud.utils.ovf, che contiene informazioni riguardanti il formato dei file utilizzati ed il tipo di hypervisor (kvm o virtualbox) adoperato per la creazione della macchina virtuale e quindi del disco; • com.install.account, contenente tutte le altre informazioni aggiuntive riguardanti l’account, come: CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 78 – username; – password; – organizzazione; – nome del pc; – dimensione del disco; – lista delle applicazioni. Successivamente, vi è la OperatingSystemSection, che riguarda il sistema operativo da installare, annotato all’interno del tag descripion. Infine vi è la VirtualHardwareSection nella quale sono presenti tutte le caratteristiche dell’hardware virtuale da utilizzare. La distinzione fra i vari componenti è effettuata attraverso gli item. In questo caso, sussistono informazioni riguardanti il numero di CPU virtuali da utilizzare, la dimensione della memoria RAM, nonché altre informazioni relative ai dischi, alla scheda di rete utilizzata, all controller USB, alla scheda audio ed infine ai lettori CD-ROM utilizzati. Si evidenzia in particolare il riferimento ai file immagine ISO da montare. 5.3.1 OVF Wrapper Una volta passato come parametro il file OVF, è necessario effettuare un parsing al fine di estrapolare le informazioni in esso contenute. A tal fine, si è utilizzato un parser, le cui librerie sono presenti nel progetto OVF4ONE [20]. Si tratta di un’implementazione Java di OCCI (Open Cloud Computing Interface) che utilizza CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 79 messaggi OVF ed il toolkit di cloud computing open-source, OpenNebula, come backend. Questa implementazione si basa sulle caratteristiche specifiche di OpenNebula, ma non le impone. In pratica, OVF4ONE è un bridge fra OCCI ed OpenNebula Cloud API (OCA), che traduce le chiamate ai metodi RestFul OCCI in chiamate RestFul OCA, in maniera tale da tradurre i messaggi OVF in template di macchine virtuali di OpenNebula. Nella figura 5.2 di seguito riportata è mostrato il diagramma delle classi utilizzate che permettono di effettuare il parsing del file OVF. CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 80 Figura 5.2: Diagramma delle classi OVF La classe principale è OVFWrapperFactory. Essa viene richiamata per creare CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 81 un oggetto OVFWrapper contenente tutte le informazioni del file OVF. I metodi implementati sono: • parse(xml : String). Esso prende come parametro la stringa rappresentante il file OVF e ne effettua l’unmarshalling, che permette la conversione del file (rappresentato sotto forma di serie byte) in una struttura dati, che nel caso particolare è un oggetto della classe EnvelopeType rappresentante l’intero documento xml (compreso all’interno del tag Envelope). Tale oggetto viene passato al metodo create. • create(envelope : EnvelopeType). Esso estrapola tutte le informazioni contenute nell’oggetto envelope che a sua volta sarà composto da oggetti sempre più specifici rappresentanti le sezioni interne del file OVF. Ad esempio, si potranno avere oggetti di VirtualSystemType, ProductSectionType, DiscSectionType, VirtualHardwareSectionType e cosı̀ via. Di volta in volta saranno prelevate le informazioni contenute in queste sezioni per formare un oggetto OVFWrapper, che sarà il parametro di ritorno del metodo in considerazione. • create(...). Tale metodo prende come parametri d’ingresso tutti i vari dati già estratti necessari per la composizione di un oggetto OVFWrapper, quindi segue una via alternativa rispetto al precedente metodo per la creazione di tale oggetto. • createDisk(...), createImage(...), createNetwork(...). Tali metodi vengono richiamati al momento della scansione della VirtualHardwareSection, cioè della sezione contenente tutti i vari tipi di hardware virtuali contenuti nel CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 82 file OVF. Non appena si è in presenza di dischi, immagini ISO oppure reti si richiamano i metodi in considerazione che creano oggetti contenenti le informazioni necessarie per configurare i vari tipi di hardware virtuale. Ad esempio, per quanto riguarda i dischi, sono utili le informazioni sul path locale nel quale sono memorizzati oppure la capacità in MegaByte. Per le reti è possibile andare a prendere le informazioni riguardanti il nome, l’indirizzo IP o Mac. La classe OVFAux è di ausilio alla classe OVFWrapperFactory. Essa implementa infatti i metodi utili alla ricerca delle sotto-sezioni contenute nell’oggetto envelope. La classe OVFWrapper, invece, contiene tutte le informazioni ottenute dal file OVF. Ad esempio: • memoryMB, la memoria ram; • architecture, architettura; • productProperties, tutte le varie informazioni contenute nelle sezioni ProductSection, memorizzate attraverso un’ HashMap, in cui ciascuna riga presenta una chiave nota ed il valore; • disks, i dischi; • images, le immagini ISO; • networks, le reti virtuali e fisiche; • osProperties, il sistema operativo; CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 83 • accountProperties, tutte le informazioni riguardanti l’account del sistema operativo da installare. Infine le classi OVFDisk, OVFImage, OVFNetwork, come già enunciato in precedenza, rappresentano i vari dischi, le immagini e le reti della macchina virtuale che si vuole istanziare attraverso il file OVF. CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 5.3.2 84 Agente OVFCompute L’agente in esame, anch’esso facente parte del ClusterManager, è stato creato al fine di effettuare il parsing del file OVF, creando cosı̀ un oggetto OVFWrapper nel quale saranno memorizzate le informazioni contenute nel file. Figura 5.3: Diagramma delle classi OVFComputeAgent CAPITOLO 5. DESCRIZIONE DELL’IMPLEMENTAZIONE 85 Il file OVF, appunto, sarà passato attraverso il comando createimage, all’agente CreateImage, il quale invocherà il metodo getAccountSettings di OVFComputeAgent per ottenere le informazioni desiderate. La classe OVFCompute implementa le funzionalità principali per giungere all’obiettivo desiderato. Essa implementa i seguenti metodi: • vmDescription(ovf : OVFWrapper). Esso prende come parametro un’oggetto OVFWrapper, precedentemente allocato e riempito delle informazioni necessarie presenti all’interno del file OVF, e ritorna un oggetto AccountSettings avente tutti i dati riguardanti l’account e le proprietà del disco da creare. • parse(path ovfXml : String). Questo metodo invece richiama l’omonimo metodo della classe OVFWrapperFactory, descritto in precedenza, passandogli il path del file OVF. • getAccountSettings(path ovfXml : String). Esso riceve il percorso locale del file OVF ed invoca prima il metodo parse, dal quale riceve un oggetto OVFWrapper e successivamente il metodo vmDescription dal quale riceve un oggetto di tipo AccountSettings che, a sua volta, sarà il suo parametro di ritorno. Capitolo 6 Test sperimentali In questo capitolo verrà mostrato un tipico scenario di funzionamento dell’agente CreateImage. 6.1 Configurazione delle macchine Per il testbed sono state adoperate 3 macchine AMD64 facenti parte di un BladeCenter dell’IBM. La prima fase ha richiesto la configurazione di queste tre lame, a tal fine si è scelto di installare come sistema operativo la distro Scientific Linux 6.3 Basic Server [24]. È necessario installare la versione DVD per la presenza di bug nelle altre ISO di installazione. Dopo aver configurato la rete si è passati all’installazione dei pacchetti necessari all’avvio di Clever. In particolare su ciascuna lama è stato installato: 86 CAPITOLO 6. TEST SPERIMENTALI 87 • il demone dbus-launch che è necessario lanciare per la corretta comunicazione dei moduli di Clever; • VirtualBox-4.1-4.1.16 x86 64 che è la versione di VirtualBox utilizzata (potrebbe non funzionare con altre versioni); • qemu-kvm, libvirt, python-virtinst, per la configurazione di libvirt. Inoltre, su alcune lame sono stati montati dei server FTP ed SFTP per la verifica della corretta memorizzazione dell’immagine del disco creata all’interno del path logico di Clever. A tal fine si sono dovuti installare i demoni Proftpd e Vsftpd. 6.2 Scenario In figura 6.1 viene presentato lo scenario per la realizzazione degli esperimenti. Come detto precedentemente, sono state utilizzate tre macchine con indirizzi appartenenti alla rete interna dell’Università di Messina ed un host che funge da repository: • ing-clever-03 con IP: 212.189.207.106, nella quale è lanciata un’istanza di CLEVER che, essendo l’unica, ha il Cluster Manager attivo; • ing-clever-02 con IP: 212.189.207.105, utilizzata per la shell di amministrazione di CLEVER; • ing-clever-01 con IP: 212.189.207.104, sulla quale è montato un server FTP, come destinazione delle immagini dei dischi. CAPITOLO 6. TEST SPERIMENTALI 88 • Minotauro con IP: 172.17.122.77, sulla quale è montato un server FTP, dal quale viene effettuato il download della ISO del sistema operativo. Figura 6.1: Scenario Il test prevede che, una volta avviata l’istanza di CLEVER nella lama 03, venga lanciato dalla shell di amministrazione posta nella lama 02 il comando: createimage -f /root/Clever/configuration image.ovf -r peppecal/repository -p peppecal/remoteftp1 passando tre parametri: il file OVF, il path logico del nodo del filesystem di CLEVER utilizzato come repository ed il path logico del nodo sul quale memorizzare il disco creato. Ipotizzando di aver assegnato come nome della macchina virtuale CleverXP e di CAPITOLO 6. TEST SPERIMENTALI 89 utilizzare come hypervisor VirtualBox, l’agente provvederà a creare il disco CleverXP.vmdk e memorizzarlo nella lama ing-clever-01. Per verificare la corretta installazione del sistema operativo nel disco si adoperano le funzioni già implementate in CLEVER che prevedono inizialmente la configurazione del file VEDescription.xml, di seguito riportato: <?xml version="1.0" encoding="UTF-8"?> <org.clever.Common.VEInfo.VEDescription> <os_guest_id>ubuntuGuest</os_guest_id> <name>CleverVM</name> <storage> <org.clever.Common.VEInfo.StorageSettings> <diskPath>peppecal/remoteftp1/CleverXP.vmdk</diskPath> </org.clever.Common.VEInfo.StorageSettings> </storage> <cpu> <numCpu>1</numCpu> <coresXCpu>1</coresXCpu> <frequency>0.0</frequency> <architecture>X86</architecture> </cpu> <mem> <size>512000</size> </mem> <network> <org.clever.Common.VEInfo.NetworkSettings></org.clever.Common.VEInfo.NetworkSettings> </network> <desktop> <username></username> <password_user></password_user> <password_vnc_vm></password_vnc_vm> <ip_vnc></ip_vnc> </desktop> </org.clever.Common.VEInfo.VEDescription> Dopodiché è necessario lanciare dalla shell di amministrazione di CLEVER il comando registervm, che registrerà l’ambiente virtuale all’interno del database. Successivamen- CAPITOLO 6. TEST SPERIMENTALI 90 te, tramite il comando createvm, al quale si passerà il nome dell’Host Manager per il mapping VM/HM ed il nome della macchina virtuale registrato nel file sopra riportato (CleverVM ), verrà creata una copia del disco all’interno della repository di CLEVER e predisposta la VM relativa. Infine, per l’avvio si adopererà il comando startvm che prende come parametro solo il nome della VM. Per visualizzare l’andamento dell’installazione del sistema operativo e per la gestione della macchina virtuale con il sistema già installato è stato adoperato il tool rdesktop, tool che permette la connessione verso desktop remoti utilizzando il protocollo RDP. Lanciando il comando: rdesktop -a 16 -N 212.189.207.106:3390 sarà possibile collegarsi attraverso la porta 3390 alla macchina virtuale avviata nella lama ing-clever-03. Naturalmente, affinché ciò avvenga è stato necessario modifica le impostazioni della macchina virtuale mettendo in ascolto un server RDP sulla porta 3390. Capitolo 7 Conclusioni e sviluppi futuri L’obiettivo preso di mira con la presente tesi è stato la progettazione e l’integrazione all’interno del middleware per il cloud computing, CLEVER, della funzionalità di creazione di un disco immagine avente i requisiti richiesti da un qualsiasi utente fruitore dei servizi del cloud. Ogni utente sarà cosı̀ capace di avviare il proprio ambiente virtuale indipendentemente sia dalla macchina che utilizza che dalla posizione geografica nella quale si trova. Inoltre, mediante l’introduzione dello standard OVF è stato rafforzato in CLEVER il concetto di contestualizzazione, in modo tale da renderlo più simile alle altre infrastrutture cloud. I risvolti del lavoro della presente tesi potrebbero essere molteplici, sia nell’ambito delle installazioni automatiche che in relazione allo standard OVF. Si potrebbero, infatti, approfondire tecniche di installazione automatica modificando i file di risposta dei sistemi operativi secondo le più specifiche esigenze dell’utente. 91 CAPITOLO 7. CONCLUSIONI E SVILUPPI FUTURI 92 Ad esempio, creando più partizione del disco, o introducendo ulteriori applicazioni da poter installare in maniera silenziosa. Inoltre, si potrebbero estendere le installazioni su altri sistemi operativi. In tal senso, si è già proceduto in fase di sviluppo per i sistemi LINUX [23]. In CLEVER, i possibili sviluppi futuri si incentrano sullo standard OVF. Infatti, l’utilizzo dei file OVF è limitato alla creazione del disco. Sono già stati implementati dei metodi che gestiscono l’import e l’export di file OVF di macchine virtuali create mediante hypervisor come VirtualBox, qemu-KVM o VMWare. Uno sviluppo futuro potrebbe far sı̀ che da un file si potrebbe direttamente istanziare una macchina virtuale presupponendo che già il disco con il sistema operativo installato sia stato creato. Bibliografia [1] T. Lindholm and F. Yellin. Java virtual machine specification. Addison-Wesley, Longman Publishing Co., Inc., 1999. 38 [2] F. Bellard. Qemu, a fast and portable dynamic translator. Proceedings of the annual conference on USENIX Annual Technical Conference, (Berkeley, CA, USA), 2005. 38 [3] Bochs. Bochs. http://bochs.sourceforge.net/, 38 [4] A. Kivity, Y. Kamay, D. Laor, U. Lublin, and A. Liguori. Kvm: the linux virtual machine monitor. Proceedings of the Linux Symposium, vol. 1, 2007. 39 [5] R. P. Goldberg. Architectural Principles for Virtual Computer Systems. Harvard University, 1973. 40 [6] VMWare. Understanding Full Virtualization, Paravirtualization and Hardware. http://www.vmware.com/files/pdf/VMware paravirtualization.pdf 42 [7] DMTF Standard. Open Virtualization Format Specification. 2010 53 93 BIBLIOGRAFIA 94 [8] National Institute of Standards and Technology (NIST). http://www.nist.gov/ 18 [9] 7th FLOOR. Cloud Computing: l’ultimo trend di Internet. http://www.7thfloor.it/2007/10/04/cloud-computing-lultimo-trend-di-internet, 18 [10] Filippo Dalla Gassa. Virtualizzazione e Cloud Computing Analisi del tool OpenNebula per la gestione di cloud privati. 2011. 19 [11] I. Foster, C. Kesselman, S. Tuecke. The anatomy of the Grid:Enabling scalable virtual organization. The Intl. Jrnl. of High Performance Computing Applications, 2001. 20 [12] I. Foster. Globus Toolkit Version 4: Software for Service-Oriented Systems. IFIP Int. Conf. on Network and Parallel Computing, Springer-Verlag LNCS 3779, 2006. 20 [13] I. Foster. What is the Grid? A Three Point Checklist. 2002. 21 [14] What is Cloud Computing?. Whatis.com.http://searchsoa.techtarget.com /sDefinition/0,,sid26 gci1287881,00.html, 2008. 22 [15] A. Chervenak, I. Foster, C. Kesselman, C. Salisbury, S. Tuecke. The Data Grid: Towards an Architecture for the Distributed Management and Analysis of Large Scientific Datasets. Jrnl. of Network and Computer Applications, 2001. [16] I. Foster, J. Vöckler, M. Wilde, Y. Zhao. Chimera: A Virtual Data System for Representing, Querying, and Automating Data Derivation. SSDBM, 2002. BIBLIOGRAFIA 95 [17] Filippo Bua. CLEVER: Progettazione di un middleware distribuito per il cloud computing. 2010. 6, 25 [18] Version 4.1.16 2004-2012 Oracle Corporation Programming Guide and Reference. 69 [19] http://libvirt.org/formatdomain.html Libvirt Virtualization API. 70 [20] Gian Uberto Lauri. http://cloud.eng.it/ovf4one/index.html. 2011. 7, 78 [21] Giovanni Valenti. Integrazione di VMware e Virtual Desktop Web-Based in Clever Cloud. 2012. 29 [22] Giancarlo Alteri. Gestione avanzata di risorse di storage in ambito Cloud. 2012. 27 [23] Andrea Cannistrà. Installazione automatica di sistemi linux virtualizzati in ambiente cloud. 2012. 92 [24] https://www.scientificlinux.org/download. 86