Disegno ed implementazione di una soluzione con macchine virtuali
Transcript
Disegno ed implementazione di una soluzione con macchine virtuali
Università degli Studi di Perugia Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea in Informatica Tesi di Laurea Disegno ed implementazione di una soluzione con macchine virtuali (XEN) per garantire servizi Candidato Ivan Grasso Relatore Prof. Leonello Servoli Correlatore Mirko Mariotti Anno Accademico 2005-2006 Indice 1 Alta Disponibilità e Virtualizzazione 1.1 Cos’è l’Alta disponibilità . . . . . . . . . . . . . . 1.1.1 Alta disponibilità tramite backups . . . . . 1.1.2 Alta disponibilità tramite ridondanza fisica 1.1.3 Alta disponibilità tramite virtualizzazione . 1.2 Cos’è la virtualizzazione . . . . . . . . . . . . . . 1.3 Teoria di Popek e Goldberg . . . . . . . . . . . . . 1.3.1 Insiemi di istruzioni . . . . . . . . . . . . 1.3.2 Teoremi . . . . . . . . . . . . . . . . . . . 1.3.3 Effetti della teoria di Popek e Goldberg . . 1.4 Tipi di virtualizzazione . . . . . . . . . . . . . . . 1.4.1 Emulazione . . . . . . . . . . . . . . . . . 1.4.2 Virtualizzazione . . . . . . . . . . . . . . 1.4.3 Virtualizzazione a livello di SO . . . . . . 1.4.4 Paravirtualizzazione . . . . . . . . . . . . 1.5 Xen . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.1 Cos’è Xen . . . . . . . . . . . . . . . . . . 1.5.2 Paravirtualizzazione in Xen . . . . . . . . 1.5.3 Architettura di Xen . . . . . . . . . . . . . 1.5.4 I daemon di Xen . . . . . . . . . . . . . . 1.5.5 Caratteristiche di Xen . . . . . . . . . . . 1.6 Vantaggi della virtualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Il prototipo: analisi delle possibilità e test dei componenti 2.1 Prototipo di architettura . . . . . . . . . . . . . . . . . 2.2 Soluzioni distinte per lo storage . . . . . . . . . . . . 2.2.1 Block device remoti via hardware . . . . . . . 2.2.2 Block device remoti via software . . . . . . . . 2.2.3 Filesystem distribuiti . . . . . . . . . . . . . . 2.3 Test delle componenti . . . . . . . . . . . . . . . . . . 2.3.1 Test di compatibilità . . . . . . . . . . . . . . I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 4 4 5 5 5 6 6 6 6 7 7 7 7 8 9 10 11 11 . . . . . . . 13 13 14 15 15 17 18 18 II INDICE 2.3.2 Test di I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Il prototipo: il sistema di Healthcheck e l’implementazione 3.1 Sistema di Healthcheck . . . . . . . . . . . . . . . . . . 3.2 Analisi delle problematiche . . . . . . . . . . . . . . . . 3.3 Analisi dei software . . . . . . . . . . . . . . . . . . . . 3.3.1 XenEnterprise . . . . . . . . . . . . . . . . . . 3.3.2 OpenQRM . . . . . . . . . . . . . . . . . . . . 3.3.3 Enomalism . . . . . . . . . . . . . . . . . . . . 3.3.4 Virtual Iron . . . . . . . . . . . . . . . . . . . . 3.3.5 Nagios e Cfengine . . . . . . . . . . . . . . . . 3.4 Il prototipo . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Schema Logico . . . . . . . . . . . . . . . . . . 3.4.2 Implementazione Fisica . . . . . . . . . . . . . 4 Prospettive future 4.1 Virtualizzazione Hardware x86 4.1.1 Architettura . . . . . . 4.1.2 Memoria . . . . . . . 4.1.3 Input/Output . . . . . 4.1.4 Sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Installazione e uso di Xen A.1 Installazione di Xen . . . . . . . . . . . . . . . . A.2 Configurazione di Xen . . . . . . . . . . . . . . A.2.1 Configurazione di xend . . . . . . . . . . A.2.2 Configurazione dei macchine virtuali . . A.2.3 pyGRUB . . . . . . . . . . . . . . . . . A.3 Uso di Xen . . . . . . . . . . . . . . . . . . . . A.3.1 Lanciare Xen . . . . . . . . . . . . . . . A.3.2 Il tool xm . . . . . . . . . . . . . . . . . A.4 Creazione di una VM SL4 . . . . . . . . . . . . A.4.1 Installazione di SL4 . . . . . . . . . . . A.4.2 Compilazione del kernel 2.6.16-xen . . . A.4.3 Creazione e prova delle macchine virtuali B Uso di block device via rete B.1 iSCSI . . . . . . . . . . . . . . . B.1.1 Introduzione . . . . . . . B.1.2 Installazione di un target . B.1.3 Installazione di un initiator B.2 GNBD . . . . . . . . . . . . . . . B.2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 . . . . . . . . . . . 33 33 33 34 34 35 36 36 37 39 39 40 . . . . . 43 43 43 43 44 44 . . . . . . . . . . . . 47 47 47 47 48 48 49 49 49 50 50 50 51 . . . . . . 53 53 53 53 54 55 55 INDICE III B.2.2 B.2.3 Installazione di GNBD . . . . . . . . . . . . . . . . . . . . . Esportazione e Importazione . . . . . . . . . . . . . . . . . . C Installazione e uso di Nagios e Cfengine C.1 Nagios . . . . . . . . . . . . . . . . . . . . C.1.1 Installazione di Nagios e plugin . . C.1.2 Configurazione dell’interfaccia web C.1.3 Configurazione di Nagios . . . . . C.2 Cfengine . . . . . . . . . . . . . . . . . . . C.2.1 Installazione di Cfengine . . . . . . C.2.2 Configurazione di Cfengine . . . . C.3 Integrazione fra Nagios e Cfengine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 56 57 57 57 58 59 61 61 61 62 IV INDICE Elenco delle figure 1.1 1.2 1.3 1.4 Confronto del rendimento tra vari metodi di virtualizzazione . . . . . Livelli di privilegi di un sistema operativo senza (sinistra) e con Xen (destra) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Architettura di Xen . . . . . . . . . . . . . . . . . . . . . . . . . . . Ripristino di due servizi virtualizzati . . . . . . . . . . . . . . . . . . 9 10 12 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 2.16 2.17 2.18 2.19 2.20 2.21 2.22 2.23 2.24 2.25 Prototipo di architettura di un sistema ad alta disponibilità tramite Xen. Le topologie FC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Architettura di iSCSI. . . . . . . . . . . . . . . . . . . . . . . . . . Schema di filesystem distribuiti. . . . . . . . . . . . . . . . . . . . . Esempio di risultato di un test con IOzone. . . . . . . . . . . . . . . Test di lettura a 64 bit. . . . . . . . . . . . . . . . . . . . . . . . . . Test di scrittura a 64 bit. . . . . . . . . . . . . . . . . . . . . . . . . Test di lettura a 32 bit. . . . . . . . . . . . . . . . . . . . . . . . . . Test di scrittura a 32 bit. . . . . . . . . . . . . . . . . . . . . . . . . Test di lettura a 64 bit. . . . . . . . . . . . . . . . . . . . . . . . . . Test di scrittura a 64 bit. . . . . . . . . . . . . . . . . . . . . . . . . Test di lettura a 32 bit. . . . . . . . . . . . . . . . . . . . . . . . . . Test di scrittura a 32 bit. . . . . . . . . . . . . . . . . . . . . . . . . Test di lettura a 64 bit. . . . . . . . . . . . . . . . . . . . . . . . . . Test di scrittura a 64 bit. . . . . . . . . . . . . . . . . . . . . . . . . Test di lettura a 32 bit. . . . . . . . . . . . . . . . . . . . . . . . . . Test di scrittura a 32 bit. . . . . . . . . . . . . . . . . . . . . . . . . Confronto 2D risultati scrittura a 32 bit. . . . . . . . . . . . . . . . . Confronto 3D risultati scrittura a 32 bit. . . . . . . . . . . . . . . . . Confronto 2D risultati lettura a 32 bit. . . . . . . . . . . . . . . . . . Confronto 3D risultati lettura a 32 bit. . . . . . . . . . . . . . . . . . Confronto 2D risultati scrittura a 64 bit. . . . . . . . . . . . . . . . . Confronto 3D risultati scrittura a 64 bit. . . . . . . . . . . . . . . . . Confronto 2D risultati lettura a 64 bit. . . . . . . . . . . . . . . . . . Confronto 3D risultati lettura a 64 bit. . . . . . . . . . . . . . . . . . 14 15 16 17 20 21 21 22 22 23 23 24 24 25 25 26 26 27 28 28 29 29 30 30 31 V 8 VI ELENCO DELLE FIGURE 3.1 3.2 3.3 3.4 3.5 Schermata XenEnterprise Schermata OpenQRM . . Schermata Enomalism . Schermata Virtual Iron . Schema del prototipo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 36 37 37 40 A.1 Menu di pyGRUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Introduzione Introduzione generale L’alta disponibilità è diventata al giorno d’oggi una delle caratteristiche fondamentali di qualunque sistema di elaborazione orientato all’erogazione di servizi. Soprattutto in alcuni ambiti specifici non è ammissibile la perdita di dati o l’impossibilità di usufruire di servizi. Non potendo garantire la perfezione, solitamente una soglia del 99% di uptime è considerata, tranne casi particolari, il limite sotto il quale non è permesso scendere se si vuol mantenere un buon funzionamento. Per favorire questa politica, negli ultimi anni, sono state sviluppate notevolmente le tecniche di virtualizzazione dei sistemi operativi, che garantiscono un rendimento di un processo al loro interno, praticamente identico rispetto a quello nel sistema nativo. L’utilizzo di queste tecniche può apportare grandi vantaggi nella progettazione ed implementazione di una soluzione ad Alta disponibilità attraverso l’isolamento del sistema operativo, erogatore del servizio, dalla rispettiva macchina fisica. Struttura della tesi La tesi è strutturata in 4 capitoli suddivisi in: Capitolo 1 in questo capitolo vengono descritte sia l’alta disponibilità, che la virtualizzazione, il loro funzionamento e le distinte soluzioni disponibili per implementarle. Capitolo 2 in questo capitolo viene proposto il prototipo concettuale per realizzare l’alta disponibilità mediante l’uso della virtualizzazione; inoltre vengono presentati i test fatti sulle differenti soluzioni disponibili. Capitolo 3 in questo capitolo viene definita ed implementata una prima versione del prototipo proposto nel capitolo precedente e tratte alcune cloncusioni. Capitolo 4 in questo capitolo vengono descritte le possibilità che il futuro offre nell’ambito della virtualizzazione. 1 2 ELENCO DELLE FIGURE Appendice A appendice nella quale viene descritta l’installazione e l’uso di Xen 3.0.2 e la creazione di distinte immagini minimali funzionanti di Scientific Linux. Appendice B appendice nella quale si spiega come installare e configurare i distinti dispositivi di storage utilizati nei test. Appendice C appendice nella quale si spiega come installare e configurare i programmi Nagios e Cfengine utilizzati nel prototipo. Capitolo 1 Alta Disponibilità e Virtualizzazione 1.1 Cos’è l’Alta disponibilità Alta disponibilità è il termine usato per descrivere i sistemi di computer che sono stati configurati in modo da ridurre al minimo la percentuale di tempo in cui saranno inattivi o non disponibili e, di conseguenza, consentirne il più alto grado di utilizzo. L’alta disponibilità del sistema si ottiene riducendo la probabilità che un guasto hardware o un difetto software abbiano come conseguenza la perdita dell’uso del sistema o una perdita dei suoi dati. 1.1.1 Alta disponibilità tramite backups Una possibile soluzione, ma anche la più semplice, è quella di gestire un sistema di storage in cui memorizzare i backup delle macchine, in maniera da essere pronti al successivo ripristino in caso di guasti. Questa soluzione non è affatto ottimale in quanto richiede personale disponibile ad ogni ora per la riattivazione di servizi e potrebbe portare ad un tempo di ripristino troppo lungo, non più accettabile, se il problema fosse della macchina che ospita i servizi stessi. Inoltre in questo tipo di soluzione bisogna trovare un compromesso fra la frequenza di backup (maggiore è il numero di backup, minore è il rendimento) e le performance dei sistemi che si vogliono rendere affidabili (minore numero di backup, minore affidabilità). 1.1.2 Alta disponibilità tramite ridondanza fisica Una seconda soluzione è quella di avere macchine fisiche in ridondanza, mantenendo un mirror (copia) della macchina che offre il servizio. Tramite questa soluzione si 3 4 CAPITOLO 1. ALTA DISPONIBILITÀ E VIRTUALIZZAZIONE riesce in caso di guasto ad utilizzare la copia della macchina rendendo il tempo di ripresa del servizio più basso. Lo svantaggio di questa scelta stà nella difficile gestione delle copie in caso di grandi strutture dotate di tante macchine, oltre che ad un elevato costo di manutenzione hardware e software. 1.1.3 Alta disponibilità tramite virtualizzazione Una terza soluzione al problema è quella che si propone in questa tesi, ossia l’uso di Virtual Machine multiple per il disaccoppiamento dei servizi dalla macchina. In questo modo, utilizzando una struttura di macchine virtuali ed un sistema automatico di monitoraggio, si otterrebbero molteplici vantaggi rispetto alle altre soluzioni proposte: • Ridurre il downtime a pochi secondi. – Avviare una nuova macchina virtuale in un’altra macchina fisica è un’operazione quasi istantanea. – Se si riscontrano problemi in una macchina fisica si può migrare la virtuale prima che la macchina fallisca, con un downtime pari a zero. • Permettere facilmente lo sviluppo ed il test di nuove versioni, isolandone l’esecuzione. • Rendere indipendenti dall’hardware sottostante i servizi e l’installazione, definendo una macchina virtuale e distribuendola sulle varie macchine fisiche. 1.2 Cos’è la virtualizzazione In informatica la virtualizzazione consiste nella creazione di una versione virtuale di una risorsa normalmente fornita fisicamente e appartenente a un sistema. Tra gli impieghi della virtualizzazione il più utilizzato è probabilmente la virtualizzazione di sistemi operativi ottenuta attraverso software specifici che riescono a creare ambienti distinti in un’unica macchina fisica, in maniera da permettere l’esecuzione di un sistema operativo in ognuno di questi ambienti. Emulazione Bochs Qemu VirtualPC DOSEMU ... Virtualizzazione VMware Plex86 Microsoft Virtual PC Microsoft Virtual Server ... Virtualizzazione a livello di SO OpenVZ Linux-VServer FreeVPS SWsoft Virtuozzo ... Paravirtualizazzione Virtual Iron User-mode Linux L4 Xen Tabella 1.1: Tipi di virtualizzazione. Il componente fondamentale di un sistema basato su macchine virtuali è il Virtual Machine Monitor, conosciuto anche con il nome di hypervisor. Il suo compito è ... 1.3. TEORIA DI POPEK E GOLDBERG 5 quello di allocare le risorse dinamicamente quando necessarie e isolare l’architetture interrompendo eventuali attività pericolose per il sistema. 1.3 Teoria di Popek e Goldberg Questa teoria stabilisce i requisiti minimi che deve avere un’architettura per essere efficientemente virtualizzata. Fu introdotta da Popek e Goldberg nel 1974 nell’articolo “Formal Requirements for Virtualizable Third Generation Architectures“ 1 [1]. Un sistema di virtualizzazione deve: • Essere equivalente, ossia un programma in esecuzione su di una macchina virtuale deve presentare lo stesso comportamento di quando è in esecuzione su di una macchina fisica. • Controllare tutte le risorse del sistema. • Essere efficiente. 1.3.1 Insiemi di istruzioni Per individuare i requisiti di virtualizzazione è stata introdotta una classificazione delle istruzioni in tre diversi gruppi: Privileged sono quelle che possono interrompere l’esecuzione del processore se è in modalità utente (user-space) e non se è in modalità sistema (kernel-space). Control sensitive sono quelle che tentano di cambiare la configurazione delle risorse nel sistema. Behavior sensitive sono quelle il cui comportamento, oppure il cui risultato, dipende dalla configurazione delle risorse del sistema. 1.3.2 Teoremi Il risultato finale dell’analisi può essere espresso attraverso due teoremi. Primo teorema Per qualsiasi calcolatore di terza generazione, un Virtual Machine Monitor potrà essere sempre costruito se qualsiasi insieme di istruzioni sensitive è un sotto-insieme delle istruzioni privileged. 1 Requisiti formali per architetture di terza generazione virtualizzabili. 6 CAPITOLO 1. ALTA DISPONIBILITÀ E VIRTUALIZZAZIONE Secondo teorema Un sistema di terza generazione sarà ricorsivamente virtualizzabile se 1. È virtualizzabile 2. Si può costruire su di lui un Virtual Machine Monitor senza dipendenze temporali. 1.3.3 Effetti della teoria di Popek e Goldberg In accordo ai due teoremi si hanno architetture come la System/370 che sono virtualizzabili perchè hanno tutte istruzioni privilegiate ed altre, come la nota x86, che non soddisfano i requisiti (ha 17 istruzioni sensitive, non privilegiate). 1.4 Tipi di virtualizzazione 1.4.1 Emulazione In questo modello, il software di virtualizzazione simula interamente l’hardware, permettendo l’esecuzione di un qualsiasi programma, compreso un sistema operativo. Questo permette per esempio all’interno di una particolare architettura, di far eseguire programmi compilati per un’altra. Un emulatore è tipicamente diviso in diversi moduli: • Emulatore di CPU. • Modulo per il sistema di memoria. • Modulo per i dispositivi di I/O. 1.4.2 Virtualizzazione Quando si parla di virtualizzazione bisogna fare una distinzione se essa riguarda il software o l’hardware. Virtualizzazione software (x86) Nella virtualizzazione software si simula una parte dell’hardware ed è dunque possibile eseguire un sistema operativo senza modifiche a patto che esso abbia la stessa architettura del sistema ospite. L’implementazione della virtualizzazione software per x86, come abbiamo già visto, non è ottima perchè questa architettura non soddisfa i requisiti della Teoria di Popek e Goldberg per virtualizzazione (1.3), è quindi avrà un rendimento abbastanza penalizzato. 1.5. XEN 7 Virtualizzazione hardware Al giorno d’oggi i due principali produttori di chip, Intel e AMD, hanno proposto le proprie tecnologie di virtualizzazione hardware, rispettivamente VT e Pacifica, che diminuiscono, in termini di efficienza, il costo della virtualizzazione dell’architettura x86. 1.4.3 Virtualizzazione a livello di SO Attraverso questo tipo di virtualizzazione si suddivide un unico server fisico in più parti, ognuna visibile dall’esterno come un server a se stante. Questo tipo virtualizzazione ha un basso overhead che massimizza l’uso delle risorse del server ma ha anche il difetto che, a differenza dell’emulazione e della paravirtualizzazione (vedi par. 1.4.4), su di essa non possono essere eseguiti differenti sistemi operativi. Quindi è compito dell’unico kernel gestire e mantenere isolate le risorse evitando un Denial of Service. 1.4.4 Paravirtualizzazione Questo modello si differenzia da quello di virtualizzazione per il differente approccio utilizzato. In questo caso il software di paravirtualizzazione agisce direttamente sull’hardware in modo da gestire la condivisione delle risorse destinate alle varie virtual machine. A questo punto però il sistema operativo ospite dovrà essere modificato per interagire con l’hypervisor. Questa implementazione ha due caratteristiche fondamentali ed interessanti rispetto alle altre soluzioni: • L’hypervisor diventa molto più semplice. • Le macchine virtuali che girano su questo sistema hanno un rendimento maggiore. In questo gruppo ci sono varie soluzioni, e di seguito analizzeremo Xen che risulta essere la più interessante per questo lavoro di tesi. 1.5 Xen In questa sezione si effettuerà una panoramica sulle caratteristiche e l’architettura di xen tralasciandone l’utilizzo, dettagliatamente analizzato nell’Appendice A. 1.5.1 Cos’è Xen Xen [3] è un “open-source para-virtualizing virtual machine monitor (hypervisor)“per l’architettura x86 in grado di asssicurare su di una singola macchina fisica l’esecuzione di molteplici macchine virtuali, mantenendo una performance molto vicina a quella 8 CAPITOLO 1. ALTA DISPONIBILITÀ E VIRTUALIZZAZIONE nativa. Xen è nato all’inizio come un progetto di ricerca dell’Università di Cambridge e la sua prima versione venne pubblicata nel 2003. Al giorno d’oggi esistono due versioni con notevoli differenze e incompatibilità tra loro: Xen 2.0 e Xen 3.0. La versione 2.0 non sarà più sviluppata e quindi la versione su cui si sta lavorando e alla quale si farà riferimento è la 3.0. Native Linux (L), Xen/Linux (X), VMware Workstation 3.2 (V), User Mode Linux (U). Figura 1.1: Confronto del rendimento tra vari metodi di virtualizzazione 1.5.2 Paravirtualizzazione in Xen La tecnica che Xen utilizza è chiamata paravirtualizzazione (1.4.4) ed è la più efficiente e sicura tra le tecniche di virtualizzazione. Con essa Xen riesce a mantenere l’overhead al di sotto del 5% rispetto alle altre tecniche che di norma lo portano sopra il 30% (vedi Figura 1.1 a pagina 8). Per far ciò Xen introduce modifiche sia nelle macchine host che nelle macchine guest. La macchina in cui verrà fatta la virtualizzazione (cioè, la macchina host) non sarà più una macchina x86, ma diventerà una macchina con architettura Xen-x86 e i sistemi operativi che si vorranno virtualizzare dovranno adattarsi a questa architettura. È per questo che non tutti i sistemi operativi sono supportati per la virtualizzazione tramite Xen o possono eseguirlo come hypervisor. La Tabella 1.2 a pagina 9 mostra i sistemi operativi compatibili con Xen 3.0 in questo momento. In questa tesi, si parlerà di Xen utilizzando sempre come host un kernel Linux della serie 2.6. 1.5. XEN 9 Sistema operativo Linux 2.6 NetBSD 3.0 FreeBSD 5.3 Plan9 ReactOS S.O. senza modifiche Host Si No No No No No Guest Si In alto grado di sviluppo In alto grado di sviluppo In sviluppo Proggettato. Supporto iniziale tramite Intel VT Tabella 1.2: Compatibilità tra Xen 3.0 e distinti sistemi operativi 1.5.3 Architettura di Xen L’architettura x86 ha un modello di protezione basato su quattro livelli di privilegi (vedi Figura 1.2 a pagina 9). Questi livelli 2 sono numerati da 0 a 3 dove lo 0 rappresenta il livello con più privilegi. ring-3 ring-3 ring-1 ring-1 ring-1 ring-1 ring-0 ring-0 SO XEN dom-0 dom-U aplicazioni utente Sistema operativo senza Xen aplicazioni utente Xen Figura 1.2: Livelli di privilegi di un sistema operativo senza (sinistra) e con Xen (destra) Un sistema operativo non virtualizzato avrà la seguente struttura: ring-0 Livello dove si esegue il kernel del sistema operativo. Questo livello è l’unico dove si possono invocare istruzioni di tipo privilegiato. ring-1, ring-2 Livelli di solito non utilizzati. ring-3 Livello dove si eseguono le applicazioni utente. Un sistema operativo modificato per eseguire Xen come hypervisor avrà invece la seguente struttura: ring-0 Livello dove si esegue l’hypervisor. ring-1 Livello dove si eseguono i sistemi operativi ospite. 2 chiamati col termine inglese: ring 10 CAPITOLO 1. ALTA DISPONIBILITÀ E VIRTUALIZZAZIONE ring-2 Livello di solito non usato. ring-3 Livello dove si eseguono le applicazioni utente. Una volta installato Xen in una macchina fisica, in automatico viene caricata e avviata nel ring-0 una prima macchina virtuale, in maniera totalmente trasparente all’utente (vedi Figura 1.3 a pagina 10). Questa, denominata VM0 oppure dom0, rappresenta il sistema operativo su cui si è fatta l’installazione di Xen ed ha privilegi speciali per l’accesso all’hardware e per la gestione di tutte le altre macchine virtuali (denominate domU), contrariamente a tutte le altre macchine virtuali che possono accedere all’hardware solo attraverso il dom-0. Figura 1.3: Architettura di Xen 1.5.4 I daemon di Xen 1.5.4.1 Xen daemon: xend Per controllare, creare ed effettuare azioni nei distinti dom-U è indispensabile l’esecuzione di un particolare programma python, denominato xend, all’interno del dom-0. Questo processo ha il compito di eseguire le richieste (creazione, distruzione, migrazione..) che vengono effettuate tramite il comando xm (Si parlerà del funzionamento nell’ Appendice A). 1.5.4.2 Xen Store Daemon: xenstored Questo daemon è un server in esecuzione nel dom-0 che ha il compito di memorizzare le informazioni delle varie macchine virtuali, sotto forma di albero, all’interno di un database condiviso tra i differenti dom-U. Attraverso questo Xen riuscirà a controllare le varie macchine virtuali in esecuzione. 1.6. VANTAGGI DELLA VIRTUALIZZAZIONE 11 1.5.5 Caratteristiche di Xen • Virtualizzazione con una penalizzazione nel rendimento molto bassa. • Possibilità di mettere in pausa la esecuzione delle Virtual Machine. • Migrazione delle Virtual Machine senza interruzioni –live migration–. • Riallocazione di memoria in esecuzione. • Controllo delle Virtual Machine via interfaccia web. • Software libero (licenza GPL). 1.6 Vantaggi della virtualizzazione La virtualizzazione tramite Xen, permette di: • Eseguire distinti sistemi operativi contemporaneamente in una singola macchina. • Separare i servizi dall’hardware (per quelli che non dipendono da un HW determinato) e dal sistema operativo installato sull’hardware. • Isolare le macchine su cui sono in esecuzione i servizi, in modo che, per esempio, ogni utente disponga di una macchina completa per il suo uso (maggiore sicurezza di fronte a intrusioni). • Possibilità di clonare le macchine per fare test e aggiornamenti, senza compromettere la integrità della macchina originale, con la possibilità di tornare indietro in maniera controllata. • Possibilità di scalabilità, entro certi limiti. • Mettere in pausa le macchine con la possibilità di migrare una macchina virtuale a un’altra macchina fisica e riprendere l’esecuzione nel punto di arresto. Questo permette: – Load-balancing: si possono migrare macchine virtuali da un host con un alto carico ad un host senza carico senza fermare le macchine (live-migration). – Alta disponibilità: se una macchina fallisce si possono migrare le macchine virtuali (prima che falliscano) o recuperare uno snapshot e farlo eseguire su un’altra macchina host. 12 CAPITOLO 1. ALTA DISPONIBILITÀ E VIRTUALIZZAZIONE Fallimento di una macchina fisica. Macchina fisica 1 Servizio 2 Servizio 1 Macchina fisica 2 Internet Servizio 4 Servizio 3 Macchina fisica 3 Servizio 6 Servizio 5 Migrazione delle macchine virtuali. Macchina fisica 1 Servizio 1 Servizio 2 Macchina fisica 2 Servizio 3 Internet Servizio 4 Macchina fisica 3 Servizio 5 Servizio 6 Ritorno allo stato di normalità. Macchina fisica 1 Servizio 1 Servizio 2 Servizio 3 Servizio 4 Servizio 6 Macchina fisica 2 Internet Servizio 5 Macchina fisica 3 Figura 1.4: Ripristino di due servizi virtualizzati Capitolo 2 Il prototipo: analisi delle possibilità e test dei componenti In questo capitolo verrà proposto un modello prototipale di architettura di un sistema ad alta disponibilità ed in seguito la serie di test effettuati per la determinazione della migliore soluzione. 2.1 Prototipo di architettura La struttura proposta è quella mostrata nella Figura 2.1 a pagina 14. Gli elementi presenti e le loro funzioni sono: Macchine fisiche In questo modello le macchine fisiche presenti hanno soltanto la funzione di ospitare una o più macchine virtuali, eseguendo Xen. Per questo nelle macchine si può utilizzare qualsiasi sistema GNU/Linux compatibile con i requisiti di quest’ultimo. Macchine virtuali Tutti i servizi che devono essere altamente disponibili devono essere virtualizzati. Storage I filesystem su cui si eseguono le macchine virtuali. Le immagini delle macchine vengono caricate da un server, tramite rete. Servizio di healtcheck Questo servizio deve essere eseguito sia sulla macchina fisica, sia su quella virtuale, poiché è incaricato di gestire e verificare il funzionamento del sistema. Nella Sezione 3.1 si parlerà più in dettaglio di questo sistema. In questo schema le macchine virtuali, quelle che realmente eseguono i servizi, sono indipendenti dall’hardware sottostante ottenendo il vantaggio di poter essere eseguite in uno qualsiasi dei nodi fisici. Per far ciò si deve utilizzare un server di storage per 13 14CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI Figura 2.1: Prototipo di architettura di un sistema ad alta disponibilità tramite Xen. caricare le immagini tramite rete ed esser cosı̀ in grado di spostare una maccchina host automaticamente. 2.2 Soluzioni distinte per lo storage Uno degli elementi fondamentali di questo prototipo è il sistema utilizzato per memorizzare e distribuire le immagini delle macchine virtuali, per questo, è necessario uno studio delle distinte tecnologie e soluzioni esistenti sul mercato per rendere possibile la distribuzione di un filesystem via rete. In generale possiamo suddividere le soluzioni nelle seguenti categorie: • Block device remoti via hardware • Block device remoti via software • Filesystem distribuiti 2.2. SOLUZIONI DISTINTE PER LO STORAGE 15 2.2.1 Block device remoti via hardware Queste soluzioni si basano sulla esportazione di diversi block device da vari dispositivi collegati via rete. In particolare, sono quelli basati su un hardware dedicato, di solito costoso, e specificamente disegnato per fare questa funzione. La tecnologia più conosciuta è Fibre Channel[6]. 2.2.1.1 Fibre Channel Fibre Channel è una tecnologia ad alta velocità, utilizzata principalmente per lo storage in rete. Fibre Channel diventa importante e fondamentale nell’ambito dei grandi supercomputer e in ambito aziendale. Ci sono diverse topologie (Figura 2.2 a pagina 15): Figura 2.2: Le topologie FC. Switched Fabric Tutti i device sono collegati ai Fibre Channel switches (molto simile all’implementazione delle moderne Ethernet). Point-to-point Due dispositivi sono collegati direttamente (soluzione semplice e limitata). Arbitrated Loop Tutti i device sono collegati ad anello rendendo questa soluzione la più sensibile ai problemi. A dispetto del suo nome, Fibre Channel può essere implementato sia con cavi di fibra ottica, che con twisted-pair. 2.2.2 Block device remoti via software Queste soluzioni sono simili ai block device remoti via hardware ma a differenza dei primi non viene utilizzato un hardware specifico ma bensı̀ un software speciale. Queste soluzioni sono una buona alternativa in quanto il prezzo della implementazione non è cosi elevato e le prestazioni sono abbastanza buone. Le due soluzioni principali sono GNBD e iSCSI. 16CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI 2.2.2.1 iSCSI L’iSCSI 1 è un protocollo definito nel Request For Comments (RFC) 3720 [10] dall’Internet Engineering Task Force 2 per utilizzare il protocollo Small Systems Computer Interface (SCSI), usando come mezzo trasmissivo una rete TCP/IP. Vista la vasta diffusione delle reti TCP/IP e il continuo sviluppo della tecnologia Gigabit Ethernet 3 le SAN[4] 4 basate su iSCSI sono divenute una soluzione economica, ma non per questo poco efficiente. iSCSI è basata su un’architettura (Figura 2.3 a pagina 16) client-server (quella di SCSI), dove il client è chiamato ”initiator” ed il server è chiamato ”target”. In un sistema iSCSI, un initiator fa richiesta di un servizio a un target utilizzando uno dei protocolli di trasporto definiti per lo standard SCSI. Figura 2.3: Architettura di iSCSI. Attualmente esistono varie implementazioni di iSCSI per i sistemi GNU/Linux: Initiator La implementazione più stabile e la più matura è quella chiamata coreISCSI http://www.kernel.org/pub/linux/utils/storage/ iscsi/. Target La implementazione su cui si sta lavorando di più è The iSCSI Enterprise Target http://iscsitarget.sourceforge.net/. 1 Internet Small Computer Systems Interface 2 http://www.ietf.org/ 3 Tecnologia 4 Storage per implementare reti Ethernet a una velocità nominale di 1 Gigabit per secondo. Area Network, soluzione di storage in reti usando protocolli di basso livello (SCSI, ATA, ecc) 2.2. SOLUZIONI DISTINTE PER LO STORAGE 17 L’installazione e configurazione di iSCSI viene descritta nell’Appendice B. 2.2.2.2 GNBD GNBD [7] consente l’accesso a distinti block device (sia locali che in una SAN) attraverso una rete che di solito è Ethernet; è una tecnologia sviluppata da Red Hat per essere utilizzata originalmente con il Red Hat Global File System. L’unica distribuzione esistente è quella della Red Hat, che è parte di una suite conosciuta con il nome di Cluster ftp://sources.redhat.com/pub/cluster/ releases. 2.2.3 Filesystem distribuiti I filesystem distribuiti più utilizzati e conosciuti sono due: GFS sviluppato dalla Red Hat. GPFS General Parallel File System, sviluppato dalla IBM. Essi permettono di accedere ad uno stesso filesystem da un numero indeterminato di calcolatori. Inoltre attraverso essi si può ottenere: • Una alta scalabilità e flessibilità. • Un aggiornamento unico del software per tutte le macchine. • Un’ottima gestione di grandi volumi di dati (vengono usati come un’unica partizione). • Un minor uso di copie ridondate di dati. Figura 2.4: Schema di filesystem distribuiti. 18CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI 2.3 Test delle componenti 2.3.1 Test di compatibilità Per poter implementare il prototipo è stato necessario effettuare una nutrita serie di test, raggruppabili in: • Test di compatibilità delle componenti software • Test di prestazioni delle diverse soluzioni di I/O Test di sistemi host I test effettuati si sono basati sull’installazione e prova di Xen 3.0.2 (in una prima installazione è stato usato Xen 3.0.1) su varie distribuzioni GNU/Linux come sistema host, sempre utilizzando il kernel Linux 2.6.16-xen (nella installazione di Xen 3.0.1 si è era usato il kernel Linux 2.6.12.6-xen): • Slackware Linux 10.2. • Gentoo Linux 2006.0. • Scientific Linux. • Ubuntu Drapper. • Fedora 5. Durante le installazioni non si sono riscontrati particolari problemi, nè errori (l’importante è stato leggere con attenzione i requisiti d’installazione richiesti da Xen e conformarsi alle richieste). Test di sistemi guest I test di compatibilità effettuati per il sistema guest si sono svolti con la distribuzione Scientific Linux (nelle versioni 3 e 4), utilizzando sempre il kernel modificato da Xen (Linux 2.6.16-xen per la versione di Xen 3.0.2 e Linux 2.6.12.6-Xen per la versione 3.0.1). Durante i test si è verificata l’indipendenza delle macchine virtuali dall’hardware sottostante. Si sono eseguite le varie macchine su hardware diverso senza nessun tipo di problema, con la sola accortezza di ricordarsi dell’incompatibilità fra l’architettura a 32 bit e quella a 64. Test di dispositivi storage Sono stati anche eseguiti test per verificare la compatibilità tra i driver delle distinte soluzioni di storage disponibili e il kernel linux modificato da Xen, senza riscontrare problemi. 2.3. TEST DELLE COMPONENTI 19 2.3.2 Test di I/O Sono stati realizzati diversi test per verificare le prestazioni delle soluzioni mostrate nella Sezione 2.2, sia in macchine a 32 bit che a 64 per scoprire la migliore soluzione da implementare in seguito nel prototipo. 2.3.2.1 IOzone IOzone 5 è uno strumento ampiamente utilizzato per fare prove comparative di rendimento nell’accesso ai dischi (sia tra differenti filesystem che tra differenti dispositivi). Si è utilizzato questo tool per effettuare i test, sottoponendo le macchine ad un alto carico di lavoro. Durante le prove è stato possibile verificare la stabilità delle varie soluzioni di storage e di quelle di Xen, garantendo assenza di problemi anche in caso di live-migration sotto alto tasso di I/O. 2.3.2.2 Caratteristiche delle macchine utilizzate nei test Le macchine fisiche utilizzate (in totale sono state due) per eseguire i test avevano le caratteristiche mostrate nella Tabella 2.1 a pagina 19, mentre le macchine virtuali caricate (2 per ogni macchina fisica) avevano una memoria RAM di 512 MB ed eseguivano una Scientific Linux 4.2 con un Kernel 2.6.16-xen. Processore Memoria Disco Conessione Rete Sistema Operativo Dual AMD Opteron 2GHz 1GB 40GB Gigabit Ethernet / Fibra ottica Gentoo Linux - Kernel 2.6.16-xen Tabella 2.1: Caratteristiche macchine fisiche. Per gli altri test, si è utilizzato il fileserver descritto nella Tabella 2.2 a pagina 19. Processore Memoria Disco Conessione Rete Sistema Operativo Dual Pentium III 1GHz 256MB 210GB - RAID 5 Gigabit Ethernet Slackware Linux 10.2 - Kernel 2.6.15.6 Tabella 2.2: Caratteristiche fileserver. In alcuni test si è utilizzato anche un disco Fibre Channel con le caratteristiche della Tabella 2.3 a pagina 19. Spazio disco Conessione Rete 4797776,28MB Fibra Ottica Tabella 2.3: Caratteristiche disco FC. 5 URL: http://www.iozone.org/ 20CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI 2.3.2.3 Interpretazione dei risultati Prima di introdurre i test di I/O, si spiegherà come analizzare le immagini. La Figura 2.5 a pagina 20 rappresenta un esempio di un test effettuato con IOzone. Con l’asse delle ascisse viene rappresentata la dimensione del file a cui IOzone ha accesso, mentre con l’asse delle ordinate si rappresenta la velocità di accesso. Analizzando l’immagine si nota che ci sono tre differenti zone: Figura 2.5: Esempio di risultato di un test con IOzone. • Zona alta: queste misure rappresentano il risultato dell’accesso al disco, quando il file è molto piccolo ed esiste l’influenza della cache della CPU. • Zona media: Queste misure rappresentano il risultato quando si ha l’influenza della cache del buffer. • Zona bassa: Queste misure rappresentano i risultati reali di accesso al disco in totale assenza di effetti di cache. 2.3.2.4 Risultati Fibre Channel Nel test si è utilizzato un disco Fibre Channel con le caratteristiche della Tabella 2.3 a pagina 19, collegato alle due macchine fisiche prima descritte (tramite una connessione in fibra ottica a 2Gb/s). I risultati ottenuti si possono osservare dalle Figure 2.6-2.9. Analizzando le immagini si nota un piccolo miglioramento nel rendimento (più visibile nella Figura 2.6 a pagina 21) per file di dimensioni sotto 1KB nell’uso di Fibre Channel con un sistema operativo a 64 bit, mentre nei restanti test il rendimento è circa lo stesso per tutte e due le architetture. 2.3. TEST DELLE COMPONENTI Figura 2.6: Test di lettura a 64 bit. Figura 2.7: Test di scrittura a 64 bit. 21 22CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI Figura 2.8: Test di lettura a 32 bit. Figura 2.9: Test di scrittura a 32 bit. GNBD In questi test è stato utilizzato il fileserver descritto nella tabella 2.2 e le due macchine descritte nella tabella 2.1. I risultati ottenuti si possono osservare dalle Figure 2.102.13. Analizzando le immagini si può osservare un comportamento anomalo derivato 2.3. TEST DELLE COMPONENTI 23 probabilmente dall’esistenza di carico nella rete. Per esempio nella Figura 2.12 a pagina 24 si può identificare nella zona alta e bassa una differenza di velocità molto sostenuta che non dovrebbe sussistere. Inoltre, come nella soluzione Fibre Channel, si può osservare un incremento del rendimento per file di piccole dimensioni nell’architettura a 64 bit. Figura 2.10: Test di lettura a 64 bit. Figura 2.11: Test di scrittura a 64 bit. 24CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI Figura 2.12: Test di lettura a 32 bit. Figura 2.13: Test di scrittura a 32 bit. iSCSI Per effettuare questi test si è utilizzato lo stesso fileserver dei test con GNBD, già mostrato precedentemente, utilizzando come initiator l’implementazione chiamata coreiSCSI [12] e come target nelle macchine fisiche The iSCSI Enterprise Target [14]. I risultati ottenuti si possono osservare dalle Figure 2.14-2.17. 2.3. TEST DELLE COMPONENTI 25 Analizzando le immagini si può osservare lo stesso comportamento riscontrato nei test effettuati con GNBD, probabilmente dovuto alla connessione di rete. Inoltre si continua ad osservare l’aumento del rendimento nella architettura a 64 bit per file di piccole dimensioni. Figura 2.14: Test di lettura a 64 bit. Figura 2.15: Test di scrittura a 64 bit. 26CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI Figura 2.16: Test di lettura a 32 bit. Figura 2.17: Test di scrittura a 32 bit. 2.3.2.5 Confronto dei risultati Nei confronti di seguito riportati è stata utilizzata solamente la porzione di dati di maggior interesse per il rendimento del sistema di storage, nel nostro caso, ossia si analizzano i tempi di lettura/scrittura solamente per file di dimensioni maggiori di 512 MB e minori di 2 GB. Nelle Figure 2.20, 2.18, 2.22 e 2.24 si è riportato il confronto tra i ri- 2.3. TEST DELLE COMPONENTI 27 sultati delle varie soluzioni per le diverse modalità di test di IOzone. Nelle figure 2.19, 2.21, 2.23 e 2.25 invece è riportato il grafico 3D delle stesse quantità con l’aggiunta di una terza dimensione rappresentata dal record. Come si evince dalle figure, il rendimento del dispositivo Fibre Channel è superiore alle soluzioni software proposte, in quanto: • Il tipo di conessione utilizzata tra le macchine e il disco è di 2Gb/s. • Il disco Fibre Channel è un dispositivo hardware specifico per essere utilizzato come SAN. Nonostante questi validi motivi il costo del dispositivo è abbastanza elevato (circa 1000 euro per una scheda di interfaccia) ed implementare una soluzione basata su iSCSI o GNBD è poco penalizzante in termini di prestazioni e molto vantaggiosa dal lato economico. Quindi nell’implementazione finale del prototipo si è scelto iSCSI che ha dimostrato scalabilità, stabilità ed un rendimento sebbene non in maniera elevatissima migliore di GNBD. Figura 2.18: Confronto 2D risultati scrittura a 32 bit. 28CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI Figura 2.19: Confronto 3D risultati scrittura a 32 bit. Figura 2.20: Confronto 2D risultati lettura a 32 bit. 2.3. TEST DELLE COMPONENTI Figura 2.21: Confronto 3D risultati lettura a 32 bit. Figura 2.22: Confronto 2D risultati scrittura a 64 bit. 29 30CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI Figura 2.23: Confronto 3D risultati scrittura a 64 bit. Figura 2.24: Confronto 2D risultati lettura a 64 bit. 2.3. TEST DELLE COMPONENTI Figura 2.25: Confronto 3D risultati lettura a 64 bit. 31 32CAPITOLO 2. IL PROTOTIPO: ANALISI DELLE POSSIBILITÀ E TEST DEI COMPONENTI Capitolo 3 Il prototipo: il sistema di Healthcheck e l’implementazione 3.1 Sistema di Healthcheck Con il termine Healtcheck si identifica un tipo di servizio svolto da un programma che si occupa di analizzare lo stato di funzionamento delle macchine monitorate e agire di conseguenza. Sostanzialmente l’healtcheck può essere visto come un supervisore che all’insorgere di problemi, li ripristina senza l’intervento umano. Nel nostro caso specifico, esso si occuperà sia della riattivazione dei servizi, che della gestione di tutta l’architettura virtuale. 3.2 Analisi delle problematiche La realizzazione di una struttura completamente virtuale apporta notevoli vantaggi, sia nella gestione delle macchine, che nella flessibilità dell’infrastruttura stessa. Tali vantaggi sono sostanzialmente dovuti alla possibilità di gestire virtualmente le macchine, attraverso migrazioni live, riavii e pause e alla possibilità in caso di necessità, di un facile incremento o una riduzione del numero delle macchine. Tutto ciò però, non elimina la problematica dell’intervento umano nel caso insorgano problemi ai servizi o alle stesse macchine virtuali. Al giorno d’oggi, esistono soluzioni di monitoring in grado di controllare macchine ed inviare segnalazioni in caso di problemi, ma la soluzione che si vuole ottenere deve riuscire a gestire indipendentemente dall’intervento umano, non solo la riattivazione di 33 34CAPITOLO 3. IL PROTOTIPO: IL SISTEMA DI HEALTHCHECK E L’IMPLEMENTAZIONE servizi, ma anche la gestione delle macchine virtuali, obbligando tale intervento solo in casi limite. Inizialmente, dopo aver analizzato approfonditamente il problema, si è deciso di scrivere un software per gestire l’intera infrastruttura. Il software è stato scritto in linguaggio C ed è stato composto di due parti: una parte master, da installare nella macchina che effettua il monitoring, ed una parte slave, da installare nelle macchine da monitorare. Semplicemente il software creato si è basato sull’interazione fra master e slave che attraverso messaggi di tipo UDP si comunicano informazioni riguardanti lo stato delle macchine ed eseguono script. Lo sviluppo di tale programma ci ha aiutato a capire maggiormente le problematiche nella realizzazione di un software di tale genere. I maggiori problemi realizzativi si sono riscontrati nella creazione delle dipendenze fra macchine virtuali e fisiche, nella creazione di script per il controllo di servizi ed infine nella gestione della migrazione delle macchine. Dopo aver intuito le difficoltà, si è pensato di esplorare nuove possibilità, alla ricerca di una soluzione più adeguata alle esigenze, concentrandosi maggiormente su software che implementino gestione di virtualizzazione o monitoring. 3.3 Analisi dei software Come già affermato precedentemente, la ricerca di possibili soluzioni ha portato ad una serie di software, ognuno con delle caratteristiche specifiche, e di seguito ne analizzeremo i pro ed i contro in riferimento alla nostra idea realizzativa. I software sono i seguenti: • XenEnterprise • OpenQRM • Enomalism • Virtual Iron • Nagios e Cfengine e di seguito ne analizzeremo le caratteristiche. 3.3.1 XenEnterprise XenEnterprise è un package integrato a pagamento, sviluppato dagli stessi autori di Xen, che include una serie di tool in grado di semplificare la gestione e la pubblicazione di macchine virtuali. XenEnterprise è in grado di permettere la gestione (creazione, pausa, migrazione, etc..) delle macchine virtuali attraverso una semplice interfaccia grafica molto esplicativa. Ovviamente esso semplifica notevolmente il compito di chi deve occuparsi di 3.3. ANALISI DEI SOFTWARE 35 grandi infrastrutture e non vuole utilizzare in maniera costante la linea di comando, implementando inoltre all’interno un supporto per driver di innumerevoli periferiche. Nella nostra specifica realizzazione, il programma non risulta di particolare interesse in quanto non si occupa della gestione di servizi, e almeno in apparenza, non dimostra un notevole sviluppo nella gestione delle macchine virtuali in caso di fallimento. Figura 3.1: Schermata XenEnterprise 3.3.2 OpenQRM OpenQRM è una piattaforma di system management molto interessante in quanto ha avuto due anni di collaudo come prodotto commerciale, prima di divenire open source. Uno dei suo pregi è l’architettura modulare basata su plugin che permette l’aggiunta di componenti in ogni parte del sistema, inclusa l’interfaccia, l’agente di monitoraggio ed il motore di decisione. OpenQRM inoltre ha un’alta scalabilità e riesce a gestire molteplici server con report dettagliati, attraverso una semplice interfaccia. Il sistema è dotato di supporto a server con dischi locali, NAS o iSCSI e permette l’utilizzo di kernel 2.4 e 2.6. Il programma grazie alla sua estendibilità, ha da poco aggiunto il supporto a Xen attraverso plugin di sviluppatori esterni, ma il rischio di immaturità di tale soluzione, non ne fa un sistema totalmente affidabile e ciò ci ha fatto propendere per un’altra scelta. 36CAPITOLO 3. IL PROTOTIPO: IL SISTEMA DI HEALTHCHECK E L’IMPLEMENTAZIONE Figura 3.2: Schermata OpenQRM 3.3.3 Enomalism Enomalism è una applicazione web tramite la quale si può gestire l’amministrazione di macchine virtuali Xen. Si basa su di una interfaccia grafica che semplifica la complessa gestione di centinaia di macchine virtuali, permettendo inoltre l’integrazione di applicazioni di terzi attraverso l’utilizzo di particolari API. Dall’analisi effettuata, Enomalism risulta essere un progetto open source che non ha trovato grande appoggio e si ritrova ancora in una fase di beta. Anche se viene detto che è in continuo sviluppo, non sono state rilasciate nuove versioni e l’implementazione fino ad ora creata non sembra essere la soluzione ideale per implementare il nostro prototipo. 3.3.4 Virtual Iron Virtual Iron è una soluzione per la creazione e la gestione di infrastrutture virtuali che permette un avanzata paravirtualizzazione dei server attraverso l’uso dell’hypervisor di Xen. Virtual Iron è distribuito in 3 versioni: Professional, Consolidation ed Enterprise di cui una è open source. Il sistema supporta fino a 8 CPU, sistemi a 32 e 64 bit e permette il recupero senza intervento umano delle macchine in caso di fallimento. Inoltre crea dettagliati report sulle singole macchine virtuali riguardo l’utilizzo delle risorse di sistema in esecuzione, e permette in casi di eccessivo utilizzo di una particolare macchina fisica, il Load Balancing attraverso migrazione virtuale. Virtual Iron è il software che si avvicina maggiormente alla nostre richieste, anche se non supporta la gestione dei servizi, che però potrebbe essere gestita da programmi 3.3. ANALISI DEI SOFTWARE 37 Figura 3.3: Schermata Enomalism all’interno delle macchine virtuali stesse. Sfortunatamente al momento della creazione del prototipo il software ancora non è disponibile in nessuna delle versioni ma, ciò non toglie che in futuro esso possa essere preso in considerazione come soluzione ottimale. Figura 3.4: Schermata Virtual Iron 3.3.5 Nagios e Cfengine Nagios [15] è un software open source per il monitoraggio di server e servizi di rete, progettato per garantire alle strutture responsabili di essere costantemente informate 38CAPITOLO 3. IL PROTOTIPO: IL SISTEMA DI HEALTHCHECK E L’IMPLEMENTAZIONE sulle prestazioni ed eventuali problemi dei sistemi monitorati. Esso funziona in ambiente Linux/Unix e gestisce sistemi di notificazione basati su mail, messaggistica e SMS, oltre a disporre di un’interfaccia web accessibile via browser. Nagios non contiene funzioni per la gestione della rete ma solo per il monitoraggio di apparecchiature (computer, switch, router,..) e servizi (HTTP, FTP, POP3,..) ed è composto da due parti fondamentali: il nucleo, che rappresenta la parte principale del programma e i plugin, che sono programmi esterni tramite i quali si possono effettuare i controlli. Nella realizzazione del prototipo la scelta è ricaduta proprio su questo software e le motivazione che ci hanno portato a tale decisione, possono essere in sostanza riassunte dalle sue ottime caratteristiche: • Monitoraggio di servizi di rete (SMTP, POP3, HTTP, NNTP, ICMP, SNMP) • Monitoraggio delle risorse hardware dei server (carico del processore, utilizzo dei dischi e della memoria) • Semplice sviluppo di plugin tramite diversi linguaggi (Bash, C++, Perl, Python, PHP, ..) per monitorare nuovi tipi di servizio. • Notificazione ai contatti in caso di problemi. • Capacità di definire eventi da eseguire durante il verificarsi di problemi per la loro risoluzione. • Produzione di log dettagliati sulle attività svolte. • Interfaccia web per la verifica dello stato corrente, delle notifiche e della cronologia dei problemi. Attraverso l’utilizzo di tale programma si è risolta la problematica del monitoraggio dell’intera infrastruttura, sia virtuale, che fisica ma non si è affrontata minimamente la problematica della riattivazione di servizi e gestione delle macchine virtuali. Per far ciò, si è affiancato a Nagios, un altro software denominato Cfengine. Cfengine [16] è un sistema di amministrazione di elaboratori Unix, il cui scopo principale è automatizzare la configurazione e il mantenimento di sistemi operativi, soprattutto quando si dispone di un gruppo eterogeneo di questi, su diversi elaboratori. Cfengine può essere definito come l’interprete di un linguaggio evoluto il cui scopo è analizzare un file di configurazione e confrontare lo stato attuale della macchina con quello ideale descritto nel file, ricreandolo in caso di incongruenze tra i due. Le sue principali caratteristiche sono: • Monitoraggio e aggiornamento di permessi sui file. • Montaggio e smontaggio automatico di filesystem NFS in corrispondenza delle opportune modifiche in fstab. 3.4. IL PROTOTIPO 39 • Amministrazione attraverso singoli file, di netmask, configurazione del DNS, route di default e interfacce di rete primarie. • Copia ricorsiva in altre locazioni del filesystem , sia localmente che in un server remoto, di file e directory. • Aggiornamento, cancellazione o linking di file (caratteristica, questa, molto potente che offre l’uso di espressioni regolari e di funzioni di ricerca/sostituzione su tutto il testo). • Avvio, uccisione o riavvio di processi. • Esecuzione diretta di una molteplicità di comandi di sistema. Nell’infrastruttura creata Cfengine potrebbe da solo riuscire a riattivare i servizi non più funzionanti, se non fosse per il fatto che il confronto tra lo stato ideale della macchina e quello attuale risulta gravoso per il sistema e si esegue di norma una volta ogni ora. Questo è uno dei motivi fondamentali per il quale si è utilizzato un software di monitoring esterno come Nagios, oltre ovviamente alla possibilità, di avere sempre un’idea generale su tutto il funzionamento dell’infrastruttura. 3.4 Il prototipo Nella realizzazione specifica del prototipo, in questa tesi, ci si è occupati solamente della parte riguardante la riattivazione di servizi in macchine virtuali e di seguito ne daremo una descrizione prima logica e poi implementativa. 3.4.1 Schema Logico Il prototipo si è realizzato utilizzando rispettivamente: • 1 macchina fisica: 1 macchina virtuale (xentest206) • 1 macchina fisica: 2 macchine virtuali (xentest207, xentest208) • 1 macchina fisica: 2 macchine virutali (xentest209, xentest210) con i seguenti software installati: • xentest207, xentest208, xentest209, xentest210: Cfegine • xentest206: Nagios, Cfegine 40CAPITOLO 3. IL PROTOTIPO: IL SISTEMA DI HEALTHCHECK E L’IMPLEMENTAZIONE Figura 3.5: Schema del prototipo. 3.4.2 Implementazione Fisica 3.4.2.1 Nagios Nella realizzazione fisica del prototipo, si è installato Nagios nella macchina xentest206, l’unica avente il compito di occuparsi del monitoraggio. In generale, è stata fatta la scelta di monitorare solamente il funzionamento del servizio ssh e della raggiungibilità delle macchine attraverso il ping. Questa ha portato alla semplificazione del prototipo, ma non per questo ad una perdita di generalizzazione, in quanto grazie all’alta scalabilità dei software utilizzati, il discorso può essere ampliato ad una molteplicità di servizi. 3.4.2.2 Cfengine Nel prototipo Cfengine ha il compito di riattivare il servizio ssh nel caso in cui il demone sshd cessi il suo funzionamento. Interessandoci specificatamente delle macchine, Cfegine si è installato su ognuna di esse. Il motivo fondamentale di questa scelta è derivato dal fatto che, il nodo che si occupa di effettuare il monitoring, deve essere in grado di far eseguire, ad ogni istante, su ognuna di esse, il servizio integrato in Cfengine che confronta gli stati della macchina ed in caso ne ripristina i servizi. 3.4. IL PROTOTIPO 41 3.4.2.3 Interazione tra i software Nell’implementazione realizzata i due software interagiscono tra di loro, riuscendo cooperativamente a rilevare e riavviare il servizio non più funzionante. Nello specifico, di seguito, descriveremo le varie fasi del processo con maggiore chiarezza: 1) Stato quiete Il servizio è attivo e Nagios non rileva problemi. 2) Caduta del servizio Il servizio per qualche motivo non è più attivo, ma Nagios non lo ha ancora rilevato. 3) Stato Allerta Nagios si rende conto che il servizio non risponde, entra in uno stato di allerta ed esegue il corrispettivo evento. Nel nostro caso viene eseguito lo script locale handle cfrun.sh al quale viene passato l’indirizzo della macchina remota. 4) Stato Segnalazione Lo script attivato esegue un programma di Cfengine denominato cfrun che invia un segnale alla macchina remota interessata. 5) Stato Ripristino La macchina remota riceve il segnale ed esegue istantaneamente Cfengine, il quale dopo aver effettuato il confronto tra gli stati, si rende conto dell’inconsistenza e riattiva il servizio. 6) Stato quiete Una volta riattivato il servizio, si ristabilisce la situazione iniziale, nella quale Nagios non rileva problemi. 3.4.2.4 Conclusioni La struttura che si è riusciti a realizzare si è dimostrata, nel complesso, solida e stabile, permettendo la riattivazione dei servizi monitorati in modo automatico dopo soli pochi secondi. Questo ha dimostrato la bontà dei software open source utilizzati ed inoltre grazie all’ampio lavoro di analisi e quindi a scelte oculate, si è data al gruppo la possibilità di proseguire nel lavoro, attraverso l’implementazione dell’intera gestione delle macchine virtuali, rendendo cosı̀ il prototipo una potente soluzione per l’alta affidabilità. 42CAPITOLO 3. IL PROTOTIPO: IL SISTEMA DI HEALTHCHECK E L’IMPLEMENTAZIONE Capitolo 4 Prospettive future 4.1 Virtualizzazione Hardware x86 In questi ultimi mesi si è assistito ad un incremento esponenziale dell’interesse nei confronti della virtualizzazione, tanto che essa sta divenendo un elemento essenziale nei piani di sviluppo degli stessi produttori di chip. Attualmente, sia Intel che AMD, hanno sviluppato indipendentemente le estensioni di virtualizzazione dell’architettura x86 denominate Intel VT (abbreviazione di Virtualization Technology) e Pacifica (AMD Virtualization), e di seguito tenteremo di descriverne le caratteristiche fondamentali, effettuando un confronto tra le due possibilità. 4.1.1 Architettura Per assistere la virtualizzazione, VT e Pacifica hanno introdotto un nuovo livello privilegiato al di sotto del ring 0. Entrambe le soluzioni hanno aggiunto 9 nuove istruzioni che lavorano solamente nel livello denominato Ring -1, create appositamente per essese usate dell’hypervisor. Questo permette di eseguire sistemi guest senza modificarne il sistema operativo e riducendone il costo di emulazione. Ovviamente quest’ultimo non è eleminato del tutto in quanto ogni sistema operativo deve essere convinto che da solo ha accesso alla memoria della macchina ed ai bus di I/O, mentre in realtà è sempre l’hypervisor che manipola l’accesso ai dispositivi reali. 4.1.2 Memoria La memoria è stata parzialmente virtualizzata sin dai 386, nel senso che il SO e un controller hardware di memoria, assegnavano la RAM fra le applicazioni. AMD presenta un vantaggio in questo ambito perchè le sue CPU includono il controller di memoria che Pacifica può semplicemente riutilizzare. In contrapposizione, le CPU Intel demandano il controllo di memoria ad un circuito integrato separato che non supporta VT, è 43 44 CAPITOLO 4. PROSPETTIVE FUTURE ciò comporta un maggiore lavoro da parte dell’hypervisor nell’amministrazione della memoria. Il controller di memoria Intel in futuro sarà introdotto nella CPU e potrà essere in grado di usare VT, ma ciò non avverrà prima del 2007. 4.1.3 Input/Output Attualmente, la virtualizzazione di I/O richiede dei driver in esecuzione nell’hypervisor, che si occupa di presentare i driver virtuali ai sistemi operativi guest. Le future versioni di Pacifica e VT elimineranno i driver dall’hypervisor, permettendo ai driver dei sistemi ospite di comunicare direttamente con l’hardware. 4.1.4 Sicurezza La virtualizzazione può contribuire a proteggere un sistema da bug o da vulnerabilità, ma in realtà non si fa che abbassare il problema di sicurezza e stabilità di un livello. A questo punto, la bontà dei sistemi dipende sostanzialmente dagli hypervisor, che fortunatamente tendono ad essere robusti in quanto, rispetto a grandi sistemi operativi, sono dei microkernel, ed è più facile verificarne la sicurezza. Ma VT e Pacifica possono ancora introdurre nuove vulnerabilità, specialmente per gli utenti che non vogliono utilizzare le nuove possibilità di virtualizzazione. Un attacco ad un sistema che utilizza un unico sistema operativo non virtualizzato, non richiederebbe nemmeno l’hacking dell’hypervisor, poichè l’attaccante potrebbe solamente inserire un virus o un trojan nell’inutilizzato Ring -1. Un virus nel Ring -1 sarebbe il rootkit definitivo, perchè funzionerebbe al di sotto del sistema operativo e simulerebbe esattamente il chip x86, riuscendo ad attaccare persino il software perfettamente sicuro. In più esso sarebbe indipendente dal sistema operativo, riuscendo a compromettere qualsiasi sistema x86 e sarebbe praticamente impossibile da rilevare solamente con il software. Per proteggersi da tale virus, il sistema ha bisogno di un componente hardware che non può essere virtualizzato. Questo sarebbe fornito dalla Trusted Platform Module (TPM), con il discutibile chip PKI già incluso in molti computer. La TPM si occuperebbe di osservare l’hypervisor e i programmi che carica in memoria, facendo un check con dei valori hash precalcolati, in maniera da assicurare l’inalterazione dell’hypervisor e creando un certificato digitale che potrà poi essere verificato dal sistema operativo virtualizzato e dai software di sicurezza. È per questo che sia Intel che AMD stanno programmando di introdurre nel 2007 le tecnologie conosciute rispettivamente come La Grande e Presidio, destinate alla sicurezza delle imprese. Ringraziamenti Al Prof. Leonello Servoli per avermi dato la possibilità di approfondire un argomento di tale interesse e per la Sua puntuale disponibilità. Ad Igor per l’aiuto tecnico agli inizi e l’appoggio morale. A Mirko e Massimo per avermi dato la possibilità di apprendere parte delle loro ampie conoscenze. Ad Alvaro per avermi insegnato un po’ di parole spagnole ed avermi raccontato di una realtà che non conoscevo. A tutti i miei amici, che mi hanno sempre aiutato nel percorso universitario, anche nei periodi più difficili. Alla mia famiglia che mi è sempre stata vicina, ed a tutte le persone che in qualche maniera mi hanno dato una mano a crescere. Infine ad Elena, che con pazienza, ha sempre sopportato i miei impegni senza mai smettere di credere in me. 45 Appendice A Installazione e uso di Xen A.1 Installazione di Xen Si è scelto di installare Xen 3.0.2 perché è l’ultima versione stabile al momento dello sviluppo del prototipo. Per l’installazione è sufficiente seguire le istruzioni disponibili nella documentazione di Xen [3]. Bisogna però fare attenzione ai prerequisiti che, se non soddisfatti, potrebbero far insorgere diversi problemi. Al momento della scrittura della tesi, la versione di pygrub che viene distribuita con Xen 3.0.2 è errata e bisogna installare quella distribuita con la versione non stabile di Xen. Per fare questo, si può scaricare la versione dal sito web http://www.cl. cam.ac.uk/Research/SRG/netos/xen/downloads.html e procedere all’installazione: # # # # tar zxfv xen-unstable-src.tgz cd xen unstable/tools/pygrub/ make build make install A questo punto, l’installazione di Xen dovrebbe essere pronta e una volta riavviata la macchina, xend può essere lanciato attravarso il comando: # xend start Se ci sono problemi o errori, si consiglia di consultare la documentazione di Xen. A.2 Configurazione di Xen A.2.1 Configurazione di xend Il demone xend viene configurato attraverso il file /etc/xen/xend-config.spx. La configurazione di default è valida, ma bisogna cambiare una riga nel file per permettere la migrazione delle macchine virtuali. 47 48 APPENDICE A. INSTALLAZIONE E USO DI XEN (xend-relocation-server no) per (xend-relocation-server yes) A.2.2 Configurazione dei macchine virtuali Ogni macchina virtuale necessita di un file di configurazione con la seguente struttura: kernel memory name = disk = root = vif = dhcp = = "/boot/kernel-2.6.12.6-xenU.64" = 512 "xen-test" [’phys:/dev/sdb1,sda1,w’] "/dev/sda1 ro" [’mac=00:00:00:00:02:07’] "dhcp" kernel Il path al kernel per utilizzare. memory La memoria RAM da utilizzatare. name Il nome della macchina (se si usa il DHCP questo nome sarà cambiato in quello fornito dal DHCP). disk Il block device in cui si trova il filesystem della macchina virtuale. root Punto di mount per la partizione root. vif Il MAC address della macchina (se non si usa il DHCP si può anche specificare l’indirizzo IP). dhcp Se questa variabile ha come valore “dhcp” questo servizio verrà utilizato. A.2.3 pyGRUB Se si volesse utilizzare un kernel interno all’immagine della macchina virtuale piuttosto che un kernel esterno, si dovrebbe utilizzare pygrub, modificando nel file di configurazione i seguenti parametri: kernel = "/boot/kernel-2.6.12.6-xenU.64" per bootloader = "/usr/bin/pygrub" Nell’immagine dovrà ovviamente esistere un file /boot/grub.conf contenente una configurazione valida per il kernel installato nella macchina. A questo punto, ogni qual volta si avvia la macchina virtuale comparirà un menù in cui scegliere quale kernel utilizzare. A.3. USO DI XEN 49 pyGRUB version 0.3 ?????????????????????????????????????????????????????????????????????????? ? Linux 32bit kernel 2.6.12.6-xen ? ? Linux 32bit kernel 2.6.16-xen ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????????????????????????????????????????????????????? Use the ˆ and ? keys to select which entry is highlighted. Press enter to boot the selected OS. ’e’ to edit the commands before booting, ’a’ to modify the kernel arguments before booting, or ’c’ for a command line. Figura A.1: Menu di pyGRUB A.3 Uso di Xen A.3.1 Lanciare Xen Xen funziona tramite un daemon chiamato xend che per essere avviato necessita semplicemente del comando: # xend start A.3.2 Il tool xm Xm è il tool presente in Xen per controllare le macchine virtuali. Xm può essere utilizzato per creare, distruggere, mettere in pausa, migrare, reassegnare memoria, ecc. L’uso è questo: # xm <ordine> [argomenti] I comandi più utilizzati sono: xm create <config file> Crea una macchina virtuale secondo il file di configurazione <config file>. xm list Stampa a schermo la lista delle macchine virtuali attive nel seguente formato: # xm list Name xentest206 xentest207 Domain-0 ID Mem(MiB) VCPUs 18 512 1 19 512 1 0 485 2 State -b----b---r----- Time(s) 343.5 363.1 17502.3 xm console <dom id> Effettua l’accesso alla console della macchina <dom id>. <dom id> può essere il nome della macchina oppure l’ID che compare attraverso il comando xm list. 50 APPENDICE A. INSTALLAZIONE E USO DI XEN xm shutdown <dom id> Fa lo shutdown della macchina <dom id>. xm destroy <dom id> Distrugge la macchina virtuale <dom id>. xm reboot <dom id> Riavvia la macchina <dom id>. xm migrate <dom id> <host> Migra la macchina <dom id> all’host <host> (che ovviamente ha xend in esecuzione). xm migrate --live <dom id> <host> Migra la macchina <dom id>, senza metterla in pausa, all’host <host>. ... A.4 Creazione di una VM SL4 Di seguito si descrivono le fasi per creare un’immagine funzionante di SL4 sotto Xen 3.0.2. Nell’esempio l’installazione viene effettuata in /dev/sdb1. A.4.1 Installazione di SL4 Si è scelto di fare un’installazione minimale di SL4 in un block device accessibile da una macchina funzionante con GNU/Linux (/dev/sdb1). Per far ciò, si sono scelti solamente pacchetti indispensabili al funzionamento del sistema e della rete, potendo successivamente ampliare l’installazione attraverso software come yum o apt-get. È importante far notare come non si debba installare né SE-Linux né GRUB (o LILO). Una volta finita l’installazione minimale e avviata la macchina con il sistema GNU/Linux originale, è necessario accedere alla partizione con SL4 e copiare i contenuti di /dev nella partizione con SL4: # mount /dev/sdb1 /mnt/test # cp -a /dev/* /mnt/test/dev/ È anche necessario disattivare udev perché una volta virtualizzata, la macchina non dovrà accedere a nessun device, perché tale gestione verrà effettuata dal dom0: # mv /mnt/test/sbin/start_udev /mnt/test/sbin/start_udev.no A.4.2 Compilazione del kernel 2.6.16-xen È necessario fare una compilazione del kernel 2.6.16-xen per la nuova macchina virtuale: # cd /usr/src/linux-2.6.16-xen # make menuconfig # make A.4. CREAZIONE DI UNA VM SL4 51 # cp vmlinuz /boot/kernel-2.6.16-xenU # cp .config /boot/config-2.6.16-xenU A.4.3 Creazione e prova delle macchine virtuali Per testare il funzionamento del nuovo kernel si deve creare un file di configurazione, ad esempio test.cfg: kernel = "/boot/kernel-2.6.12.6-xenU.64" memory = 512 name = "xen-test" disk = [’phys:/dev/sdb1,sda1,w’] root = "/dev/sda1 ro" vif = [’mac=00:00:00:00:02:07’] dhcp ="dhcp" Inoltre il server DHCP deve essere configurato per assegnare un indirizzo IP alla macchina virtuale. A questo punto la VM potrebbe essere lanciata: # xm create -c test.cfg Se non ci sono errori, l’immagine creata è pronta per essere usata. Bisogna solamente copiare il nuovo kernel funzionante in /boot/ nella macchina virtuale e creare un file di configurazione di grub valido in /boot/grub.conf per usare pygrub invece di avere un kernel esterno alla macchina virtuale. Sarebbe opportuno a questo punto effettuare un aggiornamento di tutti i pacchetti e l’installazione del gcc. 52 APPENDICE A. INSTALLAZIONE E USO DI XEN Appendice B Uso di block device via rete I block device via rete permettono l’esportazioni di device attraverso una rete Ethernet. In questa appendice si afronterà l’installazione delle due soluzione utilizzati nella tesi: iSCSI e GNBD. B.1 iSCSI B.1.1 Introduzione iSCSI ha una struttura di tipo client-server. Il client viene chiamato initiator ed è quello che comincia una petizione di una risorsa– mentre il server viene chiamato target. B.1.2 Installazione di un target B.1.2.1 Installazione L’implementazione utilizata viene chiamata “The iSCSI Enterprise Target” http: //iscsitarget.sourceforge.net. Una volta scaricati i sorgenti si possono compilare e installare tramite i comandi: # make KERNELSRC=/usr/src/linux # make KERNELSRC=/usr/src/linux install dove linux è un link simbolico che punta al kernel sul quale si vuole compilare iSCSI. B.1.2.2 Configurazione La configurazione avviene tramite il file /etc/ietd.conf che ha una o più delle seguenti strutture: Target iqn.1997-01.it.infn:pg.na48fs3.xentest206 # Lun definition 53 54 APPENDICE B. USO DI BLOCK DEVICE VIA RETE Lun 0 Path=/data16/images/206.img,Type=fileio Alias˜xentest206 In questa configurazione si definisce un dispositivo da essere esportato tramite l’iSCSI iqn.1997-01.it.infn:pg.na48fs3.xentest206. Il block device esportato sarà un file (con una immagine all’interno) chiamato /data16/images/206.img. Per maggiori informazioni sulla configurazione e la definizione di block device da esportare, si può guardare la bibliografia [11]. B.1.2.3 Lanciare il servizio Per lanciare il servizio si deve eseguire il comando: /etc/init.d/iscsi-target start B.1.3 Installazione di un initiator Per l’installazione di un initiator sono necessari due paccheti: core-icsi-tools http:// www.kernel.org/pub/linux/utils/storage/iscsi/ e core-iscsi http: //www.kernel.org/pub/linux/kernel/people/nab/iscsi-initiator-core/ di cui uno contiene il modulo per il kernel e l’altro i tools per utilizare iSCSI. B.1.3.1 Installazione di core-iscsi L’installazione viene effettuata tramite i comandi: # make initiator KERNEL_DIR=/usr/src/linux # make install dove linux è un link simbolico che punta al kernel sul quale si vuole compilare iSCSI. B.1.3.2 Installazione di core-iscsi-tools L’installazione viene effettuata tramite il comando: # make install B.1.3.3 Configurazione Ci sono vari file di configurazione, ma ci limiteremo a parlare di quelli necessari per portare avanti la configurazione anteriormente mostrata. Per maggiori informazioni si faccia riferimento alla bibliografia [13]. /etc/initiatorname.iscsi Questo file conterrà l’iSCSI Qualified Name della macchina. /etc/sysconfig/initiator In questo file ci sono i distinti target a cui la macchina si collegherà. Seguendo la configurazione il target sarà (in una unica righa): B.2. GNBD 55 CHANNEL="0 1 eth0 192.168.254.54 3260 0 AuthMethod=None; MaxRecvDataSegmentLength=8192 nopout timeout=5 iqn.1997-01.it.infn:pg.na48fs3.xentest206" B.1.3.4 Lanciare il servizio Per utilizare i dispositivi tramite iSCSI rimane soltanto da eseguire il commando: /etc/init.d/initiator start Tramite il commando /etc/init.d/initiator status invece si ottengono informazioni dai dispositivi: # /etc/init.d/initiator status ----------[iSCSI Session Info for iSCSI Channel 0]----------TargetName: iqn.1997-01.it.infn:pg.na48fs3.xentest206 TargetAlias: PyX Session ID: 9 ISID: 0x80 33 94 32 00 00 TSIH: 4864 Cmds in Session Pool: 32 Session State: INIT SESS LOGGED IN -----------[iSCSI Session Values]-----------CmdSN : ExpCmdSN : MaxCmdSN : ITT : TTT 0x00098669 0x00098669 0x00098689 0x000a8b7e 0x0006dd91 ------------[iSCSI Connections]-------------CID: 0 Connection State: INIT CONN LOGGED IN Address 192.168.254.54:3260,1 TCP ExpStatSN: 0x000a8b7d -------------[SCSI Info for iSCSI Channel 0]------------SCSI Host No: 8 SCSI-II Host TCQ Count: 128 Logical Unit TCQ Depth: 64 SGTableSize: 32 MaxSectors: 256 iSCSI Logical Unit Number: 0 Status: ONLINE -> READ/WRITE DISK: sdd SCSI BUS Location: 0/0/0 Sector Size: 512 Active Tasks: 11 Total Tasks: 1311950 Total Bytes: 69679982272k B.2 GNBD B.2.1 Introduzione GNBD è suddiviso in due componenti, una parte server che si occupa dell’esportazione dei device locali ed una parte client che si occupa di importare i device da una specifica macchina. B.2.2 Installazione di GNBD GNBD fa parte di una suite più grande di software RedHat, denominata cluster. Per l’installazione si devono scaricare i sorgenti da ftp://sources.redhat.com/ pub/cluster/releases ed in seguito compilarli attraverso i comandi: 56 APPENDICE B. USO DI BLOCK DEVICE VIA RETE # ./configure --kernel_src=/usr/src/linux # make install dove linux è un link simbolico che punta al kernel sul quale si vuole compilare GNBD. B.2.3 Esportazione e Importazione Sulla macchina server una volta compilato GNBD bisogna far partire il demone di servizio con il comando # gnbd_serv ed esportare con l’istruzione: # gnbd_export -c -e <nome_univoco_device> -d <nome_block_device> che ovviamente si può utilizare più volte per esportare più di un device. Per quanto riguarda le macchine client bisogna prima caricare il modulo del kernel con il comando # modprobe gnbd e poi importare con # gnbd_import -i <server_gnbd> Una volta effettuato il comando, i devices importati saranno disponibili in /dev/gnbd/. Appendice C Installazione e uso di Nagios e Cfengine C.1 Nagios C.1.1 Installazione di Nagios e plugin Si è installato Nagios 2.5 perché è l’ultima versione stabile al momento dello sviluppo del prototipo. Per l’installazione è sufficiente scaricare i sorgenti e seguire le istruzioni disponibili nella documentazione di Nagios [15]. # tar xvzf nagios-2.5.tar.gz Una volta scompattati i sorgenti bisogna creare l’utente ed il gruppo per Nagios, aggiungendo inoltre al gruppo creato l’utente apache, che deve avere accesso all’interfaccia web del programma. # # # # adduser nagios /usr/sbin/groupadd nagcmd /usr/sbin/usermod -G nagcmd apache /usr/sbin/usermod -G nagcmd nagios Successivamente si devono creare le directory che ospiteranno il programma e cambiare i permessi di quest’ultime. # mkdir /usr/local/nagios /etc/nagios /var/nagios # chown nagios.nagios /usr/local/nagios /etc/nagios /var/nagios Eseguire il configure specificando le directory ed il gruppo # ./configure --sysconfdir=/etc/nagios --localstatedir=/var/nagios --with-command-group=nagcmd 57 58 APPENDICE C. INSTALLAZIONE E USO DI NAGIOS E CFENGINE ed iniziare la compilazione # # # # # make make make make make all install install-init install-commandmode install-config Una volta compilato nagios non resta che installare i plugin che vanno scaricati a parte all’indirizzo http://sourceforge.net/projects/nagiosplug/ e compilati. # ./configure --sysconfdir=/etc/nagios --localstatedir=/var/nagios # make # make install C.1.2 Configurazione dell’interfaccia web La configurazione dell’interfaccia web si basa sull’ipotesi che si utilizzi il web server Apache, ed esso sia già installato e funzionante sulla macchina che ospita Nagios. Il file di configurazione che si modificherà sarà /etc/httpd/conf/httpd.conf, aggiungendo alla fine di esso le seguenti righe: ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin <Directory "/usr/local/nagios/sbin"> AllowOverride AuthConfig Options ExecCGI Order allow,deny Allow from 192.168.0.0/24 </Directory> Alias /nagios /usr/local/nagios/share <Directory "/usr/local/nagios/share"> Options None AllowOverride AuthConfig Order allow,deny Allow from 192.168.0.0/24 </Directory> Nelle precedenti righe inoltre si definisce l’utilizzo di file locali per la verifica degli accessi. Quindi si creerà un file .htaccess all’interno della cartella /usr/local/nagios/sbin e si aggiungeranno al file le seguenti righe: C.1. NAGIOS 59 AuthName Nagios-Monitoring AuthType Basic AuthUserFile /etc/nagios/htpasswd require valid-user A questo punto Nagios permetterà solo ad alcuni utenti l’accesso alla cartella CGI, e per creare tali utenti basta eseguire il comando: # htpasswd2 -c htpasswd nagios tramite il quale viene creato un primo utente e poi: # htpasswd2 htpasswd utente per creare tutti gli altri di cui abbiamo bisogno, senza il parametro -c che comporterebbe la ricreazione del file e la perdita delle informazioni in esso contenute. C.1.3 Configurazione di Nagios Durante l’installazione, attraverso l’esecuzione del comando install-config, si sono copiati nella cartella /etc/nagios diversi file di configurazione. Per favorire la pulizia del sistema si consiglia di creare un cartella /etc/nagios/sample nella quale spostare tutti i file di esempio e seguentemente creare una cartella nella quale inserire i veri e propri file di configurazione. Per far riconoscere questa cartella a Nagios, sarà opportuno modificare il file di configurazione principale nagios.cfg, inserendo la riga: cfg_dir=/etc/nagios/nome_cartella_progetto che nel nostro caso è stata chiamata xen. L’albero della cartella /etc/nagios dovrebbe presentarsi ora in questa maniera: |-- nagios | |-- nagios.cfg | |-- cgi.cfg | |-- resource.cfg | |-- htpasswd | |-- xen | | |-- file di configurazione | |-- sample | | |-- file di esempio (*-sample) .. .. Per permettere inoltre a Nagios la gestione italiana delle date basta modificare il file nagios.cfg da: 60 APPENDICE C. INSTALLAZIONE E USO DI NAGIOS E CFENGINE date format=us a date format=euro Arrivati a questo punto non resta che creare i file di configurazione ed effettuare il check per verificare eventuali problemi. # /usr/local/nagios/bin/nagios -v /etc/nagios/nagios.cfg Nagios 2.5 Copyright (c) 1999-2006 Ethan Galstad (http://www.nagios.org) Last Modified: 07-13-2006 License: GPL Reading configuration data... Running pre-flight check on configuration data... Checking services... Checked 10 services. Checking hosts... Checked 5 hosts. Checking host groups... Checked 1 host groups. Checking service groups... Checked 0 service groups. Checking contacts... Checked 1 contacts. Checking contact groups... Checked 1 contact groups. Checking service escalations... Checked 0 service escalations. Checking service dependencies... Checked 0 service dependencies. Checking host escalations... Checked 0 host escalations. Checking host dependencies... Checked 0 host dependencies. Checking commands... Checked 20 commands. Checking time periods... Checked 1 time periods. Checking extended host info definitions... Checked 0 extended host info definitions. Checking extended service info definitions... Checked 0 extended service info definitions. Checking for circular paths between hosts... C.2. CFENGINE 61 Checking for circular host and service dependencies... Checking global event handlers... Checking obsessive compulsive processor commands... Checking misc settings... Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check Infine lanciare il demone di Nagios. # /etc/init.d/nagios start C.2 Cfengine C.2.1 Installazione di Cfengine Si è installato Cfengine 2.1.21 perché è l’ultima versione stabile al momento dello sviluppo del prototipo. Per l’installazione è sufficiente scaricare i sorgenti e compilarli [16]. # ./configure # make # make install C.2.2 Configurazione di Cfengine Cfengine gestisce i file di configurazione nella cartella /var/cfengine/inputs. Di seguito verra creata una configurazione per testare il funzionamento di Cfengine in locale creando nell’host, nel quale vogliamo riattivare un servizio, i seguenti file: # -- /var/cfengine/inputs/cfagent.conf control: actionsequence = ( processes ) smtpserver = ( localhost ) # usato da cfexecd sysadm = ( root@localhost ) # dove inviare output processes: "ssh" restart "/usr/sbin/ssh" useshell=false # riattivare il servizio # -- /var/cfengine/inputs/cfservd.conf control: cfrunCommand = ( "/var/cfengine/bin/cfagent" ) 62 APPENDICE C. INSTALLAZIONE E USO DI NAGIOS E CFENGINE AllowUsers = ( root ) admit: /var/cfengine/bin/cfagent 127.0.0.1 # -- /var/cfengine/inputs/cfrunhosts.conf sshserver Per assicurarsi che Cfengine riesca ad effettuare il parsing dei file, lanciare il comando: # /usr/sbin/cfagent -qIv ed infine testare il funzionamento attraverso la riattivazione del demone ssh: # killall ssh;/usr/sbin/cfagent -qI Una volta completata l’installazione si possono attivare tutti i servizi di Cfengine. # for i in cfenvd cfservd cfexecd; do chkconfig $i on; service $i restart;done C.3 Integrazione fra Nagios e Cfengine Di seguito si spiegherà come far interagire i due programmi in modo che alla rilevazione di un problema su di un servizio, Nagios attivi uno script che in caso di errore critico invochi Cfengine nell’host remoto, riattivando il servizio. I file che di seguito mostreremo sono quelli della configurazione di Nagios opportunamente modificati per invocare Cfengine. Come descritto precedentemente, questi file devono trovarsi nella cartella creata dall’utente, nel nostro caso /etc/nagios/xen. Lo script handle cfrun viene attivato quando si rilevano problemi riguardanti il servizio ssh e solo in caso di uno stato critico viene eseguita la chiamata a cfrun. # -- /etc/nagios/xen/handle_cfrun.sh #!/bin/sh # $1 = status, $2 = status type, $3 = hostname, $4 = attempt HOME=/usr/local/nagios export HOME HOST=‘echo $3 | cut -f1 -d.‘ cd /etc/nagios/xen echo "/usr/sbin/cfrun -f $HOME/cfrun.hosts -T $HOST" > 1.txt case "$1" in OK) ;; WARNING) C.3. INTEGRAZIONE FRA NAGIOS E CFENGINE 63 ;; CRITICAL) if [ $2 == "HARD" ] || [[ $2 == "SOFT" && $4 -eq 3 ]]; then /usr/sbin/cfrun -f $HOME/cfrun.hosts -T $HOST fi ;; UNKNOWN) ;; esac exit 0 Il file services.cfg rappresenta i servizi monitorati da Nagios e come si può notare, il servizio ssh ha attivo un event handler che richiama in caso di problemi il comando handle cfrun che mappa attraverso il file checkcommands.cfg lo script precedentemente descritto. # -- /etc/nagios/xen/services.cfg define service{ hostgroups xentest service_description PING check_command check_ping!100.0,20%!500.0,60% max_check_attempts 3 normal_check_interval 5 retry_check_interval 1 check_period 24x7 notification_interval 120 notification_period 24x7 notification_options w,u,c,r,f contact_groups localadmins } define service{ hostgroups service_description check_command max_check_attempts normal_check_interval retry_check_interval check_period notification_interval notification_period notification_options contact_groups event_handler_enabled xentest SSH check_ssh 3 1 1 24x7 120 24x7 w,u,c,r,f localadmins 1 64 APPENDICE C. INSTALLAZIONE E USO DI NAGIOS E CFENGINE event_handler handle_cfrun } # -- /etc/nagios/xen/checkcommands.cfg define command{ command_name check_ssh command_line $USER1$/check_ssh -H $HOSTADDRESS$ } define command{ command_name command_line handle_cfrun /etc/nagios/xen/handle_cfrun.sh $SERVICESTATE$ $SERVICESTATETYPE$ $HOSTNAME$ $SERVICEATTEMPT$ } Infine descriviamo i restanti file di configurazione di Nagios: # -- /etc/nagios/xen/hosts.cfg define host{ host_name hostgroups address max_check_attempts check_period contact_groups notification_interval notification_period notification_options } define host{ host_name hostgroups address max_check_attempts check_period contact_groups notification_interval notification_period notification_options } define host{ host_name hostgroups xentest206 xentest 192.168.254.206 3 24x7 localadmins 120 24x7 d,u,r,f xentest207 xentest 192.168.254.207 3 24x7 localadmins 120 24x7 d,u,r,f xentest208 xentest C.3. INTEGRAZIONE FRA NAGIOS E CFENGINE address max_check_attempts check_period contact_groups notification_interval notification_period notification_options 192.168.254.208 3 24x7 localadmins 120 24x7 d,u,r,f define host{ host_name hostgroups address max_check_attempts check_period contact_groups notification_interval notification_period notification_options } xentest209 xentest 192.168.254.209 3 24x7 localadmins 120 24x7 d,u,r,f define host{ host_name hostgroups address max_check_attempts check_period contact_groups notification_interval notification_period notification_options } xentest210 xentest 192.168.254.210 3 24x7 localadmins 120 24x7 d,u,r,f 65 } # -- /etc/nagios/xen/hostsgroups.cfg define hostgroup{ hostgroup_name xentest alias xentest members xentest206, xentest207, xentest208, xentest209, } # -- /etc/nagios/xen/contacs.cfg define contact{ contact_name nagios 66 APPENDICE C. INSTALLAZIONE E USO DI NAGIOS E CFENGINE alias host_notification_period service_notification_period service_notification_options host_notification_options service_notification_commands host_notification_commands email Nagios Admin 24x7 24x7 w,u,c,r d,u,r notify-by-email host-notify-by-email [email protected] } # -- /etc/nagios/xen/contacgroups.cfg define contactgroup{ contactgroup_name localadmins alias Local Site Administrator members nagios } # -- /etc/nagios/xen/timeperiods.cfg define timeperiod{ timeperiod_name 24x7 alias 24 Hours A Day, 7 Days A Week sunday 00:00-24:00 monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 } Una volta generati i file, non resta che configurare Cfegine nell’host remoto in maniera da autorizzare Nagios ad eseguire cfrun dal server che effettua il monitoraggio. Il modello di sicurezza di Cfegine è basato su di una chiave pubblica/privata alla quale sono associati userid e host ip. Quindi per far funzionare il sistema bisogna creare una chiave per Nagios e inserirla all’interno dell’host remoto da monitorare. Per far ciò diveniamo l’utene Nagios ed eseguiamo cfkey: # su - nagios # cfkey Questo ultimo comando si occuperà di creare le chiavi. In seguito copiamo il file .pub della chiave appena creata nella cartella /var/cfengine/ppkeys nell’host remoto. Il file inoltre dovrà avere un nome speciale rappresentato dal seguente pattern username-ip.addr.pub C.3. INTEGRAZIONE FRA NAGIOS E CFENGINE 67 quindi modifichiamo il nome del file ed editiamo cfservd.conf aggiungendo la direttiva che permette l’esecuzione all’utente nagios. # -- /var/cfengine/inputs/cfservd.conf control: cfrunCommand = ( "/var/cfengine/bin/cfagent" ) AllowUsers = ( nagios root ) admit: /var/cfengine/bin/cfagent 127.0.0.1 192.168.254.206 # ip del server di monitoraggio Infine effettuiamo il test di funzionamento eseguendo il comando: # cfrun -f ˜/cfrun.hosts sshserver 68 APPENDICE C. INSTALLAZIONE E USO DI NAGIOS E CFENGINE Bibliografia [1] Popek, G.J., Goldberg, R.P. Formal requirements for virtualizable third generation architectures. Communications of the ACM, Volume 17 - Issue 7 (Luglio 1974). URL: http://portal.acm.org/citation.cfm?doid=361011. 361073 [2] Smith, J., Ravi, N. Virtual Machines. Morgan Kaufmann (2005). [3] Xen homepage. URL: http://www.cl.cam.ac.uk/Research/SRG/netos/xen/ index.html [4] SAN URL: http://en.wikipedia.org/wiki/Storage area network [5] SCSI URL: http://en.wikipedia.org/wiki/SCSI [6] Fibre Channel Overview URL: http://hsi.web.cern.ch/HSI/fcs/spec/overview.htm [7] GNBD Homepage URL: http://sources.redhat.com/cluster/gnbd/ [8] IBM GPFS URL: http://www-03.ibm.com/servers/eserver/clusters/ software/gpfs.html [9] Red Hat GFS URL: http://www.redhat.com/software/rha/gfs/ [10] Satran, J., Meth, K. et al. RFC 3720: Internet Small Computer Systems Interface (iSCSI). IETF (Aprile 2004). URL: http://www.ietf.org/rfc/rfc3720.txt [11] Rockwood, Ben. A Quick Guide to iSCSI on Linux. (Agosto 2004). URL: http://cuddletech.com/articles/iscsi/iscsiref.pdf 69 70 BIBLIOGRAFIA [12] core-iSCSI homepage. URL: ttp://www.kernel.org/pub/linux/utils/storage/ iscsi/ [13] core-iSCSI HOWTO. URL: http://www.kernel.org/pub/linux/utils/storage/ iscsi/HOWTO [14] The iSCSI Enterprise Target homepage. URL: http://iscsitarget.sourceforge. [15] Nagios homepage URL: http://www.nagios.org/ [16] Cfengine homepage URL: http://www.cfengine.org/ [17] XenEnterprise Homepage URL: http://www.xensource.com/products/xen enterprise/ [18] OpenQRM Homepage URL: http://www.openqrm.org/ [19] Virtual Iron Homepage URL: http://www.virtualiron.com/