apr 082011
 

OpenNebula è un sistema di cloud simile a OpenStack Nova, più semplice nelle funzionalità ma più maturo.
Si compone di un nodo controllore (il cloud controller), di uno storage con le immagini delle VM e di una serie di nodi di calcolo che possono utilizzare hypervisor KVM, XEN oppure VMWare ESXi.
Il software del nodo controllore è realizzato in ruby e, cosa più interessante, comunica con i nodi di calcolo esclusivamente lanciando comandi in ssh: pertanto sui nodi di calcolo non è necessario installare alcun pacchetto addizionale rispetto ad un hypervisor standard.
Analizziamo l’installazione di un sistema di test formato da un cloud controller che fungerà anche da storage esportando una directory locale tramite NFS e di due nodi di calcolo con XEN. Per il cloud controller ho scelto ubuntu 10.10, mentre per i nodi ho utilizzato la distribuzione Debian 6.0.

Informazioni di rete
IP Gateway: 172.16.0.254/24
IP Cloud Controller: 172.16.0.1/24
IP Nodo 01: 172.16.0.2/24
IP Nodo 02: 172.16.0.3/24

Cloud Controller
Installare la distribuzione Ubuntu 10.10 abilitando esclusivamente il server ssh.
Dopo il riavvio, modificare il file /etc/hosts ed aggiungere:

/etc/hosts
172.16.0.1 cloud-cc
172.16.0.2 cloud-01
172.16.0.3 cloud-02

Installare i pacchetti aggiuntivi necessari per la compilazione di OpenNebula

apt-get install libsqlite3-dev libxmlrpc-c3-dev scons g++ ruby libopenssl-ruby libssl-dev ruby-dev make rake rubygems libxml-parser-ruby1.8 libxslt1-dev libxml2-dev genisoimage libmysqlclient16 libsqlite3-ruby libsqlite3-ruby1.8 mysql-server nfs-common libmysqlclient-dev nfs-kernel-server nfs-common portmap rails thin
gem install nokogiri
gem install json
gem install sinatra
gem install rack
gem install thin
cd /usr/bin
ln -s rackup1.8 rackup

Creazione dello storage per le immagini (images conterrà gli ISO, one conterrà tutto il software necesasario a gestire il cloud) utilizzando un server NFS all’ip 172.16.0.253 che esporta la directory /nfs/public

/etc/export
/srv/cloud           172.16.0.0(rw,sync,no_root_squash)
mkdir -p /srv/cloud/images
mkdir -p /srv/cloud/one
exportfs -a

Creiamo quindi l’utente di gestione del cloud che dovrà essere identico du tutti i server

groupadd cloud
useradd -d /srv/cloud/one  -s /bin/bash -g cloud -m oneadmin
chown -R oneadmin:cloud /srv/cloud/
chmod 775 /srv
id oneadmin #(segnarsi gli id: nel mio caso uid=1001, gid=1001)

Creiamo il database mysql che conterrà tutte le informazioni del nostro cloud: ho scelto di usare mysql in modo da avere maggiori possibilità di scalare in un futuro.

mysql -p
create database opennebula;
create user oneadmin identified by 'oneadmin';
grant all on opennebula.* to 'oneadmin'@'%';
exit;

A questo punto entriamo in modalità non privilegiata e creiamo le credenziali di accesso ssh con certificato in modo da permettere le comunicazioni tra gli host del cloud in forma criptata senza bisogno di inserire la password:

su - oneadmin
ssh-keygen (usare i parametri di default)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chown 640 ~/.ssh/authorized_keys
mkdir ~/.one

Creiamo quindi il file con le variabili di ambiente .profile

.profile
export ONE_AUTH='/srv/cloud/one/.one/one_auth'
export ONE_LOCATION='/srv/cloud/one'
export ONE_XMLRPC='http://localhost:2633/RPC2'
export PATH=$PATH':/srv/cloud/one/bin'

Creiamo il file con le username e password:

/srv/cloud/one/.one/one_auth
oneadmin:password
source .profile

A questo punto siamo pronti per procedere con la compilazione di opennebula, da eseguire come utente non privilegiato “oneadmin”

cd
wget http://dev.opennebula.org/attachments/download/339/opennebula-2.2.tar.gz
tar zxvf opennebula-2.2.tar.gz
cd opennebula-2.2
scons -j2 mysql=yes
./install.sh -d /srv/cloud/one

