JeOS e vmbuilder

Introduzione

Cos'è JeOS

Ubuntu JeOS (pronunciato come la parola "juice") è una variante di della versione server di Ubuntu, configurata appositamente per le applicazioni virtuali. Non è disponibile sotto forma di file ISO per CD-ROM, ma solo come opzione:

  • durante l'installazione della versione server (premere F4 alla prima schermata per scegliere l'opzione "Installa un sistema minimale" che equivale a selezionare JeOS).

  • oppure può essere generato usando "vmbuilder" come descritto di seguito.

JeOS è un'installazione di Ubuntu Server Edition con un kernel appositamente configurato che contiene gli elementi basilari necessari all'esecuzione di un ambiente virtualizzato.

Ubuntu JeOS è stato progettato per sfruttare tutte quelle tecnologie chiave, relative alle prestazioni, presenti negli ultimi prodotti di virtualizzazione di VMware. La combinazione di una ridotta dimensione e prestazioni ottimizzate, assicurano che Ubuntu JeOS Edition sia in grado di offrire un uso efficiente delle risorse server in grandi produzioni virtuali.

Senza l'utilizzo di driver non necessari e ricorrendo solo ai pacchetti richiesti, gli ISV possono configurare il proprio SO di supporto proprio come desiderano. Inoltre, viene assicurato che gli aggiornamenti, di sicurezza o per miglioramenti, saranno limitati al minimo richiesto dallo specifico ambiente. Gli utenti che sviluppano soluzioni virtuali basate su JeOS, dovranno gestire meno aggiornamenti, e quindi una minor manutenzione, di quanto avrebbero dovuto fare con un'installazione server completa.

Cos'è vmbuilder

Con vmbuilder non è più necessario scaricare l'ISO di JeOS. vmbuilder scarica i diversi pacchetti e costruisce una macchina virtuale su misura in circa un minuto. vmbulder è uno script che automatizza il processo di creazione di una macchina virtuale basata su Linux. Gli hypervisor attualmente supportati sono KVM e Xen.

È possibile passare opzioni a riga di comando per aggiungere dei pacchetti, per rimuoverne, per scegliere la versione di Ubuntu, quale mirror, ecc... Su piattaforme hardware recenti dotate di molta memoria RAM, con tmpdir in /dev/shm o usando un tmpfs e un mirror locale, è possibile avere una macchina virtuale in meno di un minuto.

Introdotto per le prima volta come script con Ubuntu 8.04 LTS, ubuntu-vm-builder è stato inizialmente un semplice "hack" per aiutare gli sviluppatori a provare il loro codice in una macchina virtuale senza dover iniziare ogni volta da capo. Dopo che alcuni amministratori di sistema di Ubuntu hanno notato questo script, hanno iniziato a migliorarlo e ad adattarlo a molti casi d'uso che Soren Hansen (l'autore dello script e lo specialista di virtualizzazione all'interno di Ubuntu, non il giocatore di golf) ha deciso di riscriverlo da capo, per Intrepid, in Python con diversi nuovi obiettivi:

  • Svilupparlo affinché possa essere usato anche da altre distribuzioni.

  • Usare un meccanismo di plugin per tutte le interazioni di virtualizzazione per facilitare l'aggiunta di altri ambienti di virtualizzazione o una logica più complessa.

  • Fornire un'interfaccia web facile da usare come opzione alla riga di comando.

I principi generali e i comandi restano sempre gli stessi.

Configurazione iniziale

Si presuppone che siano già stati installati e configurati libvirt e KVM sul computer che si intende usare. Per maggiori informazioni, consultare:

Si dà per assodato che si sappia utilizzare un editor di testo come nano oppure vi. In caso contrario, è possibile avere una panoramica dei vari editor di testo consultando la documentazione di Ubuntu. Questa guida è stata scritta basandosi su KVM, ma il principio dovrebbe essere lo stesso anche per altre tecnologie di virtualizzazione.

Installare vmbuilder

Il nome del pacchetto da installare è python-vm-builder. In un terminale digitare:

sudo apt-get install python-vm-builder
[Nota]

Se si sta eseguendo la versione 8.04 è sempre possibile eseguire queste azioni usando la versione del pacchetto chiamata ubuntu-vm-builder; ci sono solo alcune modifiche nella sintassi da usare con il programma.

Definire una macchina virtuale

