Mostrando entradas con la etiqueta CentOS. Mostrar todas las entradas
Mostrando entradas con la etiqueta CentOS. Mostrar todas las entradas
Mounting lvm partitions: get into the dark depths of disk storage
Buenas amigos, hoy traigo este artículo desde las oscuras tierras donde moran los sysadmins. Producto de romperme la cabeza para lograr un mayor entendimiento sobre cómo funciona un sistema de archivos. Antes que nada debo excusarme por mi escasa actividad en el blog, últimamente mi tiempo se escapa desarrollando Web (PHP+MySQL+HTML+CSS+JavaScript), mi trabajo en seguridad, estudiando Java para tratar de certificar este año, y lo que me resulta más interesante: incursionando en virtualización de servidores utilizando KVM sobre host CentOS. Varias veces pensé en escribir sobre virtualización en KVM, pero el tema es tan amplio que no sé cómo encararlo. Tal vez debería empezar con mini-artículos sobre temas puntuales, como este que escribo, pero me falta tiempo. Prometo más adelante abordar el tema...


Breve intro

Para experimentar con virtualización tomé la decisión de utilizar CentOS, clon a nivel binario de RedHat, y utilizar KVM en favor de Xen. Para las máquinas virtuales decidí utilizar volúmenes lógicos de LVM como discos virtuales en lugar de archivos de imagen. No voy a explicar en este artículo las ventajas de utilizar volúmenes lógicos así que vamos directo a lo técnico...


Necesito un backup de mi máquina virtual

(Si necesitas un tutorial de LVM no lo vas a encontrar en este artículo, Google it!, hay muchos buenos tutoriales dando vueltas: 1, 2, 3)

Necesito hacer un backup de una máquina virtual cuyo disco es un volumen lógico y no un archivo de imagen. Además necesito mantener la máquina virtual en ejecución. Es decir, hacer un backup online. No hay problema! Una de las ventajas de LVM es que permite tomar snapshots de volúmenes lógicos, una especie de "instantánea" del contenido del volumen.

En la figura superior vemos un esquema de ejemplo de un disco. Una de las particiones se marca como tipo 8e y queda disponible como espacio para volúmenes lógicos. Supongamos que el volumen lógico asignado a la vm se llama "vm01" y pertenece al grupo de volúmenes lógicos "vm_group". Para crear un snapshot del volumen lógico utilizamos "lvcreate":

lvcreate --size 16G --snapshot --name vm01-snapshot /dev/vm_group/vm01

Donde --size indica el tamaño máximo del volumen, --name indica el nombre del volumen lógico correspondiente al snapshot y el último parámetro indica la ruta al dispositivo. El resultado es una copia del volumen en un instante determinado.


Listo el backup!

Eso es todo, aunque... Si el guest posee una base de datos, se debe hacer un lock para que cualquier aplicación en ejecución no escriba en tablas, y además se debe hacer un flush para escribir a disco todos los registros que se encuentran en memoria. Esto es necesario para que la base de datos quede en un estado consistente al momento de tomar el snapshot. Se puede hacer utilizando la herramienta ShellSQL (en CentOS se debe agregar el repositorio RPMforge para instalarla)


Que hago con el backup?

Una vez que tenemos la snapshot seguramente queremos moverla a un servidor de backup. Para esto necesitamos montar la imagen y copiarla al servidor de backup utilizando ftp (quise decir sftp, ver este artículo) o inclusive scp.

En Linux no es posible montar una partición LVM (tipo 8e), sólo es posible montar volúmenes lógicos. Esto es fácil si el volumen lógico posee un sistema de archivos como ext2, ext3 o NTFS. Los problemas surgen cuando el volumen lógico (partición lógica) contiene varias particiones en lugar de un sistema de archivos (las cosas se vuelven algo confusas).

¿Por qué un volumen lógico tendría varias particiones? Simple, si es utilizado por una máquina virtual tiene al menos una partición, ya que todo sistema operativo necesita al menos una o varias particiones para funcionar (/boot, /, /var, /home, etc.)

Si tratamos de montar un volumen lógico particionado obtendremos el siguiente resultado:

hfs: unable to find HFS+ superblock

Significa que mount no encuentra ningún sistema de archivos, ya que para encontrar un sistema de archivos habrá que buscarlo en la tabla de particiones. Recordemos que lo que para el host (el volumen lógico) es una partición, para el guest virtual es un dispositivo. El resultado es que tenemos particiones dentro de una partición lógica :S

Montar una partición que se encuentra dentro de un volumen lógico

Gracias a esta guía pude lograr lo que necesitaba. Primero veamos qué particiones contiene el volumen lógico correspondiente al snapshot:
[root@myserver ~]# fdisk -l -u /dev/vm_group/vm01-snapshot

Disk /dev/vm_group/vm01-snapshot: 10.4 GB, 10485760000 bytes
255 heads, 63 sectors/track, 1274 cylinders, total 20480000 sectors
Units = sectors of 1 * 512 = 512 bytes

Device Boot Start End Blocks Id System
/dev/vm_group/vm01-snapshot1 * 63 20450744 10225341 7 HPFS/NTFS

Se observa que el volumen lógico posee una única partición NTFS. El parámetro -u se utiliza para que las unidades sean en sectores y no en cilindros. Esta partición se puede montar si le indicamos a mount que el volumen lógico vm01 es un loopback device y le pasamos un offset (medido en bytes) al comienzo de la partición deseada.
El sistema de archivos NTFS comienza en el sector 63 (se observa en la captura anterior) y cada sector posee 512 bytes. Por lo tanto el offset es 32256.
Con los siguientes parámetros logramos montar la partición deseada:
[root@myserver ~]# mount -o loop,offset=32256 -t ntfs /dev/vm_group/vm01-snapshot /media/vm01-snapshot/
The disk contains an unclean file system (0, 0).
The file system wasn't safely closed on Windows. Fixing.

Voila! Tenemos la partición montada!
[root@myserver ~]# la /media/vm01-snapshot/
total 1310609
drwxrwxrwx 1 root root 8192 Feb 16 07:39 Archivos de programa
-rwxrwxrwx 1 root root 0 Feb 3 11:32 AUTOEXEC.BAT
-rwxrwxrwx 1 root root 4952 Aug 24 2001 Bootfont.bin
-rwxrwxrwx 1 root root 211 Feb 3 11:29 boot.ini
-rwxrwxrwx 1 root root 0 Feb 3 11:32 CONFIG.SYS
drwxrwxrwx 1 root root 4096 Feb 3 11:37 Documents and Settings
-rwxrwxrwx 1 root root 536399872 Mar 30 12:46 hiberfil.sys
-rwxrwxrwx 1 root root 0 Feb 3 11:32 IO.SYS
-rwxrwxrwx 1 root root 0 Feb 3 11:32 MSDOS.SYS
drwxrwxrwx 1 root root 0 Feb 16 07:37 MSOCache
-rwxrwxrwx 1 root root 47564 Aug 3 2004 NTDETECT.COM
-rwxrwxrwx 1 root root 250640 Aug 3 2004 ntldr
-rwxrwxrwx 1 root root 805306368 Mar 30 12:46 pagefile.sys
drwxrwxrwx 1 root root 4096 Feb 3 11:36 System Volume Information
drwxrwxrwx 1 root root 28672 Feb 16 14:48 WINDOWS

Teniendo acceso a la partición podemos copiar el backup del disco donde deseamos (usando scp o sftp).

Espero que les sirva!
Crear máquina virtual en CentOS usando Xen
A continuación les dejo los pasos que realicé hace algunos meses para crear una máquina virtual en un entorno Xen sobre CentOS. Existen herramientas gráficas para la creación de máquinas virtuales en Xen, pero si tienen instalado entorno gráfico, algo que no suele suceder si estamos administrando un server. Para hacerlo de forma gráfica, pueden leer éste artículo en la página de CentOS.
Si bien centos provee la herramienta virt-install para realizar el trabajo por consola, a mi no me sirvió. No logré instalar una máquina virtual utilizando dicha herramienta, y eso que lo intenté de varias formas.
Por esto, terminé recurriendo a lo básico, no utilizar ninguna herramienta más que las básicas de xen, hacer todo el resto a mano, algo que siempre da buenos resultados (si saben lo que hacen).
Igualmente no puedo asegurar nada con respecto a lo que explico a continuación, porque puede que a ustedes no les funcione. Sólo puedo decirles que a mi me funcionó perfectamente y terminé aprendiendo un montón.
Los pasos que describo son el resultado de muchas horas de búsqueda, lectura y pruebas, así que están frente a una receta que no encontré en ningún otro lugar.
En el ejemplo instalo una máquina virtual (Guest) CentOS sobre un host CentOS. Los pasos son los siguientes:

1. descargar rinse desde: http://xen-tools.org/software/rinse/releases.html.
Rinse es el equivalente a debootstrap de debian y sirve para crear la estructura de directorios básica para correr una distro basada en RPMs.

2. instalar rinse:
tar -zxvf rinse-version.tar.gz
make install
3. crear una particion para el sistema guest. En este punto hay dos opciones, usar una partición lógica o crear un archivo que sirva como imágen del sistema operativo.

3.1. para el caso de partición lógica:
lvmcreate VolGroup00 --size 2G --name virtual
donde VolGroup es el nombre del grupo de volúmenes lógicos donde crearemos la partición y 2G indica que la partición tendrá 2GB de tamaño. La partición lógica se llamará virtual (en un acto de inspiración total).
Luego formateamos esta partición con el sistema de archivos que deseamos. Para el ejemplo, utilizo ext3:
mkfs.ext3 /dev/VolGroup00/virtual
3.2. en el caso de utilizar un archivo, creamos la imagen con dd:
dd if=/dev/zero of=/media/virtual.img bs=1M seek=2047 count=1
y la formateamos con el sistema de archivos q queramos. Para el ejemplo, uso ext3:
mkfs.ext3 /media/virtual.img
4. crear una partición para swap. Otra vez, podemos elegir utilizar volumenes lógicos o una imágen en un archivo. Acosejo que sean coherentes con lo que hicieron antes, y elijan lo mismo para la swap.

4.1. Creamos el volúmen lógico de 256MB y lo formateamos para q sea swap:
lvmcreate VolGroup00 --size 256M --name swap
mkswap /dev/VolGroup00/swap
4.2. Creamos un archivo con la imágen swap
dd if=/dev/zero of=/media/virtual.swap bs=1M seek=256 count=1
mkswap /media/virtual.swap
5. Montar la partición root en algún directorio.

5.1. mount /dev/VolGroup00/virtual /mnt/virtual_base

5.2. mount -o loop /media/virtual.img /mnt/virtual_base

6. ejecutar rinse con destino el directorio que servirá como raíz del nuevo árbol de directorios y le indicamos la distribucion que vamos a instalar (opcionalmente también se puede incluir la arquitectura):
rinse --distribution centos-5 --directory /mnt/virtual_base --arch i386
Nota: si tira algún error, puede ser que les falte la librería perl-libwww-perl. Instalarla con:
yum install perl-libwww-perl
7. montar el directorio proc (comunicación con el kernel) en el árbol de directorios recién creado:
mount -t proc none /mnt/virtual_base/proc
8. hacer chroot al sistema de directorios de la máquina virtual creada:
chroot /mnt/virtual_base
9. Una vez en el árbol de directorios de la máquina guest, instalar todas los programas que deseamos, pero acuerdense de instalar el kernel xen:
yum install kernel-xen
10. modificar el /etc/fstab con "nano /etc/fstab" y dejarlo de la siguiente forma:
/dev/sda1 / ext3 defaults 1 1
/dev/sda2 none swap sw 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
none /sys sysfs defaults 0 0
11. crear un nuevo init:
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --preload=xenblk initrd.img $(uname -r)
con esto evitamos el error:
mount: could not find filesystem '/dev/root'
switchroot: mount failed: No such file or directory
12. editar el archivo /etc/inittab y agregar una consola porque sino Xen no mostrará el promt de login. Tambien se pueden comentar las ttys dado que no serán de utilidad en la consola xen. Las primeras líneas del inittab deberían quedar similares a las siguientes:
# add a console for xen
co:2345:respawn:/sbin/mingetty console
# comment out the default TTYs
#1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
13. deshabilitar TLS porque alenta la máquina virtual:
# para 32 bit :
mv /lib/tls /lib/tls.disabled
# para 64 bit :
mv /lib64/tls /lib64/tls.disabled
14. deshabilitar el reloj del hardware dado que el sistema guest utilizará el reloj del sistema host. Reemplazamos el hwclock con un script vacío:
echo exit 0 > /sbin/hwclock
15. darle un password a root:
pwconv
passwd root
16. salir del chroot con exit.

17. copiar el kernel recien instalado en otro lado, como por ejemplo a /root
cp /mnt/virtual_base/boot/initrd* /root/initrd.img
cp /mnt/virtual_base/boot/vmlinuz* /root/vmlinuz
18. desmontar todo:
umount /mnt/virtual_base/proc
umount /mnt/virtual_base
19. crear el archivo con la configuración de la máquina virtual para que Xen la pueda crear. El archivo puede estar en cualquier lugar, pero lo crearemos dentro de /etc/xen porque es el primer lugar donde busca Xen al crear una VM. El archivo lo llamaremos "virtual".

19.1. en el caso que utilizaran volúmenes lógicos, el archivo debería contener lo siguiente:
kernel = "/root/vmlinuz"
ramdisk = "/root/initrd.img"
memory = 255
name = “virtual”
vif = [ 'mac=00:16:3e:21:f1:31' ]
dhcp = “dhcp”
disk = ['phy:VolGroup00/virtual,sda1,w', 'phy:VolGroup00/swap,sda2,w']
root = “/dev/sda1 ro”
19.2. en caso de haber utilizado archivos como imágenes, debería contener lo siguiente:
kernel = “/root/vmlinuz″
ramdisk = “/root/initrd.img″
memory = 255
name = “virtual”
vif = [ 'mac=00:16:3e:21:f1:31' ]
dhcp = “dhcp”
disk = ['phy:/media/virtual.img,sda1,w', 'phy:/media/virtual.swap,sda2,w']
root = “/dev/sda1 ro”
En vif pueden colocar la mac para la placa de red, y con dhcp le indicamos que obtenga la ip por dhcp. En memory le dimos 255MB y en disk le indicamos cuáles serán las particiones visibles dentro del guest.

20. crear finalmente una instancia de la máquina virtual configurada (la cual llamamos "virtual"). Una vez creada, el promt quedará dentro de la máquina virtual.
xm create virtual -c
Para salir de la máquina virtual, tipeamos Ctrl+J. Si no utilizamos el parámetro "-c", la máquina se creará en background y no veremos el promt. Para meternos en la máquina virtual, hace falta utilziar el comando:
xm console virtual
Para apagar la máquina virtual, ejecutar (desde la máquina host):
xm shutdown virtual
Otros comandos útiles son: "xm destroy " para destruir sin apagar (como si le dieramos al botón del case). "xm list" para listar las máquinas virtuales que se están ejecutando. "xm help" para listar los comandos disponibles.

21. una vez en la máquina virtual, deshabilitar HAL dado que no funcionará:
/sbin/chkconfig haldaemon off
22. si instalamos el servidor ssh y sshd falla al intentar crear la clave, es porque no existe el dispositivo /dev/urandom. Para solucionarlo, ejecutamos:
/sbin/MAKEDEV generic
/etc/init.d/sshd start

Algunas referencias:
http://segvfault.wordpress.com/2008/11/06/xen-centos-5-debian-etch-como-guest/
http://forum.slicehost.com/comments.php?DiscussionID=690
http://blog.jphoude.qc.ca/2007/10/26/centos-5-xen-images-part-1/
http://www.virtuatopia.com/index.php/Building_a_Xen_Virtual_Guest_Filesystem_using_Logical_Volume_Management_(LVM)
http://www.howtoforge.com/perfect_setup_xen3_debian
http://www.howtoforge.org/using-xen-with-lvm-based-vms-instead-of-image-based-vms-debian-etch
http://wiki.xensource.com/xenwiki/