La configurazione di OpenNebula avviene solo sul cloud controller attraverso la modifica del file etc/oned.conf:

etc/oned.conf
HOST_MONITORING_INTERVAL = 60
VM_POLLING_INTERVAL      = 60
VM_DIR=/srv/cloud/one/var
SCRIPTS_REMOTE_DIR=/tmp/one
DB = [ backend = "mysql",
       server  = "localhost",
       port    = 0,
       user    = "oneadmin",
       passwd  = "oneadmin",
       db_name = "opennebula" ]
VNC_BASE_PORT = 5000
DEBUG_LEVEL=3
NETWORK_SIZE = 254
MAC_PREFIX   = "00:03"
DEFAULT_IMAGE_TYPE    = "OS"
DEFAULT_DEVICE_PREFIX = "hd"
IM_MAD = [
    name       = "im_xen",
    executable = "one_im_ssh",
    arguments  = "xen" ]
VM_MAD = [
    name       = "vmm_xen",
    executable = "one_vmm_ssh",
    arguments  = "xen",
    default    = "vmm_ssh/vmm_ssh_xen.conf",
    type       = "xen" ]
TM_MAD = [
    name       = "tm_nfs",
    executable = "one_tm",
    arguments  = "tm_nfs/tm_nfs.conf" ]
HM_MAD = [
    executable = "one_hm" ]
VM_HOOK = [
    name      = "image",
    on        = "DONE",
    command   = "image.rb",
    arguments = "$VMID"
HOST_HOOK = [
    name      = "error",
    on        = "ERROR",
    command   = "host_error.rb",
    arguments = "$HID -r n",
    remote    = "no" ]
VM_HOOK = [
   name      = "on_failure_resubmit",
   on        = "FAILED",
   command   = "/usr/bin/env onevm resubmit",
   arguments = "$VMID" ]

A questo punto la configurazione del cloud controller è terminata. Con i seguenti comandi avvieremo l’interfaccia il demone di controllo e l’interfaccia web:

one start
sunstone-server -H 0.0.0.0 start

Per avviare automaticamente al boot i due demoni ho modificato opportunamente lo script di startup:

/etc/init.d/one
#! /bin/sh
### BEGIN INIT INFO
# Provides:          opennebula
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: OpenNebula init script
# Description:       OpenNebula cloud initialisation script
### END INIT INFO

# Author: Soren Hansen

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/srv/cloud/one
DESC="OpenNebula cloud"
NAME=one
SUNSTONE=/srv/cloud/one/bin/sunstone-server
DAEMON=/srv/cloud/one/bin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
mkdir -p /var/run/one /var/lock/one
chown oneadmin /var/run/one /var/lock/one
su - oneadmin -s /bin/sh -c "$DAEMON start"
su - oneadmin -s /bin/sh -c "$SUNSTONE -H 0.0.0.0 start"
}

#
# Function that stops the daemon/service
#
do_stop()
{
su - oneadmin -s /bin/sh -c "$SUNSTONE stop"
su - oneadmin -s /bin/sh -c "$DAEMON stop"
}

case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac

:

Inoltre lanciamo il seguente comando per lanciarlo automaticamente:

update-rc.d one defaults

Installazione dei nodi di calcolo
Installare XEN 4.0.1 su Debian 6 abilitando server ssh così come spiegato nel precedente articolo.

Modificare il file /etc/hosts ed aggiungere

172.16.0.1 cloud-cc
172.16.0.2 cloud-01
172.16.0.3 cloud-02

Installare il software aggiuntivo per interagire con il cloud controller

apt-get install ruby nfs-common

Montiamo lo storage per le immagini utilizzando un server NFS all’ip 172.16.0.1 che esporta la directory /nfs/public:

nano /etc/fstab
172.16.0.1:/srv/cloud  /srv/cloud  nfs   soft,intr,rsize=8192,wsize=8192
mkdir -p /srv/cloud
mount /srv/cloud

Creiamo l’utente di gestione del cloud rispettando uid e gid del cloud controller (nel mio caso 1001 e 1001)

groupadd --gid 1001 cloud
useradd --uid 1001 -g cloud -d /srv/cloud/one -s /bin/bash oneadmin