Definire una macchina virtuale con vmbuilder è molto facile, ma è necessario prendere in considerazione alcuni aspetti:

  • Se si pianifica di fornire applicativi virtuali, non assumere che l'utente finale sappia come estendere la dimensione del disco secondo le proprie esigenze. Prendere quindi in considerazione l'utilizzo di dischi virtuali di grandi dimensioni per consentire agli applicativi di crescere o spiegare nella documentazione come allocare maggiore spazio. Potrebbe essere una buona idea salvare i dati in un sistema di archiviazione esterno.

  • Dato che la memoria RAM è più facile da allocare in una MV, la dimensione della RAM dovrebbe essere impostata a un valore minimo sicuro per la propria applicazione.

Il comando vmbuilder dispone di due parametri principali: la tecnologia di virtualizzazione (hypervisor) e la distribuzione finale. Sono disponibili molti altri parametri e tutti possono essere visualizzati con il seguente comando:

vmbuilder --help

Parametri base

Poiché questo esempio è basato su KVM e Ubuntu 9.10 (Karmic Koala) e poiché si andrà a eseguire il rebuild della stessa macchina virtuale diverse volte, verrà invocato vmbuilder con il seguente parametro iniziale:

sudo vmbuilder kvm ubuntu --suite karmic --flavour virtual --arch i386 -o --libvirt qemu:///system

