Con questo howto vorrei aiutare tutti quelli che come me si sono trovati in difficoltà nell'installazione di xen 3.1.0 sulla Slackware 12. Vedremo come, partendo dai sorgenti di xen, sia possibile creare dei pacchetti per Slackware.
Prima di tutto due paroline su Xen. ( da wikipedia ) Xen è un monitor di macchine virtuali Open Source rilasciato sotto licenza GPL per piattaforma x86 e compatibili (al momento sono in corso dei port per x86-64 e per IA-64) sviluppato presso il Computer Laboratory dell'Università di Cambridge.
Xen consente una completa emulazione hardware senza andare a ridurre in modo drastico le risorse del sistema, emulando sistemi operativi diversi tra loro. Contrariamente ad altri software di virtualizzazione, Xen non mira a creare un'emulazione dell'hardware di un generico computer x86 su cui far girare il sistema operativo, ma piuttosto di regolare e controllare l'accesso alle risorse fisiche della macchina da parte delle varie istanze delle macchine virtuali; questo approccio prende il nome di paravirtualizzazione ed è simile a ciò che si utilizza nel campo dei mainframe e dei supercomputer.
Il virtual machine monitor di macchine virtuali (in gergo hypervisor) è implementato direttamente nell'hardware dei processori. Questo tipo di approccio consente di ottenere un decadimento delle prestazioni minimo rispetto all'esecuzione non-virtualizzata, poiché le istruzioni provenienti dalle macchine virtuali vengono eseguite quasi tutte direttamente sul processore, senza l'intervento di un sistema operativo che si ponga tra la macchina virtuale e le risorse fisiche. Tuttavia questo comporta che il sistema operativo destinato a girare sulla macchina virtuale (guest) debba essere portato ( e io aggiungo patchato per chiarezza ) per essere reso compatibile con Xen, in quanto alcune chiamate di sistema del kernel non sarebbero possibili.Invece non è necessario ricompilare le applicazioni, in quanto i kernel Xenizzati espongono la stessa Application binary interface (ABI).
Sistema
- Slackware 12
xen 3.1.0
glibc 2.5 ricompilate ( vedi dopo )
Innanzi tutto dobbiamo disporre dei sorgenti di xen3.1.0 reperibili all'indirizzo
http://xen.org/download/
oppure provate se funziona questo link diretto
Codice: Seleziona tutto
root@darkstar:/# wget http://bits.xensource.com/oss-xen/release/3.1.0/src.tgz/xen-3.1.0-src.tgzCodice: Seleziona tutto
root@darkstar:/# cd /
root@darkstar:/# tar -xzvf xen-3.1.0-src
root@darkstar:/# cd xen-3.1.0-src
root@darkstar:/xen-3.1.0-src# su
root@darkstar:/xen-3.1.0-src# make world
Adesso andremo a preparare l'ambiente per la pacchettizzazione Slackware di xen. Creeremo 5 pacchetti :
xen_base-3.1.0.tgz
xen_kernel_dom0-3.1.0.tgz
xen_kernel_domU-3.1.0.tgz
xen_tools-3.1.0.tgz
xen_docs-3.1.0.tgz
Creiamo le directory che utilizzeremo come appoggio per la creazione dei pacchetti slackware. In queste directory verranno installati i binari frutto delle diverse compilazioni.
Codice: Seleziona tutto
root@darkstar:/# cd tmp/
root@darkstar:/tmp# mkdir package-xen-base
root@darkstar:/tmp# mkdir package-xen-tools
root@darkstar:/tmp# mkdir package-xen-kernel-dom0
root@darkstar:/tmp# mkdir package-xen-kernel-domU
root@darkstar:/tmp# mkdir package-xen-docsCompilazione di Xen ( base – tools -docs )
Codice: Seleziona tutto
root@darkstar:/tmp# cd /xen-3.1.0-src
root@darkstar:/xen-3.1.0-src# make DESTDIR=â€/tmp/package-xen-base†install-xen
root@darkstar:/xen-3.1.0-src# make DESTDIR=â€/tmp/package-xen-tools†install-tools
root@darkstar:/xen-3.1.0-src# make DESTDIR=â€/tmp/package-xen-docs†install-docs
Procediamo ora alla configurazione e compilazione del kernel dom0. Nella directory buildconfigs ( xen-3.1.0-src/buildconfigs ) ci sono una serie di file del tipo mk.linux-X.Y-*, dove X.Y sta per la versione del kernel di xen ( nel mio caso è la 2.6 ) e * sta per xen, xen0, xenU, native e altro ancora. A noi interessano xen0 per dom0 e xenU per i domU. Procediamo allora creazione del nostro kernel per la dom0:
Codice: Seleziona tutto
root@darkstar:/xen-3.1.0-src# make linux-2.6-xen0.config CONFIGMODE=menuconfigCodice: Seleziona tutto
root@darkstar:/xen-3.1.0-src# make DESTDIR=â€/tmp/package-xen-kernel-dom0†linux-2.6-xen0.build Codice: Seleziona tutto
root@darkstar:/xen-3.1.0-src# make DESTDIR=â€/tmp/package-xen-kernel-dom0†linux-2.6-xen0.installCompilazione del kernel domU
Passiamo ora alle domU. Il procedimento è praticamente identico a quello effettuato per la dom0.
Codice: Seleziona tutto
root@darkstar:/xen-3.1.0-src# make linux-2.6-xenU.config CONFIGMODE=menuconfigCodice: Seleziona tutto
root@darkstar:/xen-3.1.0-src# make DESTDIR=â€/tmp/package-xen-kernel-domU†linux-2.6-xenU.build
root@darkstar:/xen-3.1.0-src# make DESTDIR=â€/tmp/package-xen-kernel-domU†linux-2.6-xenU.installCreazione dei pacchetti slack
Ora che tutto il necessario è stato compilato, procediamo alla creazione dei pacchetti per Slackware.
Codice: Seleziona tutto
root@darkstar:/xen-3.1.0-src# cd /tmp/package-xen-base
root@darkstar:/tmp/package-xen-base# makepkg -l y -c n /tmp/xen_base-3.1.0-i386-1pedro.tgz
root@darkstar:/tmp/package-xen-base# cd /tmp/package-xen-tools
root@darkstar:/tmp/package-xen-tools# makepkg -l y -c n /tmp/xen_tools-3.1.0-i386-1pedro.tgz
root@darkstar:/tmp/package-xen-tools# cd /tmp/package-xen-docs
root@darkstar:/tmp/package-xen-docs# makepkg -l y -c n /tmp/xen_docs-3.1.0-i386-1pedro.tgz
root@darkstar:/tmp/package-xen-docs# cd /tmp/package-xen-kernel-dom0
root@darkstar:/tmp/package-xen-kernel-dom0# makepkg -l y -c n /tmp/xen_kernel_dom0-3.1.0-i386-1pedro.tgz
root@darkstar:/tmp/package-xen-kernel-dom0# cd /tmp/package-xen-kernel-domU
root@darkstar:/tmp/package-xen-kernel-domU# makepkg -l y -c n /tmp/xen_kernel-domU-3.1.0-i386-1pedro.tgzCodice: Seleziona tutto
root@darkstar:/tmp/package-xen-kernel-dom0# cd /tmp
root@darkstar:/tmp# ls
...
...
xen_base-3.1.0-i386-1pedro.tgz
xen_kernel_dom0-3.1.0-i386-1pedro.tgz
xen_kernel_domU-3.1.0-i386-1pedro.tgz
xen_tools-3.1.0-i386-1pedro.tgz
xen_docs-3.1.0-i386-1pedro.tgz
...
...Installazione pacchetti Slackware
Procediamo all'installazione :
Codice: Seleziona tutto
root@darkstar:/tmp# installpkg xen_*Ora il vostro sistema xen è pronto per essere operativo. Mancano però ancora alcuni “piccoli†accorgimenti!
Nella directory /boot vi ritroverete 2 immagini del kernel vmlinuz-2.6.18-xen0 e vmlinuz-2.6.18-xenU fiammanti e uno xen-3.1.0.gz con diversi link simbolici che lo puntano.
Aggiornamento di grub
Diciamo ora a grub che esiste xen aggiungendo le seguenti righe al file /boot/grub/menu.lst o chi per lui:
Codice: Seleziona tutto
# Xen bootable partition config begins
title Xen on (/dev/hdb2)
root (hd1,1)
kernel /boot/xen-3.1.0.gz mem=512M dom0_mem=262144
module /boot/vmlinuz-2.6-xen0 root=/dev/hdb2 ro console=vga vga=791
boot
savedefault fallback
# Xen bootable partition config endsCodice: Seleziona tutto
root@darkstar:/tmp# cat /etc/fstab
/dev/hdb1 swap swap defaults 0 0
/dev/hdb2 / ext3 defaults 1 1
/dev/hda1 /Win ntfs ro 1 0
/dev/hda5 /WinShared ntfs ro,users 1 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0 0
shm /dev/shm tmpfs defaults 0 0
Vediamo ora nel dettaglio cosa abbiamo a grub:
mem indica quanta memoria fisica ( espressa in Megabyte ) dedicare a xen;
dom0_mem indica quanta di questa memoria dedicare alla dom0; vi confesso che non mi è molto chiara la distinzione, quindi si accettano chiarimenti in merito.
savedefault fallback serve per indicare a grub cosa far partire nel caso in cui fallisse il boot dell'hypervisor. Per questo comando vi rimando alla documentazione relativa al grub.
Ricompilazione delle glibc-2.5 e di sysvinit
Se ora provate a riavviare la macchina e a far partire xen selezionandolo dal menu di avvio al boot, dovrebbe andare tutto bene tranne che per un messaggio di warning:
Codice: Seleziona tutto
***************************************************************
***************************************************************
** WARNING: Currently emulating unsupported memory accesses **
** in /lib/tls glibc libraries. The emulation is **
** slow. To ensure full performance you should **
** install a 'xen-friendly' (nosegneg) version of **
** the library, or disable tls support by executing **
** the following as root: **
** mv /lib/tls /lib/tls.disabled **
** Offending process: init (pid=1) **
***************************************************************
*************************************************************** Codice: Seleziona tutto
root@darkstar:/tmp# getconf GNU_LIBPTHREAD_VERSION
NPTL 2.5
root@darkstar:/tmp# getconf GNU_LIBC_VERSION
glibc 2.5
Riavviamo il sistema con il nostro kernel preferito ( non xen ) e scarichiamo i sorgenti delle glibc e di sysvinit dal cdrom della Slackware.
Codice: Seleziona tutto
root@darkstar:/# mkdir /tmp/package-glibc-2.5
root@darkstar:/# cd /tmp/package-glibc-2.5
root@darkstar:/tmp/package-glibc-2.5# mount /dev/hdc /mnt/cdrom
Codice: Seleziona tutto
root@darkstar:/tmp/package-glibc-2.5# cp /mnt/cdrom/source/l/glibc .
root@darkstar:/tmp/package-glibc-2.5# vi glibc.SlackBuild
Codice: Seleziona tutto
CFLAGS="-g $OPTIMIZ" \
Codice: Seleziona tutto
#CFLAGS="-g $OPTIMIZ" \
CFLAGS="-g $OPTIMIZ -mno-tls-direct-seg-refs" \
Codice: Seleziona tutto
root@darkstar:/tmp/package-glibc-2.5# ./glibc.SlackBuild
Alla fine della compilazione vi troverete una directory sulla root del tipo /glibc-tmp-xxxxxxxxxxxxxxxxxxxxxxxxxx . Entrateci dentro ed eseguite upgradepkg ( upgradepkg –reinstall oldpackagename%newpackagename ):
Codice: Seleziona tutto
root@darkstar:/tmp/package-glibc-2.5# cd glibc-tmp-af6454d73fa56f5e4d21015a706c3d68
root@darkstar:/glibc-tmp-af6454d73fa56f5e4d21015a706c3d68# upgradepkg –reinstall glibc-2.5-i486-4%glibc-2.5-i486-4.tgz
root@darkstar:/glibc-tmp-af6454d73fa56f5e4d21015a706c3d68# upgradepkg –reinstall glibc-debug-2.5-i486-4%glibc-debug-2.5-i486-4.tgz
root@darkstar:/glibc-tmp-af6454d73fa56f5e4d21015a706c3d68# upgradepkg –reinstall glibc-i18n-2.5-noarch-4%glibc-i18n-2.5-noarch-4.tgz
root@darkstar:/glibc-tmp-af6454d73fa56f5e4d21015a706c3d68# upgradepkg –reinstall glibc-profile-2.5-i486-4%glibc-profile-2.5-i486-4.tgz
root@darkstar:/glibc-tmp-af6454d73fa56f5e4d21015a706c3d68# upgradepkg –reinstall glibc-solibs-2.5-i486-4%glibc-solibs-2.5-i486-4.tgz
root@darkstar:/glibc-tmp-af6454d73fa56f5e4d21015a706c3d68# upgradepkg –reinstall glibc-zoneinfo-2.5-noarch-4%glibc-zoneinfo-2.5-noarch-4.tgz
Codice: Seleziona tutto
root@darkstar:/glibc-tmp-af6454d73fa56f5e4d21015a706c3d68# ldconfig
Codice: Seleziona tutto
root@darkstar:/# mkdir /tmp/package-sysvinit
root@darkstar:/# cd /tmp/package-sysvinit
root@darkstar:/tmp/package-sysvinit# cp /mnt/cdrom/source/a/sysvinit .
root@darkstar:/tmp/package-sysvinit# sysvinit.SlackBuild
Codice: Seleziona tutto
root@darkstar:/tmp# cd ..
root@darkstar:/tmp# upgradepkg –reinstall sysvinit%sysvinit.tgz
Configurazione di Xen
Passiamo ora alla configurazione di xen vero e proprio. Premetto che qualsiasi apporto a questa parte è ben voluto. Ci sto smanettando da poco quindi non ho ancora chiarissimi alcuni aspetti propri della configurazione. Da quanto ho capito il file principale di configurazione è /etc/xen/xend-config.sxp. Questo file si occupa di richiamare gli script necessari alla vostra configurazione e voi stessi dovete decidere quali richiamare per ogni azione poichè sono presenti diverse alternative. Per quanto mi riguarda per ora lo ho lasciato com'era tranne che per la parte relativa al networking. Aprite il file xend-config.sxp e commentate tutte le voci (network-script .......... ) tranne (network-script 'network-bridge bridge=xenbr1'). In tal modo diciamo a xen di creare nella dom0 ( xenbr1 ) un bridge nel quale verranno bridgiate la vif0.0, peth1 e le varie interfacce vifx.y delle x macchine guest virtuali domU.
Lanciamo finalmente xen:
Codice: Seleziona tutto
root@darkstar:/# xend start
Codice: Seleziona tutto
root@darkstar:/# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 256 1 r----- 193.1
root@darkstar:/#
Una prima macchina virtuale ( Debian Etch )
Creiamo ora un macchina virtuale. Personalmente io ho installato una debian come prima guest. Creiamo una dir sulla root che ospiterà le nostre virtual machine.
Codice: Seleziona tutto
root@darkstar:/# mkdir -p /vserver/images
root@darkstar:/# mkdir -p /vserver/mount
root@darkstar:/# cd /vserver/images
Codice: Seleziona tutto
root@darkstar:/vserver/images# dd if=/dev/zero of=/vserver/images/vm01.img bs=1024k count=4000
root@darkstar:/vserver/images# dd if=/dev/zero of=/vserver/images/vm01-swap.img bs=1024k count=500
Codice: Seleziona tutto
root@darkstar:/vserver/images# mkfs.ext3 vm01.img
root@darkstar:/vserver/images# mkswap vm01-swap.img
Codice: Seleziona tutto
root@darkstar:/vserver/images# cd ..
root@darkstar:/vserver# wget http://ftp.de.debian.org/debian/pool/main/d/debootstrap/debootstrap_0.3.3.2etch1_all.deb
Codice: Seleziona tutto
root@darkstar:/vserver# ar x debootstrap_0.3.3.2etch1_all.deb
root@darkstar:/vserver# mv data.tar.gz debootstrap_0.3.3.2etch1_all.tgz
root@darkstar:/vserver# installpkg debootstrap_0.3.3.2etch1_all.tgz
Codice: Seleziona tutto
root@darkstar:/vserver# mount -o loop images/vm01.img mount/
Codice: Seleziona tutto
root@darkstar:/vserver# debootstrap --verbose --arch i386 etch mount/debian-4/ http://ftp.de.debian.org/debian
Codice: Seleziona tutto
root@darkstar:/vserver# chroot mount/ /bin/bash
Codice: Seleziona tutto
darkstar:/# cat /etc/apt/sources.list
deb http://ftp2.de.debian.org/debian etch main
deb-src http://ftp2.de.debian.org/debian etch main
deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib
Codice: Seleziona tutto
darkstar:/# apt-get update
Codice: Seleziona tutto
darkstar:/# exit
Creiamo quindi un file relativo alla vm01 nella directory /etc/xen:
Codice: Seleziona tutto
root@darkstar:/vserver# cd /etc/xen
root@darkstar:/etc/xen# touch vm01-config.sxp
Codice: Seleziona tutto
root@darkstar:/etc/xen# cat /etc/xen/vm01-config.sxp
name ="vm01"
kernel ="/boot/vmlinuz-2.6.18-xenU"
root ="/dev/sda1 ro"
memory =64
disk = ['file:/vserver/images/vm01.img,sda1,w','file:/vserver/images/vm01-swap.img,sda2,w']
# network
#nics=1
#dhcp ="on"
vif=[ "" ]
#ip="192.168.0.101"
#netmask="255.255.255.0"
#gateway="192.168.0.1"
hostname="vm01.fabriziog.homelinux.org"
#extra="3"
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'
name è il nome che vogliamo dare alla macchina virtuale guest ed è il nome che verrà visualizzato quando eseguiamo xm list
kernel va indicato il path del kernel per la domU che si vuole utilizzare ( presente nella directory di boot )
root il dispositivo di domU che verrà montato come root / ( non mi è molto chiaro. Inizialmente avevo messo hdb2, ossia l'hd dove effettivamente risiedeva il file vm01.img ma non funzionava. Con sda1 funziona ). Qui si possono specificare I paramentri da passare al kernel se ne avete bisogno.
memory quanta memoria fisica si vuole assegnare alla domU in questione.
disk mappaggio dei dischi nella macchina virtuale. phy = dischi fisici (i parametri sono: il nome del disco o del file su dom0, il nome che prenderà in domU, il tipo di accesso, cioè r per lettura e w per scrittura), file = immagini di disco su file. Nel nostro caso utilizziamo ovviamente file.
ip se si vuole assegnare un ip fisso alla domU
netmask per la netmask
gateway per il gateway
hostname hostname vero e proprio
vcpus se avete un sistema multiprocessore, indica quale cpu usare ( da 0 in poi )
nics quante interfacce di rete creare
vif viene riempito con una lista di MAC address e bridge da usare nella domU vm01. Per esempio :
vif = [ 'mac=00:16:3E:00:00:11, bridge=xen-br0',
'bridge=xen-br1' ]
assegna un MAC address e un bridge alla prima interfaccia, e un bridge differente per la seconda interfaccia. Se si lascia vuoto viene riempito automaticamente da xen con uno dei MAC address assegnati standard.
extra indica quante stringhe possono essere passate al massimo al kernel nella voce root.
Ci sono altre istruzioni che qui non elenco. Se quelle elencate qui sopra non dovessero bastarvi ( come per chi vuole utilizzare un server NFS ), vi rimando alla documentazione ufficiale.
Ora siamo pronti ad avviare la nuova macchina virtuale guest domU.
Comandi utili
Facciamo partire la nuova macchina virtuale:
Codice: Seleziona tutto
root@darkstar:/# xm create /etc/xen/vm01-config.sxp
Using config file "/etc/xen/vm01-config.sxp".
Started domain vm01
Codice: Seleziona tutto
root@darkstar:/etc/xen# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 256 1 r----- 214.6
vm01 1 64 1 -b---- 8.6
Codice: Seleziona tutto
root@darkstar:/etc/xen# xm console vm01
...
...
Setting kernel variables...done.
Mounting local filesystems...done.
Activating swapfile swap...done.
Setting up networking....
Configuring network interfaces...done.
INIT: Entering runlevel: 3
Starting system log daemon: syslogd.
Starting kernel log daemon: klogd.
* Not starting internet superserver: no services enabled. <----errore nel file di configurazione vm01-config.sxp
Starting OpenBSD Secure Shell server: sshd.
Starting periodic command scheduler: crond.
Debian GNU/Linux 4.0 (none) tty1
(none) login:
Per spegnere una domU ( per esempio vm01 ) basta digitare dalla dom0 il comando :
Codice: Seleziona tutto
root@darkstar:/etc/xen# xm shutdown vm01
Riferimenti
http://tx.downloads.xensource.com/downloads/docs/user/
http://www.howtoforge.com/debian_etch_xen_3.1
http://www.debianitalia.org/modules/wfs ... 122&page=0
http://www.pervasive.jku.at/About_Us/St ... alization/
http://www.google.it
pedro

