martes, 13 de noviembre de 2007

Cambiar un disco por uno de mayor capacidad con LVM en caliente

En mi anterior artículo sobre simular un raid lineal con LVM, RuBICK nos comentaba:
Luego hay otro "truquillo" para sustituir un disco de ej: 80 GB por uno de 300Gb en caliente y sin que nadie lo note, pero eso seguro que nos lo tiene guardado Iván para otro dia.

   Tal y como le contesté en los comentarios, ya conté en el artículo inicial del LVM cómo hacerlo, aunque revisando el artículo me he dado cuenta de que me quedó un poco largo y justo eso quedó al final. Así, lo he rescatado para que se vean aún más las posibilidades de LVM.

   Partimos de un disco/partición con datos /dev/sda1 y lo que vamos a hacer es reemplazarlo por uno nuevo /dev/sdb1 previamente formateado con LVM.
  • Creamos un PV en la nueva partición:
    shian:~# pvcreate /dev/sdb1
    Physical volume "/dev/sdb1" successfully created
  • Lo añadimos al VG vg01 ya existente:
    shian:~# vgextend vg01 /dev/sdb1
    Volume group "vg01" successfully extended
  • Mostramos la información y comprobamos que tenemos dos PVs en el mismo VG. Nos fijamos en las extensiones disponibles en cada uno:
    shian:~# vgdisplay -v vg01
    Using volume group(s) on command line
    Finding volume group "vg01"
    --- Volume group ---
    VG Name vg01
    System ID
    Format lvm2
    Metadata Areas 2
    Metadata Sequence No 5
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 1
    Open LV 1
    Max PV 0
    Cur PV 2
    Act PV 2
    VG Size 5.99 GB
    PE Size 4.00 MB
    Total PE 1534
    Alloc PE / Size 256 / 1.00 GB
    Free PE / Size 1278 / 4.99 GB
    VG UUID BpNJTl-9tlr-DjzM-C8Mb-LfnL-NWDa-uyWDpf

    --- Logical volume ---
    LV Name /dev/vg01/lvdatos
    VG Name vg01
    LV UUID 7CYTLY-YgI2-c64S-F50h-vPXH-TEk9-o4hFOE
    LV Write Access read/write
    LV Status available
    # open 1
    LV Size 1.00 GB
    Current LE 256
    Segments 1
    Allocation inherit
    Read ahead sectors 0
    Block device 254:0

    --- Physical volumes ---
    PV Name /dev/sda1
    PV UUID 1wounc-DIHj-Tf54-4h2c-4rcB-w137-gLH4I6
    PV Status allocatable
    Total PE / Free PE 511 / 255

    PV Name /dev/sdb1
    PV UUID N0nwct-jNnY-eU0D-6Evh-tkIN-9vKs-9KsV3v
    PV Status allocatable
    Total PE / Free PE 1023 / 1023
  • Movemos la información de la partición que queremos liberar. Previamente nos aparece un error indicando que necesitamos tener activado en el kernel el mirror, así que cargamos el módulo:
    shian:~# pvmove /dev/sda1
    mirror: Required device-mapper target(s) not detected in your kernel

    shian:~# modprobe dm_mirror
  • De nuevo, intentamos mover los datos, aunque ahora sí lo conseguimos. Este paso variará en función de la cantidad de datos que se deban mover:
    shian:~# pvmove -v /dev/sda1
    /dev/sda1: Moved: 100.0%
  • Comprobamos el estado del VG y vemos que el PV /dev/sda1 tiene todas las extensiones disponibles:
    shian:~# vgdisplay -v vg01
    ...
    ...
    --- Physical volumes ---
    PV Name /dev/sda1
    PV UUID 1wounc-DIHj-Tf54-4h2c-4rcB-w137-gLH4I6
    PV Status allocatable
    Total PE / Free PE 511 / 511

    PV Name /dev/sdb1
    PV UUID N0nwct-jNnY-eU0D-6Evh-tkIN-9vKs-9KsV3v
    PV Status allocatable
    Total PE / Free PE 1023 / 767
  • Y finalmente eliminamos el PV /dev/sda1 del VG vg01 y comprobamos el resultado:
    shian:~# vgreduce -v vg01 /dev/sda1
    Removed "/dev/sda1" from volume group "vg01"

    shian:~# vgdisplay -v vg01
    Using volume group(s) on command line
    Finding volume group "vg01"
    --- Volume group ---
    VG Name vg01
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 11
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 1
    Open LV 1
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size 4.00 GB
    PE Size 4.00 MB
    Total PE 1023
    Alloc PE / Size 256 / 1.00 GB
    Free PE / Size 767 / 3.00 GB
    VG UUID BpNJTl-9tlr-DjzM-C8Mb-LfnL-NWDa-uyWDpf

    --- Logical volume ---
    LV Name /dev/vg01/lvdatos
    VG Name vg01
    LV UUID 7CYTLY-YgI2-c64S-F50h-vPXH-TEk9-o4hFOE
    LV Write Access read/write
    LV Status available
    # open 1
    LV Size 1.00 GB
    Current LE 256
    Segments 1
    Allocation inherit
    Read ahead sectors 0
    Block device 254:0

    --- Physical volumes ---
    PV Name /dev/sdb1
    PV UUID N0nwct-jNnY-eU0D-6Evh-tkIN-9vKs-9KsV3v
    PV Status allocatable
    Total PE / Free PE 1023 / 767

  •    Así, hemos conseguido cambiar un disco que se nos estaba quedando pequeño por otro de mayor capacidad, en caliente y sin que nadie note nada. Obviamente si es un servidor con discos internos, necesariamente hay que apagar la máquina para añadir/quitar el disco, pero con máquinas conectadas a almacenamiento externo no habría ningún problema.

    viernes, 2 de noviembre de 2007

    Actualizando versión de Linux: ¡Aprende Windows!

       Hace un par de semanas he actualizado mi Ubuntu Feisty a Gutsy y la verdad es que ha sido mucho mejor de lo que yo me esperaba y para nada traumático.

       Al principio me planteé formatear e instalar de cero y posteriormente recuperar todos mis datos del backup. Esta es la mentalidad windows: hay que instalar el sistema operativo de cero y nada de actualizar porque sino se quedan versiones antiguas y hay problemas e incompatibilidades. Pero esto no es windows, sino Linux, así que preferí actualizar mi sistema a ver qué ocurría. Ejecuté el update-manager y comencé la actualización a Gutsy Gibbon. En total se descargaron algo más de 1 Gbyte de paquetes, luego reinicié, instalé los drivers de nvidia y listo. En poco más de 2 horas tenía mi linux actualizado a la última versión de Ubuntu y con todas mis opciones de configuración almacenadas y funcionando sin ningún problema. Luego sólo tuve que configurar Compiz Fusion (hasta ahora tenía Beryl) y listo, el escritorio como lo tenía antes e incluso con efectos más chulos.

       En definitiva, que de nuevo me reafirmo en la elección que hice a principios de mayo de este año eligiendo linux como mi nuevo sistema operativo para (casi, sniff) todo.

    jueves, 25 de octubre de 2007

    Simular un raid lineal con LVM partiendo de un disco con información

       Como continuación de la entrada anterior en la que contaba cómo crear un raid 1 a partir de un disco con datos y teniendo uno nuevo, ahora voy a responder a la pregunta que dejaba abierta al final. No obstante tengo que decir que tanto Super coco como Rubick se adelantaron a la solución en los comentarios del post.

       Si recordamos, el truco de crear el raid 1 con un único disco no funcionaba para un raid lineal, así que, ¿qué podemos hacer?. La solución que se me ha ocurrido es usar LVM. Aunque no es exactamente un raid lineal el resultado final es el mismo puesto que tenemos un único punto de montaje y la capacidad de los dos discos.

       Al igual que en el artículo anterior, no me voy a extender demasiado en los detalles puesto que mi anterior artículo sobre LVM en linux es más completo.
  • Partimos de la misma situación que en la entrada anterior. Ya existe la partición /dev/sda1 y se encuentra montada en /mnt/datos.
  • Particionamos el nuevo disco como LVM (tipo 8e).
    shian:~# fdisk /dev/sdb
    ...
    Disk /dev/sdb: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 130 1044193+ 8e Linux LVM
    ...
  • Creamos un PV y un VG en él.
    shian:~# pvcreate /dev/sdb1
    Physical volume "/dev/sdb1" successfully created

    shian:~# vgcreate vg01 /dev/sdb1
    Volume group "vg01" successfully created
  • Ahora creamos un lvol con toda la capacidad del disco:
    shian:~# lvcreate -L 1G -n lvdatos vg01
    Logical volume "lvdatos" created
  • Lo formateamos, lo montamos y copiamos los datos que ya tenemos.
    shian:~# mkfs.ext3 /dev/vg01/lvdatos

    shian:~# mkdir /mnt/datos_lvm
    shian:~# mount /dev/vg01/lvdatos /mnt/datos_lvm/

    shian:~# cp -a /mnt/datos/* /mnt/datos_lvm/
  • No perdamos de vista el espacio que tenemos disponible:
    shian:~# df -h
    /dev/sda1 1004M 43M 911M 5% /mnt/datos
    /dev/mapper/vg01-lvdatos
    1001M 18M 932M 2% /mnt/datos_lvm
  • Ahora desmontamos la partición con los datos originales, la eliminamos y creamos una nueva de tipo LVM.
    shian:~# umount /dev/sda1
    shian:~# fdisk /dev/sda
    ...
    Disk /dev/sda: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sda1 1 130 1044193+ 8e Linux LVM
  • Creamos un PV en el antiguo disco que acabamos de particionar.
    shian:~# pvcreate /dev/sda1
    Physical volume "/dev/sda1" successfully created
  • Y lo añadimos al VG que creamos al principio para ampliarlo.
    shian:~# vgextend vg01 /dev/sda1
    Volume group "vg01" successfully extended
  • Si mostramos la información del VG, podemos ver que ahora los dos discos forman parte de él y que tenemos 1016MB nuevos disponibles para utilizar, por lo que podemos ampliar el lvol.
    shian:~# vgdisplay -v vg01
    Using volume group(s) on command line
    Finding volume group "vg01"
    --- Volume group ---
    VG Name vg01
    System ID
    Format lvm2
    Metadata Areas 2
    Metadata Sequence No 3
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 1
    Open LV 1
    Max PV 0
    Cur PV 2
    Act PV 2
    VG Size 1.98 GB
    PE Size 4.00 MB
    Total PE 508
    Alloc PE / Size 254 / 1016.00 MB
    Free PE / Size 254 / 1016.00 MB
    VG UUID fYT1oQ-w6zH-z6b6-58eo-qZ39-u1Ua-vROsN4

    --- Logical volume ---
    LV Name /dev/vg01/lvdatos
    VG Name vg01
    LV UUID NBOF9q-jmfW-RCik-MH2P-0Od4-DgMR-5YRJf7
    LV Write Access read/write
    LV Status available
    # open 1
    LV Size 1016.00 MB
    Current LE 254
    Segments 1
    Allocation inherit
    Read ahead sectors 0
    Block device 253:0

    --- Physical volumes ---
    PV Name /dev/sdb1
    PV UUID yH8UHo-Vgy2-Pk9t-AozF-s1Ik-JPmL-og1kM4
    PV Status allocatable
    Total PE / Free PE 254 / 0

    PV Name /dev/sda1
    PV UUID 4cGeH2-nl7W-eH4a-mBHo-BCBI-b0np-f6gw1v
    PV Status allocatable
    Total PE / Free PE 254 / 254
  • Y finalmente lo ampliamos. Recordemos que primero ampliamos el lvol y luego el filesystem.
    shian:~# lvextend -L+1016M /dev/vg01/lvdatos
    Extending logical volume lvdatos to 1.98 GB
    Logical volume lvdatos successfully resized

    shian:~# umount /mnt/datos_lvm/

    shian:~# e2fsck -f /dev/vg01/lvdatos

    shian:~# resize2fs /dev/vg01/lvdatos
    The filesystem on /dev/vg01/lvdatos is now 520192 blocks long.
  • Y ya estaría ampliado sin necesidad de formateos.
    shian:~# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/mapper/vg01-lvdatos
    2.0G 43M 1.9G 3% /mnt/datos_lvm

  •    Y con esto respodo a la duda inicial que me planteó Renato. Espero que te sea útil.

    viernes, 19 de octubre de 2007

    Crear un raid 1 a partir de un disco con datos sin formatear

       Hace unos días recibí un email de un lector de este blog, Renato, diciéndome que tiene un NSLU2 con Debian, qué envidía :-P, y con un disco duro muy lleno. Me preguntaba si podía añadir un nuevo disco y crear un raid sin tener que reformatear.

       Me picó la curiosidad y el resultado es este tutorial. No voy a extenderme demasiado en las explicaciones puesto que en el tutorial del raid 1 que hice hace tiempo se puede encontrar la información más detallada. Manos a la obra!.
  • Como preparación he creado una partición /dev/sda1, la he montado en /mnt/datos y he copiado algo de información en ella. Esta sería la partición que ya tenemos casi llena y no queremos tener que formatearla.
  • Vamos a crear un raid 1 con el otro disco (el disco nuevo que todavía no tiene información). Particionamos como tipo fd:
    shian:~# fdisk /dev/sdb
    ...
    Disk /dev/sdb: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 130 1044193+ fd Linux raid autodetect
    ...
  • Y ahora viene el paso más importante en la creación del raid. Creamos el raid 1 pero con un único disco/partición. La clave es utilizar sólo la partición del nuevo disco /dev/sdb1 y en el otro poner missing, de tal forma que el raid 1 se crea degradado porque sólo existe un disco.
    shian:~# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing
    mdadm: size set to 1044096K
    mdadm: array /dev/md1 started.
  • Si aparece el error mdadm: error opening /dev/md1: No such file or directory deberemos crear el dispositivo mdX primero, según el que necesitemos:
    shian:~# mknod /dev/md0 b 9 0
    shian:~# mknod /dev/md1 b 9 1
    shian:~# mknod /dev/md2 b 9 2
    ...
  • Si miramos el fichero /proc/mdstat nos fijamos en el que raid está disponible pero sólo con un disco.
    shian:~# cat /proc/mdstat
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
    md1 : active raid1 sdb1[0]
    1044096 blocks [2/1] [U_]
  • Lo mismo ocurre si mostramos la información del raid:
    shian:~# mdadm --detail /dev/md1
    /dev/md1:
    Version : 00.90.03
    Creation Time : Fri Sep 28 08:09:16 2007
    Raid Level : raid1
    Array Size : 1044096 (1019.80 MiB 1069.15 MB)
    Device Size : 1044096 (1019.80 MiB 1069.15 MB)
    Raid Devices : 2
    Total Devices : 1
    Preferred Minor : 1
    Persistence : Superblock is persistent

    Update Time : Fri Sep 28 08:09:16 2007
    State : clean, degraded
    Active Devices : 1
    Working Devices : 1
    Failed Devices : 0
    Spare Devices : 0

    UUID : b0e5f96e:12266294:54e4f551:119b56e7
    Events : 0.1

    Number Major Minor RaidDevice State
    0 8 17 0 active sync /dev/sdb1
    1 0 0 1 removed
  • Formateamos el raid y lo montamos en /mnt/datos_raid. Así, estaría disponible para ser utilizado, pero con un único disco. Además, copiamos la información del disco antiguo (recordemos que está montado en /mnt/datos) al raid.
    shian:~# mkfs.ext3 /dev/md1
    shian:~#
    shian:~# mkdir /mnt/datos_raid
    shian:~# mount /dev/md1 /mnt/datos_raid
    shian:~#
    shian:~# cp -a /mnt/datos/* /mnt/datos_raid
  • En este punto ya tenemos toda la información en el raid. Ahora desmontamos la partición de nuestros datos /dev/sda1, particionamos el disco y creamos la partición de tipo raid (fd).
    shian:~# umount /dev/sda1
    shian:~# fdisk /dev/sda
    ...
    Disk /dev/sda: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sda1 1 130 1044193+ fd Linux raid autodetect
    ...
  • Y ahora añadimos al raid /dev/md1 la partición que acabamos de crear:
    shian:~# mdadm --manage /dev/md1 --add /dev/sda1
    mdadm: added /dev/sda1
  • Después de un tiempo el raid estará reconstruido con toda nuestra información a salvo en ambos discos:
    shian:~# cat /proc/mdstat
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
    md1 : active raid1 sda1[1] sdb1[0]
    1044096 blocks [2/2] [UU]
  • El paso final es actualizar el archivo de configuración /etc/mdadm/mdadm.conf con el nuevo raid.
    shian:~# cd /etc/mdadm
    shian:/etc/mdadm# cp mdadm.conf mdadm.conf.`date +%y%m%d`
    shian:/etc/mdadm# echo "DEVICE partitions" > mdadm.conf
    shian:/etc/mdadm# mdadm --detail --scan >> mdadm.conf
  • Y añadir al archivo /etc/fstab el montaje automático del raid en el arranque.
    shian:~# echo "/dev/md1        /mnt/datos       ext3    defaults        0       2" >> /etc/fstab

  •    Hemos visto cómo pasar de una configuración con un único disco a otra basada en un raid 1 sin tener que salvar toda nuestra información en otro medio independiente y reformatear todo a la vez.

       Lamentablemente, lo que quería hacer nuestro compañero Renato era crear un raid JBOD (o lineal), cosa que no entendí yo en un primer momento y me lancé a probarlo con un raid 1. Si intentamos crear el raid lineal con un único disco vemos que no es posible. Aunque el mensaje de mdadm no es muy claro, con dmesg vemos realmente la causa:
    shian:~# mdadm --create --verbose /dev/md2 --level=linear --raid-devices=2 /dev/sdb1 missing
    mdadm: chunk size defaults to 64K
    mdadm: RUN_ARRAY failed: Invalid argument
    mdadm: stopped /dev/md2

    shian:~# dmesg
    ...
    linear: not enough drives present. Aborting!
    md: pers->run() failed ...
    md: md3 stopped.
    md: unbind
    md: export_rdev(sdb1)

       La solución a cómo poder hacer esto sin tener que reformatear en el próximo post :-).

    jueves, 11 de octubre de 2007

    Ocultar la ventana de "Equipo Bloqueado" en Windows

       Siempre que bloqueamos una máquina con Windows NT/2K/XP aparece una ventana indicando que el equipo está bloqueado y nuestro nombre de usuario. Esta ventana aparece en el centro de la pantalla, por lo que si tenemos una foto de fondo, lo más probable es que tape el motivo principal de la foto. En mi caso, en el ordenador del trabajo, cuando bloqueo el equipo lo que veo es:

       En este artículo lo que vamos a ver es cómo ocultar esta ventana para que al bloquear el equipo se muestre la foto a pantalla completa.

       Para poder hacer este pequeño hack lo único que necesitamos es acceso a la consola de recuperación como administrador de la máquina (también serviría un live-cd de linux y NTFS-3G) y el Resource Hacker. Este programa sirve para ver, modificar y borrar recursos en archivos ejecutables, dlls,.... Podemos cambiar el texto de un diálogo, los iconos, eliminar una parte que no nos guste. Es bastante potente y sencillo de utilizar. ¡Empecemos!.
  • El diálogo que vamos a modificar se encuentra en la dll C:\Windows\system32\msgina.dll. La copiamos a C:\ pues que en la ubicación original no la podemos usar porque está bloqueada.
  • Ejecutamos el Resource Hacker y abrimos la dll.
  • En el menú Dialog -> 1900 vemos la ventana que vamos a modificar.
  • Podemos juguetear con el código para cambiar los textos y pulsando el botón Compile Script vemos cómo quedaría. En nuestro caso, para ocultarla completamente lo que hacemos es reemplazar el código por el siguiente:
    1900 DIALOGEX 0, 0, 0, 0
    STYLE WS_POPUP | WS_VISIBLE
    CAPTION ""
    LANGUAGE LANG_SPANISH, 0x3
    FONT 0, ""
    {
    }
  • Nuevamente pulsamos el botón Compile Script, salvamos los cambios y reiniciamos el equipo para entrar en la consola de recuperación.
  • Ahora vamos a sobreescribir la dll original (recordad hacer copia de seguridad) por la modificada. La dll se encuentra en C:\Windows\system32\ y también en C:\Windows\system32\dllcache\ y es necesario reemplazar las dos copias.
    copy c:\msgina.dll c:\windows\system32
    copy c:\msgina.dll c:\windows\system32\dllcache
  • Reinciamos de nuevo la máquina, entramos en windows y bloqueamos el equipo. Si hemos hecho todo bien el resultado debería ser algo parecido a esto (se ve la foto a pantalla completa sin ninguna ventana).
  • Aunque la ventana no se vea, realmente está ahí y el equipo está bloqueado, por lo que pulsamos CTRL+ALT+SUPR, introducimos nuestro password y a trabajar.

  •    Ahora ya, cuando os levantéis de vuestro sitio, lo único que tenéis que hacer es pulsar las teclas WIN + L y disfrutar con el fondo.

    viernes, 5 de octubre de 2007

    La gran comunidad Linux

       Otra de las cosas que aún no puedo hacer con linux es utilizar mi receptor infrarrojos usb para pasar canciones o fotos a mi móvil, así que tengo que usar nuevamente windows :-(.

       Una de las grandes ventajas de Linux y su gran comunidad de desarrolladores que hay detrás es que puedes abrir un bug y esperar a que alguien lo resuelva. Eso es lo que hice y se puede ver aquí (no vale reirse de mi inglés). Aunque han tardado más de un mes en mirarlo, me han dado las gracias por abrir el bug, pero como no es nada importante está parado. ¿Gracias a mi?. No, gracias a vosotros que hacéis posible que exista este sistema operativo que poco a poco nos está liberando del que llevamos tanto tiempo arrastrando.

       Ahora sólo queda esperar a que alguien lo arregle, aunque con la inminente salida de la próxima versión de Ubuntu para el 18 de este mes, con nueva versión del kernel incluída (2.6.22), es probable que se haya corregido. Y si no, pues a reabrirlo de nuevo porque desgraciadamente mis conocimientos de programación no llegan al nivel para poder arreglarlo yo mismo.

       ¿No es mágnifico poder abrir un bug del sistema operativo y que alguien lo pueda arreglar sin depender de una "megacorporación"?.

    lunes, 1 de octubre de 2007

    Mi nuevo gadget...

       ...un iPod Classic 80GB. Un amigo, Jose, ha estado una semana en Nueva York y con la gran diferencia entre el dolar y el euro he aprovechado para encargale este nuevo juguetito. Llevaba ya mucho tiempo detrás de un iPod y por fín me he decidido con este.

       La verdad es que de momento no me ha dado tiempo a hacer demasiado, me bajé el iTunes, lo instalé, actualicé el iPod y copié unas cuantas canciones y fotos para probarlo.

       Como sabéis, no existe iTunes para Linux, por lo que de momento no he tenido más remedio que usar windows. Además, en esta nueva generación de iPods, Apple ha hecho un pequeño cambio en la base de datos y los programas para linux no funcionan correctamente. Menos mal que en poco tiempo la comunidad linux ha encontrado la solución y en breve tendremos acceso de nuevo. Yo lo he conectado en linux y me lo reconoció perfectamente, he incluso se autoejecutó Rhythmbox, montó el iPod y me mostró todas las canciones. La pega fue que al sincronizarlo éstas se "perdieron" por el problemilla anterior que he comentado. Creo que Apple debería pensar un poco en toda la gente que compra sus productos y dar la oportunidad de utilizar iTunes en linux. Otra cosa es que lo usemos :-P.

       En fin, que poco a poco terminaré de etiquetar bien todos mis mp3 (¿alguien conoce un programa bueno para esto?), buscar las carátulas e ir pasando todas las canciones al iPod. Además tengo pendiente convertir algún video a ver qué tal se ven. Mientras tanto os dejo con unas fotos del juguetito:

    jueves, 27 de septiembre de 2007

    Iniciativa de Red.es: Programa NEW

    Este análisis está patrocinado por Zync.es

       En estos tiempos, estar presentes en internet ya no es una distinción frente a la competencia sino que es necesario para cualquier empresa. Puede surgir el problema de que seamos una empresa pequeña y no tengamos ni los conocimientos ni los recursos necesarios para poder comprar un dominio, tener un servidor, mantenerlo, administrarlo,... Teniendo esto en mente, el Ministerio de Industria, Turismo y Comercio en colaboración con Red.es han creado el Programa NEW: Ninguna Empresa sin Web. Este programa es un paquete web que permite a esas empresas sin demasiados recursos tener presencia en internet sin tener que preocuparse de la tediosa tarea de la administración. Así, según indican en su web, sus características son:
  • Registro y mantenimiento de un nombre de dominio bajo el código ".es".
  • Herramienta de creación de web con un mínimo de 3 páginas con una plantilla de diseño básica para la página inicial de la web.
  • Panel de control multilingüe (castellano, lenguas co-oficiales de España e inglés).
  • Buzones de correo con 100 MB de espacio por buzón.
  • 100 MB de espacio de disco para almacenamiento de la Web.
  • 1 GB de transferencia mensual.
  • Acceso a FTP.
  • Acceso a estadísticas de uso.
  • Back Up diario.
  • Acceso a correo por Webmail.
  • Acceso a correo por POP 3, IMAP4, etc. (compatibles con Outlook, Eudora, Thunderbird,...).
  • Antispam.

  •    Todo esto lo ofrecen desde 65 euros. Mi primera impresión ha sido que es algo elevado y además habría que aclarar unos cuantos temas adicionales:
  • El tráfico de 1GB al mes me parece algo limitado si la empresa quiere potenciar su web. Si la utilizan sólo como primera toma de contacto con los posibles clientes no habría demasiados problemas. Además, habría que definir qué ocurre si se sobrepasa ese límite. ¿Se bloquea la web?, ¿se cobra un sobreprecio?.
  • Las 10 cuentas de correo pueden quedarse cortas si se quieren personalizar y no utilizar las clásicas info@empresa.com y similares.
  • Simplemente se informa de que hay backup diario, pero se debería especificar qué tipo de herramientas se utilizan y cómo se podría recuperar ese backup en caso de necesidad.

  •    Aún así, creo que es una buena iniciativa para esas Pymes que todavía no se atreven o no poseen los conocimientos o infraestructura necesaria para poder tener presencia en internet ya que les puede abrir muchas puertas.

    lunes, 24 de septiembre de 2007

    El efecto Kriptópolis

       Después del final de las vacaciones y la reincorporación al trabajo llega el momento de ponerme a leer todo lo que tenía pendiente en Google Reader. Así, he llegado a este artículo de Kriptópolis que me ha enlazado.

    Iván López, amable lector de Kriptópolis, publicó hace unos meses otro artículo interesante al respecto: Rsync vs BackupPc vs Link-Backup. Es posible que para algunos lectores pueda resultar más apropiado que el método aquí expuesto. Además, Iván tiene publicado otro artículo muy majo sobre Raid 1 en Linux. Ambos artículos me parecen muy recomendables, sobre todo si nuestras necesidades van algo más allá de las de un sencillo sistema doméstico.


       Aunque no he tenido un aluvión de visitas como después del efecto barrapunto por el artículo del raid 1 en linux, sí que he notado en las estadísticas que durante un par de días hubo un incremento de los visitantes en torno al 50%, algo muy lejos del más de 4000% del efecto barrapunto.

       En fin, que todo un honor ser enlazado por un medio tan reconocido y de tanto prestigio como Kriptópolis.

    viernes, 14 de septiembre de 2007

    Wardriving y geoposicionamiento de puntos de acceso wifi con Google Earth

       Según la Wikipedia, el Wardriving es:
    La búsqueda de redes inalámbricas Wi-Fi desde un vehículo en movimiento. Implica usar un coche o camioneta y un ordenador equipado con Wi-Fi, como un portátil o una PDA, para detectar las redes.
       Además, si en la ecuación utilizamos también un GPS podemos geoposicionar dichos puntos de acceso.

       Yo he modificado ligeramente esta idea utilizando la PDA con el GPS y aprovechando los paseos que damos por las tardes con Judith. Así, sirviendome del mágnifico programa para buscar redes wifi WiFiFoFum y enlazando éste con el GPS he ido almacenando logs con los distintos puntos de acceso wifi que he ido encontrando en sucesivos paseos. Hasta aquí todo muy bien, pero tener un log como este no sirve de mucho:
    0001386FCE3D WLAN_D6  AP On  20:16:57 20:18:03 40,2397633333333 -3,77285833333333
    0002CF503AE3 WLAN_11 AP On 20:24:54 20:26:21 40,24089 -3,77058833333333
    0003C9D1E558 Comtrend AP On 19:58:44 20:04:13 40,244575 -3,77372
    000F213108CF Mota AP On 20:20:43 20:22:17 40,239985 -3,77503166666667
    0011E3E40BD0 THOMSON AP Off 20:35:02 20:35:03 40,241825 -3,77842333333333

       Pensando cómo mostrar esa información de manera que resultase útil visualmente, busqué información sobre cómo convertir mis logs (en formato CSV pero con tabuladores en lugar de comas) en archivos KML que pudiera importar en Google Earth. Existen webs que convierten datos en CSV a KML, pero después de probar el resultado no me convencía demasiado porque el código generado era demasiado complejo y contenía mucha información inútil. Así, después de buscar algo de información sobre KML me dispuse a crear mi propio generador en shell script y AWK. El resultado es el script gps2kml:
    #!/bin/sh
    #
    # gps2kml.sh: Script de creación de ficheros KML para
    # Google Earth a partir de CSV separados por tabuladores
    #
    # Iván López Martín
    # http://lopezivan.blogspot.com
    #
    DATA_FILE=$1
    KML_FILE=$2
    SKELETON=`mktemp -u`
    WEP=$4

    create_AWK_Skeleton() {
    echo { > $SKELETON
    echo if \(\$4 \== \""On"\"\) icon=\""http://farm2.static.flickr.com/1248/1196978492_72600c8064_o.png"\" >> $SKELETON
    echo if \(\$4 == \""Off"\"\) icon=\""http://farm2.static.flickr.com/1260/1196978476_e1a2070680_o.png"\" >> $SKELETON
    echo print \""<Placemark>"\" >> $SKELETON
    echo print \"" <name>\"\$2\"</name>"\" >> $SKELETON
    echo print \"" <description>\"\$1\"</description>"\" >> $SKELETON
    echo print \"" <Point>"\" >> $SKELETON
    echo print \"" <coordinates>\"\$8\",\"\$7\",0</coordinates>"\" >> $SKELETON
    echo print \"" </Point>"\" >> $SKELETON
    echo print \"" <Style>"\" >> $SKELETON
    echo print \"" <IconStyle>"\" >> $SKELETON
    echo print \"" <Icon>"\" >> $SKELETON
    echo print \"" <href>\"icon\"</href>"\" >> $SKELETON
    echo print \"" </Icon>"\" >> $SKELETON
    echo print \"" </IconStyle>"\" >> $SKELETON
    echo print \"" </Style>"\" >> $SKELETON
    echo print \""</Placemark>"\" >> $SKELETON
    echo } >> $SKELETON
    }

    # Comprobación de parámetros
    if [ "$#" != "2" ]; then
    echo "Uso: `basename $0` fich_datos fich_kml"
    exit 1
    fi

    # Creamos el esqueleto de la función para awk
    create_AWK_Skeleton


    # Escribimos la cabecera del fichero kml
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $KML_FILE
    echo "<kml creator=\"gps2kml http://lopezivan.blogspot.com/2007/09/wardriving-y-geoposicionamiento-de.html\" xmlns=\"http://earth.google.com/kml/2.1\">" >> $KML_FILE
    echo "<Folder>" >> $KML_FILE
    echo " <name>APs Wifi Parla</name>" >> $KML_FILE
    echo " <open>0</open>" >> $KML_FILE

    # Cambiamos las comas por puntos
    sed "s/,/./g" $DATA_FILE > .tmp$DATA_FILE

    DATA_FILE=.tmp$DATA_FILE

    # Generamos los puntos
    awk -f $SKELETON -F"\t" $DATA_FILE >> $KML_FILE

    # Escribimos el final del fichero
    echo "</Folder>" >> $KML_FILE
    echo "</kml>" >> $KML_FILE

    # Borramos los temporales
    rm $SKELETON 2>/dev/null
    rm $DATA_FILE 2>/dev/null

       La forma de ejecutarlo es muy sencilla y lo único que necesita es el fichero de entrada con los datos y el fichero de salida. Aspectos a tener en cuenta:
  • Como es una versión de andar por casa no se realizan demasiadas comprobaciones.
  • Se utilizan dos iconos distintos en función de si el punto de acceso tiene cifrado o no.
  • Se generan todos los puntos de acceso en una misma carpeta dentro de GoogleEarth.
  • El fichero generado funciona correctamente en las versiones 4.1.7076.4458 y 4.2.0180.1134 de Google Earth bajo Linux. No lo he probado ni en windows ni con otras versiones, aunque no debería de haber problemas.

  •    Después de filtrar los puntos de acceso duplicados de todos los logs de los distintos días, ejecutamos el script con este fichero de entrada:
    ivan@doraemon:~$ ./gps2kml.sh datosGPS.txt paseoJudith.kml

       Abrimos Google Earth cargamos el fichero recien generado (por si no quereis generarlo) y obtendremos una vista de la zona por la que vivo con todos los puntos de acceso que he ido encontrado.

       Así que ya sabéis, si alguna tarde vais por Parla por esa zona y veis a esta preciosa niña, que sepáis que el que va empujando el carrito soy yo ;-).

       P.D: Después de terminar el script y el post he buscado en la web de WiFiFoFum y me he dado cuenta que desde la versión 2.2.5 del 10 de abril de 2007, el programa permite exportar a KML. ¡Eso me pasa por no utilizar versiones actualizadas! (la mía es de octubre de 2006). De todas formas me ha servido para conocer el formato KML y aprovechar los paseos de Judith. Además, el script se puede utilizar para generar el fichero KML desde otros orígenes que no sean el WifiFofum.

    jueves, 6 de septiembre de 2007

    GoogleReader vs Firefox LiveBookmarks

       Llevo mucho tiempo leyendo mis feeds por medio de los marcadores de Firefox. Así, tengo que ir abriéndolos de uno en uno en solapas, recordando los que ya he leído para no volverlos a leer, guardar en del.icio.us lo que más me pueda interesar,... en fin, que es una tarea bastante manual y tediosa.

       Al poco de que Google lanzara Google Reader comencé a usarlo y de hecho tenía algunos feeds configurados, pero por alguna extraña razón que no recuerdo dejé de usarlo. Hace ya un tiempo me lo volvió a recomendar un compañero y decidí darle otra oportunidad. Siguiendo la propia ayuda que proporciona Google Reader me instalé un plugin para firefox que me permitía exportar mis marcadores al formato OPML y poder importarlos de una manera sencilla con Google Reader. En menos de cinco minutos tenía todos mis feeds en Google Reader y lo único que tuve que hacer fue etiquetarlos correctamente y tuve todo listo para funcionar.

       La verdad es que después de llevar utilizándolo muy poco tiempo pienso "¿cómo he podido vivir sin esto?". Lo que más me gusta de Google Reader es:
  • La gestión de los feeds es realmente buena. Se utiliza un sistema de etiquetas similar al de Gmail y los feeds se refrescan automáticamente. Se pueden mostrar todos o sólo los que están sin leer, se pueden marcar feeds como favoritos,...
  • Las estadísticas (trends) aunque no demasiado útiles, sí son al menos curiosas.
  • Se pueden importar automáticamente los feeds de del.icio.us, flickr, blogger,...
  • Puedes compartir tus feeds o los post que consideres más interesantes. Para ello sólo tienes que publicar una url o un feed y listo, cualquiera puede leer lo que compartas.
  • La posibilidad de leer los feeds de manera Offline. Aunque en los tiempos de las conexiones por modem sí resultaría realmente útil porque te podrías descargar los posts (con un máximo de 2000) y desconectarte, en estos tiempos también viene bien por si hay cortes de adsl o lo que sea. Además, este año durante las vacaciones con wifi, sincronizaba mis feeds y por la tarde podía seguir leyendo en casa.
  • Puedes moverte por la interfaz con atajos de teclado, algo realmente útil para no tener que utilizar en todo momento el ratón.
  • Y la más importante por cortesía de Super Coco en los comentarios, la versión móvil para PDAs y móviles, imprescindible.

  •    Realmente todo me ha gustado mucho, lo único que he echado de menos en el tiempo que llevo usándolo era la opción de búsqueda en los feeds y justo hoy me ha sorprendido Google con el cambio. En definitiva, un DIEZ!.

    lunes, 3 de septiembre de 2007

    Usuario de Ubuntu

       Hace un tiempo descubrí la web The Ubuntu Counter Project, que está basada en Linux Counter y sirve para poder darte de alta como usuario de Ubuntu. Así que nada, desde hoy soy el usuario registrado número 15006 de Ubuntu, más concretamente de Feisty Fawn como ya sabéis.

       Aunque la web es casi una mera anécdota y obviamente hay muchísima más gente que usa cualquier distribución basada en Ubuntu y también hay mucha gente que se registra y lo más que prueba es un Live-CD, siempre están bien páginas como esta. Yo hace ya muchos años que me registré en Linux Counter, pero perdí mi registro :-(, aunque ahora es cuando por fin he dado el paso para dejar windows. Qué lejos queda mi segundo post en este blog del 4 de julio de 2005 en que el que contaba mi intención de cambiar de windows a linux...

    The Ubuntu Counter Project - user number # 15006

    jueves, 16 de agosto de 2007

    De vacaciones en el pueblo... con Wifi!!

       Para descansar unos días nos hemos venido a Hinojal, el pueblo de mis suegros. Es un pequeño pueblo a unos 30 Km. de Cáceres con muy pocos habitantes y sin apenas cobertura de los móviles, así que de puntos de acceso Fon o vecinos con redes wifi ni hablemos...

       Resulta que hablando con mi suegro me dijo que en la Casa de la Cultura a lo mejor había ordenadores para conectarse a internet. El otro día nos acercamos y aunque nos dijeron que durante el mes de agosto tienen la sala de los ordenadores cerrada, pude comprobar con la PDA que había un punto de acceso wifi de Telecentros. Leyendo un poco su web me entero de que son puntos de acceso wifi gratuitos para llevar internet a zonas rurales. Me registré y enseguida estaba leyendo el correo y comprobando algunas webs desde la PDA. Luego por la tarde, para dar un paseo, volvimos con Judith y el portatil (nunca viajes sin él) y ahí estaba yo en el parque con mi niña, leyendo mis feeds y preparando este post.


       Así que aquí estoy tan feliz, descansando unos días pero con conexión a internet para seguir on.

    jueves, 9 de agosto de 2007

    ¿Edición de video en Linux?

       Lo siento pero lo he intentado y no hay manera. Me he pegado tanto con Cinelerra como con Kino y no me terminan de convencer.

       Hace unos meses nos compramos una videocámara para tenerla lista para el nacimiento de Judith. Después de haber hecho algunas pruebas grabando y probando la cámara llega el momento de capturar todo en el pc y proceder a la edición del video. Como ya he dicho he probado tanto con Cinelerra como con Kino y lo he dejado por imposible. Intentar compilar Cinelerra con sus múltiples dependencias es poco menos que una tarea larga, tediosa y bastante compleja, así que busqué el paquete .deb y me decidí a probarlo. La interfaz no está mal pero la aplicación se colgaba de vez en cuando y no parece llevarse nada bien con Beryl. Además no me terminó de convencer demasiado la forma de trabajar. Kino, todo hay que decirlo, tampoco lo probé mucho pero lo poco que vi tampoco me gustó.

       Después de algo más de 3 meses usando (casi) exclusivamente linux en casa, me duele mucho tener que decir esto pero para la edición de video tengo que usar windows :-(

       Concretamente he elegido la opción de Adobe Premiere Pro 2.0 + Adobe Encore DVD 2.0 + Adobe Photoshop CS2. La verdad es que no hay color, puedo editar el video a mi gusto desde Premiere, importarlo con Encore para crear los menús del dvd y editar las plantillas del dvd con Photoshop. Obviamente no son comparables estos productos con las alternativas existentes para linux. En fin, que aunque estoy muy contento con haberme pasado a linux para mi día a día, tengo que admitir que para cosas más concretas debo usar windows.

    martes, 31 de julio de 2007

    Wake on Lan con Linksys DD-WRT

       Todos conocemos lo que es Wake On Lan (WOL) y no me voy a extender en explicarlo sino que os voy a remitir a este interesante artículo de Vicente Navarro en el que está explicado perfectamente. Si no sabes lo que es, te recomiendo que empieces por ahí y luego vuelvas aquí. Por petición suya en los comentarios de su artículo voy a extender un poco la idea del wake on lan para poder sacarle todo el provecho posible.

       Como ya he dicho en otras ocasiones, el Linksys con DD-WRT tiene muchísimas opciones que consiguen una combinación de router-firmware increíble.

       Imaginemos la siguiente situación... Estás en "cualquier lugar del mundo con conexión a internet" y necesitas algún archivo que sólo tienes en el ordenador de tu casa. Como tu ordenador está apagado no tienes posibilidad de obtenerlo, pero antes de viajar has dejado el router encendido y configurado para poder conectarse desde el exterior. Inicias una sessión por ssh a tu router, arrancas remotamente tu ordenador, esperas unos minutos y te puedes conectar a él por ssh, vnc o lo que prefieras. Obtienes el documento que querías, lo apagas y sigues disfrutando de tu viaje.

       En mi caso esto se puede hacer con el Linksys con dd-wrt:
    ~ # uname -a
    Linux DD-WRT 2.4.34-pre2 #170 Fri Jun 15 20:10:21 CEST 2007 mips unknown

    ~ # /usr/sbin/wol -i 192.168.1.255 AA:BB:CC:DD:EE:FF
    Waking up AA:BB:CC:DD:EE:FF...

       Y ese paquete mágico despierta automáticamente a mi pc y lo deja listo para que me pueda conectar a él. También es posible hacerlo desde la interfaz gráfica del router pero no tiene tanta gracia...

       Otro uso que se me ocurre crear una tarea del crontab que arranque nuestra máquina y el servidor de backup todas las noches, se conecte por ssh y lance la copia de los datos, y finalmente, que apague las dos máquinas. Por la mañana sólo tendríamos que encender el móvil para comprobar si el backup ha terminado correctamente...

    miércoles, 18 de julio de 2007

    Fonera brickeada...

       ...Y arreglada!. Hace ya tiempo, intentando instalar un nuevo firmware en una de mis foneras hice lo que comúnmente se conoce como brickear, vamos, que me la cargué. Buscando un poco de información en los foros leí que con un cable serie la podía conectar al ordenador para intentar recuperarla.

       Mi circuito es una pequeña adaptación del que encontré y no está tan currado pero para el uso que le iba a dar es más que suficiente. El material que utilicé y el precio fue:
  • Placa protoboard: Tenía una en casa de alguna práctica de la facultad, así que esto me lo ahorré. También se puede utilizar una placa perforda pero hay que soldar y no me apetecía mucho ;-).
  • 4 condensadores electrolíticos de 1 µF: 0,20€ cada uno.
  • 1 condensador electrolítico de 10 µF: 0,20€.
  • Chip Max232: Para controlar la comunicación por el puerto de serie. También tenía uno de otra práctica.
  • Cable de audio de un lector de cdrom: Lo usé para desarmarlo y conectarlo a los pines de la fonera de una manera fácil.
  • Cable serie o conector para el PC y tres hilos: En mi caso tenía el cable y lo que hice fue cortarlo para engancharlo a la placa.


  •    Después de un rato conectando cables según el circuito lo tenía listo para probarlo. El cable que sale por abajo es el que va a la Fonera y el de arriba es el cable serie que va al ordenador. Después de conectarlo todo, el circuito quedó:

       Y seguí este magnífico post para conectarme por el cable de serie a la fonera y poder instalarle de nuevo el firmware oficial de Fon. Después de eso, seguí mi propio post (qué pronto se olvidan las cosas) para instalarle dd-wrt y ya está recuperada y funcionando de nuevo :-).

    Como dicen en el anuncio: "condensadores, placa protoboard, cables,... unos pocos euros. Pasar una tarde entretenido y recuperar una fonera... no tiene precio".

    jueves, 5 de julio de 2007

    Crear un fotolog con Flickr y Blogger

       En algún momento nos podemos plantear hacer un fotolog en el que iremos subiendo fotos y pequeños textos con algún comentario de las mismas. La manera tradicional de realizar esto puede ser subir las fotos a flickr, copiar las rutas, editar el html a mano desde blogger y finalmente publicar el post.

       Esta opción puede resultar muy tediosa para algo tan sencillo como querer publicar fotos con un pequeño comentario. Una opción mucho más cómoda es utilizar Flickr + Blogger. Desde flickr podemos configurar un blog en el que queramos publicar nuestrar fotos. Para ello necesitamos:
  • Cuenta de Google y blog de Blogger.
  • Cuenta de Flickr.
  • Entramos en Flickr y en el menu You > Your Account seleccionamos la opción Extending Flickr y en la opción Your Blogs configuramos nuestro blog de Blogger.
  • Seleccionamos la plantilla de publicación que vamos a utilizar.
  • Volvemos a la vista de las fotos que hemos subido y seleccionamos una. En las opciones que aparecen encima de la foto seleccionamos Blog This, escribimos el título y el texto del mensaje y se realiza la publicación.
  • Cargamos nuestro blog de blogger y la foto debería aparecer.

  •    Aquí habríamos terminado. A partir de ahora podríamos subir nuestras fotos a flickr y publicarlas en el blog de una manera rápida y sencilla.

       Obviamente este tutorial no termina aquí porque esto que acabo de contar se puede encontrar en multitud de páginas web. Vamos a ver los inconvenientes y cómo mejorar un poco los posts que se generan.

       Cuando seleccionamos en flickr la plantilla de publicación, por ejemplo 500px, on its own line y vemos el código html que se va a utilizar para publicar en el blog nos encontramos con esto:
    <style type="text/css">
    .flickr-photo { border: solid 2px #000000; }
    .flickr-yourcomment { }
    .flickr-frame { text-align: left; padding: 3px; }
    .flickr-caption { font-size: 0.8em; margin-top: 0px; }
    </style>


    <div class="flickr-frame">
    <a href="{photo_url}" title="photo sharing"><img src="{photo_src}" class="flickr-photo" alt="" /></a>
    <br />
    <span class="flickr-caption">[[string:by2:<a href="{photo_url}">{photo_title}</a>:<a href="{uploader_profile}">{uploader_name}</a>]]</span>
    </div>

    <p class="flickr-yourcomment">
    {description}
    </p>

       He marcado en rojo el código css que se utiliza para formatear los posts. Tal y como está hecho, en cada post se incluye la información para formatearlo por lo que si más adelante deseamos cambiarla tendríamos que editar todos los mensajes uno a uno. Para solucionar este problema lo que hacemos es incluir esa información en la plantilla de blogger (después de modificarla ligeramente para que el texto que escribimos se vea un poco mejor), quedando así:
    .flickr-photo { border: solid 2px #000000; }
    .flickr-yourcomment { font-size: 1.2em;}
    .flickr-frame { text-align: left; padding: 3px; }
    .flickr-caption { font-size: 0.8em; margin-top: 0px; }

       Y ahora, después de modificar la plantilla para centrar la foto y eliminar la información innecesaria, tenemos la siguiente plantilla para flickr:
    <div class="flickr-frame">
    <center><a href="{photo_url}" title="{title}"><img src="{photo_src}" class="flickr-photo" alt="" /></a></center>
    <br/><p class="flickr-yourcomment">
       {description}
    </p>
    </div>

       Así, hemos conseguido dos cosas. Hemos independizado y aislado el formateo de los posts en un único lugar (la plantilla de blogger) por lo que si posteriormente nos cansamos del aspecto del blog o queremos retorcar algo sólo lo tendremos que modificar un único sitio y servirá para todos los posts. Por otro lado hemos eliminado la información que añade flickr sobre quién y a qué hora subió la foto y cómo se llama el archivo original, que tampoco aporta nada y deja los posts más legibles.

       El resultado de todo esto lo podéis ver en el blog que he creado para mi hija Judith: http://judithlopezb.blogspot.com

    viernes, 22 de junio de 2007

    He sido padre...

       ...de una preciosa niña. El pasado lunes 18 de junio a las 16:08 vino al mundo Judith. Nació por parto natural, pesó 3,2 Kg. y midió 50,5 cm. Tanto la niña como mi mujer están bien y ahora ya estamos en casa con los nervios y la emoción de padres primerizos. Noches durmiendo poco, pendientes a todas horas de la niña, yo haciendo todo el papeleo para la baja por maternidad, mi permiso de paternidad, los 100 euros de ayuda,...

       Como supondréis, a partir de ahora le voy a poder dedicar menos tiempo al blog, sobre todo las primeras semanas para poder ayudar a mi mujer y cuidar de la niña. Tengo que aprovechar mis 15 días de baja por paternidad al máximo. De todas formas seguiré intentando escribir regularmente puesto que ya tengo pensados unos cuantos posts y están casi terminados de redactar.

       Como buen padre geek no he podido resistirme a hacerle una foto con el pin y la mascota de mi sistema operativo favorito para que desde bien pequeñita se vaya familiarizando con él. Aquí tenéis las fotos de presentación en sociedad...

       Además, también le creé una cuenta de gmail para que mi mujer y yo la escribamos de vez en cuando y le contemos cositas. Así cuando sea más mayor podrá leer todo lo que hicimos con ella de pequeñita y la lata que nos dió ;-).

       En fin, que espero que entendáis este pequeño "parón" al blog de unas cuantas semanas y esperéis los próximos posts como siempre.

    lunes, 11 de junio de 2007

    Sincronización de Marcadores: Foxmarks

       Tengo bastantes feeds almacenados en los marcadores del Firefox y me ocurre que a veces estoy en el ordenador de casa y añado uno nuevo, luego en el curro otro, cuando cojo el portatil otro más y al final todo es un caos y no hay manera de tenerlos sincronizados. Hace un tiempo un amigo me dijo que él utilizaba Google Browser Sync, pero que alguna vez le había preparado alguna buena y lo dejó de utilizar.

       Hace poco descubrí la solución a todos mis problemas: Foxmarks. Foxmarks es un plugin para Firefox que permite mantener sincronizados nuestros marcadores entre distintas máquinas. Una vez que lo instalamos y reiniciamos firefox nos aparece un sencillo asistente de configuración en el que podemos crear una cuenta o utilizar una ya existente. Después de crearla almacena todos nuestros enlaces en sus servidores y automáticamente los mantiene actulizados. A partir de aquí, si instalamos el plugin en otra máquina al iniciarlo por primera vez nos pregunta si queremos reemplazar los marcadores locales con los remotos o mezclarlos. Hecho esto, los podemos organizar, almacenar de nuevo y listo. A partir de ese momento tendremos siempre los marcadores sincronizados en todos nuestros ordenadores.

       Sin duda una utilidad muy a tener en cuenta para alguien que navega desde distintas máquinas.

    jueves, 7 de junio de 2007

    Se aceptan sugerencias...

       Viendo las estadísticas del blog estoy observando que tengo una "clientela" fija que de vez en cuando vuelve al blog y también gente que llega de manera esporádica pero que pasa bastante tiempo leyendo algunos artículos. Además, en ocasiones recibo algún comentario de artículos un tanto antiguos y me encanta que a la gente que le sirva algo de lo que humildemente escribo me lo diga.

       Este post es para los fijos y los esporádicos que vuelven de vez en cuando y que aunque no escriben en los comentarios, les gusta o les sirve de lo que hablo. Me gustaría saber un poco más lo que esperais de este blog y sobre todo de qué os gustaría que hablara. Hace ya algún tiempo (aproximadamente desde final de 2006) que la temática del blog se ha hecho más técnica y ya no comento ninguna noticia de la que hace un año habría escrito sin duda. Me gusta cómo está ahora el blog y creo que a vosotros también (sólo hay que ver cómo han subido las visitas y los comentarios), así que os pido por favor que dejéis un comentario en este post y me contéis vuestras inquietudes, lo que penséis,... en fin lo que se os ocurra.

    Saludos para todos.

    jueves, 31 de mayo de 2007

    Monitorizando un Raid en Linux: Estado y Ocupación

       Enlazando con el artículo anterior del envío de alarmas al móvil utilizando el API de Google Calendar, le he dado utilidad al programa. Desde hace unos días lo utilizo para monitorizar el estado del raid 1 del servidor de backup y enterarme de manera instantánea de cualquier problema con algún disco.

       Utilizando mdadm en modo monitor lo configuré para que ejecutara un script cuando detectara algún evento del raid. De todos los eventos posibles, los que a mi me interesan son:
  • Fail: Cuando se produce un fallo en algún disco del raid.
  • DegradedArray: Si se ha producido un fallo en algún disco y se ejecuta de nuevo el mdadm, se genera este evento. El caso más típico para un raid 1 es que ha fallado un disco y hemos reiniciado la máquina y estamos trabajando sólo con el otro disco. Sirve a modo de recordatorio de que hay que cambiar el disco defectuoso y reconstruir el raid.
  • RebuildStarted: Este evento se genera cuando comienza la reconstrucción del raid.
  • RebuldFinished: Cuando se ha terminado de reconstruir el raid se lanza este evento.

  •    El resto de eventos no me afectan demasiado, así que simplemente los guardaré en un log. Para ejecutar un script cuando se produce un evento en el raid en lugar de la notificación por email, es necesario hacer un pequeño cambio en el archivo /etc/init.d/mdadm.
  • Definimos la ruta del script:
    PROGRAM=/root/scripts/monitorRaid.sh
  • En "start" cambiamos la instrucción que viene por:
    start-stop-daemon -S -p $PIDFILE -x $MDADM -- -F -i $PIDFILE -p $PROGRAM -f --scan

  •    El script monitorRaid.sh que he creado es el siguiente:
    shian:~# cat scripts/monitorRaid.sh
    #!/bin/sh
    # Script de generación de alarmas según el estado del raid
    #
    # Iván López Martín
    # http://lopezivan.blogspot.com
    #####

    RAID_EVENT=$1
    LOG_DIR=/var/local/raid
    LOG_FILE=monitor_raid.log
    SMS_PROGRAM=/root/scripts/enviaSMS.sh
    GMAIL_USER=usuario@gmail.com
    GMAIL_PASS=mipassword

    if [ $RAID_EVENT == "Fail" ]; then
    date >> $LOG_DIR/$LOG_FILE
    echo Fail >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    # Envío del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "ERROR CRITICO: Ha fallado un disco del raid."

    elif [ $RAID_EVENT == "DegradedArray" ]; then
    date >> $LOG_DIR/LOG_FILE
    echo DegradedArray >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    # Envío del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "RECORDATORIO: El raid está funcionando con un solo disco."

    elif [ $RAID_EVENT == "RebuildStarted" ]; then
    date >> $LOG_DIR/$LOG_FILE
    echo RebuildStarted >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    elif [ $RAID_EVENT == "RebuildFinished" ]; then
    date >> $LOG_DIR/$LOG_FILE
    echo RebuldFinished >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    # Envío del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "INFO: Ha terminado la reconstrucción del raid."

    else
    date >> $LOG_DIR/$LOG_FILE
    echo $RAID_EVENT >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE
    fi

       Para probar que está todo bien configurado, podemos ejecutar el monitor del raid en modo Test:
    shian:~# mdadm -F -p /root/scripts/monitorRaid.sh --scan -t -1

    shian:~# tail -3 /var/local/raid/monitor_raid.log
    Mon May 21 18:15:17 CEST 2007
    TestMessage

       Si vemos el mensaje de prueba significa que la monitorización es correcta, ahora sólo queda esperar a que falle algún disco (ojalá no ocurra) para que el programa de alarmas por sms cumpla su función.

       Adicionalmente he creado otro script que ejecuto por medio de crontab cada 10 minutos que monitoriza la ocupación de los filesystems (en este caso sólo el del raid) y cuando se supera un umbral se envía una notificación por SMS.
    shian:~# cat monitorFS.sh
    #!/bin/sh
    # Script de monitorización del tamaño de un filesystem y envío de alarmas por SMS
    #
    # Iván López Martín
    # http://lopezivan.blogspot.com
    ######

    FILESYSTEM=$1
    TMP_DIR=/root/scripts
    SMS_PROGRAM=/root/scripts/enviaSMS.sh
    GMAIL_USER=usuario@gmail.com
    GMAIL_PASS=mipassword

    SPACE_USED=`df | grep $FILESYSTEM | awk '{print $5}' | sed 's/%//g'`

    if [ "$SPACE_USED" -gt 90 ] ; then
    if ! [ -f $TMP_DIR/.fs_90 ] ;then
    SEND_SMS=YES
    THRESHOLD=90
    touch $TMP_DIR/.fs_90
    fi
    elif [ "$SPACE_USED" -gt 80 ] ; then
    if ! [ -f $TMP_DIR/.fs_80 ] ;then
    SEND_SMS=YES
    THRESHOLD=80
    touch $TMP_DIR/.fs_80
    fi
    elif [ "$SPACE_USED" -gt 70 ] ; then
    if ! [ -f $TMP_DIR/.fs_70 ] ;then
    SEND_SMS=YES
    THRESHOLD=70
    touch $TMP_DIR/.fs_70
    fi
    elif [ "$SPACE_USED" -gt 60 ] ; then
    if ! [ -f $TMP_DIR/.fs_60 ] ;then
    SEND_SMS=YES
    THRESHOLD=60
    touch $TMP_DIR/.fs_60
    fi
    fi

    if [ "$SEND_SMS" == "YES" ] ; then
    # Envio del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "El filesystem" $FILESYSTEM "supera el "$THRESHOLD"%."
    fi

    domingo, 20 de mayo de 2007

    Usando el API de Google Calendar: Alarmas por SMS

       Hace un tiempo descubrí Google Calendar, y aunque no lo utilizo mucho tiene una característica que me llamó la atención desde el principio. Una vez que defines una cita o evento, puedes asociarle un recordatorio para que te avise por email o con un pop-up si tienes la web abierta; hasta aquí ninguna novedad. Lo realmente novedoso es que también permite avisarte por medio de un SMS al móvil y además, en el caso de España es gratis. Sólo hay que asociar a nuestra cuenta de google nuestro número de teléfono móvil y después de una verificación de identidad podemos añadir el aviso por sms como recordatorio de las citas.

       Teniendo esto en mente pensé que sería realmente útil poder enviar alarmas al móvil con el estado de los servidores de casa. Así, si normalmente tenemos alguna tarea programada en crontab que nos avisa por email cuando termina mal, algún monitor de los servicios, espacio en los filesystems,... podríamos añadir una llamada a un programa adicional que introdujese un evento en nuestro calendario de google para que nos llegara el aviso por medio de un sms al móvil y así estar informados en todo momento del estado de nuestras máquinas :-).

       Pues dicho y hecho, me puse a buscar y lo que encontré no pudo ser mejor. Google proporciona un acceso completo a su API, con ejemplos, foros, y además disponible desde varios lenguajes de programación (Java, .Net, PHP y Python). De todos estos, el que más conozco y con el que más he trabajado (aunque ya haga tiempo que no lo toco demasiado) es Java. Además, tiene la ventaja de que al ser multiplataforma podría monitorizar también máquinas windows.

       Me instalé Eclipse y la máquina virtual de Sun 1.5 (ojo que esto es importante, no funciona con la 1.4.2) por medio de un simple apt-get. De la web de google descargué las librerías cliente para java y me puse a probar alguno de los ejemplos. La verdad es que el código es muy sencillo y está muy bien explicado. Hay ejemplos de autenticación, consulta de los eventos del calendario entre determinadas fechas, alta de eventos, borrado, actualización...

       Después de realizar un par de pruebas tenía un esqueleto que funcionaba aunque había que afinar. Examinando con más detalle las clases con Eclipse y con unas pocas pruebas posteriores terminé la versión 0.1 que permite insertar un evento en nuestro calendario y recibir un aviso por sms en 1 minuto. Aspectos a tener en cuenta del código:
  • Para conseguir que llegue el aviso dentro de un minuto lo que hago es poner la hora de comienzo del evento dentro de 6 minutos y la notificación por sms 5 minutos antes. Aunque por código es posible fijar el recordatorio dentro de 1 minuto, luego, cuando se envía la petición se nos muestra un error diciendo que no es válida.
  • Parece que la clase DateTime de Google no se lleva muy bien con la clase Date. Al principio creé un objeto con la hora actual para asignarselo al comienzo del evento, pero una vez asignado, la fecha que ponía era de dos horas antes!. Lo resolví creando un TimeZone para "Europe/Madrid" y utilizándolo en la creación de dicho objeto. Luego hablando con un compañero y comentándole esas 2 horas de diferencia (yo pensé que debería ser sólo una por eso de que estamos en zona GMT+1), me dijo que, con el cambio a horario de verano hemos pasado "automáticamente" a GMT+2. En fin, misterio aclarado. Gracias Jose!.
  • El programa recibe como parámetros el usuario, el password y el texto que queremos enviar. Aunque a priori no hay limitación en la longitud del texto, al móvil sólo nos llegarán los primeros 57 caracteres.
  • Después de construir la petición y enviarla, por la consola aparece un error. Según he investigado parece como si la versión que utilizo de las librerías de google fuera antigua, aunque realmente estoy trabajando con la última. En principio no afecta al funcionamiento, aunque queda un poco "feo".
  • Adicionalmente, es necesario descargar las librerías mail.jar del API JavaMail y activation.jar del Framework de Sun JavaBeansActivation.

  •    Y ya, sin más divagaciones, el código:
    /*
    * Programa para el envío de alarmas por SMS al móvil por medio del API Google Calendar
    *
    * Iván López Martín
    * http://lopezivan.blogspot.com
    *
    */

    import java.net.URL;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.TimeZone;

    import com.google.gdata.client.calendar.CalendarService;
    import com.google.gdata.data.DateTime;
    import com.google.gdata.data.Person;
    import com.google.gdata.data.PlainTextConstruct;
    import com.google.gdata.data.extensions.EventEntry;
    import com.google.gdata.data.extensions.Reminder;
    import com.google.gdata.data.extensions.When;


    public class EnviaSMS {

    public static void main(String[] args) {

    // Comprobamos los argumentos necesarios: usuario, password y texto del mensaje
    if (args.length < 3) {
    System.err.println("Uso: EnviaSMS <usuario> <password> <texto>");
    return;
    }

    String userName = args[0];
    String userPassword = args[1];
    String sms = "";
    // El máximo son 57 caracteres
    for(int i=2; i<args.length; i++) {
    sms = sms + args[i] + " ";
    }
    sms = sms.trim();

    try {
    URL feedUrl = new URL("http://www.google.com/calendar/feeds/" + userName + "/private/full");

    CalendarService myService = new CalendarService("EnviaSMS");

    // Nos autenticamos en google Calendar
    myService.setUserCredentials(userName, userPassword);

    // Creamos el evento
    EventEntry myEntry = new EventEntry();
    myEntry.setTitle(new PlainTextConstruct(sms));

    Person author = new Person(userName, null, userName);
    myEntry.getAuthors().add(author);

    // Definimos la zona horaria
    TimeZone tz = TimeZone.getTimeZone("Europe/Madrid");

    Calendar cal = GregorianCalendar.getInstance();
    cal.add(Calendar.MINUTE, 6);
    DateTime startTime = new DateTime(cal.getTime(), tz); //6m

    cal.add(Calendar.MINUTE, 1);
    DateTime endTime = new DateTime(cal.getTime(), tz); //7m

    // Definimos la hora de comienzo y de fin del evento
    When eventTimes = new When();
    eventTimes.setStartTime(startTime);
    eventTimes.setEndTime(endTime);
    myEntry.addTime(eventTimes);

    // Añadimos el recordatorio sólo como SMS y que avise 5 minutos antes
    Reminder reminder = new Reminder();
    reminder.setMinutes(new Integer(5));
    reminder.setMethod(Reminder.Method.SMS);
    myEntry.getReminder().add(reminder);

    // Enviamos la petición para insertar el evento en el calendario
    EventEntry insertedEntry = (EventEntry)myService.insert(feedUrl, myEntry);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

       Para la ejecución desde la línea de comandos, he creado un pequeño script:
    ivan@doraemon:~$ cat enviaSMS.sh 
    #!/bin/sh
    #################################
    # Iván López Martín #
    # http://lopezivan.blogspot.com #
    #################################
    SMS_HOME=/home/ivan/workspace/GoogleCalendar

    CLASSPATH=$SMS_HOME/lib/activation.jar:$SMS_HOME/lib/gdata-calendar-1.0.jar:$SMS_HOME/lib/gdata-client-1.0.jar:$SMS_HOME/lib/mail.jar:$SMS_HOME/bin

    java -classpath $CLASSPATH EnviaSMS $@

    ivan@doraemon:~$ ./enviaSMS.sh usuario@gmail.com password "Visita el blog de Iván López. http://lopezivan.blogspot.com"

       En nuestro calendario de google aparece el nuevo evento con las opciones que hemos indicado:

       Y un minuto después, en el móvil el sms:


       Como ya he dicho, se trata de la versión 0.1, aunque me parece que no la voy a modificar mucho más porque lo único que necesito es el envío de los sms. No voy a borrar los eventos del calendario, ni actulizarlos, ni consultarlos desde el programa,...

       Cualquiera es libre de modificar el código, usarlo y mejorarlo siempre que por favor respete el comentario del autor y el enlace a este blog. Además, si lo mejoras por favor házmelo saber para poder actulizar este artículo.

       Que lo disfrutéis...

    Backups con Rsync

       Después de mi entrada anterior sobre el sistema de backup que voy a utilizar, quiero ampliar un poco la información diciendo que después de haber tenido un rato para terminarlo de configurar completamente he lanzado el backup completo de los 21 GB de datos. El resultado con rsync ha sido muchísimo mejor de lo que me esperaba a priori ya que ha tardado apenas 40 minutos en realizar la copia frente a las 3 horas que tardó BackupPC. Estoy encantado con haber elegido finalmente rsync y aunque finalmente no tenga todos los añadidos de BackupPC creo que ha sido la mejor elección.
       Muchas veces, lo más simple es lo mejor y en este caso, un pequeño script me ha solucionado todos los problemas.

    lunes, 14 de mayo de 2007

    Rsync vs BackupPc vs Link-Backup

       Llevo las últimas semanas buscando y probando distintos sistemas de copias de seguridad para poder tener los backups centralizados en casa en una única máquina, hacerlos de una manera eficiente, fiable y organizada. Los requisitos que debe cumplir el sistema son los siguientes:
  • Debe funcionar bajo linux: Voy a reutilizar mi antiguo Duron instalándole la nueva Debian Etch y quiero montar un raid 1 para tener fiabilidad en el backup.
  • Se deben poder hacer backups de máquinas windows y linux: Tengo que hacer backups de mi sobremesa con Ubuntu y del portatil de mi mujer con windows XP.
  • Debe permitir backups totales, parciales e incluso un histórico o versionado de archivos: Realmente lo único imprescindible es hacer un backup completo la primera vez e irlo ampliando con backups incrementales posteriores. Si además puedo tener un versionado de todos los archivos o almacenarlos en directorios distintos según el día, pues mejor que mejor.
  • No debe requerir tener el servidor encendido 24x7: No quiero un sistema de backup que deba tener encendido todo el día puesto que la idea es hacer un backup completo la primera vez y luego, según sea el trabajo diario encenderlo y hacer incrementales de vez en cuando.
  • Posibilidad de utilizar una interfaz gráfica (GUI): Más que para su utilización y/o configuración, para ver los archivos que se han almacenado de una manera fácil y cómoda.

  •    Así, con estas premisas me puse a buscar por internet y a leer foros y me quedé con tres herramientas para hacer pruebas y decidir cual era la mejor para mi: Rsync, BackupPC y Link-Backup.

    Rsync: Es un clásico en sistemas Unix/Linux. Entre las muchas opciones que permite sirve para realizar una copia de toda la información y posteriormente actualizar sólo los fragmentos que se modifican de los archivos. Cuando digo los fragmentos que se modifican de los archivos me refiero a que posteriormente, si de un archivo de 300 MB sólo modificamos una parte, sólo esa parte será enviada en la siguiente copia.
       En aspectos negativos decir que no tiene GUI de consulta de archivos.

    BackupPC: Me ha sorprendido mucho esta herramienta y además según he podido leer hay mucha gente que la utiliza con muy buenos resultados. De todos mis requisitos el único que no cumple es el de no poder apagar el servidor puesto que una vez al día ejecuta tareas de reorganización de índices y además el servidor decide cuando quiere hacer la copia de las máquinas (aunque es cierto que se pueden ejecutar backups bajo demanda). Tiene GUI para su utilización (que no configuración), versiona los archivos, permite backups completos y parciales y permite guardar la información de máquinas windows y linux. La recuperación de los archivos también está muy bien puesto que permite restaurarlos en su localización inicial, en otra máquina e incluso crear un zip con los archivos que queramos.
       Para funcionar utiliza rsync y crea hard links para reducir la utilización de espacio en el servidor. Así, la primera vez que hacemos un backup transfiere el archivo completo pero en posteriores copias, si detecta que el archivo es el mismo lo único que hace es crear un hard link, por lo que no consume más espacio en disco, pero sí inodos. Esto último, en función del sistema de archivos que utilicemos y del número de máquinas a gestionar puede traernos problemas.

    Link-Backup: Es una utilidad muy parecida a BackupPC aunque no tan "vistosa". Se trata de un script escrito en python y que también utiliza rsync para realizar la transferencia de los ficheros. Permite backups completos e incrementales y también utiliza hard links para reducir el espacio ocupado en disco. No tiene interfaz gráfica aunque en la web del autor hay disponible un pequeño cgi que sirve de interfaz gráfica para poder navegar por los distintos backups.

       Como tanto BackupPc como Link-Backup se basan en rsync y además aportan funcionalidad adicional, me centré directamente en estas dos herramientas.

       Comencé por BackupPC. Lo descargué, lo instalé y para la configuración, que fue muy sencilla, seguí este tutorial. Posteriormente cambié la configuración para utilizar rsyncd (el demonio rsync) en lugar de las transferencias cifradas por ssh. Después de un par de pequeñas pruebas transfiriendo unos cuantos archivos configuré todos los directorios a guardar y lancé el backup. En total fueron 21 GB y la copia tardó poco más de 3 horas. Durante este tiempo tuve a la vista el monitor de red de la máquina origen para comprobar la utilización de la red y he de decir que no se aprovechaba todo el ancho de banda ni mucho menos y apenas se llegó a utilizar el 40-50%. Una vez terminado el backup completo lancé el backup incremental para comprobar que se chequeaban todos los archivos y al no tener que transferir ninguno la copia se haría en pocos minutos. Al final, la copia incremental tardó 65 minutos! por lo que pensé que debía tener algo mal configurado. Estuve buscando algo más de información por internet y la conclusión a la que llegué es que BackupPC tiene que reconstruir toda la estructura de directorios, crear los hard links y actualizar su catálogo con la información de los ficheros. Además, debe calcular CRCs de los archivos para decidir si han cambiado y es necesario transferirlos de nuevo.

       El uso y configuración de Link-Backup es más sencillo todavía, sólo hay que tener python instalado para ejecutar el script. La sintaxis es similar a la del comando scp (usuario@maquina:/directorio) y no posee demasiadas opciones de configuración. Como no quería que me pasase lo mismo que con BackupPC, hice una prueba con un directorio de sólo 4 GB y los resultados fueron muchísimo mejores. Durante la transferencia la utilización de la red era de prácticamente el 90-100%, por lo que el tiempo del primer backup se redujo muchísimo. Después volví a ejecutar de nuevo el script y esta vez sí, en 5 segundos terminó indicando que no había nada que copiar.
       Luego instalé el cgi para tener la posibilidad de navegar por los backups y aunque la interfaz gráfica no se puede ni comparar con la de BackupPC, para el uso que yo quiero me sirvía.
       Cuando ya me iba a decidir por esta herramienta me dí cuenta que no era capaz de indicarle que realizara la copia de más de un directorio a la vez y crease un catálogo único, así que después de unas cuentas pruebas intentándolo, la descarté.

       Busqué alguna herramienta más por internet como Bacula pero requiere el servidor encendido y que el origen de los backups sea el servidor, por lo que también la descarté.

       Finalmente, me decidí por la opción de crearme yo mis propios scripts de backup utilizando rsync con la opción de crear hard links para ocupar menos espacio en el disco y crear un snapshot en cada ejecución.

       El script que realiza el backup se llama desde los clientes indicándole el nombre de la máquina origen por medio de ssh:
    ivan@doraemon:~$ ssh rsync@shian /home/rsync/scripts/backup.sh doraemon

       El contenido del script es el que muestro a continuación. Está algo hardcodeado porque no he sido capaz de pasarle como parámetro la lista de directorios al rsync. El problema está en que si es más de un directorio tiene que ir entre comilla simple ' y aunque "escape" el caracter con \ no funciona el rsync. Lo que hace el script es calcular el último snapshot y crear la nueva copia basándose en la anterior. Así, cada vez que lo ejecutamos se crea un nuevo directorio backup.X con la falsa ilusión de que es un backup completo por la magia de los hard links.
    #!/bin/bash

    # Comprobación de los parámetros
    if [ -z $1 ] ; then
    echo Uso `basename $0` hostname
    exit 1
    fi

    # Destino del backup
    DEST_DIR=/mnt/raid/datos

    HOST=$1
    FULL_DEST_DIR=$DEST_DIR/$HOST

    # Calculo del último snapshot del backup y del nuevo
    LAST_SNAPSHOT=`ls -ltr $FULL_DEST_DIR | tail -1 | awk {'print $8'} | cut -d . -f 2`
    ((NEW_SNAPSHOT=LAST_SNAPSHOT+1))

    # En función de la máquina de la que queramos hacer el backup, ejecutamos con unos u otros parámetros
    if [ $HOST == "doraemon" ] ; then
    rsync -av --delete --link-dest=$FULL_DEST_DIR/backup.$LAST_SNAPSHOT/ ivan@doraemon:'/Dir1 /Dir2 /Dir3' $FULL_DEST_DIR/backup.$NEW_SNAPSHOT > $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt
    mv $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt $FULL_DEST_DIR/backup.$NEW_SNAPSHOT/files.txt
    elif [ $HOST == "dorami" ] ; then
    rsync -av --delete --link-dest=$FULL_DEST_DIR/backup.$LAST_SNAPSHOT/ ana@dorami:'/MisDocs' $FULL_DEST_DIR/backup.$NEW_SNAPSHOT > $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt
    mv $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt $FULL_DEST_DIR/backup.$NEW_SNAPSHOT/files.txt
    else
    exit 2
    fi

       Lo único necesario es configurar el acceso por ssh sin password desde mi pc con linux (doraemon) y el portatil de mi mujer (dorami) al servidor de backup (shian) y desde éste a los clientes puesto que el backup parte de shian. Sé que es algo engorroso tener que configurar la conexión ssh sin password en ambos sentidos, pero prefiero hacerlo así porque quiero que el momento en el que se realice el backup se decida en el lado cliente.

       Instalé en el portatil de mi mujer Cygwin y lo configuré como sigue para conectarme por ssh sin tener que utilizar ninguna clave:
  • Primero, en windows, desde cygwin generamos el par de claves pública/privada:
    $ ssh-keygen -t dsa -b 1024
    Generating public/private dsa key pair.
    Enter file in which to save the key (/cygdrive/c/Documents and Settings/ana/.ssh/id_dsa): INTRO
    Enter passphrase (empty for no passphrase): INTRO
    Enter same passphrase again: INTRO
    Your identification has been saved in /cygdrive/c/Documents and Settings/ana/.ssh/id_dsa.
    Your public key has been saved in /cygdrive/c/Documents and Settings/ana/.ssh/id_dsa.pub.
    The key fingerprint is:
    7b:9a:c6:e9:ee:f1:2e:b0:00:fc:68:c6:58:2b:d6:a0 ana@dorami.casa
  • Copiamos la clave pública al servidor de backup:
    $ scp id_dsa.pub rsync@shian:/home/rsync/.ssh/id_dsa_ana.pub
    Password:
    id_dsa.pub 100% 605 0.6KB/s 00:00
  • Ahora nos conectamos al servidor de backup con el usuario rsync y añadimos la clave pública en el archivo de claves autorizadas para poder conectarnos por ssh sin necesidad de password:
    rsync@shian:~$ cat ~/.ssh/id_dsa_ana.pub >> ~/.ssh/authorized_keys
  • En este momento ya nos podemos conectar por ssh sin password desde la máquina windows (dorami) al servidor de backup (shian):
    $ hostname
    dorami

    $ ssh rsync@shian
    Last login: Fri 11 21:50:47 2007 from doraemon
    rsync@shian:~$
  • Para afinar un poco más la configuración y eliminar el agujero de seguridad de permitir sesiones por ssh con el usuario utilizado para el backup, editamos el archivo de claves autorizadas y añadimos al principio la limitación de sólo poder conectarnos desde esa máquina, no permitir redirección de puertos y no permitir sesiones interactivas, quedando así:
    rsync@shian:~$ cat .ssh/authorized_keys
    from="dorami.casa",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AAAAB3Nza................y6SzRKqzW6V9PpwQ== ana@dorami.casa
  • De esta manera, si ahora intentamos conectarnos por ssh al servidor, obtenemos el siguiente error:
    $ ssh rsync@shian
    stdin: is not a tty

  •    Repetí los pasos desde mi máquina aunque obviamente sin la parte de capar el acceso por ssh ;-). Adicionalmente hay que hacer lo mismo para configurar las conexiones sin password pero desde el servidor hacia los clientes.

       Ahora, para finalizar, lo que hago es crear un script en cygwin para lanzar el backup y otro script .bat para crear un acceso directo en windows para que mi mujer pueda ejecutar sus backups sin ningún problema.
    # En cywin
    $ cat backupAna.sh
    #!/bin/sh
    ssh rsync@shian /home/rsync/scripts/backup.sh dorami


    # En windows
    @echo off
    REM EjecutaBackup.bat
    echo Ejecutando backup...
    C:\cygwin\bin\bash --login -i /usr/local/bin/backupAna.sh
    pause

       Y esto es todo, mi mujer puede lanzar su backup cuando quiera y yo desde mi máquina tengo un script similar.

       Como conclusiones finales me quedo con un cierto mal sabor de boca por no haber elegido BackupPc puesto que me parece la solución más completa aunque también es cierto que los tiempos de backup incrementales son bastante elevados. Aunque bastante menos elegante, la solución del script manual es mucho más eficiente y cómoda para mi.

    miércoles, 2 de mayo de 2007

    Migración a Linux

       Llevo ya dos semanas trabajando en casa casi exclusivamente con linux, más concretamente con Ubuntu 7.04 Feisty Fawn. Durante este tiempo estoy intentando adaptarme al nuevo sistema operativo, instalando los programas que necesito, buscando sustitutos a las aplicaciones windows que utilizaba,... De momento la transición está yendo mejor de lo que pensaba.

       La instalación fue de lo más sencillo y no presentó ninguna complicación. Después, instalé los drivers de la tarjeta nvidia y posteriormente, con un simple apt-get instalé beryl sin ningún esfuerzo. La verdad es que aunque había visto bastantes videos en youtube de lo que se podía hacer me ha dejado gratamente impresionado. El cubo es chulísimo y los efectos al maximizar, desplazar, minimizar,... las ventanas están muy logrados. Además, lo mejor es que aún está en la versión 0.2, por lo que cuando llegue a la 1.0 va a ser increíble.


       En windows me gusta tener en la barra de tareas la monitorización de las temperaturas del sistema para controlar cómo está todo. Después de buscar algo similar para linux me encontré con lm-sensors, hddtemp y unos applets para el panel de gnome que hacen de interfaz y muestran las temperaturas. De nuevo, todo fue muy sencillo y leyendo un par de tutoriales no tuve ningún problema en configurar todo. Aún estoy buscando la forma de poder mostrar la temperatura de la tarjeta gráfica sin tener que arrancar la utilidad nvidia-settings, aunque tampoco es crítico para mi.

       Otro aspecto que me ha gustado ha sido la facilidad para utilizar los archivos de video y música. Das doble click a un divx, aparece un mensaje indicando que no tienes los codecs instalados, aceptas y automáticamente se descargan, se configuran y listo, a ver la serie. Lo mismo ocurre con la música, automáticamente se ha descargado los codecs MP3 necesarios para poder escuchar las canciones.

       Me he hecho una lista de los programas que utilizo en windows para buscar un sustituto. Así, ya utilizo VLC para ver los videos, Gaim como gestor de mensajería para conectarme a GoogleTalk, Gthumb para ver fotos, OpenOffice, Gimp,... y así poco a poco voy probando nuevos programas y quedándome con los que más me gustan.

       Una cosa magnífica de la que deberían aprender otros sistemas operativos es la gestión de paquetes. Es increíble la cantidad de programas que hay en los repositorios. Sólo hay que buscar lo que quieres y enseguida tienes una gran cantidad de programas listos para descargar y probar. Lo mejor sin duda es la gestión de las dependencias, así, si algo ya no lo necesitas, lo puedes desinstalar y automáticamente se desinstalan todos los programas y librerías que ya no son necesarios. Así, el sistema no se va corrompiendo poco a poco y no se va quedando basura en algo como el famoso registro de windows.

       Mi intención es hacer por fín el cambio de windows a linux aunque vaya siendo poco a poco. Para los programas que no encuentre sustituto (por ejemplo para la declaración de la renta), para las webs que sólo funcionan con iexplorer,... me he instalado una máquina virtual windows con VmWare. Para solucionar un problema de compilación de los módulos he seguido el interesante artículo Cómo solucionar incompatibilidades entre una versión de VMWare y un kernel más reciente de Vicente Navarro y nuevamente ha sido todo muy sencillo. En fin, que ya iré contando poco a poco mis progresos.