Creació d’una màquina virtual model per a Xen

Objectiu:

Quan és necessari crear un munt de màquines virtuals sovint ens interessa tenir-ne una que estigui ja preparada i només haver de copiar-la i adaptar-la a les noves necessitats. Utilitzant virtualització això esdevé una tasca força simple i alhora permet un ràpid desplegament de nous serveis amb un cost ridícul.

Aquest petit tutorial explica com preparar una màquina virtual Squeeze (6.0) mitjançant l’instal·lador propi de Debian i deixar-la llesta per a ser clonada en el futur.

Procediment:

El primer que necessitarem és una imatge de disc on emmagatzemar les dades de la màquina model. D’opcions n’hi ha moltes i diverses essent potser les imatges i LVM les més populars i simples d’utilitzar. Pels nostres propòsits utilitzarem simples imatges tot i que portar la mateixa idea a LVM és molt simple així com el procés de clonatge posterior. En entorns de producció real les imatges són l’entorn més lent de treball pel que s’haurien de considerar com a última opció.

L’experiència ens diu que un sistema operatiu que només ha de subministrar serveis (sense emmagatzemar massa dades) pot viure sense problemes amb tres o quatre gigues de disc. Si després necessitem més espai per emmagatzemar informació podem afegir d’altres discs a la màquina virtual i muntar-los en els punts que siguin necessaris, millorant també així la gestió de les còpies de seguretat.

Crearem doncs una imatge de 4Gb i la formatarem amb el sistema de fitxers ext3 o ext4 segons les nostres necessitats:

$ dd if=/dev/zero of=/root/vm.img bs=1k count=1024x1024x4
$ mkfs.ext3 /root/vm.img

Aquesta comanda generarà un arxiu buit de 4Gb al directori d’execució i la formatarà amb ext3. La comanda mkfs.ext3 donarà un avís ja que estem intentant formatar un arxiu en comptes d’una partició d’un disc. No hi ha cap problema en permetre l’execució.

Un cop executades les comandes podem muntar la nova imatge en un punt de muntatge i verificar que, efectivament, només conté la carpeta lost+found:

$ mkdir /root/ostmp
$ mount -o loop  /root/vm.img /root/ostmp
$ ls /root/ostmp
drwx------  2 root root 16384  8 feb 19:42 lost+found
$ umount /root/ostmp

L’arxiu està llest per a ser utilitzat en una màquina virtual.

Una de les decisions importants a prendre en aquest moment és com gestionarà Xen l’arrancada de les màquines virtuals. Hi ha dues maneres principals de fer-ho, mitjançant un kernel i un ramdisk locals del Dom0 o mitjançant pygrub amb el kernel i ramdisk propis de cada màquina virtual. Antigament la primera era l’única opció i implicava gestionar els mòduls del kernel sempre que aquesta màquina es movia entre Dom0’s. Ara, l’opció pygrub facilita i simplifica molt aquesta tasca ja que tota la informació és dins de la màquina virtual i la reubicació de les mateixes passa a ser un tema trivial.

Debian ha preparat un arxiu que automatitza la instal·lació de les seves distribucions d’una manera simple, tot i que en data de redacció d’aquesta entrada donava algun problema amb Squeeze i els arxius temporals que generava. Així doncs proposo una alternativa que fa la mateixa tasca de forma més manual. Crearem un arxiu de configuració vm.cfg (el nom és arbitrari) de màquina virtual:

$ pico /root/vm.cfg

amb les següents dades:

kernel="/root/vmlinuz"
ramdisk="/root/initrd.gz"

memory = 128
name = "vm"

cpus = "1-3"
vcpus = 1

vif = ['']
disk = ['file:/root/vm.img,xvda,w']

console="hvc0"

D’aquest arxiu s’ha de comentar que tota la informació penja de la carpeta /root. Això és una molt mala idea en un servidor en producció i s’hauria d’ubicar en un espai dedicat per les imatges i les configuracions de màquines virtuals. Ho fem així només per simplicitat.

També s’hauria de comentar la línia cpus=”1-3″. Aquesta es pot adaptar per a cada sistema segons el nombre de processadors. En aquest cas concret es permet a la màquina virtual executar-se en els processadors 1 a 3. Si en tenim més i/o més màquines virtuals podem associar cada una a un grup de processadors, etcètera, segons ens convingui. Amb la línia vcpus diem a la màquina virtual quantes cpus de les assignades amb cpus pot utilitzar. Per defecte vcpus = 1 que vol dir que actua com a uniprocessador.

Per saber informació sobre com estan distribuïts els processadors entre els màquines virtuals que s’executen podem utilitzar la comanda:

$ xm vcpu-list

D’altra banda, examinant el contingut de l’arxiu veiem que encara no disposem dels arxius vmlinuz ni initrd.gz. Els hem d’aconseguir, això l’script de Debian ho feia automàticament però no suposa cap problema trobar-los. Concretament els podem descarregar de http://ftp.debian.org/debian. Les comandes per fer-ho des de la consola són:

