...Installare e configurare XEN...

- Sistema, Rete ed Ambiente Grafico -

(By Dario Maggiari aKa nEcR0SoFt)


In questo articolo vediamo l'installazione e configurazione di XEN (1) (2), una macchina paravirtuale dalle ottime prestazioni che permette di far girare più sistemi operativi (detti GuestOS o domU) al di sopra di un sistema Linux (detto HostOS o dom0).

1. Terminologia

Di seguito sono riportate le descrizioni dei termini più utilizzati nell'articolo:

Virtual Machine (VM): è il termine generico che indica l'ambiente di esecuzione di un Sistema Operativo, cioè un ambiente in cui le risorse hardware sono "virtualizzate" e rese disponibili/visibili ai Sistemi Operativi ospiti.

Virtual Machine Monitor (VMM o Hypervisor): è lo strato del Kernel che permette il monitoraggio/gestione delle VM e che crea, quindi, un livello "monitor" intermedio fra l'HostOS e i GuestOS garantendo isolamento e compatibilità.

HostOS o dom0 (domain privileged): è il sistema operativo su cui è installato XEN. Si tratta di una certa versione di Linux (Debian, Ubuntu, Slackware, Fedora, etc...) su cui è installato il XEN-Kernel che permette la creazione di altre Virtual Machine su cui installare altri Sistemi Operativi (GuestOS). Generalmente ci si riferisce a dom0 anche come "prima Macchina Virtuale" o "Macchina Virtuale privilegiata".

GuestOS o domU (domain unprivileged): è il sistema operativo installato su una VM e quindi "Ospite" dal punto di vista dell'HostOS. Ci si riferisce a questi OS anche come domU, cioè "dominio NON privilegiato" per distinguerli nettamente da dom0. Ad un eventuale Kernel compilato appositamente per un GuestOS Linux ci si riferisce con il termine xenU-Kernel.

2. Installazione dai Sorgenti

Potete installare XEN sia dai sorgenti sia da pacchetti preconfezionati per la vosta distribuzione. Il secondo caso è conveniente sotto sistemi debian-like (come Ubuntu) poichè il processo è generalmente più veloce anche se meno flessibile ai cambiamenti e alle correzioni di errori rispetto all'installazione dai sorgenti. Visto che l'installazione dal sorgente è il metodo più universale, adottabile senza problemi su qualsiasi distribuzione, procederemo alla descrizione di questo tipo d'installazione. Per una trattazione sull'installazione di XEN su sistemi debian-like vedasi il seguente link: https://help.ubuntu.com/community/Xen.

Scaricate i sorgenti dell'ultimo XEN disponibile QUI. Dopo aver scaricato il sorgente è sufficiente compilarlo come un normale kernel Linux ma NON prima di aver scaricato la versione del Kernel di Linux originale corrispondente. Per la versione 3.1 di XEN è necessario scaricare il kernel 2.6.18 QUI. E' necessario scaricare la versione in bz2 e posizionarla sotto la directory creata dopo la scompattazione di XEN (la directory dovrebbe avere un nome come xen-3.1.0-src). Il processo di configurazione/compilazione di XEN altro non fa che modificare il Kernel originale 2.6.18 di Linux applicando una serie di "patch" che "virtualizzano" il Kernel rendendolo in grado di gestire delle VM su cui saranno installati i GuestOS.

Generalmente è necessario riconfigurare il Kernel prima dell'installazione poichè la maggior parte delle volte mancano le opzioni per i ponti IDE/ISA che non permettono di avviare correttamente il XEN-Kernel ritornando errori molto comuni in fase di avvio quali:

"Please append a correct "root=" boot option
Kernel panic: VFS: Unable to mount root fs on unknown-block(0,0)"

Quindi, dalla directory dei sorgenti di XEN digitare:

make linux-2.6-xen-config CONFIGMODE=menuconfig (or xconfig)

A questo punto potete configurare il XEN-Kernel come un normale Kernel Linux. Potete, ovviamente, caricare anche un file di configurazione precedentemente confezionato. Potete scaricare QUI un config abbastanza universale che dovrebbe permettervi di far avviare il XEN-Kernel sulla maggior parte delle macchine comuni. NOTA: questo config è valido SOLO per la versione del kernel 2.6.18.

Una volta salvata la nuova configurazione, uscite e digitate i comandi:

make

Avvia il processo di compilazione. Errori in questa fase sono dovuti a mancanza di componenti e librerie sulla vostra Linux-Box come ad esempio gettext, Latec o estensioni gcc.

make install

Provvede all'installazione del XEN-Kernel nella directory /boot del vostro sistema e dei tool necessari alla gestione di XEN.

Prima di procedere oltre è necessaro verificare che il sistema possa avviarsi correttamente con il XEN-Kernel. E' necessario, quindi, configurare il proprio boot-loader per avviare XEN.

3. Configurare il boot-loader

E' necessario che abbiate installato GRUB come boot-loader sul vostro sistema. Sfortunatamente nessun altro boot-loader (come, ad esempio, LILO) è in grado di caricare il XEN-Kernel. Supponendo che abbiate già installato GRUB, è sufficiente modificare il file menu.lst generalmente presente sotto /boot/grub:

 title ->XEN3.1-2.6.18
      kernel /boot/xen-3.1.gz
      module /boot/vmlinuz-2.6.18-xen root=<your_root> ro console=tty0

      #Per l'uso di un'immagine di avvio (riga seguente) continuare a leggere!!
      module /boot/initrd-2.6-xen.img


A seconda di come avete compilato il Kernel non avete bisogno dell'initrd che, inoltre, è generalmente fonte di problemi. Ad ogni modo, se dopo tutti i tentativi di ricompilazione del caso (componenti FS compilate statiche, BUS Option IDE/ISA compilate statiche per la vostra architettura, etc...) incontrate ancora problemi al boot, potete generare una immagine di avvio con i comandi seguenti (adattati alla vostra versione di Xen):

depmod 2.6.18-xen
mkinitrd -o /boot/initrd-2.6-xen.img 2.6.18-xen


In caso stiate utilizzando una distribuzione recente (ultime versioni di Ubuntu, Fedora o simili...) potreste non avere a disposizione il comando mkinitrd ma bensì mkinitramfs. In questo caso la sintassi resta comunque invariata:

depmod 2.6.18-xen
mkinitramfs -o /boot/initrd-2.6-xen.img 2.6.18-xen


il parametro <your_root> deve essere rimpiazzato con la vostra root partition, cioè la partizione di "/" su cui è installato il vostro Linux HostOS (tipo /dev/hda1).

A questo punto dovreste essere in grado di riavviare il sistema utilizzando il XEN-Kernel dal menu di GRUB all'avvio.

4. Istanziare le VM ed "installare" i GuestOS

Una volta avviato dom0 dovrebbe essere possibile utilizzare il sistema Linux normalmente, avviando anche il vostro WM preferito. Fate un controllo preliminare sulle risorse riconosciute quali schede di rete, schede audio, mouse, etc...Se manca qualcosa è necessaria una riconfigurazione del Kernel o un caricamento dei moduli adeguato. Ad ogni modo, se esistono i supporti compilati nel Kernel (o staticamente o come modulo), non dovreste incontrare problemi poichè nelle fasi di avvio del sistema vengono processati i medesimi script di init che utilizzate per il sistema Linux su cui non è installato XEN.

Per gestire le VM è necessario avviare un demone dal nome xend che è consigliabile inserire in qualche script di avvio in modo da averlo avviato sempre automaticamente quando caricate il XEN-Kernel. Vedasi successivamente per un esempio di script di avvio con tutte le configurazioni necessarie al corretto funzionamento delle VM e del dom0.

Lanciato il demone xend potete verificare lo stato della prima macchina virtuale digitando:

xm list

xm
è il comando principale di XEN che permette, con vari parametri, di gestire le VM. E' possibile crearle, distruggerle, riavviarle, etc...E' sufficiente digitare xm senza parametri per verificare le differenti possibilità di utilizzo. Il comando precedente visualizza lo stato di tutte le macchine virtuali correntemente in uso. Inizialmente dovreste visualizzare soltanto le informazioni relative a dom0.

    4.1 Linux domU

E' il momento di installare qualche GuestOS Linux per il test delle VM. Questa parte è notevolmente dipendente dalla distribuzione di Linux installata come HostOS poichè possono essere possibili diverse modalità di installazione/creazione di un GuestOS. Ad esempio, per i sistemi Debian-like è consigliato l'utilizzo di debootstrap, mentre per i sistemi Red-Hat-Based si utilizza rpmstrap che permettono di creare delle immagini di un OS che verrà caricato all'interno di una VM.

E' possibile velocizzare e semplificare questo passaggio recuperando delle immagini preconfezionate di diversi LinuxOS (GuestOS-Image) direttamente da Jailtime. Qui sono disponibili varie immagini di Linux OS quali Debian 3.1, Slackware 11 o Fedora Core 6. E' sufficiente scompattarle e modificarne la dimensione poichè, inizialmente, hanno una dimensione pari ad 1GB che generalmente non è sufficiente se si vuole installare altro software nei GuestOS (si deve considerare che queste immagini sono minimali e quindi prive di qualsiasi software aggiuntivo. Manca anche l'ambiente grafico che deve essere installato a parte, come non sono presenti altri tool solitamente utili/necessari come apache, postfix, clamav, etc...soprattutto in ambito Server).

A tal scopo potete utilizzare questo script (copiate ed incollate questo script in un file dal nome resize_script dandogli i permessi di esecuzione con chmod 775 resize_script):

#!/bin/sh
    dd if=/dev/zero of=$1 bs=1M conv=notrunc count=1 seek=$2
    losetup /dev/loop0 $1
    e2fsck -f /dev/loop0
    resize2fs /dev/loop0
    e2fsck -f /dev/loop0
    losetup -d /dev/loop0

Passando come primo parametro il nome dell'immagine da ridimensionare e come secondo parametro la nuova dimensione dell'immagine in MB, come da esempio seguente:

./resize_script debianGuest.img 2500

Ovviamente lo script va eseguito da root.

All'interno di queste immagini trovate anche i file di configurazione necessari all'avvio della VM in cui girerà l'OS scelto. Per default tali file devono essere posizionati sotto la cartella "/etc/xen". Il file di configurazione è simile al seguente:

kernel = "/boot/vmlinuz-2.6.18-xen"   #Ovviamente, adattate la configurazione alla vostra versione di XEN.
memory = 128
name = "debian.3-1-guest01"
vif = [ 'bridge=xenbr0' ]
dhcp = "dhcp"
disk = ['file:/path/debian.3-1-guest01.img,sda1,w','file:/path/debian-guest01.swap,sda2,w' ]
root = "/dev/sda1 ro"
                     make linux-2.6-xenU-config CONFIGMODE=menuconfig [OPZIONALE, solo se si vuole una configurazione particolare del xenU kernel]
                     make linux-2.6-xenU-build
                     depmod
                     make linux-2.6-xenU-install
                            mount /path/immagine.img /mnt/punto_mount -o loop
Ipotizzando di aver una GuestOS-Image di debian possiamo salvare la configurazione precedente in un file dal nome debianGuest01 sotto la direcotry "/etc/xen".  A questo punto dovreste essere in grado di avviare una VM con il seguente comando:

xm create -c debianGuest01 vmid=1

Nella console avrete, quindi, un'altra distribuzione di Linux a tutti gli effetti funzionante e isolata dal dom0. Potete quindi installare ciò che preferite (X compreso, vedasi successivamente per l'utilizzo dell'ambiente grafico nelle VM) utilizzando i consueti strumenti della distribuzione scelta.

    4.2 Windows domU

NOTA: Per far girare un sistema Windows tramite XEN è necessario che il vostro hardware supporti la tecnologia HVT (Hardware Virtualization). Nello specifico è il processore che deve possedere il set di istruzioni necessario per la virtualizzazione. Esempi sono IVT di intel e Pacifica di AMD. Se il vostro processore NON possiede questo supporto NON potete far girare sistemi Windows, come GuestOS, sulla vostra macchina utilizzando XEN.

Per utilizzare Windows come GuestOS è necessario installarlo, solitamente in un file d'immagine, a partire dal file iso o dal cdrom. Il file di configurazione necessario per creare una macchina virtuale in cui lanciare l'installazione di Windows è riportato di  seguito.

NOTA: All'atto dell'installazione dovete utilizzare il seguente file specificando l'opzione "boot = 'd'".

kernel = "/usr/lib/xen/boot/hvmloader"
#builder='linux'
builder='hvm'
memory = 256
name = "WinXPGuest"
vif = [ 'bridge=xenbr0' ]
disk = [  'file:/path/winxp.img,hda3,w', 'file:/path/winiso.iso,hdc:cdrom,r' ]
boot = 'd'
device_model = '/usr/lib/xen/bin/qemu-dm'
cdrom = '/home/winiso.iso'
root = "/dev/hda3 ro"
extra = "4"
vnc = 1
vncviewer = 1
sdl = 0
stdvga = 0
serial = 'pty'
ne2000 = 0

Terminata l'installazione cambiate il parametro boot in "boot = 'c'". Prestate attenzione alle voci "kernel" e "builder" che sono differenti rispetto al caso precedente (l'opzione "builder" era omessa nella configurazione precedente poichè "linux" è il parametro di default).

