martes, 22 de marzo de 2011

Clonar Compact Flash

En esta ocasión voy a contar como clonar tarjetas Compact Flash.

Concretamente tarjetas que se utilizan como discos duros en PC's industriales.

Había probado varios programas de clonación y no funcionaban bien.

Por otro lado,al intentar usar fdisk o cfdisk se hacen un lio y no podia crear particiones que luego fueran booteables.

Por supuesto con el comando  dd  si se podía hacer. Pero no me interesaba clonar una CF de 8GB con dd si el sistema instalado ocupaba la mitad.

Al final consegui crear las particiones con parted y luego clonar el sistema con tar.



Paso 1: Copiar Sistema de Ficheros origen a fichero backup.

Se va a suponer que el dispositivo CompactFlash (en adelante CF) es reconocido por el sistema como /dev/sdc.

 1.1: Montar sistema de ficheros origen: 
    mount /dev/sdc1 /mnt/disk
 1.2: Copiar sistema de archivos a un fichero comprimido: 
    tar cvpzf CFBackup.tgz /mnt/disk 1 

Paso 2: Crear particiones en nueva CF.

 2.1: Si existen, borrar particiones existentes (suponemos existen 2 particiones):
    parted /dev/sdc rm 1
    parted /dev/sdc rm 2...
 2.2: Crear nuevas particiones:
  2.2.1: Para sistemas ext3:
    parted /dev/sdc mklabel msdos
    parted /dev/sdc mkpart primary ext3 0 3500
    mkfs -t ext3  /dev/sdc1
    parted /dev/sdc set 1 boot on
  2.2.2: Para sistemas ext2:
    parted /dev/sdc mkpartfs primary ext2 0 3500
    parted /dev/sdc set 1 boot on
  2.2.3: Para sistemas ext2:
    parted /dev/sdc mkpartfs primary linux-swap 3501 4000

Paso 3: Restaurar Sistema de Ficheros:


            3.1: Se monta el dispositivo CF:
                    mount /dev/sdc1 /mnt/disk
            3.2: Se copia sistema de ficheros al dispositivo CF:
                    tar xvpzf CFBackup.tgz -C /

Paso 4: Prepara Sistema de Ficheros nuevo:


            4.1: Modificamos fstab para que coincida con las nuevas particiones.
                   Por ejemplo: Si la partición swap es /dev/hda5 ahora será /dev/hda2.
            4.2: Actualizar el sistema de ficheros ram de inicio:
                        chroot /mnt/disk
                        update-initramfs -u
            4.3: Crear el nuevo sector de arranque (mbr) en la CF:
                        umount /media/disk

                       grub
                       grub> device (hd2) /dev/sdc
                       grub> root (hd2,0)
                       grub> setup (hd2)
                       grub> quit
                       sync



1Sistema origen aprox. 900MB. Fichero .tgz 441 MB

jueves, 3 de marzo de 2011

Mantenimiento de Aulas. Un enfoque virtualizado. (Parte 2/3)

Ok, ya tenemos un sistema mínimo, sin entorno gráfico ni nada. Tan solo el servidor de xorg y aplicaciones de sistema.

Lo hemos configurado para tener un arranque por grub con el menú que nos permitirá lanzar las VM deseadas o entrar al sistema host.


Lo primero que tenemos que hacer es crearnos las máquinas virtuales. Para ellos se puede arrancar VirtualBox en modo gráfico:

Misuario@Equipo:~$xinit VirtualBox
Yo tengo equipos nuevecitos con 4 núcleos  y 4GB de RAM, así que a mis VM les he puesto los 4 núcleos y 3GB de RAM, ya que el sistema host no va ha hacer nada mas que servir de virtualizador.

En mi caso, las máquinas se encuentran en:
/home/MiUsuario/.VirtualBox

He creado una VM con Windows7 que he llamado Windows7Guest y otra con Linux que he llamado LinuxGuest.

La idea es que una vez instalados y configurados los sistemas tomo una instantánea de cada uno que llamare "inicio" y que podre restaurar antes de levantar la VM para que el sistema siempre este limpio.

Para arrancarlas ejecuto los siguientes scripts como MiUsuario: StartW7.sh t StartLinux.sh.
StartW7.sh:
#!/bin/sh

VBoxManage snapshot W7Guest restore inicio &&
xinit /usr/bin/VBoxSDL -startvm W7Guest --hwvirtex --fullscreen
sudo /sbin/poweroff
StartLinux.sh:
#!/bin/sh