$ wget http://ftp.debian.org/debian/dists/squeeze/main/installer-amd64/current/images/netboot/xen/vmlinuz
$ wget http://ftp.debian.org/debian/dists/squeeze/main/installer-amd64/current/images/netboot/xen/initrd.gz

Aleshores, com a resum, al directori de treball tindrem aquests quatre arxius:

  • vm.img: Imatge on instal·larem el nou sistema operatiu.
  • vm.cfg: Arxiu de configuració que utilitzarà Xen per arrencar la màquina virtual.
  • vmlinuz: Kernel a utilitzar durant la instal·lació de la màquina virtual.
  • initrd.gz: ramdisk a utilitzar durant la instal·lació de la màquina virtual.

Per iniciar la màquina virtual fem el següent:

$ xm cre -c vm.cfg

Aquesta comanda donarà peu a la instal·lació de Debian Squeeze en mode consola. El procés que s’ha de seguir durant la instal·lació és el tradicional sense tenir res en compte que es tracta d’una màquina virtual. En el nostre cas instal·lem només un entorn de consola, amb SSH activat per defecte i res més.

Un cop acabada la instal·lació se’ns demanarà de reiniciar. Amb la configuració actual de l’arxiu vm.cfg, el reinici no funcionarà. S’ha de modificar el contingut original per la següent informació:

bootloader="pygrub"

memory = 128
name = "vm"

cpus = "1-3"
vcpus = 1

vif = ['']
disk = ['file:/root/vm.img,xvda,w']

Aleshores la podrem iniciar amb:

$ xm cre -c vm.cfg

Accedim a la màquina amb el nom d’usuari i contrasenya creats durant la instal·lació anterior i passem a acabar de configurar el nou sistema. Els temes pendents que s’haurien de configurar són:

  • locales: s’ha d’afegir les traduccions i locales de la nostra llengua.
  • configurar la timezone: posar la màquina a la timezone correcta.
  • aplicacions varies: aquelles que no volem haver d’instal·lar en totes les màquines virtuals posteriors al clonatge.
  • eliminar l’usuari sense privilegis creat durant la instal·lació.
  • modificar l’arxiu /root/.profile per adapatar-lo a les nostres necessitats.
  • afegir al cron.daily l’ntpdate
  • reconfigurar l’exim4 per a que enviï a traves d’un smarthost

Algunes de les accions anteriors es solucionen amb les següents comandes:

$ dpkg-reconfigure locales
$ apt-get install nmap ccze tree iptraf ntpdate
$ mv /etc/localtime /etc/localtime.old
$ ln -sf /usr/share/zoneinfo/Europe/Andorra /etc/localtime
$ dpkg-reconfigure exim4-config

Per sortir de la consola de la màquina virtual sota Xen hem de prémer les tecles Ctrl + ]. Per tornar a connectar posteriorment fem:

$ xm con #id

NOTA: L’#id es tracta del primer nombre que apareix associat a la màquina virtual quan fem un ‘xm list’.

Ja podem apagar la màquina virtual. Un cop de nou sobre la màquina Dom0 podem començar a fer còpies de l’arxiu vm.cfg i vm.img adaptant-los per que les noves màquines siguin úniques. Això vol dir substituir ‘vm’ pel nom de la nova màquina a crear a partir de la plantilla.

Un cop s’hagi iniciat la nova màquina virtual s’ha de modificar/adaptar el següent:

  • nom de la màquina: s’ha de modificar als arxius /etc/hostname, /etc/hosts i /etc/mailname
  • configuració de la xarxa: s’ha de modificar l’arxiu /etc/network/interfaces
  • àlies del correu de root: s’ha de modificar l’arxiu /etc/aliases i mirar a on envia els correus per l’usuari root. Es pot substituir per una adreça del tipus nom@domini.tld
  • modificar l’esquema de particions: a l’arxiu /etc/fstab es treballa amb UUID’s. En les còpies clonades pot donar problemes. Es poden substituir els UUID=codi per /dev/xvda# (Molt de compte amb aquests canvis que poden impedir que la màquina iniciï.

NOTA: Si volem fer els canvis abans d’iniciar la màquina per no entrar en conflictes d’adreces i demés podem muntar la imatge en la Dom0 utilitzant kpartx:

$ apt-get install kpartx
$ modprobe dm-mod
$ kpartx -l /root/new.img
$ kpartx -a /root/new.img
$ mount /dev/mapper/loop0p1 /root/ostmp

En /root/ostmp tenim disponible la partició primària de la màquina virtual. Compte en modificar els arxius de la partició i no confondre’s amb els de la pròpia màquina Dom0. No és el mateix editar /etc/hostname que /root/ostmp/etc/hostname. L’exemple és encara pitjor si ens trobem dins el directori ostmp:

$ cd ostmp
$ pico etc/hostname
$ pico /etc/hostname

Les dues anteriors comandes accedeixen a arxius diferents i poden deixar inútil la màquina principal si ho fem malament. Molt de compte. 🙂

A clonar!