Aggiungiamo le credenziali di accesso ssh con certificato editare il file /srv/cloud/one/.ssh/authorized_keys, duplicando la riga relativa a cloud-cc e impostando il nome host a cloud-01. ad es:

ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-cc
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-01
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-02

Eseguiamo un paio di configurazioni specifiche per XEN. Editare il file /etc/sudoers ed aggiungere:

/etc/sudoers
%cloud    ALL=(ALL) NOPASSWD: /usr/sbin/xm *
%cloud    ALL=(ALL) NOPASSWD: /usr/sbin/xentop *

Anche la configuarzione del nodo di calcolo è ultimata!

Una volta installato anche il secondo nodo, spostarsi sul cloud controller e lanciare i seguenti comandi come utente oneadmin per aggiungere i sue nodi di calcolo al cluster:

onehost create cloud-01 im_xen vmm_xen tm_nfs
onehost create cloud-02 im_xen vmm_xen tm_nfs

Nel prossimo articolo vedremo come testare il sistema creando una nuova macchina virtuale base e usando i comandi shell per gestirla.

apr 072011
 

Premessa
Xen è un sistema di virtualizzazione free ed OpenSource che permette di operare in tutti e tre i metodi possibili di virtualizzazione:
- full virtualization: se la CPU server ospitante non permette di operare in modalità hardware (come VMWare)
- hardware virtualization: se la CPU server ospitante permette di operare in modalità hardware (come KVM)
- paravirtualization: modalità caratteristica di xen in cui il kernel della VM è conscio di essere utilizzato su un ambiente XEN (solo per VM Linux)

Per ulteriori dettagli sui metodi di virtualizzazione potete fare riferimento a questo articolo.

XEN (ribattezzato recentemente XENsource per meglio far capire di cosa si tratta) è il pacchetto che sta alla base dei sistemi “installa e usa” Xenserver e XCP. Questi ultimi permettono di installare su un hardware fisico un intero sistema di virtualizzazione dotato di Kernel Linux, XEN e API di gestione. La differenza tra Xenserver e XCP è che Xenserver è la versione “commerciale” dotata di client Windows per la gestione, mentre XCP è la versione “di sviluppo” completamente Open, un po’ ciò che avviene con Fedora e RedHat.
In qualsiasi caso sia Xenserver, sia XCP implementano una versione di XEN(source) non proprio recentissima, pertanto può essere interessante utilizzare la versione 4.0.1 che introduce novità molto interessanti, tra cui la mia preferita è la reale High Availability. In pratica, con XEN 4.0 è possibile utilizzare la modalita “Remus” per avere la stessa VM (con i dischi in un datastore condiviso) presente contemporaneamente su più server fisici: su un server è “online”, mentre sugli altri è “paused”. In caso di blocco del server “online” la VM viene immediatamente attivata su un altro server mantenendo congruo lo stato della RAM e dei buffer virtuali.

Purtroppo XEN ha immeritatamente risentito della spinta che le primcipali distribuzioni stanno dando a KVM come Hypervisor di default, per cui l’installazione di un server XEN può essere problematica se si va per tentativi.
Dalle prove che ho fatto, il metodo più semplice per installare XEN è partire dalla distribuzione Debian 6.0.1 a 64 bit. Per quanto personalmente non sia un fanatico di Debian, devo dire che questa volta sono stato piacevolmente sorpreso dalla facilità con cui si porta a termine il lavoro.

Installazione

Procediamo innanzi tutto con l’installazione base di Debian 6.0.1 abilitando solo il pacchetto Openssh server

Una volta terminata l’installazione del sistema operativo di base e riavviato il server, procediamo con l’installazione dei pacchetti necessari con:

apt-get install ntp sudo xen-hypervisor-4.0-amd64 linux-image-xen-amd64 xen-qemu-dm-4.0

L’ultimo pacchetto è opzionale e permette di attivare la modalità full/hardware virtualization, utile nel caso in cui si volessero ospitare VM non compatibili con Xen (Windows, ecc.).

L’unica cosa che il sistema si installazione non fa per bene è la configurazione grub; ecco pertanto cosa fare: la prima linea permette di ordinare correttamente il menu di avvio, le successive disattivano l’OS prober per non appesantire inutilmente il menu di avvio (e creare possibili confusioni); l’ultima riga aggiorna la configurazione del bootloader grub.