VBoxManage snapshot LinuxGuest restore inicio &&
xinit /usr/bin/VBoxSDL -startvm LinuxGuest --hwvirtex --fullscreen
sudo /sbin/poweroff
Con este script lanzamos ls VM sin necesidad de lanzar las X's y además cuando apagamos la VM se apaga la máquina host.

Para ello, es necesario modificar el fichero /etc/sudoers para que permita ejecutar el comando poweroff sin pedir password. Basta con añadir un linea como la siguiente:

MiUsusario     ALL = NOPASSWD: /sbin/halt,/sbin/poweroff,/usr/bin/vdfuse

Otra cosa interesante es la necesidad de que funcionen los USB en las VM's de forma transparente al usuario. Para ello, desde VirtualBox  (xinit VirtualBox) habilitamos los USB's y creamos un "filtro vacío" (mirar la documentación del VirtualBox si no sabéis de lo que hablo).

Para que se enlacen los dispositivos usb a la VM necesitamos crear una regla en el udev. Esto lo podemos hacer poniendo la regla 90-usb-virtualbox.rules en /etc/udev/rules.d/
90-usb-virtualbox.rules:
SUBSYSTEM=="usb", ACTION=="add", RUN+="/usr/local/sbin/usb-virtualbox.sh" 

Donde  usb-virtualbox.sh es un script creado por nosotros y hemos situado en /usr/local/bin/

usb-virtualbox.sh:

#!/bin/bash
U=MiUsuario
A=$(env | grep DEVPATH | cut -f 5-6 -d /)
S=$(su $U -c "VBoxManage list usbhost" | grep "$A" | awk '{print $2}' )
su $U -c "VBoxManage controlvm W7Guest usbattach $S"
su $U -c "VBoxManage controlvm LinuxGuest usbattach $S"

Con todo esto ya tenemos un sistema host que arranca directamente las VM que seleccionamos desde el menu de inicio de grub.

Que las VM's reconozcan los dispositivos USB de forma transparente al usuario de la VM.

Y que la máquina física se apage al apagar la VM.

En la próxima 3ª parte nos meteremos en como automatiza la clonación de estos equipos virtualizados.

Mantenimiento de Aulas. Un enfoque virtualizado. (Parte 1/3)

Fueron varias las preguntas que surgieron cuando considere la posibilidad de utilizar Máquinas Virtuales en equipos de laboratorio:
  • ¿para que?¿que ventajas ofrece si ya tengo un sistema de clonación?
  • ¿Podre clonar las máquinas virtuales utilizadas y desplegarlas con multicast?
  • ¿Podre clonar Windows7 y ejecutar el sysprep para preparar el sistema (incluirlo en Active Directory y darle un nombre, ...etc)?
Después de investigar un poco y realizar varias pruebas, las respuestas fueron afirmativas.

¿Para que?¿Que ventajas ofrece? 

Encontré varios motivos para adoptar este enfoque, pero el decisivo, fue el uso de las instantáneas del sistema o snapshot. Las snapshot permiten restaurar el sistema automáticamente antes de cada arranque y de forma casi instantánea. Con lo que el usuario siempre se encuentra un sistema limpio y en perfecto estado.

Las otras ventajas eran:

  • Independencia del hardware.
  • Actualización de los sistemas virtuales usando multicast.
  • Posibilidad de redimensionar los discos virtuales.
  • Flexibilidad para realizar casi cualquier cosa.
 Desventajas:

  • Posible perdida de rendimiento con respecto al uso directo del hardware del equipo. Pero he realizado el test de configuración de Windows 7 y los resulados son:
      • CPU 6.4
      • RAM 6.7
      • Video 1 (no soporta aceleración 3D)
      • Disco 6
       Teniendo en cuenta que W7 puntua de 1 a 7.9 me parecio mas que suficiente.
        El problema de la aceleración 3D tampoco supone gran cosa mientras no se vayan a usar los equipos para render o juegos.


¿Podre Clonar las VM?

Esto en importante porque de forma regular es necesario instalar nuevas aplicaciones o actualizar las ya instaladas.

A priory Existe la posibilidad de usar dos métodos:

  • Clonar todo el disco o partición del sistema mediante el sistema de clonado que usemos de forma habitual (recomiendo Clonezilla SE).
  • Copiar el disco virtual (fichero vdi) actualizado a los clientes.
Ambos enfoques son válidos.

