HAL y pmount

Hace ya un rato (casi dos años), a Robert Love (reconocido hacker del kernel y GNOME) se le ocurrió la genial idea de que cuando un usuario conectara su cámara, llave USB, PDA, etc. a una máquina con Linux, sería muy chido que el aparato en cuestión comenzara a funcionar. De ahí nació el proyecto Utopía (pueden leer el mensaje original de Robert en Kernel.org).

La idea era integrar el kernel y el escritorio: básicamente (se dijo en ese momento), el kernel es über cool y GNOME todavía más, así que sólo había que pegarlos. En español: el kernel ya era capaz de detectar los dispositivos y manejarlos, y el escritorio tenía las herramientas para utilizarlos; la bronca era configurar la comunicación entre ambos. Utopía se iba a encargar de dicha comunicación.

De ahí vienen D-Bus y HAL, entre otras cosas. HAL (de Hardware Abstraction Layer) se encarga de que cada vez que un dispositivo se conecta, hace público tal evento, además de pasar bastante información del dispositivo, cosas como el fabricante y el modelo; o incluso cosas útiles como el sistema de archivos que utiliza una llave USB. D-Bus sirve como un sistema de IPC (Inter Process Communication), con jerarquías y toda la madre.

La idea es fabulosa… en teoría. En la práctica ha causado un verdadero desmadre, especialmente a la gente que usamos Gentoo y entonces seguimos los dictados de GNOME casi al pie de la letra… lo que se traduce en que si de repente a los GNOMEros se les ocurre la genial idea de usar pmount, ahí vamos el resto como borregos. Más de eso adelante.

Ayer todo GNOME 2.12 entró a amd64 (estable), y por tanto actualicé. Todo salió sorprendentemente bien, sin ninguna bronca. Yo estaba siguiendo con mi tarea hercúlea de restablecer mi sistema como lo tenía antes del cambio a AMD 64, así que configuré mi Palm (sin broncas), y decidí dejar conectado permanentemente el cable de mi cámara Sony Cybershot DSC P200 (de qué sirve tener 10 puertos USB si no). Para probar, la conecté y con horror vi que había desaparecido el hermoso iconito de una camarita en nautilus (ahora salía un horrible drive genérico), y en segundo y más grave lugar, ahora el sistema de archivos se montaba con shortname=winnt, lo que causa que todos los archivos ESTÉN EN PURAS MAYÚSCULAS LO CUAL NO SÓLO ES MOLESTO SINO INCONSISTENTE CON TODAS MIS DEMÁS FOTOS.

Así que como ando de vagaciones, decidí resolver el asunto de una vez y por siempre (ya había tenido esa bronca en mi laptop con mi iPod Shuffle, que causa que Rhythmbox no funcione como debe).

Después de menearle un rato, al menos recuperé mi hermoso iconito de camarita; el chiste fue poner esto en /etc/hal/fdi/information/99-sony-camera.fdi:

<?xml version="1.0" encoding="UTF-8"?> <!-- -*- xml -*- -->
<deviceinfo version="0.2">
  <device>
    <match key="@storage.physical_device:info.bus" string="usb">
      <match key="@storage.physical_device:usb.vendor_id" int="0x054c">
        <match key="@storage.physical_device:usb.product_id" int="0x0010">
          <merge key="storage.policy.should_mount" type="bool">true</merge>
          <merge key="info.category" type="string">camera</merge>
          <merge key="camera.access_method" type="string">storage</merge>
          <append key="info.capabilities" type="strlist">camera</append>
        </match>
      </match>
    </match>
  </device>
</deviceinfo>

Y mi iconito volvió (porque ya especifico que el dispositivo tiene la propiedad de camera):

Icono de camarita

Icono de camarita

Chingón. El problema fue decirle que no montara el dispositivo con la opción shortname=winnt. Inocente de mí, supuse que usando la propiedad volume.mount_option.shortname=lower todo iba a jalar. Nomás no lo hizo. Lo desesperante era que HAL sí estaba asignando la opción, sólo que en algún punto del stack de Utopía, se la pasaba por el arco del triunfo.

Analicé todas las opciones por omisión de HAL, y después de D-Bus. En ningún lado ponían explícitamente la opción shortname=winnt. Comenzaba a desesperarme, cuando vi la luz: era pmount.

Originalmente, HAL modificaba /etc/fstab cada vez que un dispositivo era conectado al sistema. Era sucio, era propenso a errores y a estados inconsistentes del sistema (por ejemplo si se iba la luz y uno desconectaba el dispositivo antes de volver a prender la máquina, la entrada en /etc/fstab se quedaba ahí hasta el fin de los tiempos), pero funcionaba. De repente en algún punto entre GNOME 2.10 y 2.12, a los GNOMEros se les ocurrió: “pues vamos a usar pmount“.

La idea de pmount es chida, si bien espanta un poco cuando uno la oye por primera vez. El programa lo que hace es permitir a usuarios comunes y corrientes el montar dispositivos sin que éstos tengan que estar listados en /etc/fstab. ¿Cómo hace esto? Fácil: es un programa setuid.

De donde yo vengo, cuando oímos algo así lo primero que hacemos es decir:

¡PELIGRO, WILL ROBINSON, PELIGRO!

