El montaje automático de dispositivos en GNU/Linux y sus distintos métodos
September 11th, 2008 by BusindreEl proceso de "montaje" de dispositivos lo realizan todos los sistemas operativos actuales, *BSD, Solaris, GNU/Linux, Mac, Windows,.. Se basa en insertar el árbol de ficheros del hardware conectado al ordenador dentro del propio árbol de ficheros del sistema operativo que usemos, un ejemplo de directorios de montaje es /mnt y /media (Actualmente).
Cuando conectamos una cámara de fotos, una memoria flash, reproductor MP3, un disco duro externo USB / FIrewire o cualquier otro dispositivo de almacenamiento en un GNU/Linux actual, este se monta de forma automática en el sistema. El montaje que se uso toda la vida, el tradicional, no estaba automatizado y solo root podÃa hacer uso de el, ahora como es lógico en la evolución de los sistemas operativos, se intenta facilitar la vida a los usuarios automatizando ese proceso para que nada mas insertemos un determinado disco de almacenamiento, este se monte de forma automática en un directorio como pueda ser /media y sin necesidad de cambiar de usuario para ello.
Dependiendo de la distribución, escritorio o incluso el gestor de ficheros que usemos, podemos encontrar distintas formas de automontaje o carecer del mismo. Por norma las distintas distribuciones de GNU/Linux instalan lo necesario para que se pueda disfrutar del montaje automático de dispositivos externos y al no haber un método estándar se pueden utilizar distintos métodos para ello. En GNU/Linux actualmente se usa HAL y D-bus en conjunto con alguna otra aplicación para este fin, siendo los encargados de identificar y facilitar todo tipo de información (Marca, modelo, tipo, formato,..) sobre los componentes conectados al ordenador y sus eventos a las distintas aplicaciones que lo requieran. Esto sirve para montar discos externos de forma automática según se conecten al ordenador o también arrancar programas especÃficos según el hardware que enchufemos, mostrar avisos al usuario sobre los estados de la baterÃa del portátil o cualquier otra cosa.
Los escritorios más populares Kde, Gnome y Xfce incluyen aplicaciones y scripts para automontar dispositivos sin necesidad de usar a root para ello, este soporte muchas veces debe activarse en la compilación a la hora de generar el escritorio a partir del código fuente, hal-dev suele ser una dependencia muy común cuando compilamos escritorios y les dotamos de soporte para la automatización del montaje de dispositivos. Es común encontrar al enchufar un dispositivo en el ordenador que que se despliegue una ventana similar a la de Windows preguntando al usuario por la acción a realizar sobre el mismo (Abrir en una nueva ventana (Montarlo), Descargar las fotos con digiKam, No hacer nada,..), esto es gracias a HAL.
A continuación enumeramos alguna de las aplicaciones más usadas en el automontaje:
* AutoFS/Automount -> Usa un sistema Cliente / Servidor.
* Fstab-sync (HAL) -> Edita el fstab en tiempo real añadiendo lineas según se necesite.
* Ivman (HAL) -> Captura eventos notificados por HAL y puede usarse para realizar montajes de forma automática.
* Pmount -> Permite montar dispositivos desde privilegios de usuarios sin necesidad de root.
* Reglas Udev -> En el pasado se usaba mediante reglas o enlaces simbólicos junto a scripts en distintos lenguajes para realizar montajes automáticos. Actualmente es usado por el escritorio Kde ayudándose de la información proporcionada por HAL.
Como decÃamos anteriormente el automontaje depende de la distro y el escritorio y pueden usar distintos y variados mecanismos para realizarlo. Kde en la actualidad hace uso de Hal + Dbus + Udevd mientras que Gnome hace uso de "Gnome-volume-manager" que a su vez usa Hal y Pmount. Un ejemplo de esto lo vemos en la salida de este comando:
$ strings /usr/bin/gnome-volume-manager | grep -i pmount
/usr/bin/pmount-hal
%s/%d: gvm_device_mount_encrypted: could not execute pmount: %s
%s/%d: pmount did not exit normally
NOTA: Pmount-hal forma parte de Pmount y se encarga de preguntar acerca de las opciones de montaje (noatime, async,..) a HAL para enviarselo a pmount que se encarga de montarlo con las opciones que HAL especificó.
Se puede dar el caso dependiendo de la distro usada, que al tener instalado un escritorio con soporte para el automontaje como puede ser Kde, este parezca no funcionar. Esto se debe a que NO se tienen instalados programas como Hal y Dbus y por lo tanto el escritorio no puede usarlos para montar o mostrar diálogos en pantalla relacionados con el dispositivo enchufado. Con distros modernas es raro encontrarse en dicha situación ya que en las instalaciones por defecto se intenta proporcionar de todos los paquetes necesarios para que el escritorio pueda ofrecer un nivel aceptable de comodidad al usuario.
¿Que pasa con las personas que no usan Desktops y usan gestores de ventana o únicamente las TTYs?
Cuando un usuario de GNU/Linux usa un windows manager como es IceWM, Fluxbox, WindowsMaker o no utiliza servidor gráfico, se da cuenta de que los dispositivos no se montan solos. Esto se debe a que el proceso de montaje recae en su inmensa mayorÃa sobre el Escritorio usado y no sobre el sistema en si, pero como es de esperar hay métodos para implementar el automontaje sin tener que depender de un escritorio para ello. Muchos usuarios lo que hacen es añadir en el arranque de su gestor de ventanas la ejecución de utilidades como gnome-volume-manager o ciertos demonios de Kde para que implementen el automontaje. También se puede hacer uso de las utilidades nombradas anteriormente como es AutoFS, Ivman, Fstab-sync ,.. Nosotros vamos a exponer una forma de realizar el automontaje de una forma simple y fácil de adaptar a nuestras necesidades, que pueda funcionar en cualquier circunstancia, ya sea usando un gestor de ventanas o una tty. Usaremos para ello Hal + Dbus y Pmount, veamos como empezar.
* Hal: Debemos tenerlo instalado en nuestro equipo y es el encargado de identificar eventos en el hardware.
* Dbus: Va de la mano de Hal y sirve para comunicar HAL con aplicaciones o scripts.
* Script de Automontaje: un script que usa python-DBus para escuchar los eventos en el hardware y montar las unidades extraibles mediante Pmount.
Hemos escogido Pmount para que se encargue del montaje de dispositivos por dos sencillas razones, la primera y principal caracterÃstica es que permite montar dispositivos desde privilegios de usuario sin necesidad de root. El segundo motivo es que hace referencia a NTFS-3g. Si tenemos instalado en nuestro GNU/Linux la utilidad Ntfs-3g, será utilizada por pmount para montar sistemas de ficheros NTFS antes que el modulo NTFS del kernel de Linux, que no permite escritura sobre ese formato.
Veamos el script en python que se encargará de realizar el automontaje, denominado hal-automount :
# -*- encoding: utf-8 -*-
import dbus
import dbus.service
if getattr(dbus, 'version', (0,0,0))>= (0,41,0):
import dbus.glib
import gobject
import sys
import os
class DeviceManager:
def __init__(self):
self.bus = dbus.SystemBus()
self.bus.add_signal_receiver(self.device_added,
'DeviceAdded',
'org.freedesktop.Hal.Manager',
'org.freedesktop.Hal',
'/org/freedesktop/Hal/Manager')
self.bus.add_signal_receiver(self.device_removed,
'DeviceRemoved',
'org.freedesktop.Hal.Manager',
'org.freedesktop.Hal',
'/org/freedesktop/Hal/Manager')
def udi_to_device(self, udi):
return self.bus.get_object("org.freedesktop.Hal", udi)
def device_added(self, udi):
print 'Added', udi
properties = self.udi_to_device(udi).GetAllProperties()
if properties.get('info.category') == u'volume':
label, dev = properties.get('volume.label'), properties.get('block.device')
if not label:
os.system("pmount '%s'" %(dev))
else:
os.system("pmount %s /media/'%s'" %(dev, label))
def device_removed(self, udi):
print 'Removed', udi
if __name__ == '__main__':
m = DeviceManager()
mainloop = gobject.MainLoop()
try:
mainloop.run()
except KeyboardInterrupt:
mainloop.quit()
print 'Exiting...'
sys.exit(0)
Script original: http://redclay.altervista.org/wiki/doku.php?id=projects:hal-automount
NOTA: El script "hal-automount" que nosotros proponemos tiene algunas modificaciones con respecto al original para hacerlo algo más eficiente.
Dependencia del script hal-automount: Dbus-python. Esta aplicación permite comunicarnos mediante python con el demonio BUS y asà permitir intercambios de información entre aplicaciones, en este caso Hal y el script propuesto anteriormente, pero realmente Dbus como comentábamos podrÃa comunicarse con Udev (En el caso de Kde) u otras aplicaciones que lo necesiten.
Descargar dbus-python: http://dbus.freedesktop.org/releases/dbus-python/
Compilar / Instalar Dbus-python:
$ tar -zxvf dbus-python-0.83.0.tar.gz
$ cd dbus-python-0.83.0
$ ./configure
$ make
# make install ó checkinstall
NOTA: Es probable que tengamos esta dependencia en nuestros repositorios del gestor de paquetes usado (Apt, Yum, Urpmi,..). De tener instalada una versión de Dbus no muy actual es probable que necesitemos instalar una versión anterior a la más moderna en nuestro equipo si vemos que el script nos da error.
Para hacer funcionar el automontaje debemos tener instalado y ejecutándose Hal y Dbus en nuestro sistema, para comprobar que están arrancados podemos usar el siguiente comando:
$ ps aux | grep -i dbus | grep -i daemon
/usr/bin/dbus-daemon --system
/usr/bin/dbus-daemon --fork --print-pid 7 --print-address 9 --session
$ ps aux | grep -i hald | grep -i daemon
/usr/sbin/hald --daemon=yes
Una vez sepamos que Hal y Dbus se encuentran funcionando solo debemos ejecutar el script en python de la siguiente manera
$ python hal-automount &
NOTA: Debe iniciarse con privilegios de usuario ya que los dispositivos se montarán usando ese UID / GID.
El script montará todos los dispositivos de almacenamiento que conectemos en el directorio "/media" y usará como nombre de dispositivo su etiqueta ("Ipod_xabi", "Windows", "Seagate_250",..) o en su defecto el nombre de dispositivo (sda1, sdc3,..). Podemos añadir la linea python hal-automount & al fichero de inicio de nuestro gestor de ventanas para que al arrancar disfrutemos de el. Si no vamos a usar las X, podemos crear un alias que ejecute el comando, con realizarlo solo una vez al iniciar una sesión en una Tty es suficiente, aunque salgamos de la misma o cambiemos a otra. Si lo que queremos es que después de arrancar el sistema operativo, ya tengamos el automontaje activado independientemente de estar logueados en una tty o escritorio, podemos añadir la siguiente linea al fichero rc.local:
su 'USUARIO' -c 'python /usr/bin/automount.py' &
NOTA: El USUARIO es con el que queremos que se monten las unidades de forma automática.
Si mediante las opciones por defecto no se nos montase el dispositivo a nuestro gusto, solo debemos editar las lineas relativas a pmount indicándole lo que queremos, por ejemplo para que use una codificación determinada a la hora de monta.
* Original:
os.system('pmount %s' %(dev))
os.system('pmount %s /media/%s' %(dev, label))
* Indicándole la codificación:
os.system('pmount -c iso8859-1 %s' %(dev))
os.system('pmount -c iso8859-1 %s /media/%s' %(dev, label))
Podemos editar el script y añadir al comando pmount todas las opciones que queramos para que monte los dispositivos a nuestro gusto. Los distintos tipos de sistema de ficheros que soporta pmount son Udf, iso9660, vfat, ntfs, hfsplus, hfs, ext3, ext2, reiserfs, reiser4, xfs, jfs y omfs. También soporta el montaje con ntfs-3g (Usado por defecto para NTFS) si está instalado y tenemos en el sistema el fichero /sbin/mount.ntfs-3g, que por norma se crea al instalar Ntfs-3g.
AVISO: No se montarán automáticamente los dispositivos que estén listados en el archivo /etc/fstab.
Enlace de interés: http://www.busindre.com/...montar-particiones-windows-gnulinux/
Posted in How To |

