29/7/09

RAID con mdadm luego de reboot

(Nota original publicada en ubuntu-es - http://www.ubuntu-es.org/?q=node/35863)

Recientemente he colaborado para realizar un arreglo de discos redundante (RAID) y existía el problema que el arreglo se perdía luego de reiniciar (reboot) la computadora. Con cada reinicio había que ensamblarlo nuevamente a mano y no permitía un uso fluido del sistema. Si bien aclaro que el S.O. era Debian, creo que el mismo efecto puede producirse sobre Ubuntu.

El hardware usado, y hago solamente referencia a los discos por ser el tema de este artículo, consiste de 1 discos pata (antes ide) y 2 discos sata de igual tamaño. Sobre el disco pata hda se instaló el sistema operativo Debian con una partición ext3 y una swap. Es decir una instalación clásica.

Los discos sata sda1 y sdb1 se desean utilizar en raid 1, es decir haciendo espejado o mirroring. El control del arreglo raid es basado en software con mdadm, que además de simple es muy potente. Hay una muy buena página con un resumen de uso de mdadm en http://www.linuxdevcenter.com/pub/a/linux/2002/12/05/RAID.html?page=1 (en inglés).

Para crear por primera vez el arreglo se usa:

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

Luego de sincronizar los discos sda1 y sdb1, el arreglo está armado y funcionando como md0. Se puede comprobar su estado con lo siguiente:

/proc/mdstat
mdadm -D /dev/md0

Para completar la configuración del arreglo, se definen los parámetros del raid en el archivo /etc/mdadm/mdadm.conf:

DEVICE /dev/sda1 /dev/sdb1
ARRAY /dev/md0 level=raid1 num-devices=2 /dev/sda1 /dev/sdb1

Para finalizar, se agrega el raid md0 en /etc/fstab y luego en el sistema de archivos:

mount -a

Todo esto funciona correctamente hasta que se produce el reinicio del sistema, en este caso forzado para verificar el correcto funcionamiento del sistema.

Luego del reinicio, se comprueba que el raid no es ensamblado y montado automáticamente, y se puede hacer manualmente con:

mdadm -As /dev/md0

... para ensamblar el raid ya creado y:

mount -a

... para montar el raid en /raid, ya creado en fstab.

Es importante destacar que una vez creado el raid no es necesario volver a crearlo luego del reinicio, sino que se debe ensamblar, manteniendo toda la integridad de los datos dentro de los discos.

Analizando los mensajes del sistema se encuentra que, aparentemente, el sistema monta el disco pata hda y luego intenta montar en forma automática el raid, pero todavía no ha incorporado los discos sata sda y sdb a la lista de dispositivos /dev, con lo cual el raid falla.

Para solucionar este inconveniente y permitir que el sistema sea completamente automático, se debe habilitar el script de inicio mdadm-raid para que se ejecute de acuerdo al nivel que se utilice. En este caso particular se utiliza el runlevel 3, por lo que se hizo un link desde /etc/init.d/mdadm-raid a /etc/rc3.d/S23mdadm-raid.

Con esta operación luego de cada reinicio, el script leía lo definido en el archivo /etc/mdadm/mdadm.conf para ensamblar nuevamente el raid. Pero no se montaba automáticamente.

Para solucionar ésto se hizo el script /etc/init.d/mdadm-raid-mount que contiene:

#!/bin/sh -e
#
# Monta los raid que estuvieran especificados en /etc/fstab
#
# Distribuir bajo los términos de GNU GPL versión 2.

mount -a

Luego queda por hacer un link entre /etc/init.d/mdadm-raid-mount y /etc/rc3.d/S27mdadm-raid-mount

Cabe destacar que si se utiliza otro nivel de ejecución (runlevel) se deben crear los links que correspondan. Por ejemplo, si se utiliza el modo gráfico, seguramente el runlevel es el 5 y los links se deben hacer a /etc/rc5.d/...

Para probar todo se realizaron varios reinicios y se comprobó que el raid se ensambla y monta automáticamente.

-----
parq!

28/7/09

Transferencia de artículos desde ubuntu-es

En los últimos meses he notado que ubuntu-es está teniendo problemas para estar online, y ellos mismos lo reconocen (http://www.ubuntu-es.org/?q=node/110508) que están teniendo problemas técnicos por el gran uso del servidor.


Por ese motivo, y temiendo perder mis artículos en ese sitio, estoy trayéndolos a este blog, para mantener un archivo de mis publicaciones.

6/7/09

Frase: La discreción

Tu amigo tiene un amigo, y el amigo de tu amigo tiene otro amigo; por consiguiente sé discreto.

Frase del Talmud.

Realidad Aumentada - ARToolKit en Ubuntu 9.04

A fines de junio de 2009 estuve leyendo en el blog de Fabio acerca de realidad aumentada, y uno de los ejemplos mostraba algo de ARToolKit.

La realidad aumentada es la posibilidad de interactuar con elementos virtuales en el mundo real. Esto abre un mundo de posibilidades, desde un diagnóstico médico hasta juegos.

En el mundo real sólo existe un patrón (un papel impreso, en la mayoría de los casos) y mediante ese patrón la computadora le agrega un modelo 3D en tiempo real. Es sencillamente impresionante.



Enseguida me puse manos a la obra para probarlo en Ubuntu 9.04.

Al final de este artículo vas a encontrar un listado de los paquetes instalados y un listados completo de paquetes y sus dependencias. Todos esos paquetes los instalé durante las pruebas, por lo que el listado seguramente se puede reducir.

EL SISTEMA
ARToolKit es una biblioteca de software para crear aplicaciones de AR (Augmented Reality - Realidad Aumentada) y se puede descargar desde la página del HIT Lab de la Universidad de Washington y se distribuye bajo la GNU GPL para aplicaciones no comerciales.

La instalación es muy simple y sólo se requieren unos pocos comandos en la consola. Todo detallado en la página de la Universidad de Washington.

LA COMPLEJIDAD
ARToolKit es muy simple y potente, pero requiere de una cámara para poder funcionar. Técnicamente puede usarse cualquier cámara. Allí es donde se complica un poco hacer que el sistema funcione, dadas las opciones de drivers para conectarse con la cámara.

LA SOLUCIÓN
ARToolKit soporta que la cámara sea conectada a través de Gstreamer, por lo que literalmente se puede usar cualquier cámara. Recomiendo no renegar con las otras opciones (como hice yo) y empezar a probar con la opción de Gstreamer.

EL SECRETO
Al configurar la cámara y correr el sistema de prueba de ARToolKit ($ simpletest) el sistema no funcionaba porque la pantalla estaba dividida en varias partes, se veía la imagen duplicada y la parte inferior con lluvia. Este tema de demandó algunas horas hasta que entendí lo que pasaba.

Luego de buscar un rato largo y probar varias cosas en internet, encontré un post en el foro del HIT Lab de la Universidad de Canterbury el motivo del problema.

Y es que la cámara genera una imagen YUV (de luces) y ARToolKit necesita una imagen RGB (de colores). Esta diferencia en el formato hace que la imagen que el sistema de prueba recibe no sea útil para su funcionamiento.

En mi caso fue tan simple como exportar una línea para que se convierta el formato:
$ export ARTOOLKIT_CONFIG="v4l2src ! jpegdec ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24 ! identity name=artoolkit ! fakesink"

Y listo!




LISTADO DE PAQUETES INSTALADOS
freegult
libxi-dev
libxmu-dev
libxmu-headers
libjpeg2-dev
libglib2.0-dev
libgtk2.0-dev
libgstreamer-dev

LISTADO DE PAQUETES INSTALADOS Y SUS DEPENDENCIAS
build-essential (11.4)
dpkg-dev (1.14.24ubuntu1)
g++ (4:4.3.3-1ubuntu1)
g++-4.3 (4.3.3-5ubuntu4)
libstdc++6-4.3-dev (4.3.3-5ubuntu4)
patch (2.5.9-5)

freeglut3 (2.4.0-6.1ubuntu1)
freeglut3-dev (2.4.0-6.1ubuntu1)
libgl1-mesa-dev (7.4-0ubuntu3.1)
libglu1-mesa-dev (7.4-0ubuntu3.1)
libice-dev (2:1.0.4-1)
libpthread-stubs0 (0.1-2)
libpthread-stubs0-dev (0.1-2)
libsm-dev (2:1.1.0-1)
libx11-dev (2:1.1.99.2-1ubuntu2)
libxau-dev (1:1.0.4-1)
libxcb1-dev (1.1.93-0ubuntu3)
libxdmcp-dev (1:1.0.2-3)
libxext-dev (2:1.0.99.1-0ubuntu3)
libxt-dev (1:1.0.5-3ubuntu1)
linux-headers-2.6.28-13 (2.6.28-13.44)
linux-headers-2.6.28-13-generic (2.6.28-13.44)
linux-image-2.6.28-13-generic (2.6.28-13.44)
linux-restricted-modules-2.6.28-13-generic (2.6.28-13.17)
mesa-common-dev (7.4-0ubuntu3.1)
x11proto-core-dev (7.0.14-2)
x11proto-input-dev (1.5.0-1ubuntu1)
x11proto-kb-dev (1.0.3-3ubuntu1)
x11proto-xext-dev (7.0.4-1)
xlibmesa-gl-dev (1:7.4~5ubuntu18)
xtrans-dev (1.2.3-1)

libxi-dev (2:1.2.0-1ubuntu1)

libxmu-dev (2:1.0.4-1)
libxmu-headers (2:1.0.4-1)

v4l-conf (3.95.dfsg.1-8.1ubuntu1)

libjpeg62-dev (6b-14)

libglib2.0-dev (2.20.1-0ubuntu2)

debhelper (7.0.17ubuntu4)
gettext (0.17-6ubuntu2)
html2text (1.3.2a-5)
intltool-debian (0.35.0+20060710.1)
libatk1.0-dev (1.26.0-0ubuntu2)
libcairo2-dev (1.8.6-1ubuntu2)
libdirectfb-dev (1.0.1-11ubuntu1)
libdirectfb-extra (1.0.1-11ubuntu1)
libexpat1-dev (2.0.1-4)
libfontconfig1-dev (2.6.0-1ubuntu12)
libfreetype6-dev (2.3.9-4ubuntu0.1)
libgtk2.0-dev (2.16.1-0ubuntu2)
libmail-sendmail-perl (0.79.16-1)
libpango1.0-dev (1.24.1-0ubuntu1)
libpixman-1-dev (0.13.2-1)
libpng12-dev (1.2.27-2ubuntu2)
libsys-hostname-long-perl (1.4-2)
libsysfs-dev (2.1.0-5)
libxcb-render-util0-dev (0.2.1+git1-1)
libxcb-render0-dev (1.1.93-0ubuntu3)
libxcomposite-dev (1:0.4.0-3)
libxcursor-dev (1:1.1.9-1)
libxdamage-dev (1:1.1.1-4)
libxfixes-dev (1:4.0.3-2)
libxft-dev (2.1.13-3ubuntu1)
libxinerama-dev (2:1.0.3-2)
libxrandr-dev (2:1.3.0-1build1)
libxrender-dev (1:0.9.4-2)
po-debconf (1.0.15ubuntu1)
x11proto-composite-dev (1:0.4-2)
x11proto-damage-dev (1:1.1.0-2build1)
x11proto-fixes-dev (1:4.0-3)
x11proto-randr-dev (1.3.0-1)
x11proto-render-dev (2:0.9.3-2)
x11proto-xinerama-dev (1.1.2-5ubuntu1)
zlib1g-dev (1:1.2.3.3.dfsg-12ubuntu2)

check (0.9.5-4)
libgstreamer0.10-dev (0.10.22-1)
libpopt-dev (1.14-4)
libxml2-dev (2.6.32.dfsg-5ubuntu4)