Puesto que existe la posibilidad de enviar ficheros desde un servidor a varios clientes usando multicast (mediante la herramienta udp-cast de Linux), parece que transferir los ficheros vdi nos permitiría actualizar las distintas VM de forma independiente (con el consiguiente ahorro de tiempo).

Sin embargo, también es posible crear una partición para alojar cada fichero vdi y así utilizar el método de clonado de discos (o particiones) que usemos habitualmente (¿Clonezilla SE?).

Yo adoptare la transferencia de ficheros vdi con udp-cast, me parece más flexible y así lo pruebo.

¿Podré usar Sysprep con Windows7?


Gracias al programa vdfuse-v82 (ojo tiene un bug para discos VMDK), es posible montar los discos vdi en el sistema de ficheros anfitrión, con lo que podremos parsear el fichero sysprep.xml con los datos que queramos y ponerlo en la VM con Windows7 para ejecutar el sysprep al arrancar.

Por supuesto también permite acceder al disco de la VM con Linux.

Nota:He conseguido que lo ejecute y funcione, pero al parsearlo, no me hace el cambio de nombre. Seguiremos informando.

¿Vale, pero como lo hago?

La idea es montar un sistema anfitrión con Linux y usar VirtualBOX para levantar las máquinas virtuales  (en adelante VM).

Una vez instalado todo y configurado, los equipos arrancan con Grub y se muestra un menú para seleccionar el S.O a utilizar, así como la opción de mantenimiento (para la que se requiere de contraseña).

Como sistema host he utilizado ubuntu 10.4.1 server versión de 64bits. Instalado con la opción de "sistema mínimo" y sin seleccionar ningún paquete durante el proceso de instalación.

Como virtualizador he utilizado VirtualBOX versión 3.2, por que es el paquete que viene en la distro y parece que va mas ligero que la versión 4.

Para poder montar los discos vdi en el sistema de archivo del host y hacer cosas como parchear el sysprep.xml para Windows7, he utilizado vdfuse-v82 (que es posible compilarlo utilizando las headers de la versión ose del VirtualBox).

Que sí, que sí, pero ¿como?

Para abreviar, partiremos de la base de que ya hemos instalado ubuntu 10.4.1 server, sistema mínimo y sin ningún paquete seleccionado y virtualbox-3.2. El que tenga dudas ya sabéis, internet lo sabe todo, a buscar que hay mucha documentación.

Lo primero que hay que hacer es cambiar grub2 por grub1.5, más fácilmente configurable.

La idea es crear un fichero de configuración con menús para arrancar las distintas VM más un menú de configuración protegido por contraseña. Ejemplo del fichero menu.lst:


title        Windows 7
kernel        /boot/vmlinuz-2.6.35-020635-generic root=/dev/sda1 ro quiet VM=W7
initrd        /boot/initrd.img-2.6.35-020635-generic
quiet


title        Linux
kernel        /boot/vmlinuz-2.6.35-020635-generic root=/dev/sda1 ro quiet VM=Linux
initrd        /boot/initrd.img-2.6.35-020635-generic
quiet

title        Linux Practicas
kernel        /boot/vmlinuz-2.6.35-020635-generic root=/dev/sda1 ro quiet VM=Linux2
initrd        /boot/initrd.img-2.6.35-020635-generic
quiet

title        Mantenimiento
password --md5 $1$PZgknzmNqPTYhVU/kiCW0
kernel        /boot/vmlinuz-2.6.35-020635-generic root=/dev/sda1 ro quiet
initrd        /boot/initrd.img-2.6.35-020635-generic
quiet

 
La variable de la linea del kernel "VM", la utilizo para evaluar que menú ha sido seleccionado y arrancar la VM correspondiente.

He creado un script que se ejecuta al arrancar llamado VMboot.sh que esta en /etc/init.d :

#!/bin/bash

VM=`cat /proc/cmdline | awk -F 'VM=' '{print $2}' | awk '{print $1}'`
case "$VM" in
    'W7')
    su MiUsuario -c /home/
MiUsuario/StartW7.sh;;
    'Linux')
    su
MiUsuario -c /home/MiUsuario/StartLinux.sh;;
    'PrimerArranque')
    /home/
MiUsuario/PrimerArranque.sh;;      
esac


Este script lanza los scripts que levantan la máquina virtual correspondiente. La opción de "PrimerArranque"  la utilizo para hacer tareas de postclonado que veremos más adelante.