Il parametro --suite definisce il rilascio di Ubuntu, --flavour specifica di usare il kernel virtuale (quello usato per generare un'immagine JeOS), --arch indica di usare un computer a 32 bit, -o indica a vmbuilder di sovrascrivere la versione precedente della macchina virtuale e --libvirt aggiunge la macchina virtuale risultante tra quelle disponibili nell'ambiente di virtualizzazione.

Note:

  • Data la natura delle operazioni eseguite da vmbuilder, sono necessari i privilegi di root.

  • Se la macchina virtuale necessita di usare più di 3GB di RAM, è utile generare una macchina a 64 bit (--arch amd64).

  • Fino a Ubuntu 8.10, il kernel virtuale era generato solo per architetture a 32 bit, per definire quindi una macchina amd64 su Hardy, usare --flavour server.

Parametri di installazione di JeOS

Rete con JeOS
Assegnare un indirizzo IP fisso

Come applicazione che verrà messa in produzione all'interno di reti diverse, è molto difficile conoscere la struttura attuale della rete. Per semplificare la configurazione è utile procedere come solitamente procedono i venditori di hardware di rete, assegnando un indirizzo IP fisso all'interno di una classe di rete che verrà descritta all'interno della propria documentazione. Un indirizzo nell'intervallo 192.168.0.0/255 è una buona scelta.

Per ottenere questo vengono usati i seguenti parametri:

  • --ip INDIRIZZO: indirizzo IP (il valore predefinito è dhcp se non viene specificato nulla)

  • --mask VALORE: maschera di rete (valore predefinito: 255.255.255.0)

  • --net VALORE: indirizzo IP net (valore predefinito: X.X.X.0)

  • --bcast VALORE: broadcast (valore predefinito: X.X.X.255)

  • --gw INDIRIZZO: indirizzo del gateway (valore predefinito: X.X.X.1)

  • --dns INDIRIZZO: indirizzo server dei nomi (valore predefinito: X.X.X.1)

Si dà per scontato che i valori predefiniti siano sufficiente. Il comando diventa:

sudo vmbuilder kvm ubuntu --suite karmic --flavour virtual --arch i386 -o --libvirt qemu:///system --ip 192.168.0.100
Modificare il modello libvirt per usare il bridge di rete

Dato che l'applicativo dovrà garantire accesso agli host remoti, è necessario configurare libvirt in modo che l'applicativo usi il bridge di rete. Per ottenere ciò viene usato il modello di vmbuilder per modificare quello predefinito.

Nella directory di lavoro, creare la gerarchia del modello e copiare quello predefinito:

mkdir -p VMBuilder/plugins/libvirt/templates
cp /etc/vmbuilder/libvirt/* VMBuilder/plugins/libvirt/templates/

È ora possibile aprire il file VMBuilder/plugins/libvirt/templates/libvirtxml.tmpl e modificare:

          <interface type='network'>
            <source network='default'/>
          </interface>

In:

          <interface type='bridge'>
            <source bridge='br0'/>
          </interface>
Partizionamento

Il partizionamento dell'applicativo virtuale deve prendere in considerazione cosa si intende fare. Dato che molti applicativi non avranno un sistema di archiviazione separato per i dati, usare una partizione /var separata è una buona idea.

Per ottenere tutto questo, vmbuilder dispone dell'opzione --part:

--part PATH
  Allows to specify a partition table in partfile each  line  of  partfile  should  specify
  (root first):
      mountpoint size
  where  size  is  in megabytes. You can have up to 4 virtual disks, a new disk starts on a
  line with ’---’.  ie :
      root 1000
      /opt 1000
      swap 256
      ---
      /var 2000
      /log 1500

In questo caso, creare un file di testo vmbuilder.partition contenente quanto segue:

root 8000
swap 4000
---
/var 20000
[Nota]

Notare che vengono usate immagini disco virtuali, le dimensioni inserite sono le dimensioni massime dei volumi.

Il comando diventa quindi:

sudo vmbuilder kvm ubuntu --suite karmic --flavour virtual --arch i386 \ -o --libvirt qemu:///system --ip 192.168.0.100 --part vmbuilder.partition
[Nota]

L'uso di "\" all'interno di un comando consente di scrivere comandi su più righe.

Utente e password

È necessario anche impostare un utente e una password predefiniti e generici da poter includere nella documentazione. Successivamente verrà presentato uno script che viene eseguito al primo accesso di un utente che tra le molte cose chiederà di modificare la password. In questo esempio viene usato come nome utente user e default come password.

Per fare questo vengono usati i seguenti parametri:

  • --user NOME_UTENTE: imposta il nome utente da aggiungere. Valore predefinito: ubuntu.

  • --name NOME_COMPLETO: imposta il nome completo dell'utente da aggiungere. Valore predefinito: Ubuntu.

  • --pass PASSWORD: imposta la password dell'utente: Valore predefinito: ubuntu.

Il comando ora è il seguente:

sudo vmbuilder kvm ubuntu --suite intrepid --flavour virtual --arch i386 \ -o --libvirt qemu:///system --ip 192.168.0.100 --part vmbuilder.partition \ --user user --name user --pass default

Installare i pacchetti richiesti

In questo esempio verrà installato un pacchetto (Limesurvey) che accede a un database MySQL ed è dotato di un'interfaccia web. Il sistema operativo dovrà quindi aver installato:

  • Apache

  • PHP

  • MySQL

  • Server OpenSSH

  • Limesurvey (un'applicazione di esempio creata appositamente)

Per fare questo viene usata l'opzione "--addpkg" diverse volte:

--addpkg PKG
  Install PKG into the guest (can be specfied multiple times)

Purtroppo, in base al funzionamento di vmbuilder, i pacchetti che devono porre delle domande nella fase di post-installazione non sono supportati e dovrebbero essere installati successivamente quando è possibile interagirvi. Questo è il caso di Limesurvey che verrà installato successivamente, dopo che l'utente ha eseguito l'accesso.

Altri pacchetti che pongono delle semplici domande di debconf, come mysql-server che richiede di impostare una password, possono essere installati, ma dovranno essere riconfigurati una volta eseguito l'accesso.

Se alcuni dei pacchetti che si devono installare non sono presenti nel componente "main", è necessario abilitare dei repository aggiuntivi usando le opzioni "--comp" e "--ppa":

--components COMP1,COMP2,...,COMPN
           A comma separated list of distro components to include (e.g. main,universe). This defaults
           to "main"
--ppa=PPA  Add ppa belonging to PPA to the vm's sources.list.

Limesurvey non fa parte degli archivi attualmente ed è quindi necessario specificarne l'indirizzo PPA (Personal Package Archive) così da aggiungerlo al file /etc/apt/source.list della macchina virtuale. Aggiungere quindi quanto segue al comando:

--addpkg apache2 --addpkg apache2-mpm-prefork --addpkg apache2-utils --addpkg apache2.2-common \ --addpkg dbconfig-common --addpkg libapache2-mod-php5 --addpkg mysql-client --addpkg php5-cli \ --addpkg php5-gd --addpkg php5-ldap --addpkg php5-mysql --addpkg wwwconfig-common \ --addpkg mysql-server --ppa nijaba
OpenSSH

Un altro strumento utile da avere installato nell'applicativo è OpenSSH, per consentire agli amministratori di accedere da remoto in sicurezza. Mettere in produzione direttamente su Internet un applicativo con una versione preinstallata del server OpenSSH è un rischio per la sicurezza, poiché tutti i server condividono la stessa chiave privata, rendendo l'applicativo una facile preda da parte di malintenzionati. Come per la password utente, viene usato una script che installa OpenSSH al primo accesso di un utente affinché la chiave generata sia diversa per ogni applicativo. Per questo scopo viene usato uno script --firstboot che non richiede alcun intervento da parte dell'utente.

Considerazioni sulla velocità

Cache dei pacchetti

Quando vmbuilder genera il sistema, necessita di scaricare dai repository in rete ogni singolo pacchetto di cui il sistema è composto che, in base alla velocità della connessione e al carico del mirror, può avere un forte impatto sui tempi di generazione. Per ridurre questo effetto, è utile avere un repository locale (che è possibile creare usando apt-mirror) o un proxy cache come apt-cache. La seconda opzione, descritta di seguito, è quella più facile da implementare e richiede meno spazio su disco. Per installare il tutto, digitare:

sudo apt-get install apt-proxy

Una volta completata l'installazione, il proxy (vuoto) è pronto all'indirizzo "http://INDIRIZZO_MIRROR:9999" e trovaerà i repository Ubuntu sotto "/ubuntu". Affinché vmbuilder possa usarlo, è necessario usare l'opzione --mirror:

--mirror=URL  Use Ubuntu mirror at URL instead of the default, which
              is http://archive.ubuntu.com/ubuntu for official
              arches and http://ports.ubuntu.com/ubuntu-ports
              otherwise

Aggiungere quindi al comando:

--mirror http://INDIRIZZO_MIRROR:9999/ubuntu
[Nota]

L'indirizzo del mirror qui specificato verrà usato anche nel file /etc/apt/source.list del nuovo ospite creato. È utile quindi specificare un indirizzo che può essere utilizzato dall'ospite oppure pianificare una modifica dello stesso magari in uno script --firstboot.

Installare un mirror locale

Se si è in un ambiente molto grande, può aver senso creare un mirror locale dei repository di Ubuntu. Il pacchetto "apt-mirror" fornisce uno script per la gestione delle operazioni di mirror. È utile avere almeno 20GB di spazio per ogni rilascio supportato e architettura.

Il file di configurazione predefinito usato da apt-mirror è /etc/apt/mirror.list. Dato che è già impostato, dovrà solamente replicare l'architettura del computer locale. Se è necessario supportare altre architetture all'interno del mirror, basta duplicare le righe che iniziano con “deb”, sostituendo la parola "deb" con "/deb-{arch}", dove "arch" può essere i386, amd64, ecc... Per esempio, su architettura amd64, per avere anche gli archivi per i386:

deb  http://archive.ubuntu.com/ubuntu karmic main restricted universe multiverse 
/deb-i386  http://archive.ubuntu.com/ubuntu karmic main restricted universe multiverse

deb  http://archive.ubuntu.com/ubuntu karmic-updates main restricted universe multiverse 
/deb-i386  http://archive.ubuntu.com/ubuntu karmic-updates main restricted universe multiverse 

deb http://archive.ubuntu.com/ubuntu/ karmic-backports main restricted universe multiverse 
/deb-i386  http://archive.ubuntu.com/ubuntu karmic-backports main restricted universe multiverse 

deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe multiverse 
/deb-i386  http://security.ubuntu.com/ubuntu karmic-security main restricted universe multiverse 

deb http://archive.ubuntu.com/ubuntu karmic main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer 
/deb-i386 http://archive.ubuntu.com/ubuntu karmic main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer 

I pacchetti dei sorgenti non sono stati inclusi nel mirror dato che non sono molto usati quanto i binari e occupano molto spazio. È comunque possibile aggiungerli facilmente all'elenco.

Una volta terminata l'operazione di duplicazione del mirror (può durare molto), è necessario configurare Apache affinché i file del mirror (in /var/spool/apt-mirror se non è stato modificato il valore predefinito) siano pubblicati dal proprio server Apache. Per maggiori informazioni su Apache, consultare la sezione chiamata «HTTPD - Server web Apache2».

Installare in un disco RAM

Scrivere direttamente nella RAM è molto più veloce dello scrivere su disco. Se si dispone di un po' di memoria libera, far eseguire le operazioni di vmbuilder in un RAMdisk può essere molto utile. Per fare questo, usare l'opzione --tmpfs:

--tmpfs OPTS  Use a tmpfs as the working directory, specifying its
              size or "-" to use tmpfs default (suid,dev,size=1G).

Se si dispone di più di 1GB di RAM, è altamente consigliato l'uso dell'opzione --tmpfs -.

Pacchettizzare l'applicativo

Sono disponibili due opzioni:

  • Il metodo raccomandato è quello di creare un pacchetto Debian. Dato che questo argomento esula da questa guida, non verrà spiegato questo metodo e si rimanda alla Ubuntu Packaging Guide. In questo caso è anche utile creare un repository per contenere il pacchetto in modo tale che gli aggiornamenti vengano prelevati da questo. Per ulteriori informazioni, consultare Debian Administration.

  • Installare l'applicativo nella directory /opt come raccomandato dalle linee guida di FHS.

In questo caso viene usato Limesurvey come esempio di applicazione web per cui creare un applicativo virtuale. Come accennato precedentemente. è disponibile un pacchetto di questa applicazione attraverso gli archivi PPA (Personal Package Archive).

Terminare l'installazione

Primo avvio

Al primo avvio della macchina, è necessario installare il pacchetto openssh-server, in modo che la chiave generata sia unica per ogni macchina. Creare quindi uno script, chiamato boot.sh, come segue:

# Questo script viene eseguito al primo avvio della macchina virtuale
# È eseguito come utente root.

apt-get update
apt-get install -qqy --force-yes openssh-server

Aggiungere quindi l'opzione --firstboot boot.sh al comando.

Primo accesso

Mysql e Limesurvey necessitano di interagire con l'utente durante l'installazione, per questo è necessario configurarli al primo accesso dell'utente utilizzando uno script chiamato login.sh. Lo stesso script verrà usato affinché l'utente specifichi:

  • la propria password

  • la tastiera e altre informazioni sulla lingua da usare

Creare il file login.sh e inserirvi:

# Questo script è eseguito al primo accesso dell'utente

echo "L'installazione del proprio applicativo è quasi terminata."
echo "Per concludere l'installazione, è necessario rispondere ad alcune domande,"
echo "iniziando col cambiare la propria password utente."

passwd

#consentire di cambiare la tastiera
sudo dpkg-reconfigure console-setup

#configura la password di root del server mysql
sudo dpkg-reconfigure mysql-server-5.0

#installa limesurvey
sudo apt-get install -qqy --force-yes limesurvey

echo "L'applicativo è ora configurato. Per poterlo usare, visitare"
echo "l'indirizzo: http://serverip/limesurvey/admin"

Aggiungere quindi l'opzione --firstlogin login.sh al comando.

Utili accorgimenti

Configurare gli aggiornamenti automatici

Affinché il sistema sia configurato per aggiornarsi automaticamente a scadenze determinate, basta installare il pacchetto unattended-upgrades. Aggiungere quindi quanto segue al comando:

--addpkg unattended-upgrades

Dato che il pacchetto dell'applicazione è stata inserito nel PPA, il processo di aggiornamento non aggiornerà solamente il sistema, ma anche l'applicazione ogni qualvolta ci sia una versione aggiornata nel PPA.

Gestire gli eventi ACPI

Affinché la macchina virtuale possa gestire gli eventi come riavvio e arresto che le vengono inviati, è utile installare anche il pacchetto "acpid". Aggiungere quindi quanto segue al comando:

--addpkg acpid

Il comando finale

Ecco il comando con tutte le opzioni presentate poco sopra:

sudo vmbuilder kvm ubuntu --suite intrepid --flavour virtual --arch i386 -o \ --libvirt qemu:///system --ip 192.168.0.100 --part vmbuilder.partition --user user \ --name user --pass default --addpkg apache2 --addpkg apache2-mpm-prefork \ --addpkg apache2-utils --addpkg apache2.2-common --addpkg dbconfig-common \ --addpkg libapache2-mod-php5 --addpkg mysql-client --addpkg php5-cli \ --addpkg php5-gd --addpkg php5-ldap --addpkg php5-mysql --addpkg wwwconfig-common \ --addpkg mysql-server --addpkg unattended-upgrades --addpkg acpid --ppa nijaba \ --mirror http://INDIRIZZO_DEL_MIRROR:9999/ubuntu --tmpfs - --firstboot boot.sh \ --firstlogin login.sh es

Risorse

Per avere maggiori informaioni, per porre qualche domanda o per lasciare dei suggerimenti, contattare l'«Ubuntu Server Team» presso: