udev e ipod – El sueño del mono loco
El sueño del mono loco Saliva, cinismo, locura, deseo…

udev e ipod

Este es otro post linuxero. Mamá, no sigas leyendo…

Estos días he derribado otro mito, otra equivocación. Desde los primeros días que salió udev me había parecido la mismísima reencarnación del mal. Sabía que es un programa útil y necesario, pero complicado y farragoso. Pues bien, como quería tener mi iPod en un directorio específico (/media/ipod), me he puesto las pilas, he leido un par de enlaces, la documentación oficial (bendito /usr/share/doc) y ya tengo los dispositivos USB categorizados.

Todo este documento se refiere a los dispositivos USB.

udev e iPod

  1. ¿Qué es udev y cómo funciona?
  2. udev es un programa pensado para gestionar el directorio /dev de una forma más ordenada y, por ende, a todos los dispositivos que se encuentren bajo éste. Actualmente hay un montón de dispositivos colgando del directorio dev, de los cuales la mayoría no se utilizan para nada, están obsoletos o se mantienen por cuestiones de compatibilidad. udev gestiona este directorio y lo vuelve dinámico, consiguiendo que todos los dispositivos que se detecten en el sistema (discos duros, usb, tarjetas gráficas, etc…), estén en el directorio y el resto, simplemente, no.

    udev está presente en la mayoría de las distribuciones linux en forma de demonio (programa residente — udevd), se ejecuta completamente en el espacio del usuario y se emplea en los dos grandes escritorios, gnome y kde, junto a pmount. Yo me centraré en gnome ya que es el utilizo habitualmente aunque para kde no varía nada más que la configuración de montaje de los dispositivos.

    Hay una explicación más detallada de cómo actua en [2] pero como introducción decir que, en cuanto se enchufa un dispositivo nuevo a un equipo, el kernel lo detecta y lo notifica al hotplug (la parte del núcleo que gestiona los dispositivos en caliente), que carga los módulos que permitirán usar el dispositivo. A continuación, notifica a udev que hay un nuevo juguete y éste busca en la partición sysfs la identificación del aparato y le aplica unas reglas para asignar una entrada al dispositivo.

  3. Ficheros importantes
  4. Todos los ficheros de configuración están bajo /etc/udev, como no podía ser de otra forma. Los ficheros con reglas de configuración están bajo /etc/udev/rules.d/. Yo traté de crear mi propio fichero de reglas, situándolo primero en el órden de ejecución, como comenta Ricardo Galli [1] y, como no funcionaba, edité el fichero /etc/udev/udev.rules y lo añadí en las primeras líneas. Sucio pero eficaz.

  5. Conceptos rápidos
    • Las reglas se componen de dos partes, la de las comparaciones y la de las asignaciones. Las primeras tienen dos símbolos de igual (==) para indicar comparación y las segundas sólo uno (=).
    • Todas las comparaciones se obtienen del directorio sysfs y mediante la herramienta udevinfo.
    • Toda la información relativa al dispositivo usb debe obtenerse del mismo bloque de datos del udevinfo. Si se coge información de distintos bloques, por ejemplo, distinto bus y etiqueta del fabricante, no funcionará.
  6. Obteniendo información del dispositivo
  7. udev incorpora varias herramientas para tratar la información de los dispositivos, como udevinfo, que muestra toda la información del cacharro. Si dmesg dice que tu cacharro está en /dev/sda1, como es mi caso, basta ejecutar lo siguiente:

    # udevinfo -a -p /block/sda/sda1
    (...)
    looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-6':
    BUS=="usb"
    ID=="1-6"
    DRIVER=="usb"
    SYSFS{bConfigurationValue}=="1"
    SYSFS{bDeviceClass}=="00"
    SYSFS{bDeviceProtocol}=="00"
    SYSFS{bDeviceSubClass}=="00"
    SYSFS{bMaxPower}=="500mA"
    SYSFS{bNumConfigurations}=="2"
    SYSFS{bNumInterfaces}==" 1"
    SYSFS{bcdDevice}=="1001"
    SYSFS{bmAttributes}=="80"
    SYSFS{configuration}=="Apple iPod"
    SYSFS{devnum}=="5"
    SYSFS{idProduct}=="1300"
    SYSFS{idVendor}=="05ac"
    SYSFS{manufacturer}=="Apple"
    SYSFS{maxchild}=="0"
    SYSFS{product}=="iPod "
    SYSFS{serial}=="000A2700101086C4"
    SYSFS{speed}=="480"
    SYSFS{version}==" 2.00"
    (...)

    Tenemos que buscar el bloque que muestra más información o información más precisa acerca del dispositivo. Yo he escogido este entre los ocho que me muestra la salida del comando porque se puede ver que se trata del iPod. El comando muestra las características de todos los dispositivos conectados al equipo, por lo que hay que tener cuidado con las reglas. ¡Ah! y no se debe coger información de más de un bloque (por si no había quedado claro :)).

  8. Escribir las reglas
  9. Esto es lo que yo he añadido en el fichero udev.rules para que mi sistema reconozca a la iPod:

    # comparaciones \
    # asignaciones

    # iPod
    BUS=="usb", KERNEL=="sd?1", SYSFS{configuration}=="Apple iPod", \
    NAME="%k", SYMLINK="ipod"

    # Pendrive
    BUS=="usb", KERNEL=="sd?1", SYSFS{product}=="USB Flash Drive", \
    NAME="%k", SYMLINK="flashdrive"

    La primera regla tiene tres comparaciones:

    • BUS==»usb» — El bus debe ser USB. Puede ser SCSI, IDE, etc…
    • KERNEL==»sd?1″ — Debe tratarse de la primera partición de un dispositivo SCSI (las memorias USB son emuladas mediante SCSI).
    • SYSFS{configuration}==»Apple iPod» — En el árbol sysfs debe especificarse que la configuración sea Apple iPod. Aquí se busca algo distintivo y único del cacharro a conectar.

    y dos asignaciones, es decir, lo que debe suceder al encontrar un dispositivo que case con las comparaciones:

    • NAME=»%k» — Debe asignarle el nombre del dispositivo, en este caso, iPod. Es útil para evitar que Gnome lo monte como Dispositivo de 1040MB.
    • SYMLINK=»ipod» — Debe crear un enlace con ese nombre bajo /dev. De esta forma, siempre que sea detectada, la ipod aparecerá como /dev/ipod.

    La segunda regla es idéntica a la primera, salvo porque se trata de otro dispositivo definido por la descripción del producto USB Flash Drive.

    Hay muchas más comparaciones y asignaciones. Ver [3].

  10. Apuntes finales
  11. Para que udev relea la configuración es necesario ejecutar el comando udevstart. No es necesario reiniciar ningún servicio, ni la sesión, ni el equipo.

    Para que siempre se monten los dispositivos en sus respectivos lugares, he añadido las siguientes líneas al fichero /etc/fstab:

    /dev/ipod /media/ipod auto defaults,user,noauto 0 0
    /dev/flashdrive /media/flash auto defaults,user,noauto 0 0

  12. Enlaces de interés

Actualización (22 de marzo de 2007):

Han cambiado la mitad de la sintaxis de udev, no sé si a mejor o a peor, pero aquí está la nueva línea para la configuración de la iPod:

SUBSYSTEMS=="usb", ATTRS{product}=="iPod ", ATTRS{manufacturer}=="Apple", ATTRS{serial}=="Mi-numero-de-serie", \
NAME="ipod", SYMLINK="iPod"

udev, ipod