mv -i /etc/grub.d/10_linux /etc/grub.d/50_linux
echo "" >> /etc/default/grub
echo "# Disable OS prober to prevent virtual machines on logical volumes from appearing in the boot menu." >> /etc/default/grub
echo "GRUB_DISABLE_OS_PROBER=true" >> /etc/default/grub
update-grub2

A questo punto il server è pressochè ultimato: è sufficiente un riavvio per essere operativi.

Riguardo la configurazione Xen, due sono le modifiche che consiglio rispetto alla configurazione di default:

/etc/default/xendomains
XENDOMAINS_RESTORE=false
XENDOMAINS_SAVE=""

/etc/xen/xend-config.sxp
(network-script 'network-bridge antispoof=yes')
(xend-relocation-port 8002)
(xend-relocation-address '')

La prima disattiva la (non molto funzionante) funzionalità di backup e restore dello stato delle VM, la seconda serie attiva la funzionalità antisproofing sull’interfaccia bridge per garantire che le interfacce di rete virtuali siano isolate tra di loro e abilita le funzionalità necessarie per migrare le VM tra più server Xen.

apr 052011
 

Non sono mai stato un gran fan di Debian, francamente preferisco Ubuntu, però ho avuto la necessità di installare Debian Lenny sul Dell PowerEdge 1955 del quale parlavo qualche articolo fa a proposito dell’unità DRAC.
Questo server, come molti server Dell, è dotato di una scheda di rete Broadcomm il cui driver è classificato come “non-free” da debian e pertanto non è incluso nell’ISO di installazione.
All’avvio dell’installazione, infatti, Debian segnala la mancanza del file bnx2-06-4.0.5.fw in quanto non-free e chiede di inserire un disco con il driver per procedere all’installazione.
La soluzione, fortunatamente è abbastanza semplice.
Bisogna scaricare il pacchetto deb dal sito di debian, copiarlo su una chiave USB, inserire la chiave sul server e dare l’OK. In caso di schede multiporta, può essere che debian indichi la presenza sia di schede con Hardware Intel sia di schede con Hardware Broadcomm: debian non ci vede bene, non c’è alcuna scheda intel, per cui scegliere senza scrupolo la scheda broadcomm.
Il link dei driver è qui

mar 062011
 

Risposta: quella che vi piace di più ;-)

Battute a parte, la notevole quantità di distribuzioni Linux esistenti è il punto di forza di questo sistema operativo (sicuramente troverete la distribuzione più adatta alle vostre esigenze), ma dall’esterno spesso si considera questo come una pecca perchè manca una standardizzazione tanto cara a chi arriva dal mondo closed.
Ancora peggio è, a mio avviso, chi fa una “guerra di religione” sulla distribuzione che utilizza denigrando le altre: questo non fa altro che far aumentare l’incertezza per chi, appunto, non è avvezzo a questo mondo e, quindi, facilmente preferirà non spostarsi da ambienti che conosce come Windows o MacOS.

Prima di addentrarci nel mondo delle distribuzioni, andiamo velocemente a capire com’è fatto Linux. Intanto partiamo con un errore: tutti noi parliamo di Linux, però in realtà dovremmo dire GNU/Linux. Difatti, in relatà, Linux è “solamente” il kernel del sistema operativo, cioè quel pezzo di software (che in gergo Linux si chiama pacchetto) che dà delle funzionalità di base e che è atto a dialogare direttamente con l’hardware del computer. Col solo kernel, però, si fa molto poco: per avere un computer in grado di fare qualcosa, si devono caricare altri pacchetti, destinati appunto a fare quel qualcosa. Sono pacchetti, ad esempio la shell (cioè l’ambiente a riga di comando simile al DOS), i programmi per gestire la rete, i programmi per gestire l’ambiente  grafico e così via…
Nel mondo Linux si cerca sempre di riutilizzare ciò che è già stato fatto per cui, ad esempio, un pacchetto per fare da mail server non incorporerà le funzionalità di gestione della rete ma utilizzaerà un pacchetto esterno che le fornisce: in questo caso si parla di “dipendenza”.

Fatta questa premessa, cerchiamo di capire un po’ di più di questo mondo, in modo da avere un piccolo aiuto nella scelta.

Innanzi tutto, premettiamo che nel tempo nel mondo Linux si sono fatti avanti due “colossi”: RedHat e Debian. Molte delle distribuzioni esistenti sulla piazza, in realtà derivano proprio da queste due.