HAL: Como dejar que los dispositivos USB se gestionen solos en Debian GNU/Linux
Creación: 14-08-2005
Índice de contenidos
4.Instalamos los paquetes necesarios
1. Introducción
En el tutorial “Como acceder por nombre a los dispositivos USB en GNU / Linux (Debian)” vimos como podíamos dar un nombre concreto a los dispositivos USB para luego acceder a ellos.
En este tutorial y gracias a HAL (Hardware Abstraction Layer) vamos a ver como se puede gestionar de forma automática cualquier dispositivo que tengamos conectado en nuestro ordenador, discos duros, USB, firewire, …
En concreto nos centraremos en los dispositivos externos que conectamos a través de algún puerto (USB, FireWire, …). Veremos como estos dispositivos están inmediatamente disponibles para el usuario.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Ahtex Signal X-9500M (Centrino 1.6 GHz, 1024 MB RAM, 60 GB HD).
- Sistema Operativo: GNU / Linux, Debian Sid (unstable), Kernel 2.6.12, KDE 3.4
- Máquina Virtual Java: JDK 1.5.0_03 de Sun Microsystems
3. Configuración del kernel
Si compiláis vosotros mismos el kernel, deberíais tener activas las siguientes opciones:
CONFIG_DNOTIFY=y
CONFIG_KOBJECT_UEVENT=y
(General setup -> Kernel Userespace Events)
CONFIG_HOTPLUG=y
(General setup -> Support for hot-pluggable devices)
CONFIG_HOTPLUG_PCI=m (Bus options -> PCI Hotplug Support)
CONFIG_HOTPLUG_PCI_FAKE=m
CONFIG_HOTPLUG_PCI_COMPAQ=m
CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM=y
CONFIG_HOTPLUG_PCI_ACPI=m
CONFIG_HOTPLUG_PCI_CPCI=y
CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
Con esto estamos activando el soporte para que el kernel detecte cuando se conectan dispositivos en “caliente”. Son fundamentales las cuatro primera opciones, en el resto de las opciones de HOTPLUG_PCI bastará con generar los módulos por si los usa nuestro hardware (http://lists.debian.org/debian-kde/2005/04/msg00170.html)
4. Instalamos los paquetes necesarios
Como mínimo tendremos que tener instalado “hal”. También vamos a instalar “hal-devide-manager”, ya que con esta aplicación podemos ver toda la información que detecta HAL sobre todos nuestros dispositivos.
# apt-get -u install hal
hal-device-manager
Una vez instalados los paquetes, es muy importante que nos aseguremos que en nuestro fichero /etc/fstab no tenemos ninguna línea del estilo:
none /sys/bus/usb usbfs defaults 0
0
Es decir, no deberíamos tener ninguna línea que intente montar nada dentro de /sys. De lo contrario HAL no funcionará correctamente y no detectará ninguno de los dispositivos conectados a nuestro ordenador (http://groups.google.es/group/linux.debian.bugs.dist/browse_thread/thread/136e3125c5735f5e/9c58d9b2f9b2bbf7?lnk=st&
q=hal+Unable+to+open+%2Fsys%2Fbus%2Fusb%2Fdevices&rnum=1&hl=es#9c58d9b2f9b2bbf7).
Podemos comprobar si HAL está funcionando correctamente utilizando la aplicación hal-device-manager. Si ejecutamos esta aplicación deberíamos ver algo similar a:
Podéis observar como HAL es capaz de gestionar prácticamente todo el lo que tenemos conectado en nuestro ordenador, discos, particiones, CD-ROM, PCI, USB, …
5. Soporte de HAL en KDE
Ahora que tenemos HAL funcionando podemos sacarle más partido con nuestro entorno de escritorio KDE. Si abrimos el konqueror y nos vamos a la dirección “media:/” podremos ver todos los dispositivos con capacidad de almacenamiento a los que podemos acceder en ese momento (discos duros, particiones, pendrives, CD-ROMs, …)
Para facilitar el uso de los dispositivos que enganchamos en caliente (CD-ROM, pendrives, camaras, …) vamos ha hacer que nos salga un icono en el escritorio en cuanto conectemos el dispositivo.
Para ello sobre nuestro escritorio pinchamos con el botón derecho del ratón, y seleccionamos “Configure Desktop…” (lo siento chicos pero me gusta tener el sistema instalado en inglés, supongo que en español será algo así como “Configurar Escritorio…”).
En la ventana de configuración del escritorio seleccionamos el icono de la izquierda “Behavior” (Comportamiento), y dentro de esta sección pinchamos sobre la pestaña “Device Icons” (Iconos de Dispositivo). En esta pestaña seleccionamos “Show device icons:” (Mostrar Iconos de Dispositivo) y elegimos los iconos que queremos ver en el escritorio cuando se conecte alguno de los dispositivos.
Podéis comprobar el efecto que tiene en vuestro sistema.
Por ejemplo si yo no tengo nada conectado vería algo como:
Si os fijáis arriba a la izquierda me aparece un icono de un disco duro. Es mi partición de XP que está sin montar (luego veremos como se puede hacer que determinadas particiones, o dispositivos en general no aparezcan al usuario).
Si ahora pongo un CD de música y pincho mi pendrive en alguno de los puertos USB, vería lo siguiente:
Fijaros como me ha aparecido un icono que representa el CD de audio y otro icono que representa el pendrive.
Observar también como ahora en la esquina derecha inferior del icono del disco duro hay un pequeño triangulo verde. Esto indica que el dispositivo está montado y que se puede acceder a su información. Para montarlo basta con pinchar con el botón izquierdo del ratón sobre el icono del dispositivo y automáticamente el dispositivo se monta y se abre una ventana de konqueror para acceder a su contenido. Para desmontarlo o expulsar el CD podemos pinchar con el botón derecho sobre el icono del dispositivo y elegir la opción que más nos interese. Es muy aconsejable que siempre que queramos desenganchar un pendrive o similar, desmontemos previamente el dispositivo o seleccionemos la opción “Safely Remove” (Quitar sin incidentes, Quitar con confianza).
6. Configuración de HAL
En este apartado vamos a ver como podemos configurar el comportamiento de HAL para que se ajuste más a nuestras necesidades. Esta personalización la haremos a través de ficheros *.fdi. Estos son ficheros XML que colocaremos en el directorio /usr/share/hal/fdi/95userpolicy (la documentación nos recomienda usar este directorio para que no les afecten las posibles actualizaciones del sistema).
6.1 Esconder dispositivos
En primer lugar vamos a ver como podemos configurar HAL para que no sea visible alguno de los dispositivos de almacenamiento. En mi caso tengo tres particiones, una para XP otra de swap y otra con Debian. De estas tres particiones no me interesa que se vean ni la de swap ni la de Debian.
Crearemos el fichero “local-ide.fdi” (podemos ponerle el nombre que queramos simplemente tener en cuanta que los ficheros se procesan por orden alfabético, y que deben terminar con la extensión “.fdi”).
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- --> <deviceinfo version="0.2"> <device> <match key="block.device" string="/dev/hda1"> <merge key="volume.label" type="string">Hard Disc XP</merge> </match> </device> <device> <match key="block.device" string="/dev/hda2"> <merge key="volume.fsusage" type="string">other</merge> </match> </device> <device> <match key="block.device" string="/dev/hda3"> <merge key="volume.fsusage" type="string">other</merge> </match> </device> </deviceinfo>
Dentro del fichero distinguimos las siguientes etiquetas:
- <device> para hacer referencia a un dispositivo concreto.
- <match> para especificar las condiciones de selección de los dispositivos. Podemos anidar tantas como queramos.
- <append> y <merge> para modificar los valores de las propiedades de los dispositivos seleccionados con <match>.
En nuestro ejemplo se ve que se selecciona el dispositivo según el valor de la propiedad “block.device”. En el primer caso, la partición de XP, le cambiamos el nombre de la
etiqueta con la que se mostrará el icono en el escritorio o en el konqueror. En los otros dos casos, la partición de swap y la de Debian, fijamos el valor de la propiedad “volume.fsusage” a “other”, con esto conseguimos que estos dispositivos no sean visibles para le usuario desde su entorno de escritorio (no los veremos ni en el escritorio, ni con el konqueror en media:/).
Para ver todas las propiedades os recomiendo que leáis la documentación oficial:
https://www.freedesktop.org/wiki/Software/hal/
6.2 iPod & gtkpod
El el caso de mi iPod quiero hacer una gestión un poco especial. Yo gestiono la música de mi iPod con la aplicación gtkpod. Esta aplicación tiene una opción bastante cómoda que permite que la propia aplicación monte y desmonte el dispositivo. No quiero perder esta funcionalidad, pero el problema es que con HAL cuando pinchas un dispositivo (en este caso el iPod) y aparece el icono en el escritorio, el dispositivo todavía no está montado ni hay una línea en /etc/fstab que indique como se tiene que montar. gtkpod necesita esta línea en fstab para poder montar el dispositivo.
Lo que voy a hacer es combinar HAL con el método que veíamos en el tutorial “Como acceder por nombre a los dispositivos USB en GNU / Linux (Debian)”. Hay que tener en
cuanta que HAL es una especi de base de datos de los dispositivos conectados, pero es el kernel junto con udev el que identifica y pone nombre al dispositivo. Asimismo no es HAL el que monta el dispositivo cuando vamos a utilizarlo, sino que será otra aplicación (mount, pmount, …).
Para entender mejor la arquitectura de HAL os recomiendo que leáis la documentación oficial: https://www.freedesktop.org/wiki/Software/hal/
En resumen, primero configuramos udev para asignar un nombre concreto de dispositivo al iPod. Para esto creamos el fichero /etc/udev/rules.d/z90_mis_reglas.rules con:
BUS=="scsi",
SYSFS{vendor}=="Apple*", SYSFS{model}=="iPod*",
NAME="ipod%n"
En segundo lugar añadimos una línea en /etc/fstab para que gtkpod pueda montar y desmontar el iPod:
/dev/ipod2 /media/ipod vfat
defaults,user,noauto 0 0
Con esto ya tenemos resuelto el problema de gtkpod. Esta aplicación podrá seguir gestionando cuando se monta y desmonta el iPod, cosa que resulta muy cómoda (por lo menos para mi 😉
Por último vamos a añadir un fichero .fdi para refinar un poco el comportamiento del iPod desde el punto de vista de HAL (por ejemplo que no muestre al usuario el primer volumen del iPod). Creamos el fichero /usr/share/hal/fdi/95userpolicy/ipod.fdi
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- --> <deviceinfo version="0.2"> <device> <match key="storage.vendor" string="Apple"> <match key="storage.model" string="iPod"> <merge key="storage.removable" type="bool">false</merge> <merge key="storage.media_check_enabled" type="bool">false</merge> </match> </match> <match key="@block.storage_device:storage.vendor" string="Apple"> <match key="@block.storage_device:storage.model" string="iPod"> <match key="block.is_volume" bool="true"> <match key="volume.fsusage" string="filesystem"> <match key="volume.partition.number" int="1"> <merge key="volume.policy.should_mount" type="bool">false</merge> <merge key="volume.fsusage" type="string">other</merge> </match> <match key="volume.partition.number" int="2"> <merge key="volume.policy.desired_mount_point" type="string">ipod</merge> </match> </match> </match> </match> </match> </device> </deviceinfo>
7. Conclusiones
Aunque HAL es relativamente nuevo podéis comprobar que puede resultar tremendamente útil, sobre todo de cara al usuario no experto, ya que, combinado con un entorno de escritorio como KDE o GNOME, nos permite acceder de forma muy sencilla a nuestros dispositivos externos.
En el tutorial hemos visto como podemos combinar HAL con lo que ya habíamos aprendido sobre udev, es decir no son métodos excluyentes, sino complementarios. Y de hecho hemos visto que en algún caso nos puede venir muy bien la “colaboración” de ambos.
8. Sobre el autor
Alejandro Pérez García, Ingeniero en Informática (especialidad de Ingeniería del Software)
Dir. Implantación y Rendimiento
Formador en tecnologías J2EE, ADOO, UML
mailto:alejandropg@autentia.com
Autentia Real Business Solutions S.L.