Tricks:

1]
Per creare una immagine di WindowsXP avviabile potete usare il seguente comando:

dd if=/dev/cdrom of=winiso.iso

Dove, ovviamente, /dev/cdrom è il device in cui è presente il CD di installazione di WindowsXP (NON montato).

2]
Potete avviare come macchina virtuale anche un WindowsXP precedentemente installato sulla vostra macchina senza, quindi, installarlo in un fiile immagine locale come visto in precedenza. In questo caso, è sufficiente modificare l'opzione disk in modo simile al seguente:

disk = ['phy:/dev/hda2,sda1,w']

Specificando che la partizione hda2 di WindowsXP vista dal Dom0 deve essere esportata read-write in un nuovo dominio sda1. Ovviamente,anche il parametro root deve essere impostato a /dev/hda2.

5. Configurare la Rete

La configurazione della rete è uno degli aspetti più delicati ed importanti di XEN. Il corretto funzionamento della rete avviene utilizzando le cosiddette interfacce dummy che permettono di creare un ponte "trasparente" tra i domU e dom0, mantenendo inalterata la capacità di connessione di dom0 stesso (esistono altri sistemi forse più rapidi di bridging diretto fra domU e dom0 che, però, impediscono il corretto funzionamento della rete da parte di dom0 stesso...). Una volta eseguito xend, se digitate il comando "ifconfig" da dom0 dovrebbe apparirvi un output simile al seguente:

eth0      Link encap:Ethernet  HWaddr 00:C0:9F:82:EA:80 
          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::2c0:9fff:fe82:ea80/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:51 errors:0 dropped:0 overruns:0 frame:0
          TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7864 (7.6 KiB)  TX bytes:3047 (2.9 KiB)
          Interrupt:20 Base address:0xe000

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

vif0.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF 
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:10624 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15792 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:787766 (769.3 KiB)  TX bytes:19487567 (18.5 MiB)

vif1.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF 
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:3685 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3670 errors:0 dropped:2 overruns:0 carrier:0
          collisions:0 txqueuelen:32
          RX bytes:14173450 (13.5 MiB)  TX bytes:262684 (256.5 KiB)

vif2.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF 
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:12104 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6953 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:32
          RX bytes:5092861 (4.8 MiB)  TX bytes:524908 (512.6 KiB)

xenbr0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:440 (440.0 b)  TX bytes:238 (238.0 b)

xenbr1    Link encap:Ethernet  HWaddr 00:00:00:00:00:00 
          inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:468 (468.0 b)

Oltre ad eth0 e lo, le interfacce che vedete sono "interfacce di rete virtuali" create automaticamente da XEN. Lo scopo è quello di eseguire un "ponte" ("bridge", appunto) fra dom0 e domU usando i xenbr (XEN Bridge) messi a disposizione da XEN.

NOTA: Se non visualizzate nulla al di fuori di eth0/lo, è probabile che non siano installati i pacchetti per il bridge-control (brctl). Se controllate nel file di log /var/log/xen/xend.log dovreste trovare degli errori che riguardano proprio brctl. Su Ubuntu ed i sistemi Debian-Like dovreste trovare le utility necessarie nel pacchetto bridge-utils.

E' necessario, prima di tutto, creare l'interfaccia dummy come segue:

1. Inserite i seguenti parametri in /etc/modprobe.conf:
               
    alias dummy dummy0

    options dummy numdummies=1

2. Caricate il modulo dummy (inserite il seguente comando in qualche script di avvio in modo da essere certi che il modulo sia caricato ad ogni avvio della macchina):               

    modprobe dummy


3. Assegnate alla nuova dummy-interface un indirizzo IP differente da quello della vostra interfaccia fisica. Ad esempio, se eth0 ha indirizzo IP 192.168.0.4 potete digitare:               
    ifconfig dummy0 192.168.10.10


4. A questo punto create un file con nome, ad esempio, my-scriptnet con il seguente contenuto:              

    #!/bin/bash

        dir=$(dirname "$0")
        "$dir/network-bridge" "$@" vifnum=0 netdev=dummy0 bridge=xenbr0

fornitegli i permessi di esecuzione:

    chmod 775 my-scriptnet

e spostatelo nella cartella "/etc/xen/scripts".

5. Editate il file "/etc/xen/xend-config.sxp" come segue:

#
# Xend configuration file.
#

(xend-relocation-server yes)

# The hosts allowed to talk to the relocation port.  If this is empty (the
# default), then all connections are allowed (assuming that the connection
# arrives on a port and interface on which we are listening; see
# xend-relocation-port and xend-relocation-address above).  Otherwise, this
# should be a space-separated sequence of regular expressions.  Any host with
# a fully-qualified domain name or an IP address that matches one of these
# regular expressions will be accepted.
#
# For example:
#  (xend-relocation-hosts-allow '^localhost$ ^.*\.example\.org$')
#
#(xend-relocation-hosts-allow '')
(xend-relocation-hosts-allow '^localhost$')

##
# To bridge network traffic, like this:
#
# dom0: fake eth0 -> vif0.0 -+
#                            |
#                          bridge -> real eth0 -> the network
#                            |
# domU: fake eth0 -> vifN.0 -+
#
# use
#
(network-script my-scriptnet)

# The script used to control virtual interfaces.  This can be overridden on a
# per-vif basis when creating a domain or a configuring a new vif.  The
# vif-bridge script is designed for use with the network-bridge script, or
# similar configurations.
#
# If you have overridden the bridge name using
# (network-script 'network-bridge bridge=<name>') then you may wish to do the
# same here.  The bridge name can also be set when creating a domain or
# configuring a new vif, but a value specified here would act as a default.
#
# If you are using only one bridge, the vif-bridge script will discover that,
# so there is no need to specify it explicitly.
#
(vif-script vif-bridge)

# Dom0 will balloon out when needed to free memory for domU.
# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to.
# If dom0-min-mem=0, dom0 will never balloon out.
(dom0-min-mem 196)

# In SMP system, dom0 will use dom0-cpus # of CPUS
# If dom0-cpus = 0, dom0 will take all cpus available
(dom0-cpus 0)

6. A questo punto potete riavviare il demone di xen digitando il comando:

xend restart

Nell'output di "ifconfig" devono apparire, ora, 2 nuove voci:

dummy0    Link encap:Ethernet  HWaddr 66:6B:32:F4:4E:78 
          inet addr:192.168.10.10  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::646b:32ff:fef4:4e78/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15791 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10624 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:19487497 (18.5 MiB)  TX bytes:787766 (769.3 KiB)

pdummy0   Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF 
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:882 (882.0 b)

In questo modo si è eseguito un ponte "trasparente" tra dummy0 e xenbr0 che è, di default, "collegato" ad eth0. In questo modo è quindi possibile creare una sorta di LAN fra i domU e dom0 utilizzando dom0 come gateway per la rete esterna, avendo anche il vantaggio di non modificare alcuna configurazione di rete per i domU qualora si cambi indirizzo di rete per eth0.

7. E', quindi, necessario configurare l'interfaccia di rete per i domU settando come gateway l'interfaccia dummy0 configurata in dom0. Con GuestOS Debian potete modificare direttamente il file "/etc/network/interfaces" come segue:

auto eth0
iface eth0 inet static
        address 192.168.10.11
        netmask 255.255.255.0
        network 192.168.10.0
        broadcast 192.168.10.255
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers <dns_server>
        gateway 192.168.10.10 #DEVE ESSERE L'INDIRIZZO DELL'INTERFACCIA DUMMY0 IN DOM0.
 
8. Per finire è necessario inserire qualche regola di iptables e raffinare qualche configurazione di rete per permettere il FORWARD fra le interfacce di rete fisiche<->virtuali.

Le operazioni necessarie da eseguirsi sono le seguenti (Vedasi paragrafo 7 per uno script riassuntivo):

#Disabilita il blocco del bridging a livello di iptables.
/sbin/sysctl -w net.bridge.bridge-nf-call-iptables="0"
#Se il comando precedente non funziona (non disponete di sysctl) utilizzate il comando seguente assicurandovi di aver caricato il modulo bridge con "modprobe bridge":
#echo "0" > /proc/sys/net/bridge/bridge-nf-call-iptables
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo "1" > /proc/sys/net/ipv4/ip_forward
/usr/sbin/iptables -t nat -F
/usr/sbin/iptables -F
/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

6. Emulare il ServerX tramite VNC (Linux GuestOS)