September 11th, 2008 at 1:15 pm
Grande entre los grandes, que buena info, la verdad que tengo intriga de porque dolphin monta mis usb en un sistema que NO es utf8, por lo que los acentos salen como todo el mundo sabe, mientras que nautilus lo hace con utf8. Alguien que me pueda dar una solucion. Gracias y muy buen post!
September 11th, 2008 at 1:54 pm
Buenas sitositos, Pues precisamente por lo que comentaba en el post, cada distro, escritorio o navegador de ficheros monta de forma distinta las particiones. Algunas distros como instalan por defecto Utf8 en su escritorio, implementan el automontaje para que todo sea utf8 y de esta forma cualquier dispositivo montado estará con esta codificación, ya que es la correcta para verlo bien, pero puede que si se cambia de locales el sistema este ya no monte correctamente los dispositivos de forma automática, pero por norma es algo que no se suele cambiar. Lo mismo pasa con cualquier aplicación que se encargue de montar dispositivos, como en tu caso pueden ser algunos gestores de ficheros, al no haber un método estándar para montarlos, cada uno lo hace como quiere, habiendo algunos más efectivos que otros.
Las distribuciones implementan el automontaje de distintas formas y basan las opciones del mismo en lo que Hal les dice sobre el dispositivo o se centran en las locales del sistema GNU/linux sobre el que se montará o simplemente que por defecto todo lo monten con una única codificación de caracteres, pudiendo entrar en conflicto con la codificación del sistema operativo sobre el que se monta.
Por estos y otros motivos se puede encontrar distros, escritorios, gestores de ficheros o cualquier otro software que nos monten correctamente nuestros dispositivos de forma automática y otros que no lo hagan. Espero haberte aclarado un poco tu duda.
Saludos!
October 12th, 2008 at 6:28 pm
[...] de uso práctico: Podemos usar el script para automontaje de dispositivos en rc.local para que lo arranque como un usuario del sistema y no como root. De [...]