Pablo Iranzo Gómez's blog

abr 26, 2010

Rescate de sistemas virtuales (Xen)

A raíz de un problema debido a reiterados apagones, me vi en la necesidad de levantar una máquina virtual que ya no arrancaba.

En un sistema físico, lo que haríamos, es que según en qué punto estemos, usar un disco de arranque de nuestra distribución y por un lado reparar el sistema de ficheros con fsck o rehacer un initrd.img.

¿Cómo hacemos esto si la máquina en lugar de ser una real, es una virtual?.

Copiando el fichero de configuración de nuestra máquina a 'rescate', podemos editar la línea del cargador (eliminando pygrub) e indicando como kernel e initrd.img los de nuestro cd de distribución (en el caso de Xen, images/xen para EL5).

Una vez arrancado, ya podemos seguir el procedimiento estándar de recuperación.

En el caso de tener que reconstruir el initrd, podemos tener un problema añadido, pero por otro lado, al ser todo máquinas virtuales 'con el mismo hardware', es muy sencillo crear otra máquina virtual e instalarla indicando los mismos nombres para los vg's, particiones de arranque, etc y luego copiar el initrd.img y el kernel de la máquina nueva a la antigua y arrancarla, para llegados a este punto, reinstalar la última versión del kernel disponible con nuestro sistema ya arrancado.

La copia la podemos hacer bien desde el medio de rescate o montando mediante loopback el fichero de la máquina virtual (con LVM's es trivial) (puedes encontrar mucha información al respecto buscando por xen image y loopback offset).

posted at 23:31  ·   ·  fedora  xen
Click to read and post comments

jul 18, 2008

Mount disk images

I've been using a Xen guest under RHEL 5.2 to hold this webserver, and because of failures, I choose to keep a copy of the full disk image on another machine.

Having to transfer the full disk in the network means stop the server (xen guest), rsync the image on disk (wait 40 minutes), then start guest again.

After doing the initial image transfer, it would be easier to just sync updated files, but... how to loop mount a full disk?

In my case, the hdd image contained a partition for /boot and a partition for a LVM pv.

First, I needed to check Number of cylinders in virtual disk inside Xen Guest. Using fdisk I could check that number, for example, 777.

On the remote system, the one with the full image transferred previously I could then do:

#!bash
fdisk /var/lib/xen/images/GUEST.img -C 777 -l -u #  and will yield something like:

255 heads, 63 sectors/track, 777 cylinders, 0 sectores en total
Unidades = sectores de 1 * 512 = 512 bytes
Disposit. Inicio Comienzo Fin Bloques Id Sistema
/var/lib/xen/images/GUEST.img1 * 63 208844 104391 83 Linux
/var/lib/xen/images/GUEST.img2 208845 12482504 6136830 8e Linux LVM

In this case, as I want to access my LVM volume, so I need to convert the partition start to a size, so:

#!bash
START=512*208845 = 106928640

and then thanks to losetup:

#!bash
libre=`losetup -f` #Get a free loop device
losetup -o 106928640 $libre /var/lib/xen/images/GUEST.img #setup the device for the 2nd partition
pvscan #scan for LVM's pv
vgscan # same for VG
lvscan # same for LV's
lvchange -a y /dev/GUESTvg #activate LV's on 'GUESTvg' VG

and mount our drives doing mount /dev/GUESTvg/LVMunit where desired ;)

At this point I can just run:

#!bash
rsync -avur —perms —progress —delete remoteserver:/ /mnt/DISKIMAGE

And get a 'working' copy of the remote machine but just copying changed elements.

posted at 06:17  ·   ·  linux  xen
Click to read and post comments