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.

    sábado, 21 de abril de 2007

    Linux y LVM

       En los 320GB del disco de mi nuevo pc he reservado unos 45GB para linux. En concreto me he estado esperando para instalar la nueva Ubuntu Feisty Fawn porque iba a salir en poco tiempo. Durante estos días he estado pensando cómo particionar esos 45GB y la verdad es que no lo tenía nada claro. Después de preguntar a Alex por gtalk, esta fue su solución:
    150MB /boot ext2 (o ext3)
    6GB / ext3
    1GB /var ext3
    2GB swap
    El resto en un PV de LVM para vgdata (por ejemplo). Después creas /opt en lvopt sobre vgdata y /home en lvhome sobre vgdata.
    Por último dejar el /usr en el / (no ponerlo en LVM ni como otro FS)

       Además me dió unos cuantos comandos para crear todo y me "soltó" para que probase.

       Después de mirar el man y buscar un poco por internet me enteré de qué es LVM, en qué se basa, para qué me podía servir y cómo utilizarlo. Manos a la obra...

       Como siempre, para cacharrear utilizo una máquina virtual puesto que es mucho más cómodo y permite mucha flexibilidad a la hora de añadir discos, cambiarlos de tipo,... Añadí un nuevo disco duro scsi de 2 GB (para las pruebas es más que suficiente) y me dispuse a aprender:
  • El primer paso como siempre particionar. En este caso, el tipo de partición será Linux LVM (8e)

    shian:~# fdisk /dev/sda

    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-261, default 1):INTRO
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-261, default 261):INTRO
    Using default value 261

    Command (m for help): t
    Selected partition 1
    Hex code (type L to list codes): 8e
    Changed system type of partition 1 to 8e (Linux LVM)

    Command (m for help): p

    Disk /dev/sda: 2147 MB, 2147483648 bytes
    255 heads, 63 sectors/track, 261 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sda1 1 261 2096451 8e Linux LVM

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    Syncing disks.
  • El siguiente paso es crear el Physical Volume (PV):
    shian:~# pvcreate -v /dev/sda1
    Set up physical volume for "/dev/sda1" with 4192518 available sectors
    Zeroing start of device /dev/sda1
    Physical volume "/dev/sda1" successfully created
  • Ahora creamos el Volume Group (VG) con el PV recien creado. En mi caso crearé sólo uno:
    shian:~# vgcreate -v vg01 /dev/sda1
    Adding physical volume '/dev/sda1' to volume group 'vg01'
    Archiving volume group "vg01" metadata.
    Creating volume group backup "/etc/lvm/backup/vg01"
    Volume group "vg01" successfully created
  • Después creamos los Logical Volume (LV) que queramos. Cada uno de estos será al final un punto de montaje distinto. En mi caso crearé uno de 1 GB para datos (y dejaré el otro GB libre):
    shian:~# lvcreate -v -L 1G -n lvdatos vg01
    Finding volume group "vg01"
    Creating logical volume lvdatos
    Archiving volume group "vg01" metadata.
    Creating volume group backup "/etc/lvm/backup/vg01"
    Found volume group "vg01"
    Loading vg01-lvdatos
    Zeroing start of logical volume "lvdatos"
    Creating volume group backup "/etc/lvm/backup/vg01"
    Logical volume "lvdatos" created

  •    Bien, veamos lo que llevamos hecho hasta ahora.
  • Lista de PVs creados:
    shian:~# pvdisplay -v
    Scanning for physical volume names
    --- Physical volume ---
    PV Name /dev/sda1
    VG Name vg01
    PV Size 2.00 GB / not usable 0
    Allocatable yes
    PE Size (KByte) 4096
    Total PE 511
    Free PE 255
    Allocated PE 256
    PV UUID 1wounc-DIHj-Tf54-4h2c-4rcB-w137-gLH4I6
  • Lista de VGs creados. En VG Size vemos que el VG es de 2GB y que hemos utilizado 1GB (Alloc Size):
    shian:~# vgdisplay
    --- Volume group ---
    VG Name vg01
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 2
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 1
    Open LV 0
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size 2.00 GB
    PE Size 4.00 MB
    Total PE 511
    Alloc PE / Size 256 / 1.00 GB
    Free PE / Size 255 / 1020.00 MB
    VG UUID BpNJTl-9tlr-DjzM-C8Mb-LfnL-NWDa-uyWDpf
  • Lista de LVols creados:
    shian:~# lvdisplay -v
    Finding all logical volumes
    --- 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 0
    LV Size 1.00 GB
    Current LE 256
    Segments 1
    Allocation inherit
    Read ahead sectors 0
    Block device 254:0
  • Y finalmente, si queremos ver la asignación de VGs, LVols y PVs:
    shian:~# vgdisplay -v
    Finding all volume groups
    Finding volume group "vg01"
    --- Volume group ---
    VG Name vg01
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 2
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 1
    Open LV 0
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size 2.00 GB
    PE Size 4.00 MB
    Total PE 511
    Alloc PE / Size 256 / 1.00 GB
    Free PE / Size 255 / 1020.00 MB
    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 0
    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

  •    Después de este pequeño resumen seguimos con la creación de la partición.
  • Una vez que tenemos el lvol creado lo formateamos con la sistema de ficheros que más nos guste:
    shian:~# mkfs.ext3 /dev/vg01/lvdatos
    mke2fs 1.37 (21-Mar-2005)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    131072 inodes, 262144 blocks
    13107 blocks (5.00%) reserved for the super user
    First data block=0
    8 block groups
    32768 blocks per group, 32768 fragments per group
    16384 inodes per group
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376

    Writing inode tables: done
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done

    This filesystem will be automatically checked every 27 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.
  • Lo montamos para probar:
    shian:~# mkdir /mnt/datos_lvm
    shian:~# mount /dev/vg01/lvdatos /mnt/datos_lvm
    shian:~# df -h /mnt/datos_lvm/
    Filesystem Size Used Avail Use% Mounted on
    /dev/mapper/vg01-lvdatos
    1008M 33M 925M 4% /mnt/datos_lvm
  • Y listo, ya sólo queda añadirlo a /etc/fstab para que se monte automáticamente en el arranque:
    shian:~# echo "/dev/vg01/lvdatos /mnt/datos_lvm ext3   defaults        0       2" >> /etc/fstab

  •    Hasta aquí es lo fácil. Como se puede ver con unos cuantos comandos tenemos el filesystem montado y listo para ser utilizado sin mayores complicaciones.

       La ventaja de utilizar lvm es que podemos redimensionar las particiones de manera dinámica sin tener que hacer un backup de la información, tener que reparticionar,... Vamos a probarlo.
  • Creamos un archivo aleatorio de 25MB, calculamos su CRC y lo apuntamos:
    shian:~# dd if=/dev/urandom of=/mnt/datos_lvm/random count=51200
    51200+0 records in
    51200+0 records out
    26214400 bytes transferred in 7.991592 seconds (3280248 bytes/sec)
    shian:~# cksum /mnt/datos_lvm/random
    1105592823 26214400 /mnt/datos_lvm/random
  • Supongamos que necesitamos espacio adicional en el disco, por ejemplo, 500MB más. Lo que tenemos que hacer es ampliar el lvol y después el filesystem:
    shian:~# lvextend -v -L+500M /dev/vg01/lvdatos
    Finding volume group vg01
    Archiving volume group "vg01" metadata.
    Extending logical volume lvdatos to 1.49 GB
    Creating volume group backup "/etc/lvm/backup/vg01"
    Found volume group "vg01"
    Found volume group "vg01"
    Loading vg01-lvdatos
    Logical volume lvdatos successfully resized
  • En el caso de un sistema de archivos como ext3 es necesario desmontarlo primero antes de realizar la ampliación. Adicionalmente también es necesario ejecutar e2fsck para chequear el filesystem:
    shian:~# umount /mnt/datos_lvm/
    shian:~# resize2fs /dev/vg01/lvdatos
    resize2fs 1.37 (21-Mar-2005)
    Please run 'e2fsck -f /dev/vg01/lvdatos' first.

    shian:~# e2fsck -f /dev/vg01/lvdatos
    e2fsck 1.37 (21-Mar-2005)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    /dev/vg01/lvdatos: 12/131072 files (0.0% non-contiguous), 18737/262144 blocks

    shian:~# resize2fs /dev/vg01/lvdatos
    resize2fs 1.37 (21-Mar-2005)
    Resizing the filesystem on /dev/vg01/lvdatos to 390144 (4k) blocks.
    The filesystem on /dev/vg01/lvdatos is now 390144 blocks long.
  • Y ya estaría listo. Si ahora montamos el filesystem y/o comprobamos el lvol vemos que tiene 500MB más:
    shian:~# mount /mnt/datos_lvm/
    shian:~# df -h /mnt/datos_lvm/
    Filesystem Size Used Avail Use% Mounted on
    /dev/mapper/vg01-lvdatos
    1.5G 58M 1.4G 4% /mnt/datos_lvm

    shian:~# lvdisplay
    --- 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 0
    LV Size 1.49 GB
    Current LE 381
    Segments 1
    Allocation inherit
    Read ahead sectors 0
    Block device 254:0
  • Para reducirlo el procedimiento es similiar, pero hay que tener en cuenta que primero hay que reducir el filesystem y luego el lvol. La primera vez que lo hice no lo pensé mucho y reduje primero el lvol, por lo que me cargué los datos ;-)
    shian:~# umount /mnt/datos_lvm/
    shian:~# e2fsck -f /dev/vg01/lvdatos
    e2fsck 1.37 (21-Mar-2005)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    /dev/vg01/lvdatos: 12/196608 files (0.0% non-contiguous), 20795/390144 blocks

    shian:~# resize2fs /dev/vg01/lvdatos 1G
    resize2fs 1.37 (21-Mar-2005)
    Resizing the filesystem on /dev/vg01/lvdatos to 262144 (4k) blocks.
    The filesystem on /dev/vg01/lvdatos is now 262144 blocks long.

    shian:~# lvreduce -v -L-500M /dev/vg01/lvdatos
    Finding volume group vg01
    WARNING: Reducing active logical volume to 1.00 GB
    THIS MAY DESTROY YOUR DATA (filesystem etc.)
    Do you really want to reduce lvdatos? [y/n]: y
    Archiving volume group "vg01" metadata.
    Reducing logical volume lvdatos to 1.00 GB
    Creating volume group backup "/etc/lvm/backup/vg01"
    Found volume group "vg01"
    Found volume group "vg01"
    Loading vg01-lvdatos
    Logical volume lvdatos successfully resized

    shian:~# mount /mnt/datos_lvm/
    shian:~# df -h /mnt/datos_lvm/
    Filesystem Size Used Avail Use% Mounted on
    /dev/mapper/vg01-lvdatos
    1008M 58M 921M 6% /mnt/datos_lvm
  • Comprobamos el cksum para ver que no nos hemos cargado nada:
    shian:~# cksum /mnt/datos_lvm/random
    1105592823 26214400 /mnt/datos_lvm/random

  •    Aunque todo parece muy bonito, no fue tan fácil. Como he dicho al principio del artículo el disco virtual que añadí al vmware era scsi por lo que cuando arrancaba la máquina, como los controladores scsi se cargan posteriormente al montaje de las particiones aparecía un error porque no encontraba el dispositivo. Como no estaba seguro que de fuera eso añadí un nuevo disco ide, repetí todos los pasos y funcionó a la perfección. Así, el problema era del scsi. Lo que tuve que hacer para solucionarlo fue:
  • Miré el controlador scsi que utiliza vmware y los módulos cargados:
    shian:~# lspci
    0000:00:00.0 Host bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
    0000:00:01.0 PCI bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
    0000:00:07.0 ISA bridge: Intel Corp. 82371AB/EB/MB PIIX4 ISA (rev 08)
    0000:00:07.1 IDE interface: Intel Corp. 82371AB/EB/MB PIIX4 IDE (rev 01)
    0000:00:07.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI (rev 08)
    0000:00:0f.0 VGA compatible controller: VMWare Inc [VMWare SVGA II] PCI Display Adapter
    0000:00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
    0000:00:11.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)

    shian:~# lsmod
    Module Size Used by
    ipv6 241728 -
    ehci_hcd 28744 -
    usbcore 127804 -
    shpchp 34416 -
    pci_hotplug 14784 -
    intel_agp 23084 -
    pcnet32 31972 -
    mii 5392 -
    crc32 3888 -
    agpgart 33472 -
    raid1 20912 -
    md_mod 72172 -
    sd_mod 19552 -
    dm_mod 55692 -
    mptspi 16348 -
    mptscsih 24720 -
    mptbase 52064 -
    scsi_transport_spi 23792 -
    scsi_mod 145484 -
    ide_cd 40200 -
    cdrom 39424 -
    unix 25328 -
    ext3 126488 -
    jbd 54552 -
    ide_disk 16112 -
    generic 4952 -
    piix 10228 -
    ide_core 117252 -
    evdev 9824 -
  • La clave me la dio el MPT tanto de la controladora como de los módulos cargados:
    0000:00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)

    ...
    mptspi 16348 -
    mptscsih 24720 -
    mptbase 52064 -
    ...
  • Así, añadí al archivo /etc/modules lo siguiente:
    # /etc/modules: kernel modules to load at boot time.
    #
    # This file should contain the names of kernel modules that are
    # to be loaded at boot time, one per line. Comments begin with
    # a "#", and everything on the line after them are ignored.
    ide-cd
    ide-disk
    mptspi
    mptscsih
    mptbase
  • Guardé los cambios, reinicié y ahora ya sí se inicializaba la tarjeta scsci antes del lvm y al intentar montar las particiones éstas estaban disponibles.


  •    Otra de las cosas interesantes que podemos hacer con lvm es crear un volumen físico sobre uno de raid. Aprovechando el raid 1 que cree hace tiempo hice la siguiente prueba. Ojo que los datos del raid se pierden!.
    shian:~# umount /dev/md0
    shian:~# pvcreate -v /dev/md0
    Set up physical volume for "/dev/md0" with 2096000 available sectors
    Zeroing start of device /dev/md0
    Physical volume "/dev/md0" successfully created

    shian:~# vgcreate -v vg02 /dev/md0
    Adding physical volume '/dev/md0' to volume group 'vg02'
    Archiving volume group "vg02" metadata.
    Creating volume group backup "/etc/lvm/backup/vg02"
    Volume group "vg02" successfully created

    shian:~# lvcreate -v -L 900M -n lvol_raid vg02
    Finding volume group "vg02"
    Creating logical volume lvol_raid
    Archiving volume group "vg02" metadata.
    Creating volume group backup "/etc/lvm/backup/vg02"
    Found volume group "vg02"
    Loading vg02-lvol_raid
    Zeroing start of logical volume "lvol_raid"
    Creating volume group backup "/etc/lvm/backup/vg02"
    Logical volume "lvol_raid" created

    shian:~# mkfs.ext3 /dev/vg02/lvol_raid
    mke2fs 1.37 (21-Mar-2005)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    115200 inodes, 230400 blocks
    11520 blocks (5.00%) reserved for the super user
    First data block=0
    8 block groups
    32768 blocks per group, 32768 fragments per group
    14400 inodes per group
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376

    Writing inode tables: done
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done

    This filesystem will be automatically checked every 28 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.

    shian:~# mount /dev/vg02/lvol_raid /mnt/raid

    shian:~# df -h /mnt/raid
    Filesystem Size Used Avail Use% Mounted on
    /dev/mapper/vg02-lvol_raid
    886M 17M 825M 2% /mnt/raid

       Y ya tenemos un LVM + Raid 1 funcionando y con las ventajas de ambos: la redundancia del raid y la gestión dinámica de las particiones de lvm.

       Finalmente, para terminar, otra cosa que se puede hacer con lvm es lo siguiente (cortesía de Alex). Imaginemos que tenemos lvm montado en un disco, con particiones, datos,... pero que se nos está quedando pequeño. Nos compramos un disco nuevo para sustituir al antiguo (en el ejemplo he añadido un nuevo disco scsi a la máquina virtual de 4GB, sdb) y después de particionarlo como lvm hacemos lo siguiente:
  • Creamos un PV en la nueva partición:
    shian:~# pvcreate -v /dev/sdb1
    Set up physical volume for "/dev/sdb1" with 8385483 available sectors
    Zeroing start of device /dev/sdb1
    Physical volume "/dev/sdb1" successfully created
  • Lo añadimos al VG vg01 ya existente:
    shian:~# vgextend -v vg01 /dev/sdb1
    Checking for volume group "vg01"
    Archiving volume group "vg01" metadata.
    Adding physical volume '/dev/sdb1' to volume group 'vg01'
    Volume group "vg01" will be extended by 1 new physical volumes
    Creating volume group backup "/etc/lvm/backup/vg01"
    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 -v /dev/sda1
    Finding volume group "vg01"
    Archiving volume group "vg01" metadata.
    Creating logical volume pvmove0
    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:
    shian:~# pvmove -v /dev/sda1
    Finding volume group "vg01"
    Archiving volume group "vg01" metadata.
    Creating logical volume pvmove0
    Moving 256 extents of logical volume vg01/lvdatos
    Found volume group "vg01"
    Updating volume group metadata
    Creating volume group backup "/etc/lvm/backup/vg01"
    Found volume group "vg01"
    Found volume group "vg01"
    Loading vg01-pvmove0
    Found volume group "vg01"
    Loading vg01-lvdatos
    Checking progress every 15 seconds
    /dev/sda1: Moved: 72.7%
    /dev/sda1: Moved: 100.0%
    Found volume group "vg01"
    Found volume group "vg01"
    Found volume group "vg01"
    Loading vg01-pvmove0
    Found volume group "vg01"
    Loading vg01-lvdatos
    Found volume group "vg01"
    Found volume group "vg01"
    Removing temporary pvmove LV
    Writing out final volume group after pvmove
    Creating volume group backup "/etc/lvm/backup/vg01"
  • 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
    Finding volume group "vg01"
    Using physical volume(s) on command line
    Archiving volume group "vg01" metadata.
    Removing "/dev/sda1" from volume group "vg01"
    Creating volume group backup "/etc/lvm/backup/vg01"
    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

  •    En este extenso (si has llegado hasta aquí enhorabuena) artículo hemos visto qué es el LVM y cómo gestionarlo.

       Tengo que admitir que durante mis pruebas me he cargado alguna vez algo pero nada que no se pueda arreglar empezando de nuevo. Además, si finalmente me decido a utilizarlo en casa ya me andaré con más cuidado y pensaré bien lo que hago antes de estropearlo. Todavía no tengo muy claro si lo haré o no porque en caso de fallo no creo que sea lo mismo intentar recuperar una partición ext3 que una lvm, en fín, me tendré que informar.

    lunes, 16 de abril de 2007

    DD-WRT en La Fonera

       Ya comenté hace tiempo que quería actualizar la fonera a dd-wrt. Aunque aún se encuentra en fase beta ya va tomando más forma y hay algunas versiones que son bastante estables. Después de leer bastante los foros y hacerme un pequeño esquema de todos los pasos necesarios para realizar la actualización sin (demasiado) riesgo de romper mi fonera me decidí a intentarlo.

       Primero hay que asegurarse de que cumplimos todos los prerequisitos para poder empezar la actualización:
  • Tener acceso por ssh a la fonera
  • Servidor TFTP: En mi caso para windows.
  • Putty
  • Los binarios del firmware dd-wrt para la fonera.

  •    Nos conectamos por ssh a la fonera y lo primero que tenemos que hacer el instalar el RedBoot con el que procederemos a actulizar el firmware. Esto sólo hay que hacerlo la primera vez que instalemos el firmware, en posteriores actulizaciones nos podemos ahorrar estos pasos:
    root@OpenWrt:~# cd /tmp
    root@OpenWrt:~# wget http://fonera.info/camicia/openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
    root@OpenWrt:~# mtd -e vmlinux.bin.l7 write openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma vmlinux.bin.l7
    root@OpenWrt:~# reboot

       Ahora la fonera se reinicia. Después de que arranque volvemos a entrar por ssh y ejecutamos:
    root@OpenWrt:~# cd /tmp
    root@OpenWrt:~# wget http://fonera.info/camicia/out.hex
    root@OpenWrt:~# mtd -e "RedBoot config" write out.hex "RedBoot config"
    root@OpenWrt:~# reboot

       De nuevo la fonera se va a reiniciar pero ya no arrancará más. La desenchufé y me preparé para cargar el nuevo firmware:
  • Copié los archivos root.fs y vmlinux.bin.l7 que descargué al directorio del TFTP y desactivé el firewall para no tener problemas y ejecuté el servidor.
  • Configuré la ip de mi pc a una del rango 192.168.1.xxx (en mi caso 192.168.1.11) con máscara de red 255.255.255.0.
  • Abrí un cmd y ejecuté un ping indefinido ping -t 192.168.1.254. Esta es la ip en la que levanta RedBoot.
  • Desde el putty preparé una conexión por telnet al puerto 9000 de 192.168.1.254.
  • Enchufé de nuevo la fonera y en cuanto empezó a responder a los pings me conecté desde el putty.

  •    En ese momento ya tenía el prompt del RedBoot listo para flashear.
  • Configuré la ip del servidor TFTP del cual iba a obtener el firmware:
    RedBoot> ip_address -l 192.168.1.254/24 -h 192.168.1.11

  •    Y llegó el momento de la verdad, comenzó el flasheo...
    RedBoot> fis init
    RedBoot> load -r -v -b 0x80041000 root.fs
    RedBoot> fis create -b 0x80041000 -f 0xA8030000 -l 0x002C0000 -e 0x00000000 rootfs
    RedBoot> load -r -v -b 0x80041000 vmlinux.bin.l7
    RedBoot> fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7
    RedBoot> fis create -f 0xA83D0000 -l 0x00010000 -n nvram
    RedBoot> reset

       Aparentemente todo funcionó correctamente. Sólo hay que tener paciencia puesto que el segundo paso tardó más de 10 minutos y en pantalla no aparece ninguna información del progreso.

       Cuando terminó la fonera se reinició, obtuvo ip por dhcp y creó la señal wifi dd-wrt. Me conecté a la ip asignada y este es el resultado final.


       Esto lo hice hace ya algún tiempo y he probado en total 7 u 8 versiones distintas del firmware. Como se puede ver en la web de descargas cada 3 ó 4 días de media aparece una versión nueva, por lo que hay que probar si la configuración de red que quieres crear funciona bien con esa versión. Ahora mismo me estoy pegando con la configuración de la fonera en modo cliente wifi y también con wds. Me ha funcionado una vez (justo la primera y sin mirar tutoriales ni nada parecido) pero ahora no soy capaz de repetirlo. Tengo que seguir probando a ver si consigo enlazarla correctamente a mi linksys.

    martes, 10 de abril de 2007

    Modding Fonera

       Siguiendo el post anterior de pintar la grabadora de dvd, decidí que ya que me ponía podía pintar una fonera a ver qué tal quedaba. Después de frotar un rato con alcohol borré el logo de fon y desarmé la fonera. Esto es lo que tenemos:


       Me llevé las piezas al parque y después de pintarlas el resultado fue el siguiente:

    Modding grabadora de DVD

       Mi nuevo ordenador tiene un lector y una grabadora de DVDs. Estos dos dispositivos los he reutilizado de mi antiguo Duron. El lector era de color negro pero la grabadora era blanca y con la nueva caja quedaba francamente mal. Tenía dos posible soluciones:
  • Comprar una nueva grabadora: 40€
  • Comprar un bote de spray negro mate y un paquete de pipas: 2€

  •    Obviamente me decidí por la segunda opción aparte de por ser bastante más económica, porque me serviría para entretenerme un rato :-P.

       Esta es la víctima a la que le quité el frontal y la tapa de la bandeja:

       Cogí el spray, las piezas de la grabadora, unos guantes de latex, un paquete de pipas y un cartón y me fui con mi mujer a un parque al lado de casa. Puse las piezas de la grabadora en el cartón, las pinté y mientras que se secaban al sol estuvimos comiendo unas pipas sentados en un banco...

      Después de 2 manos de pintura y unas cuantas pipas, el resultado es este:

       Como se ve ha quedado muy bien y estoy muy satisfecho con el resultado. Me he ahorrado bastante dinero y además me daba pena comprarme una grabadora nueva porque ésta, después de más de 2 años, funciona a la perfección.

    martes, 3 de abril de 2007

    Nuevo Ordenador

       Como ya comenté en algún post anterior tenía pensado cambiar de ordenador porque mi actual Duron 1200 Mhz ya estaba a tope y no podía dar más de sí. Además el Duron lo quiero reutilizar para montar el raid 1 y darle algún provecho puesto que aunque es un ordenador algo antiguo es el que estaba utilizando hasta hace poco y todavía sirve.

       No quería gastar mucho dinero (mi presupuesto inicial era unos 450-500€ aunque al final fueron 600€), por lo que he estado leyendo foros de hardware algo más de un mes para ponerme al día. Hace unos años controlaba mucho del tema pero en todo este tiempo las cosas han cambiado bastante: dual core, memorias dual channel, pci express, microprocesadores sin pines puesto que están en la placa base, discos duros sata,... Vamos, que he leído mucho para actualizarme ;-).

       Al final, después de buscar, comparar, leer reviews, preguntar en los foros,... estos componentes han sido los elegidos:
  • Micro Core 2 Duo E4300: Es el más bajo de la gama Core 2 Duo de Intel, así no sé me va mucho el presupuesto y según he leído tienen un rendimiento muy bueno.

  • Placa base ASRock ConRoeXFire-eSATA2: ASRock es la segunda marca de Asus. Por el precio que tiene esta placa viene con muchos extras como por ejemplo interfaz firewire, puertos eSata, Gigabit ethernet, sonido de 8 canales,...

  • 2GB de Ram Kingston: En dos módulos para el dual channel.

  • Disco duro Seagate 320GB con 16MB de cache: También he leído cosas muy buenas de él en los foros. Es prácticamente un clásico en todas las configuraciones.

  • Tarjeta gráfica nVidia 7300GT con 256MB: Como no juego no quería una tarjeta gráfica muy potente. He optado por esta que es de gama media y además sin ventilador, todo con disipación pasiva, así tendremos menos ruido.

  • Caja Sharkoon Rebel 9 Value Edition: La verdad es que he elegido esta caja un poco por capricho aunque también por la funcionalidad que tiene.

  • Fuente de alimentación de 450W: Como no juego y tampoco voy a conectar muchos periféricos, no necesito mucha más potencia.


  •    Durante el montaje la verdad es que no hubo ninguna complicación y en algo más de dos horas tenía todo montado. Sólo hay que tener especial cuidado al colocar el micro y el disipador, el resto coser y cantar. Me ha funcionado todo a la primera y la verdad es que estoy muy contento con la elección de los componentes que he hecho, en especial con la caja. Como se puede ver he puesto el disco duro justo detrás del ventilador frontal, por lo que siempre estará fresquito y no tendré problemas de temperatura. Además, el ventilador lateral también mueve mucho aire y hace que el resto de componentes también se refrigeren. Al encender el ordenador lo primero que comprobé fue que la bios detectaba correctamente todo el hardware y que la temperatura del micro era baja, esto me indicó que el disipador estaba correctamente colocado y la pasta termoconductora estaba haciendo su trabajo.


       Este es el aspecto de la caja con todos los componentes montados:


       Y finalmente el ordenador terminado. El ventilador frontal que refrigera el disco duro tiene unos leds azules, que junto con el de encendido dan a la caja un aspecto elegante y luminoso tanto con la luz encendida como apagada.

    lunes, 26 de marzo de 2007

    Servidor raid 1 en "Preproducción"

       El otro día estuve un tanto ocioso y quise hacer una pequeña prueba del raid 1 pero esta vez sin utilizar máquinas virtuales, sino con hardware real. Así podía hacer una prueba en "preproducción" antes de la implementación definitiva cuando tenga mi nuevo ordenador y reutilice el antiguo.

       Abrí una caja con diverso hardware (memorias, discos duros, cables ide, alguna placa base, procesadores,...) que tengo pendiente de subir al trastero y monté lo siguiente:


       El equipo es ya algo antiguo y fue lo mejor que pude hacer con el hardware que tenía:
  • Pentium II 300Mhz
  • 384 MB de Ram
  • Tarjeta Gráfica ATI Mach32 PCI
  • Tarjeta de red 3Com PCI 100 Mbps
  • Disco duro principal 1,6 GB
  • 2 discos duros adicionales para el raid

  •    El disco duro principal ya tenía una Debian Sarge recien instalada que utilicé hace algún tiempo en un pc de características similares, así que todo arrancó sin problemas. Para logarme como root y empezar a configurar el raid y hacer las pruebas utilicé el método que comenté el otro día para recuperar el password de root puesto que no me acordaba del password.

       Después de tener tanto el raid como samba configurados hice una pequeña prueba copiando un archivo de unos 700 MB de mi actual sobremesa a una carpeta compartida del raid y tomé tiempos. La copia de los 700 MB tardó algo menos de 2 minutos, por lo que me sale una transferencia de aproximadamente unos 6,5 MBytes por segundo. Aunque creo que para casa es más que suficiente he hecho una prueba similar en el trabajo (aunque con dos máquinas windows) para comparar y el tiempo ha sido prácticamente el mismo.

    domingo, 25 de marzo de 2007

    Recuperar Debian sin password de root

       Alguna vez me ha pasado que después de mucho tiempo he intentado entrar como root en algún linux antiguo pero no recordaba la contraseña. Haciendo memoria (de los tiempos de lilo) sé que se le puede pasar al kernel el parámetro single para arrancar el modo monousuario como root sin necesidad de utilizar password. Hacer esto con grub es algo distinto aunque la filosofía es la misma. Se edita la línea kernel y se añade al final, quedando así:
    /boot/vmlinuz-2.4.27-speakup root=/dev/hda1 ro single

       Aceptando el cambio y arrancando el sistema tendremos el prompt de root listo para lo que queramos. Esto me ha funcionado siempre en todas las distribuciones que he probado, sin embargo en Debian Sarge el sistema no termina de arrancar sino que muestra el siguiente mensaje:
    Give root password for maintenance
    (or type Control-D to continue):

       Así que hay que buscar otra solución. Después de descartar el tener que abrir el ordenador para conectar el disco duro a otro e incluso arrancar desde una distribución live-cd, no se me ocurría nada más. Miré si Alex estaba conectado en gtalk para que me echara una mano y la solución que me propuso (sin tener acceso a la consola) fue añadir al final de la línea kernel el parámetro init=/bin/sh, quedando así:
    /boot/vmlinuz-2.4.27-speakup root=/dev/hda1 ro init=/bin/sh

       De esta forma, según me dijo se arranca un kernel mínimo y se ejecuta el shell sh. Después tenemos que montar el filesystem en modo lectura-escritura y editar el archivo /etc/shadow para eliminar el password de root:
    sh-2.05b# mount -o remount,rw /
    sh-2.05b# vi /etc/shadow

       Y listo!. Ahora reiniciando de nuevo podemos logarnos como root y no tendremos que introducir ningún password :-D. Muchas gracias por la ayuda Alex!.

    viernes, 23 de marzo de 2007

    Compartir directorios con Samba

       En el artículo anterior configuré un raid 1 en debian listo para ser utilizado y aprovechar la redundancia que proporciona para almacenar información importante. Ahora lo que vamos a ver es cómo configurar Samba para poder compartir el raid entre máquinas windows. Además, utilizaremos autenticación de los usuarios y controlaremos los permisos de los directorios a nivel de sistema operativo y con samba.

       Voy a crear un grupo casa con los usuarios ivan y ana y la estructura de directorios será la siguiente.
       + Home
    - Ivan
    - Ana
    + Datos
    - Musica
    - Pelis
    - Fotos
    - Varios
    - Lo_que_sea

       Cada usuario tendrá permisos de sólo-lectura en el home del otro usuario y todo lo que cuelgue de Datos podrá ser modificado por cualquiera de nosotros dos. Como es algo muy básico no voy a mostrar ni la creación del grupo, usuarios, directorios, permisos con chmod y chown,... creo que hay muchas páginas en la red con ayuda y ejemplos. Sólo muestro cómo quedan al final:

    shian:/mnt/raid# ls -l
    total 24
    drwxrwxrwx 7 root root 4096 2007-03-15 09:53 Datos
    drwxr-xr-x 4 root root 4096 2007-03-15 09:46 Home
    drwx------ 2 root root 16384 2007-03-13 16:42 lost+found

    shian:/mnt/raid# ls -l Datos/
    total 20
    drwxrwx--- 3 ivan casa 4096 2007-03-15 09:54 Fotos
    drwxrwx--- 4 ivan casa 4096 2007-03-15 09:54 Musica
    drwxrwx--- 2 ana casa 4096 2007-03-15 09:53 Pelis
    drwxrwx--- 3 ivan casa 4096 2007-03-15 09:51 Papelera de reciclaje
    drwxrwx--- 3 root root 4096 2007-03-15 09:52 Varios

    shian:/mnt/raid# ls -l Home/
    total 8
    drwxr-x--- 3 ana casa 4096 2007-03-15 09:53 Ana
    drwxr-x--- 2 ivan casa 4096 2007-03-15 09:50 Ivan
  • Hay que añadir los usuarios a samba:
    shian:/# smbpasswd -a ivan
    New SMB password:
    Retype new SMB password:
    shian:/# smbpasswd -a ana
    New SMB password:
    Retype new SMB password:

  • El archivo de configuración de Samba es el siguiente:
    shian:/# cat /etc/samba/smb.conf
    # Global parameters
    [global]
    display charset = UTF-8
    server string = Shian server
    obey pam restrictions = Yes
    passdb backend = tdbsam, guest
    syslog = 0
    max log size = 1000
    socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=16384 SO_RCVBUF=16384
    load printers = No
    local master = No
    dns proxy = No
    invalid users = root

    # Para habilitar la papelera de reciclaje
    recycle:directory_mode = 0770
    recycle:versions = Yes
    recycle:keeptree = Yes
    recycle:repository = Papelera de reciclaje
    vfs objects = recycle

    [temporal]
    comment = tmp
    path = /mnt/tmp
    read only = No
    create mask = 0660
    directory mask = 0770
    guest ok = No

    [datos]
    comment = Datos del raid
    path = /mnt/raid/Datos
    read only = Yes
    write list = @casa
    create mask = 0660
    directory mask = 0770
    guest ok = No

    [home]
    comment = Home usuarios
    path = /mnt/raid/Home
    read only = Yes
    write list = @casa
    create mask = 0640
    directory mask = 0750
    guest ok = No

  • Una opción interesante de Samba es la utilización del objeto recycle que implementa una papelera de reciclaje. Así, si borramos archivos de las carpetas de red éstos no se eliminan sino que se almacenan en la carpeta Papelera de reciclaje por si los queremos recuperar posteriormente.
  • Ahora, si nos conectamos desde una máquina windows tenemos lo siguiente:

  •    En fin, una configuración bastante sencilla y una manera muy simple de compartir los datos. La configuración de samba se podría hacer de muchas maneras puesto que proporciona mucha flexibilidad en cuanto a opciones de configuración y compartición de archivos pero para el uso que le vamos a dar en casa es más que suficiente con esto.

    miércoles, 21 de marzo de 2007

    El efecto barrapunto

       El sábado publicaron mi artículo del raid 1 en linux en portada de Barrapunto. Ha estado en portada desde las 22:27 del sábado a las 11:08 del martes y como consecuencia de esto tuve el conocido Efecto Barrapunto y las visitas al blog se dispararon. Normalmente recibo aproximadamente unas 50 visitas diarias y el domingo llegaron a las 2500!. En total en estos días han sido aproximadamente 4500 visitas, siendo la mayoría al artículo del raid.






       El haber aparecido en portada también me ha servido para que la gente conozca un poco este blog puesto que he recibido comentarios en otros artículos y he visto que en general hay gente curiosa que ha estado leyendo bastante del blog. En fin, me conformo con que algunos de ellos se vuelvan habituales del blog y que el artículo del raid haya ayudado a alguien.

    sábado, 17 de marzo de 2007

    Nuevo aspecto del blog

       Aunque estos últimos días he cambiado algún estilo del blog (gracias Alex por la ayuda), llevaba algún tiempo queriendo darle un lavado de cara. La plantilla que tenía antes estaba hecha de manera estática y adaptada a 800x600 pixels. Viendo las estadísticas (públicas por cierto) del blog me he dado cuenta de que la mayoría de las visitas son con una resolución de al menos 1024x768 pixels.

       Así, la antigua plantilla ha muerto y ha dejado paso a esta que estás viendo. Sigue siendo muy sencilla, con colores muy básicos y donde destaca el blanco. La principal ventaja es que está hecha de manera dinámica, por lo que de adapta a la resolución de tu monitor. Esto me permitirá poner las fotos a un tamaño un poco mayor, puesto que a veces no se apreciaban bien sin ampliarlas.

       En fin, iremos mejorándola poco a poco.

    Raid 1 en Linux

       Siguiendo el artículo anterior del servidor NAS para casa, aquí cuento todo lo que hice para configurar y probar el raid 1 en debian y las conclusiones finales a las que llegué. Este pequeño tutorial lo he hecho en una máquina virtual VMware por lo cómodo que es probar e instalar todo. El disco de sistema es hda con una única partición y los discos con los que se creará el raid 1 serán hdb y hdc. Muestro en rojo lo que he introducido en los diferentes menús.
  • Particionar los dos discos duros. El sistema de archivos debe ser Linux raid auto.
    shian:~# fdisk /dev/hdb
    Command (m for help): p

    Disk /dev/hdb: 1073 MB, 1073741824 bytes
    16 heads, 63 sectors/track, 2080 cylinders
    Units = cylinders of 1008 * 512 = 516096 bytes

    Device Boot Start End Blocks Id System

    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-2080, default 1):INTRO
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-2080, default 2080):INTRO
    Using default value 2080

    Command (m for help): t
    Selected partition 1
    Hex code (type L to list codes): fd
    Changed system type of partition 1 to fd (Linux raid autodetect)

    Command (m for help): p

    Disk /dev/hdb: 1073 MB, 1073741824 bytes
    16 heads, 63 sectors/track, 2080 cylinders
    Units = cylinders of 1008 * 512 = 516096 bytes

    Device Boot Start End Blocks Id System
    /dev/hdb1 1 2080 1048288+ fd Linux raid autodetect

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    Syncing disks.
  • Repetimos los pasos para /dev/hdc.
  • Creamos el raid 1 con las dos particiones que acabamos de crear. En las opciones indicamos que el tipo de raid será 1 (mirror), que deseamos utilizar dos discos y que el nuevo dispositivo raid será /dev/md0.
    shian:~# mdadm --create /dev/md0 --verbose --level=1 --raid-devices=2 /dev/hdb1 /dev/hdc1
    mdadm: size set to 1048192K
    mdadm: array /dev/md0 started.

    NOTA: Si ya hemos usado el disco anteriormente para otro raid, es necesario reiniciar el superbloque para que se borre la información existente, puesto que sino, la creación puede fallar:
    shian:~# mdadm --zero-superblock /dev/sdXX
  • El raid 1 se está creando en segundo plano. En función del tamaño de los discos tardará más o menos. Se puede ver el estado en el archivo /proc/mdstat:
    shian:~# cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    md0 : active raid1 ide/host0/bus1/target0/lun0/part1[1] ide/host0/bus0/target1/lun0/part1[0]
    1048192 blocks [2/2] [UU]
    [===========>.........] resync = 58.2% (611196/1048192) finish=0.0min speed=101866K/sec
    unused devices: <none>
  • El porcentaje va subiendo hasta que finalmente el dispositivo está listo:
    shian:~# cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    md0 : active raid1 ide/host0/bus1/target0/lun0/part1[1] ide/host0/bus0/target1/lun0/part1[0]
    1048192 blocks [2/2] [UU]

    unused devices: <none>
  • A partir de este momento para cualquier manipulación que deseemos hacer del raid debemos utilizar /dev/md0 y no /dev/hdb1 ni /dev/hdc1.
  • Formateamos el raid
    shian:~# mkfs.ext3 /dev/md0
    mke2fs 1.37 (21-Mar-2005)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    131072 inodes, 262048 blocks
    13102 blocks (5.00%) reserved for the super user
    First data block=0
    8 block groups
    32768 blocks per group, 32768 fragments per group
    16384 inodes per group
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376

    Writing inode tables: done
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done

    This filesystem will be automatically checked every 22 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.
  • Creamos el punto de montaje, añadimos la entrada correspondiente para que el raid se monte cuando se arranca la máquina y lo montamos:
    shian:~# mkdir /mnt/raid

    shian:~# echo "/dev/md0 /mnt/raid ext3 defaults 0 1" >> /etc/fstab

    shian:~# mount /mnt/raid

    shian:~# df -h /dev/md0
    Filesystem Size Used Avail Use% Mounted on
    /dev/md0 1008M 17M 941M 2% /mnt/raid
  • Aquí ya habríamos terminado la instalación del raid y podríamos utilizarlo, aunque tal y como está configurado y montado sólo tendría permisos el usuario root.

  •    A partir de aquí, lo que yo hice inicialmente fue simular que un disco duro se estropeaba y al arrancar la máquina quería montar el raid sólo con el otro disco y utilizarlo normalmente. Además, después de simular con la máquina virtual que añadía un nuevo disco duro, quería añadirlo al raid para volver a tener de nuevo la redundancia. Después de leer muchos tutoriales y foros no había manera de que funcionase. Si reiniciaba la máquina sin un disco del raid, éste no se montaba y no podía acceder a los datos. Además, el dispositivo /dev/md0 no era reconocido, por lo que era como si el raid no existiese!. Finalmente, encontré en un pequeño tutorial la solución a mis problemas.

  • Es necesario indicarle al sistema operativo cómo acceder a ese dispositivo raid para que sea capaz de utilizarlo. Esto que puede parecer tan obvio no venía en ningún tutorial ni en ninguna ayuda de las que consulté.
    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
    shian:/etc/mdadm#
    shian:/etc/mdadm# cat mdadm.conf
    DEVICE partitions
    ARRAY /dev/md0 level=raid1 num-devices=2 UUID=a48e6816:ea6e7f37:6cc50cdb:6fead399
    devices=/dev/hdb1,/dev/hdc1
  • Ahora ya podemos reiniciar la máquina y el raid arrancará y se montará automáticamente en el arranque.
  • Podemos probar a parar el dispositivo y a levantarlo de nuevo:
    shian:/etc/mdadm# umount /mnt/raid
    shian:/etc/mdadm# mdadm --stop /dev/md0
    shian:/etc/mdadm# cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    unused devices: <none>

    shian:/etc/mdadm# mdadm --assemble /dev/md0 /dev/hdb1 /dev/hdc1
    mdadm: /dev/md0 has been started with 2 drives.
    shian:/etc/mdadm# cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    md0 : active raid1 ide/host0/bus0/target1/lun0/part1[0] ide/host0/bus1/target0/lun0/part1[1]
    1048192 blocks [2/2] [UU]

    unused devices: <none>

  •    Ahora sí, vamos a probar si realmente el podemos recuperar la información y el sistema funciona correctamente en caso de caída de un dispositivo. Además, veremos cómo reemplazar el disco defectuoso y recuperar de nuevo el raid 1 con los dos discos.
  • Creamos un archivo aleatorio de 25MB en el raid montando previamente de nuevo el raid:
    shian:/# mount /dev/md0 /mnt/raid
    shian:/# dd if=/dev/urandom of=/mnt/raid/random1 count=51200
    51200+0 records in
    51200+0 records out
    26214400 bytes transferred in 7.829523 seconds (3348148 bytes/sec)
  • Calculamos su CRC y lo apuntamos. Posteriormente nos servirá para comprobar que todo es correcto:
    shian:/# cksum /mnt/raid/random1
    1652310020 26214400 /mnt/raid/random1
  • Vamos a simular un fallo en uno de los dispositivos. Para ello apagamos el sistema, desconectamos uno de los discos duros (en este caso /dev/hdb) y arrancamos de nuevo.
  • Una vez arrancado de nuevo el sistema, si examinamos con detalle los mensajes de arranque encontraremos algo como lo siguiente. Como se puede ver el sistema ha detectado un disco falla y al no haber un disco de repuesto (spare) levanta el raid en modo degradado con un sólo disco. Podremos seguir utilizando el raid con total normalidad pero si este disco también fallase, perderíamos irremediablemente todos los datos.
    md: bind
    md: ide/host0/bus1/target0/lun0/part1's event counter: 00000006
    md0: former device hdb1 is unavailable, removing from array!
    md: raid1 personality registered as nr 3
    md0: max total readahead window set to 124k
    md0: 1 data-disks, max readahead per data-disk: 124k
    raid1: device ide/host0/bus1/target0/lun0/part1 operational as mirror 1
    raid1: md0, not all disks are operational -- trying to recover array
    raid1: raid set md0 active with 1 out of 2 mirrors
    md: updating md0 RAID superblock on device
    md: ide/host0/bus1/target0/lun0/part1 [events: 00000007]<6>(write) ide/host0/bus1/target0/lun0/part1's sb offset: 1048192
    md: recovery thread got woken up ...
    md0: no spare disk to reconstruct array! -- continuing in degraded mode
    md: recovery thread finished ...
  • En el archivo /proc/mdstat podemos ver el estado del raid. Ahora mismo se encuentra funcionando sólo con un dispositivo de dos posibles y nos indica que el que ha fallado es el primero de ellos:
    shian:~# cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    md0 : active raid1 ide/host0/bus1/target0/lun0/part1[1]
    1048192 blocks [2/1] [_U]

    unused devices: <none>
  • No obstante el raid está montado y el filesystem es accesible:
    shian:~# df -h /dev/md0
    Filesystem Size Used Avail Use% Mounted on
    /dev/md0 1008M 42M 916M 5% /mnt/raid
  • Ahora marcamos el disco /dev/hdb1 como fallo para proceder a cambiarlo:
    shian:~# mdadm --manage /dev/md0 --fail /dev/hdb1
    mdadm: set /dev/hdb1 faulty in /dev/md0

  •    Apagamos la máquina y cambiamos el disco duro defectuoso por uno nuevo. En el caso de VMware basta con crear un nuevo dispositivo de tipo disco duro. Además, este disco duro nuevo que añadimos va a ser de mayor tamaño que el anterior. Idealmente en un raid 1 los dos discos duros deben tener el mismo tamaño, pero linux nos proporciona la suficiente flexibilidad para que esto no sea así.

  • En el arranque de la máquina vemos que el raid sigue arrancando pero en modo degradado. Lo que vamos a hacer es crear la tabla de particiones del nuevo disco duro exáctamente igual que la del disco duro que aún funciona y que forma parte del raid:
    shian:~# sfdisk -d /dev/hdc | sfdisk /dev/hdb
    Checking that no-one is using this disk right now ...
    OK

    Disk /dev/hdb: 4161 cylinders, 16 heads, 63 sectors/track

    sfdisk: ERROR: sector 0 does not have an msdos signature
    /dev/hdb: unrecognized partition table type
    Old situation:
    No partitions found
    New situation:
    Units = sectors of 512 bytes, counting from 0

    Device Boot Start End #sectors Id System
    /dev/hdb1 63 2096639 2096577 fd Linux raid autodetect
    /dev/hdb2 0 - 0 0 Empty
    /dev/hdb3 0 - 0 0 Empty
    /dev/hdb4 0 - 0 0 Empty
    Warning: no primary partition is marked bootable (active)
    This does not matter for LILO, but the DOS MBR will not boot this disk.
    Successfully wrote the new partition table

    Re-reading the partition table ...

    If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
    to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
    (See fdisk(8).)
  • Como este nuevo disco duro es mayor que el anterior, podemos crear una partición /dev/hdb2 y formatearla para utilizarla sin problemas.
    shian:~# fdisk /dev/hdb

    The number of cylinders for this disk is set to 4161.
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of LILO)
    2) booting and partitioning software from other OSs
    (e.g., DOS FDISK, OS/2 FDISK)

    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 2
    First cylinder (2081-4161, default 2081):INTRO
    Using default value 2081
    Last cylinder or +size or +sizeM or +sizeK (2081-4161, default 4161):INTRO
    Using default value 4161

    Command (m for help): p

    Disk /dev/hdb: 2147 MB, 2147483648 bytes
    16 heads, 63 sectors/track, 4161 cylinders
    Units = cylinders of 1008 * 512 = 516096 bytes

    Device Boot Start End Blocks Id System
    /dev/hdb1 1 2080 1048288+ fd Linux raid autodetect
    /dev/hdb2 2081 4161 1048824 83 Linux

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    Syncing disks.

    shian:~# mkfs.ext3 /dev/hdb2
    mke2fs 1.37 (21-Mar-2005)
    warning: 62 blocks unused.

    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    131328 inodes, 262144 blocks
    13110 blocks (5.00%) reserved for the super user
    First data block=0
    8 block groups
    32768 blocks per group, 32768 fragments per group
    16416 inodes per group
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376

    Writing inode tables: done
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done

    This filesystem will be automatically checked every 30 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.

    shian:~# mkdir /mnt/tmp

    shian:~# mount /dev/hdb2 /mnt/tmp
  • Ahora vamos a reconstruir el raid:
    shian:~# mdadm --manage /dev/md0 --add /dev/hdb1
    mdadm: hot added /dev/hdb1
  • En este instante el raid 1 se está reconstruyendo. Toda la información del disco existente (/dev/hdc1) se está escribiendo en el nuevo disco (/dev/hdb1) para reconstruir el mirror y tener de nuevo la redundancia. Podemos comprobar el estado en el archivo /proc/mdstat:
    shian:~# cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    md0 : active raid1 ide/host0/bus0/target1/lun0/part1[2] ide/host0/bus1/target0/lun0/part1[1]
    1048192 blocks [2/1] [_U]
    [=======>.............] recovery = 39.5% (415488/1048192) finish=0.1min speed=69248K/sec
    unused devices: <none>
  • Finalmente, después de un tiempo tenemos el raid recuperado:
    shian:~# cat /proc/mdstat
    Personalities : [raid1]
    read_ahead 1024 sectors
    md0 : active raid1 ide/host0/bus0/target1/lun0/part1[0] ide/host0/bus1/target0/lun0/part1[1]
    1048192 blocks [2/2] [UU]

    unused devices: <none>
  • Si no nos fiamos de que todo esté correcto (yo tengo que verlo para creerlo), podemos hacer lo siguiente para comprobar que la recuperación se ha realizado satisfactoriamente. Lo que vamos a hacer es desmontar el raid, montar únicamente el nuevo dispositivo /dev/hdb1 y comprobar el CRC del archivo que generamos anteriormente para comprobar que la recuperación ha sido correcta.
    shian:~# umount /mnt/raid
    shian:~# mount /dev/hdb1 /mnt/raid
    shian:~# cksum /mnt/raid/random1
    1652310020 26214400 /mnt/raid/random1
  • Y listo!. El raid se ha recuperado correctamente y toda nuestra información está a salvo. Es importante dejarlo todo como estaba antes de utilizarlo puesto que ahora mismo en /mnt/raid se encuentra montado de manera temporal sólo un dispositivo del raid y no éste completo. Si ahora hiciéramos algún cambio, creásemos archivos,... perderíamos todos esos datos en cuanto montásemos de nuevo el raid. Mejor lo dejamos todo como estaba:
    shian:~# umount /mnt/raid/
    shian:~# mount /mnt/raid/
    shian:~# df -h /mnt/raid/
    Filesystem Size Used Avail Use% Mounted on
    /dev/md0 1008M 42M 916M 5% /mnt/raid
  • Si ahora reiniciamos la máquina vemos que el raid arranca correctamente con los dos discos de nuevo:
    md: ide/host0/bus0/target1/lun0/part1's event counter: 0000000c
    md: ide/host0/bus1/target0/lun0/part1's event counter: 0000000c
    md: raid1 personality registered as nr 3
    md0: max total readahead window set to 124k
    md0: 1 data-disks, max readahead per data-disk: 124k
    raid1: device ide/host0/bus0/target1/lun0/part1 operational as mirror 0
    raid1: device ide/host0/bus1/target0/lun0/part1 operational as mirror 1
    raid1: raid set md0 active with 2 out of 2 mirrors
    md: updating md0 RAID superblock on device
    md: ide/host0/bus0/target1/lun0/part1 [events: 0000000d]<6>(write) ide/host0/bus0/target1/lun0/part1's sb offset: 1048192
    md: ide/host0/bus1/target0/lun0/part1 [events: 0000000d]<6>(write) ide/host0/bus1/target0/lun0/part1's sb offset: 1048192

  •    Hemos visto una manera bastante sencilla y fiable de tener nuestros datos importantes a buen recaudo. No obstante este sistema raid no sirve de nada sin una buena política de backups, puesto que no protege del borrado accidental de archivos.

       Después de haber probado FreeNAS y el Raid en Debian puedo sacar en claro lo siguiente:
  • FreeNAS es mucho más sencillo y fácil de configurar, pero no ofrece toda la flexibilidad que linux. Por ejemplo, con FreeNAS no es posible crear un raid con dos discos de distinto tamaño y aprovechar el espacio restante. En linux eso no supone ningún problema. Simplemente hay que tener claro que los datos de esa nueva partición no tendrán respaldo, por lo que no se debe utilizar para almacenar información importante.
  • FreeNAS todavía es una versión beta y aunque parece muy robusta y hay mucha gente que la está utilizando (sólo hay que echar un vistazo a sus foros), los desarrolladores indican que no se debería utilizar en entornos de producción. Por contra, el raid por software en linux se lleva utilizando desde hace bastante tiempo.
  • Si tengo algún problema con FreeNAS será más complicado encontrar soporte. Sólo tendría el foro para preguntar. Si tengo un problema con linux tengo a mano a Alex que seguro está encantado de echarme una mano ;-)
  • Al utilizar un sistema linux "estandar" podemos montar un apache, scripts de monitorización del raid, avisos por correo electrónico,... cualquier cosa que se nos ocurra. Con FreeNAS esto sería muy complicado de hacer.

  •    Ahora ya sólo me queda cambiar mi actual Duron 1200Mhz (algo que voy a hacer en las próximas semanas) puesto que ya está algo viejo y cada vez lo noto más lento y utilizarlo como servidor NAS-Debian en casa.

       El siguiente capítulo será la configuración de Samba para compartir los nuevos dispositivos creados con una máquina windows así como la gestión de los distintos permisos de usuario.

       

    martes, 13 de marzo de 2007

    Servidor NAS para casa

       Hace un mes descubrí el proyecto FreeNAS. Es un proyecto para crer un servidor NAS basado en una distribución de FreeBSD y con una interfaz gráfica php. La instalación es muy sencilla he incluso en la web de sourceforge podemos descargar una máquina virtual de VMware ya preparada para probar.

       Me ha picado el gusanillo y he estado algún tiempo realizando bastantes pruebas (gracias a la máquina virtual) creando servidores con discos en raid 1, raid 5, (por software claro)... compartiendo los datos con máquinas windows,... y aunque todavía se trata de una versión beta (actualmente 0.68b3) el producto está muy logrado y me ha sorprendido gratamente. Me he planteado crear un pequeño servidor NAS en casa con raid 1 para poder tener todos los datos importantes centralizados y poder gestionar mejor las copias de seguridad. Actualmente es bastante complicado porque mi mujer trabaja con su portatil pero parte de su información está en mi sobremesa, luego otra copia está en mi disco duro externo,... y nunca tiene tiempo de sincronizar la información!! en fin, un caos!.

       Un aspecto muy importante cuando se configura un servidor NAS es la recuperación en caso de fallo. En mi caso, con la máquina virtual es muy fácil de simular y probar. Sólo hay que desconectar un disco duro y arrancar de nuevo el sistema para ver qué ocurre. En las pruebas no se perdió nada de información aunque se trabajase sólo con un único disco. Posteriormente conecté un nuevo disco a la máquina virtual y lo quise añadir al raid 1. Al principio me volví loco puesto que desde la interfaz gráfica no encontraba la forma de hacerlo. Finalmente, después de leer el foro descubrí que a los desarrolladores se les había olvidado la opción de añadir un disco al raid 1. Como FreeNAS utiliza la herramienta gmirror de FreeBSD, googleando un poco encontré los comandos necesarios para reconstruir el raid sin problemas desde la línea de comandos.

       Unos días después le conté este proyecto a Alex y aunque me dijo que tenía buena pinta me sugirió que hiciera lo mismo con linux, exactamente con Debian. La ventaja de utilizar FreeNAS es que ya está todo configurado y orientado al servidor NAS. Así, es muy sencillo compartir la información con clientes windows, utilizar un servidor ftp,... Pero esto también es un inconveniente. El sistema está tan pensado para hacer sólo esto que es muy dificil añadir alguna mejora o modificarlo para adaptarlo a nuestros gustos. Además, aunque no tengo los conocimientos de Alex en linux, me defiendo. Sin embargo, esto no lo puedo decir de FreeBSD que es el sistema operativo en el que se basa FreeNAS.

       Así, descargué la última versión de Debian Sarge que encontré (la 3.1r5) y lo instalé en VMware para poder hacer todas las pruebas. En breve publicaré el siguiente artículo con todo lo que tuve que hacer y cómo solucioné los problemas (que hubo bastantes) hasta que logré que todo funcionase correctamente.

    jueves, 1 de marzo de 2007

    La Fonera Hackeada (II)

       El otro día comentaba que había logrado abrir el ssh de mi fonera y que la había "capado" para que Fon no la pudiese actualizar. Hoy que he tenido más tiempo libre he estado jugueteando con el Chillispot. Para el que no lo conozca se trata del portal cautivo que utiliza Fon para controlar el acceso a la red. Cuando nos conectados a la red wifi de la fonera y ponemos cualquier página en el navegador, automáticamente esa petición pasa por Chillispot y si no está entre las urls permitida nos redirigirá a la url que hayamos indicado para autenticar el usuario por medio de Radius. En este caso nos redirige a la web de Fon y cuando nos conectamos con nuestro usuario y password ya podemos navegar libremente.

       Conectándome con el portatil a la red pública de la fonera pude comprobar que había algunas páginas a las podía conectar sin tener que pasar por chillispot. Por ejemplo, podía leer mi correo de gmail o visitar flickr. Editando el archivo de configuración del chillispot me encontré esto:
    root@OpenWrt:/etc# cat chilli.conf
    radiusserver1 radius01.fon.com
    radiusserver2 radius02.fon.com
    radiussecret garrafon
    dhcpif eth1
    uamsecret garrafon
    uamallowed 209.85.129.99,209.85.129.104,209.85.129.147
    uamanydns
    uamallowed www.martinvarsavsky.net,www.google.com,www.flickr.com,static.flickr.com,video.google.com,216.239.51.0/24,66.249.81.0/24
    uamallowed www.fon.com,www.paypal.com,www.paypalobjects.com,www.skype.com,66.249.93.0/24,72.14.207.0/24,72.14.209.0/24,84.96.67.0/24,213.91.9.0/24,80.118.99.0/24
    uamallowed shop.fon.co.kr,secure.nuguya.com,inilite.inicis.com,fon-en.custhelp.com,maps.fon.com,c20.statcounter.com

    uamallowed www.fon.com,acceso.fon.com,en.fon.com,es.fon.com
    uamallowed www.fon.com,www.paypal.com,www.paypalobjects.com

    uamserver https://login.fon.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/cp/index.php

       Es una lista de urls permitidas por las que se puede navegar sin tener que estar autenticado. Revisando algunas de esas ips he visto que la mayoría son de google, flickr,... pero hay otras que no tengo ni idea. Entonces he pensado que no quería que los Aliens que se conecten a mi punto de acceso Fon puedan navegar libremente por Google, Flickr, Skype,.... Lo primero que se me ha ocurrido ha sido comentar las líneas de las webs no permitidas y reiniciar el chillispot, pero cual ha sido mi sorpresa que no ha funcionado. Revisando con más detalle el script de chillispot (/etc/init.d/N50chillispot) he visto que cuando se arranca se descarga de Fon (en la función radconfig) el archivo de configuración, lo almacena en /tmp/chilli.conf y comprueba mediante un hash MD5 si el que acaba de descargar y el existente son iguales o no. En caso de que el existente haya sido modificado, lo borra y mueve el que se ha descargado a la ruta original. Así Fon tiene control total sobre las webs por las que los Aliens pueden o no navegar:
    radconfig() {
    /usr/sbin/chilli_radconfig \
    -c /dev/null \
    --radiusserver1="$RADIUSSERVER" \
    --radiussecret="$RADIUSSECRET" \
    --adminuser="$RADIUSADMUSR" \
    --adminpasswd="$RADIUSADMPWD" \
    --radiusnasid="$MAC" \
    --dhcpif $wifi_ifname \
    > $TMP_C
    [ -n "$(cat $TMP_C)" ] && {
    MD5SUM_TMP=$(md5sum $TMP_C | awk '{ print $1 }')
    MD5SUM_ETC=$(md5sum $ETC_C | awk '{ print $1 }')
    if [ ! "$MD5SUM_TMP" = "$MD5SUM_ETC" ]; then
    rm $ETC_C
    mv $TMP_C $ETC_C
    circular_log $LOG_LOOP_F "RELOAD"
    do_reload
    else
    circular_log $LOG_LOOP_F "NO RELOAD"
    fi
    return 0
    }
    circular_log $LOG_LOOP_F "NO RELOAD"
    }

       ¿Qué podemos hacer para evitar esto?. Muy sencillo, simplemente cambiamos el signo de la comparación (la línea comentada del if es la original):
    radconfig() {
    /usr/sbin/chilli_radconfig \
    -c /dev/null \
    --radiusserver1="$RADIUSSERVER" \
    --radiussecret="$RADIUSSECRET" \
    --adminuser="$RADIUSADMUSR" \
    --adminpasswd="$RADIUSADMPWD" \
    --radiusnasid="$MAC" \
    --dhcpif $wifi_ifname \
    > $TMP_C
    [ -n "$(cat $TMP_C)" ] && {
    MD5SUM_TMP=$(md5sum $TMP_C | awk '{ print $1 }')
    MD5SUM_ETC=$(md5sum $ETC_C | awk '{ print $1 }')
    # if [ ! "$MD5SUM_TMP" = "$MD5SUM_ETC" ]; then
    if [ "$MD5SUM_TMP" = "$MD5SUM_ETC" ]; then
    rm $ETC_C
    mv $TMP_C $ETC_C
    circular_log $LOG_LOOP_F "RELOAD"
    do_reload
    else
    circular_log $LOG_LOOP_F "NO RELOAD"
    fi
    return 0
    }
    circular_log $LOG_LOOP_F "NO RELOAD"
    }

       y ya está capado. Ahora editamos el archivo de configuración de Chillispot y comentamos las webs que no queremos que se puedan utilizar:
    root@OpenWrt:/etc# cat chilli.conf
    radiusserver1 radius01.fon.com
    radiusserver2 radius02.fon.com
    radiussecret garrafon
    dhcpif eth1
    uamsecret garrafon
    #uamallowed 209.85.129.99,209.85.129.104,209.85.129.147
    uamanydns
    #uamallowed www.martinvarsavsky.net,www.google.com,www.flickr.com,static.flickr.com,video.google.com,216.239.51.0/24,66.249.81.0/24
    #uamallowed www.fon.com,www.paypal.com,www.paypalobjects.com,www.skype.com,66.249.93.0/24,72.14.207.0/24,72.14.209.0/24,84.96.67.0/24,213.91.9.0/24,80.118.99.0/24
    #uamallowed shop.fon.co.kr,secure.nuguya.com,inilite.inicis.com,fon-en.custhelp.com,maps.fon.com,c20.statcounter.com

    uamallowed www.fon.com,acceso.fon.com,en.fon.com,es.fon.com
    uamallowed www.fon.com,www.paypal.com,www.paypalobjects.com

    uamserver https://login.fon.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/cp/index.php

       y finalmente reiniciamos Chillispot.

       Si ahora nos conectamos desde a la señal wifi de Fon y ponemos una web como http://www.google.com, Chillispot nos reenviará automáticamente al Portal de login de Fon.

       El próximo paso: Actualización de la Fonera a DD-WRT.