Per utilizzare il server X sotto un domU è necessario appoggiarsi ad un sistema di virtualizzazione dei display grafici esterno a XEN. Non è possibile lanciare direttamente il comando "startx" all'interno di domU, poichè con questo comando si cerca di collegarsi direttamente al device fisico (scheda video) che, ovviamente, è già lockato dal dom0.

Per abilitare l'accesso ad un WM su un domU dovete seguire i seguenti passi:

- Su Dom0

E' necessario installare il viewer che realizza il ponte fra il "display virtuale" del domU e il "display reale" di dom0.

Sotto sistemi Debian-Like potete installare xvncviewer:

apt-get install xvncviewer

Sotto Slackware o altri sistemi è più facile reperire il pacchetto TightVNC.

- Su DomU

E' necessario installare prima di tutto il sistema X. Questo è dipendente dalla distribuzione che avete scelto come GuestOS (XFree o Xorg). Ad esempio, sotto Debian Sarge è necessario digitare:

apt-get install x-window-system-core

Successivamente installate i seguenti pacchetti: rxvt, vncserver, xdm.

Dovete installare uno o più WM leggeri quali: xfce4, fluxbox o icewm-experimental. Nessuno vieta di installare anche Gnome o KDE ma sono generalmente WM troppo pesanti per essere eseguiti su una VM.

L'utility d'installazione per la vostra distribuzione dovrebbe risolvere automaticamente tutte le dipendenze. Per questo è consigliato di scegliere GuestOS semplici da gestire da questo punto di vista come Debian (apt-get) o Fedora (yum).

A questo punto è sufficiente configurare XDM per essere eseguito via VNC digitando:

echo ':0 /usr/bin/Xvnc /usr/bin/Xvnc -geometry 1024x768 -depth 24' \ > /usr/X11R6/lib/X11/xdm/Xservers

L'opzione "geometry" indica la risoluzione dello schermo virtuale che verrà visualizzato all'avvio di X per un domU. Scegliete quella più opportuna in relazione alla vostra risoluzione su dom0.

Infine fermate e riavviate XDM:

/etc/init.d/xdm stop
/etc/init.d/xdm start

A questo punto è necessario soltanto collegare il display reale a quello virtuale tramite il comando xvncviewer (o vncviewer se si è installato TightVNC).

Quindi da dom0 digitate:

xvncviewer <ip_domU>

o

vncviewer <ip_domU>

In questo modo dovrebbe visualizzarsi una nuova finestra in cui appare XDM che vi abilita al login grafico.

    6.1 Tips&Tricks Grafici

    6.2 Problemi di avvio del ServerX in Dom0

7. Script di avvio per la configurazione di XEN

Di seguito riportiamo uno script che potete far caricare al sistema direttamente all'avvio. Lo script riconosce automaticamente la versione del Kernel caricata e quindi si comporta di conseguenza effettuando le configurazioni necessarie qualora si avvii uno XEN-Kernel. Sotto Slackware potete inserire questo script in "/etc/rc.local", su sistemi Debian-like potete inserirlo in uno script in "/etc/init.d".

KERNEL=$(uname -r)

if [ ! $KERNEL = "2.6.18-xen" ]; then
    echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    #Others your personal options for NON-XEN_Kernel

else #XEN_Kernel
    #Modules
    modprobe dummy
    #modprobe bridge

    #DUMMY INTERFACE UP.
    echo "Setting up dummy Interface for bridge..."
    ifconfig dummy0 192.168.10.10

    #XEN start.
    echo "Load XEND Daemon..."
    xend start > /dev/null
   
    #DUMMY/NET OPTIONS
    /sbin/sysctl -w net.bridge.bridge-nf-call-iptables="0"
    #echo "0" > /proc/sys/net/bridge/bridge-nf-call-iptables

    echo "1" > /proc/sys/net/ipv4/ip_forward

    echo "1" > /proc/sys/net/ipv4/ip_dynaddr

    /usr/sbin/iptables -t nat -F
    /usr/sbin/iptables -F
    /usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE   
fi

8. Un Esempio di esecuzione di VM

Nello snapshot seguente si vedono 2 Debian Sarge che girano come domU (WM utilizzati: XFCE4 e Fluxbox) sopra ad una Slackware 12 dom0 (XFCE4).

http://necrosoft.altervista.org/immagini/screen1.jpg

Dario Maggiari aKa nEcR0SoFt - 2007