Configurare Gentoo per utilizzare Xen
1.
Introduzione
La tecnologia Xen permette
l'esecuzione di più sistemi operativi su una stessa macchina, di gestire
l'occupazione delle risorse ed anche di migrare domini (che sono gli ambienti
virtuali nei quali un sistema operativo ospite viene eseguito) da un sistema
Xen ad un altro. Il sistema operativo che ospiterà gli altri deve supportare
Xen (supporto fornito dal kernel Linux) ma i sistemi ospite possono esser
eseguiti senza modifiche se l'hardware in uso supporta l'Intel
Virtualization Technology (VT-x) o l'AMD Virtualization Technology (SVM).
In caso contrario, anche il sistema operativo ospite dovrà avere il supporto a
Xen.
Attraverso questa guida si conosceranno tutti i passi necessari per ottenere un
sistema Xen funzionante su Gentoo Linux. Non si discuterà di Xen in sé (il
progetto Xen fornisce documentazione
sufficiente) né di configurazioni specializzate che potrebbero essere
interessanti ma non sono strettamente legate a Xen (come esportare Portage via
NFS, avviare Linux usando PXE, ecc.).
2.
Preparare il Domain0
Introduzione
In ambiente Xen, Domain0 è il dominio primario e definisce il sistema
operativo che ospiterà gli altri domini. In questo capitolo si preparerà una
installazione esistente di Gentoo per farla diventare il sistema ospitante di
questo dominio e si compilerà un kernel Xen in modo tale da permettere a Gentoo
di ospitare altri domini Xen.
Ricompilare l'intero sistema Gentoo?
Un cambiamento drammatico che potrebbe essere necessario è la ricompilazione
dell'intero sistema Gentoo con differenti CFLAGS, altrimenti i sistemi
operativi ospite sotto Xen potrebbero avere un serio decadimento delle
prestazioni. Comunque, se si sta solo pianificando di provare Xen, non lo si
sta installando in un ambiente produttivo e non si ha l'ardente desiderio di
ricompilare tutti i programmi, si può saltare questo passo. In questo caso si
noteranno solo cali di prestazione, ma si potrà comunque usare Xen.
Importante:
Si raccomanda, nel caso si vogliano modificare le CFLAGS> per ricompilare
il sistema con una versione di gcc inferiore alla 4, di non aver impostato
-Os in quanto si produrrebbe codice corrotto.
|
Codice 2.1: Modificare le CFLAGS e ricompilare Gentoo |
~# nano -w /etc/make.conf
CFLAGS="-O2 -march=pentium4 -pipe -mno-tls-direct-seg-refs"
~# emerge -e world
|
Se si avvia il sistema usando un ramdisk iniziale (initrd) sarà necessario
rigenerarlo (operazione che è meglio fare eseguendo tutti i passi come se
si stesse ricompilando il kernel).
Installare Xen
Attualmente Xen è composto da numerosi componenti, sarà quindi necessario
installare alcuni pacchetti.
Codice 2.2: Installare Xen |
~# emerge xen xen-tools xen-sources
|
Configurare e compilare il kernel
Si andrà ora a configurare e compilare il kernel col supporto a Xen. Questo
kernel, i cui sorgenti sono disponibili in
/usr/src/linux-2.6.x.z-xen, diverranno il kernel principale che
verrà utilizzato (p.e. per il domain 0). Nella sezione XEN si trovano i
driver per tutti i tipi di periferiche di input/output, ogni driver possiede una
implementazione per backend e frontend. Per il kernel del domain 0
è necessario selezionare le implementazioni backend, queste verrano
utilizzate dagli altri domini (che usano i driver frontend) per
comunicare direttamente con l'hardware.
Naturalmente, non ci si dimentichi di selezionare Xen-compatible come
Processor type and features. Ci si potrebbe meravigliare per quanto
riguarda la gestione della rete: in un dominio ogni interfaccia possiede un
link punto-punto ad un'interfaccia sul domain 0 (chiamata vifX.Y
dove X è il numero del dominio e Y è il numero dell'interfaccia di tale
dominio), in questo modo è possibile configurare la propria rete nel modo che
si vuole (bridging, NAT, ecc.).
Codice 2.3: Abilitare il supporto a Xen per un kernel i386 |
Processor type and features --->
Subarchitecture Type (Xen-compatible)
|
Codice 2.4: Abilitare il supporto a Xen per un kernel x86_64 |
Processor type and features --->
Subarchitecture Type (PC-compatible)
[*] Enable Xen compatible kernel
[*] Support for hot-pluggable CPUs
|
Codice 2.5: Configurare il kernel per il Domain-0 |
Bus options (PCI etc.) --->
[*] PCI support
[ ] Xen PCI Frontend Debugging
Networking --->
Networking options --->
<*> 802.1d Ethernet Bridging
XEN --->
[*] Privileged Guest (domain 0)
<*> Backend driver support
<*> Block-device backend driver
<*> Network-device backend driver
<*> PCI-device backend driver
PCI Backend Mode (Virtual PCI) --->
[*] Scrub memory before freeing it to Xen
[*] Disable serial port drivers
Xen version compatibility (3.0.4 and later)
|
Codice 2.6: Configurare il kernel per un Domain-U |
Bus options (PCI etc.) --->
[ ] PCI support
Device Drivers --->
SCSI device support --->
< > SCSI device support
XEN --->
[ ] Privileged Guest (domain 0)
<*> Block-device frontend driver
<*> Network-device frontend driver
[*] Scrub memory before freeing it to Xen
[*] Disable serial port drivers
Xen version compatibility (3.0.4 and later)
|
Un utile suggerimento è quello di far sì che il processo di creazione del
kernel salvi i file oggetto intermedi da qualche altra parte in modo da poter
riutilizzare gli stessi sorgenti del kernel per configurazioni diverse:
Codice 2.7: Compilare il kernel |
~# mkdir -p ~/build/dom0 ~/build/domU
~# make O=~/build/dom0 menuconfig
~# make O=~/build/dom0 && make O=~/build/dom0 modules_install
|
Una volta compilato il kernel si troverà la sua immagine, chiamata
vmlinuz, direttamente nella directory di compilazione (non dentro
arch/ o in qualche altra directory). Copiarla in /boot
e configurare il bootloader affinché usi l'hypervisor di Xen (uno dei componenti
installati precedentemente) che è stato salvato come /boot/xen.gz.
Nella configurazione del bootloader, indicare a Xen di effettuare il boot
utilizzando il kernel appena generato. In GRUB, ad esempio:
Codice 2.8: Configurazione di GRUB per Xen |
title Xen 3.0 / Gentoo Linux 2.6.x.y
root (hd0,0)
kernel /boot/xen.gz
module /boot/kernel-2.6.x.y-xen0 root=/dev/sda3
|
Una volta riavviato il sistema sarà necessario avviare il demone di Xen:
Codice 2.9: Avviare il demone di Xen |
~# /etc/init.d/xend start
|
Controllare se il sistema funziona normalmente, nel qual caso si potrà
modificare la configurazione del bootloader per rendere predefinito il kernel
di Xen e aggiungere il demone di Xen al runlevel di default così che possa
partire automaticamente ad ogni riavvio del sistema.
Nota:
Se si vuol far partire automaticamente anche i domini ospite ad ogni riavvio,
aggiungere xendomains al runlevel di default e creare un link simbolico
in /etc/xen/auto ai file di configurazione di Xen per i domini
che si vuol far partire.
|
3.
Creare un dominio non privilegiato (Domain-U)
Configurare e compilare il kernel
Si ritorni ai sorgenti del kernel precedentemente utilizzati per il domain 0
e si aggiorni la configurazione. È consigliabile mantenere la configurazione
del nuovo kernel il più simile possibile al kernel principale eccetto per le
impostazioni di XEN dove i driver selezionati dovrebbero essere quelli
per l'implementazione frontend invece che backend.
Compilare il kernel e spostare il file vmlinuz ottenuto dove si
vuole (in questa guida si assume sia in /mnt/data/xen/kernel):
Codice 3.1: Compilare il kernel per il sistema ospite |
~# make O=~/build/domU
~# cp ~/build/domU/vmlinuz /mnt/data/xen/kernel/kernel-2.6.x.y-xen
|
È possibile anche creare una singola immagine del kernel per entrambi i domini
(quello amministrativo e quello non privilegiato). Maggiori informazioni possono
venire trovate nel manuale utente di Xen.
Creare i dischi per un dominio
Per avere maggiori prestazioni è consigliabile dedicare una partizione (o un
volume logico) ad un dominio piuttosto che un filesystem creato su file.
Comunque, se si vuole usare Xen solo per scopi di test, usare una filesystem
creato su file ha i suoi vantaggi (specialmente per quello che riguarda la
manutenzione).
Si può creare un filesystem su file usando dd e mke2fs
(o qualsiasi altro strumento di creazione di filesystem). Per esempio, per
creare un filesystem ext3 di 2 Gbyte:
Codice 3.2: Creare un filesystem su file |
~# dd if=/dev/zero of=/mnt/data/xen/disks/ext3root.img bs=1M count=2048
~# mke2fs -j /mnt/data/xen/disks/ext3root.img
|
Configurare un dominio
Si crei ora un file di configurazione per un dominio Xen. Si possono salvare
questi file di configurazione dove si vuole, per esempio in
/mnt/data/xen/configs. Come esempio, si creerà in file di
configurazione per un piccolo ambiente Gentoo che usi l'immagine del disco
creata precedentemente:
Codice 3.3: Creare un file di configurazione per un dominio |
~# nano -w /mnt/data/xen/configs/gentoo
kernel = "/mnt/data/xen/kernel/kernel-2.6.x.y-xen"
memory = 512
name = "gentoo"
disk = ['file:/mnt/data/xen/disks/ext3root.img,sda1,w']
root = "/dev/sda1 ro"
|
Se come disco si sta usando un device a blocchi (come un volume lvm o una
partizione), usare 'phy:' invece di 'file:' e omettere /dev. Per esempio:
Codice 3.4: Usare un device a blocchi |
disk = [ 'phy:lvm/xen-guest-root,sda1,w' ]
disk = [ 'phy:sdb6,sda1,w' ]
|
Si possono trovare esempi di file di configurazione in /etc/xen.
Far partire il nuovo dominio
Terminata la fase di configurazione, si può far partire il nuovo dominio.
Se l'immagine del disco contiene un sistema operativo, si potrebbe creare e far
partire il dominio usando il comando xm (Xen manager):
Codice 3.5: Creare e far partire un nuovo dominio |
~# xm create /mnt/data/xen/configs/gentoo -c
|
Il dominio dovrebbe partire all'interno del terminale nel quale è stato
eseguito il comando. Nel caso in esempio, comunque, l'immagine del disco è vuota
per cui il dominio non si avvierà. Per ovviare a questo, si può montare
l'immagine in loop ed installarvi Gentoo come fosse un sistema nuovo.
Per scollegarsi dal dominio, premere Ctrl+]. Per ottenere una nuova
connessione alla console del dominio usare xm console gentoo.
Dato che si può avere una sola console per dominio, la si usi solo se non
si può accedere altrimenti (per esempio attraverso SSH).
4.
La rete su un dominio non privilegiato
Introduzione
Xen supporta almeno due metodi per configurare la propria rete (virtuale)
routed e bridged.
Scegliendo un approccio di tipo routed, l'interfaccia all'interno
del dominio non privilegiato verrà connessa all'interfaccia virtuale del dominio
amministrativo. Sul dominio amministrativo (domain 0), l'interfaccia virtuale
sarà collegata alla eth0. L'interfaccia interna al dominio non
privilegiato dovrebbe avere un indirizzo IP sulla stessa rete dell'interfaccia
del dominio amministrativo. Qualsiasi comunicazione a tale indirizzo IP potrà
avvenire solo dal dominio amministrativo a meno di non configurare specifiche
regole di instradamento (NdT. routing).
Scegliendo un approccio di tipo bridged, l'interfaccia predefinita
sul dominio amministrativo diventerà un bridge (NdT: ponte) che accetta
connessioni al dominio virtuale attraverso l'IP del dominio amministrativo.
Interfacce routed
Prima di configurare l'interfaccia del dominio non privilegiato, assicurarsi
che siano caricati i driver Xen netloop e netbk.
Un suggerimento veloce: se si ha netloop come modulo, caricarlo
con nloopbacks=0 in modo che non crei interfacce che puntano alla
periferica di loopback. Modificare quindi il file di configurazione del dominio
ed aggiungervi un istruzione vif come segue.
Codice 4.1: Configurare un'interfaccia virtuale |
~# nano -w /mnt/data/xen/configs/gentoo
vif = [ 'ip=192.168.1.101, vifname=veth1' ]
|
Nel precedente esempio, l'interfaccia verrà creata per il dominio non
privilegiato (nel quale verrà chiamata eth0) e Xen assicurerà che
l'indirizzo 192.168.1.101 sia raggiungibile dal dominio amministrativo
attraverso l'interfaccia veth1.
Questo non significa che all'interfaccia virtuale eth0 verrà
automaticamente assegnato l'indirizzo IP 192.168.1.101, ma piuttosto che, se
non gli si darà tale IP, non verrà connessa con il dominio amministrativo e
quindi non potrà essere raggiunta.
Modificare /etc/xen/xend-config.sxp come segue per configurare
la rete:
Codice 4.2: modificare xend-config.sxp |
~# nano -w /etc/xen/xend-config.sxp
#(network-script network-bridge)
#(vif-script vif-bridge)
(network-script network-route)
(vif-script vif-route)
|
Interfacce bridged
A differenza delle interfacce routed è ora necessario caricare il driver
netloop con nloopbacks=1 (o maggiore) in modo tale che le
periferiche di loopback addizionali verranno usate per creare il bridge.
Per quanto riguarda gli altri moduli, netbk è sempre necessario
così come la funzionalità di bridging (il modulo bridge se
compilato in tal modo).
Modificare il file di configurazione del dominio virtuale e aggiungere il
seguente costrutto vif:
Codice 4.3: Configurare un'interfaccia virtuale |
~# nano -w /mnt/data/xen/configs/gentoo
vif = [ 'ip=192.168.1.101, vifname=veth0' ]
|
Modificare /etc/xen/xend-config.sxp come segue per configurare la
rete:
Codice 4.4: modificare xend-config.sxp |
~# nano -w /etc/xen/xend-config.sxp
(network-script network-bridge)
(vif-script vif-bridge)
# (network-script network-route)
# (vif-script vif-route)
|
Di default, il bridge conterrà qualsiasi interfaccia configurata per essere
l'interfaccia predefinita (la periferica che viene elencata come default
utilizzando il comando ip route list). Se si vuole cambiare questo
comportamento, modificare xend-config.sxp come segue:
Codice 4.5: Modificare xend-config.sxp per cambiare la configurazione del bridge |
~# nano -w /etc/xen/xend-config.sxp
(network-script 'network-bridge netdev=eth0 bridge=xenbr0 vifnum=0')
|
Una volta modificata la configurazione, andrà fatto ripartire xend per
far riflettere le modifiche a Xen:
Codice 4.6: Far ripartire il demone xend |
~# /etc/init.d/xend restart
|
5.
Ulteriori risorse
La documentazione di Xen
Strumenti per Xen
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|