En defensa de los autores de pmount, parece que es un programa chiquitito que hace una sola cosa y trata de hacerla bien y de forma limpia. La bronca es que hace falta un sólo error en el programa para permitir un escalamiento de privilegios en el sistema. Pero a la gente de GNOME se les hizo buena idea, y yo confío en ellos… y si me crackean ya sé a quiénes echarles la culpa.

Me costó un par de segundos descubrir el “error” (ellos le han de decir “feature”) en pmount: básicamente el tiempo que me tardó teclear grep winnt en el código fuente de pmount. En src/fs.c aparece:

static struct FS supported_fs[] = {
    { "udf", "nosuid,nodev,user", 1, "007", 1 },
    { "iso9660", "nosuid,nodev,user", 1, NULL, 1 },
    { "vfat", "nosuid,nodev,user,quiet,shortname=winnt", 1, "077", 1 },
    { "ntfs", "nosuid,nodev,user", 1, "077", 1 },
    { "hfsplus", "nosuid,nodev,user", 1, NULL, 0 },
    { "hfs", "nosuid,nodev,user", 1, NULL, 0 },
    { "ext3", "nodev,noauto,nosuid,user", 0, NULL, 0 },
    { "ext2", "nodev,noauto,nosuid,user", 0, NULL, 0 },
    { "reiserfs", "nodev,noauto,nosuid,user", 0, NULL, 0 },
    { "xfs", "nodev,noauto,nosuid,user", 0, NULL, 0 },
    { "jfs", "nodev,noauto,nosuid,user", 0, NULL, 1 },
    { NULL, NULL, 0, NULL, 0}
};

Y en el ChangeLog aparece:

- pmount: mount vfat with shortname=winnt option

Qué razonamiento tuvieron los autores de pmount para forzar la opción shortname=winnt, no la sé. Y como no tienen lista de correo y su página está en alemán, probablemente nunca lo sepa. Pero el punto es que me estaban limitando, y a mí no me gusta eso.

Por suerte es Open Source, así que sólo creé el parche:

--- pmount-0.9.6/src/fs.c       2005-10-13 09:59:06.000000000 -0500
+++ pmount-0.9.6-new/src/fs.c   2006-01-24 20:33:32.000000000 -0600
@@ -21,7 +21,7 @@
 static struct FS supported_fs[] = {
     { "udf", "nosuid,nodev,user", 1, "007", 1 },
     { "iso9660", "nosuid,nodev,user", 1, NULL, 1 },
-    { "vfat", "nosuid,nodev,user,quiet,shortname=winnt", 1, "077", 1 },
+    { "vfat", "nosuid,nodev,user,quiet,shortname=lower", 1, "077", 1 },
     { "ntfs", "nosuid,nodev,user", 1, "077", 1 },
     { "hfsplus", "nosuid,nodev,user", 1, NULL, 0 },
     { "hfs", "nosuid,nodev,user", 1, NULL, 0 },

y además hice un ebuild que aplica el parche e instala pmount con lo demás sin modificar. Después de eso, recuperé mis minúsculas:

Minúsculas

Minúsculas

Pero al menos ya estoy bien rudo en HAL: no tiene secretos para mí. Incluso hice que la cámara se monte en /media/sonycamera en lugar de /media/usbdisk.

Yay.

7 comentarios sobre “HAL y pmount

  1. Hola mi nombre es mike, es seguido su foro sobre pmount. he logrado instalarlo y hacer que funcione. Pero me suge el siguiente problema cuando le hago doble clic para cargar el cd o culaquier dispositivo me dice que nautilus se cerro inesperadamente y se reinicia. Carga las cosas pero ese error y el reinicio de nautilus me preocupa… A alguien le paso lo mismo

  2. Problemas con HAL y ntfs:

    Agrege en el fstab:
    /dev/hdb1 /media/windows ntfs-fuse auto,gid=1001,umask=0002 0 0
    luego agregé mi usuario al grupo 1001.
    Lo primero que ocurre al reiniciar es que en el EQUIPO, donde aparecen todos los iconos de los discos, aparece el disco pero no lo puedo abrir diciendo que
    ya está montado en /media/windows.
    Aunque no me gusta hice un enlace simbólico del /media/windows en el escritorio. Con ntfs-fuse puedo escribir, leer la partición, etc.
    Algunas veces me dá error genérico al querer crear una carpeta o borrarla.

    Se que el problema está con HAL, porque este debería montar el disco.
    Como configuro el disco con HAL.

    Datos: Debian – etch – r4.0 – pentium III
    hago

  3. Hola, tengo un problema o BUG con kubuntu y quizas me puedas ayudar, kde4 tiene un widget que me permite ver unidades de CD o USB que conecte al sistema, cuando corri kubuntu por primera vez desde el cd, mi disco de windows se veia en ese gadget, ahora que lo tengo instalado como tal en mi pc no me sale, intente modificar el fstab para montarlo en mnt o media a ver si eso hacia diferencia, pero no hizo nada. Se me ocurrio la idea de que quizas podria ser porque cuando ejecute desde el CD me reconocio el disco duro como una unidad extraible, y no se si ahora pueda hacer que la particion donde esta windows pueda ser vista como tal para que me aparezca en el widget… Agradeceria mucho tu colaboracion!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *