Monday, February 18, 2008

CentOS 5.1 + Xen + LVM for Guests

Normalmente per eseguire una installazione di un DomU di Xen usando delle partizioni LVM basterebbe configurare la macchina virtuale per usare il volume scelto usando qualcosa del tipo

disk = [ 'phy:/dev/mapper/vg-dom1,xvda1,w', 'phy:/dev/mapper/vg-dom1swap,xvda2,w']

Purtroppo Anaconda, l'installer di RedHat usato anche da CentOS, non sembra essere in grado di eseguire una installazione usando una partizione quindi il normale processo di installazione vanificherebbe l'utilizzo di LVM per la gestione flessibile dei dischi.

La soluzione, seppur complicata, una volta applicata potrà essere facilmente riutilizzata e replicata.
Partiremo dall'inizio, cioè dalla installazione dell'ambiente host, cioè del Dom0 all'interno del quale installeremo il minor numero di pacchetti possibile per consentire una facile gestione e contemporaneamente un alto livello di sicurezza.

Inserito il disco di CentOS avviamo l'installazione grafica (non quella testuale in quanto non consente la manipolazione dei volumi LVM) e quando arriviamo al partizionamento dei dischi selezioniamo il partizionamento manuale. Creiamo una struttura di partizioni come la seguente:
volume group - base
logical volume - root (4GB)
logical volume - swap (max 2GB)
volume group - xen

Arrivati alla selezione dei pacchetti eliminiamo qualsiasi segno di spunta e chiediamo di rivedere il dettaglio dei pacchetti da installare. A questo punto deselezioniamo qualsiasi segno di spunta dall'elenco dei gruppi (di default vengono spuntati i pacchetti per la connessione remota tramite modem, internet testuale e gli editor) ed attiviamo solamente i pacchetti per la virtualizzazione.

Facciamo completare l'installazione e riavviamo la macchina per poi procedere ad un successivo hardening eliminando i seguenti pacchetti che vengono comunque installati ma che molto probabilmente non saranno necessari:

  • NetworkManager
  • amtu
  • conman
  • bluez-utils
  • coolkey
  • irda-utils
  • firstboot-tui
  • irda-utils
  • pcmciautils
  • rp-pppoe
  • virt-manager
  • gnome-applet-vm

A questo punto prepariamoci all'installazione del sistema operativo guest, o DomU nel gergo xen, utilizzando un disco virtuale su file come base per l'installazione.

Creiamo quindi un disco virtuale di dimensioni iniziali 256MB e dimensioni massime 4GB (tanto per stare sul sicuro) con il seguente comando:

$ dd if=/dev/zero of=/var/lib/xen/images/template.hda.img oflag=direct bs=1M seek=4096 count=256

Facciamo attenzione ad usare la cartella corretta per il file altrimenti avremo problemi successivamente con SELinux.
Adesso abbiamo bisogno dei file initrd.img e vmlinuz necessari ad effettuare il boot dal disco virtuale oltre che di un file di configurazione per Xen che descriva la virtual machine così realizzata.

I primi due possono essere scaricati dal sito di Centos avendo l'accortezza di selezionare la cartella corrispondente all'architettura del sistema operativo ospite: i386 oppure x86_64.

Posizioniamo i due file appena scaricati nella cartella /var/lib/xen e creiamo un file /etc/xen/template per il nuovo DomU come il seguente:

kernel = "/var/lib/xen/vmlinuz-xen-install"
ramdisk = "/var/lib/xen/initrd-xen-install"
#decommentare la linea seguente se abbiamo un kickstart file pubblicato
#extra = "text ks=http://ipaddress/minimal-ks.cfg"
name = "template"
memory = "256"
disk = [ 'tap:aio:/var/lib/xen/images/template.hda.img,xvda,w', ]
vif = [ 'bridge=xenbr0', ]
vcpus=1
on_reboot = 'destroy'
on_crash = 'destroy'


Avviamo la virtual machine attaccandoci alla console ed eseguiamo una normale installazione text based (se non avevamo specificato un kickstart file non interattivo) per il nostro nuovissimo server virtuale, avendo ovviamente cura a selezionare il minimo dei pacchetti necessari:

$ xm create template -c

Non resta che spostare quanto installato sul disco virtuale all'interno di un disco reale gestito in LVM quindi procediamo allo stop della macchina virtuale e creiamo quindi i volumi LVM necessari cioè uno per la partizione root ed uno per l'area di swap:

$ lvcreate -L12288 -ntemplate xen
$ lvcreate -L1024 -ntemplate.swap xen
$ mkfs.ext3 /dev/mapper/xen-template01
$ mkswap /dev/mapper/xen-template01.swap

Ovviamente è possibile variare le dimensioni ed i nomi a piacere. Adesso effettuiamo lo spostamento di quanto presente nella partizione principale del disco virtuale all'interno della partizione LVM appena creata.

$ dd if=/var/lib/xen/images/template.hda.img of=/dev/mapper/xen-template01
$
resize2fs -p /dev/mapper/xen-template01

Ora non ci resta che perfezionare la configurazione del sistema in modo che non ci sia nessun riferimento rispetto all'installazione appena effettuata quindi montiamo il disco appena creato e cominciamo le attività di pulizia:

$ mount /dev/mapper/xen-template01 /media
$ chroot /media

Con quest'ultimo comando abbiamo impostato il disco della configurazione finale come se fosse la root del nostro sistema quindi possiamo avviare tutti i comandi che effettuano modifiche sul disco come se fossimo già all'interno della virtual machine.

Procediamo andando a modificare i punti di mount in fstab

$ vi /etc/fstab

Che dovrà essere modificato per fare riferimento alle partizioni LVM, come riportato nell'esempio seguente dove sono state evidenziate le linee modificate.
/dev/xvda1      /        ext3   defaults       1 1
/dev/xvda2 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0


e successivamente dobbiamo modificare la configurazione di GRUB (editando il file /etc/grub.conf) andando anche qui a sostituire LABEL=/ con /dev/xvda1

Prima di avviare la macchina virtuale è necessario ancora eseguire alcune operazioni.

Disattiviamo il supporto ad IPv6 se non è necessario modificando i file:

  • /etc/sysconfig/network dovrà contenere NETWORKING_IPV6=no

  • /etc/sysconfig/network-scripts/ifcfg-XXXX dovranno contenere IPV6INIT=no


Disattiviamo il firewall per IPv6 con il comando

$ chkconfig --levels 2345 ip6tables off

Assicuriamoci che al prossimo riavviano venga eseguito il relabel del filesystem per SELinux eseguendo il comando

$ touch /.autorelabel

e che vengano rigenerate le chiavi usate da OpenSSH eliminando quelle già generate:

$ rm /etc/ssh/ssh_host_*

Infine un aggiornamento alle ultime versioni è un'operazione consigliabile

$ yum update

Finita la preparazione della nostra nuova macchina virtuale torniamo al Dom0 per preparaci a gustare i risultati del nostro lavoro.

$ exit
$ umount /media /mnt

Ci rimane da preparare (o modificare) il file di configurazione per Xen in modo che sia in grado di avviare la nostra nuova macchina virtuale. per farlo editiamo il file /etc/xen/template affinchè rispecchi queste nuove proprietà:
name = "template"
bootloader = "/usr/bin/pygrub"
disk = [ 'phy:/dev/mapper/xen-template,xvda1,w','phy:/dev/mapper/xen-template.swap,xvda2,w']
vif = [ 'bridge=xenbr0']
vcpus = 1
on_reboot = 'restart'
on_crash = 'restart'

Per comodità nell'installazione delle successive macchine virtuali converrà creare un nuovo archivio, a partire dal sistema appena installato sul volume LVM, da tenere in disparte per evitare di dover ripetere il processo dall'inizio: con l'archivio già pronto potremo ripartire dalla creazione delle partizioni LVM e limitarci a configurare la rete e l'hostname!

$ dd if=
/dev/mapper/xen-template01 of=/var/lib/xen/images/lvm-template.img

Non resta che effettuare lo start della macchina virtuale et voilà,
avete la vostra bella macchina virtuale CentOS 5.1 che lavora su una
partizione LVM.... come promesso!