Automontaje de dispositivos extraíbles en Linux
Hace algunos años, el mundo Linux no contaba con herramientas que montaran dispositivos como las hay hoy en día, o como hacía Windows desde versiones antiguas. Esto me enseñó a montar los dispositivos a mano, usando el bien conocido comando mount o bien configurando entradas en /etc/fstab para el montaje automático al iniciar el sistema. El problema es que a veces es bastante molesto tener que montar a mano cada dispositivo que vamos a utilizar.

Todo esto cambió a medida que fueron surgiendo/mejorando herramientas como udev, hal y pmount. Ahora la mayoría de los window manager presentan al usuario la opción de montar un dispositivo simplemente clickeando en el ícono del cd/dvd-rom, pendrive, disco externo, etc que aparece en el desktop. Cada entorno gráfico cuenta con alguna interfaz para hal-pmount, como ser gnome-volume-manager, thunar-volman, kdebase-kio-plugins, etc.

Hoy les traigo una forma de auto-montar dispositivos sin necesidad de usar ningún entorno gráfico. Es decir, la configuración será independiente del entorno gráfico que estemos utilizando y nos servirá además si tenemos un sistema sin gráficos.

La idea inicial del artículo era probar varias herramientas y describir el funcionamiento de cada una, pero dado que anduve corto de tiempo no pude probar las otras opciones que quería, así que por ahora los dejo sólo con autoFS y espero en próximos artículos describir el resto.
Por si les interesa investigar por ustedes mismos, las otras herramientas de las que pensaba hablar eran ivman, halevt y usbmount. También me interesaría describir el funcionamiento de udev, hal y pmount, pero todo requiere tiempo y pruebas =)


Automontar con autofs

Autofs es un script que controla el funcionamiento del demonio automount, el cual es el programa encargado de realizar la tarea de montar automáticamente un dispositivo cuando el usuario intenta accederlo. automount funciona leyendo el archivo /etc/auto.master, el cual contiene el mapeo de unidades->directorio de montaje.
Para configurar los dispositivos que deseamos automontar, debemos editar el mencionado /etc/auto.master, el cual contendrá una entrada apuntando a otro archivo, el cual contendrá los puntos de montaje y las opciones.
Para mostrar la funcionalidad, utilizaré un ejemplo donde intento montar automáticamente un cdrom, cuyo dispositivo es /dev/hda. Para este caso, deberemos ingresar una línea como la siguiente en auto.master:
/media/misc /etc/auto.misc --timeout=5 --ghost
auto.master cuenta con el punto de montaje (/media/misc/), el archivo donde se encuentra el comando para montar el dispositivo (/etc/auto.misc) y opciones. En el ejemplo especifiqué la opción --timeout=5, que indica al sistema que desmonte los dispositivos luego de 5 segundos de inactividad, y --ghost que indica no borrar los directorios utilizados dentro del punto de montaje, osea, los creados dentro de /media/misc... ya vamos a ver por qué.

Para continuar, debemos configurar el archivo /etc/auto.misc. Si bien aca utilizo auto.misc que es un archivo creado automáticamente al instalar autofs, podrían utilizar cualquier archivo con cualquier nombre, siempre que tenga el formato necesario para que esto funcione.
Para montar nuestro cdrom, necesitaríamos utilizar una entrada como ésta dentro de auto.misc:
cd1 -fstype=iso9660,ro,nosuid,nodev :/dev/hda
el primer parámetro es el directorio de montaje creado dentro del punto de montaje indicado en auto.master, es decir, para nuestro ejemplo, el cdrom se montará en /media/misc/cd1. Luego, como podrán reconocer, vienen las opciones de montaje como el tipo de archivo, que lo montamos como read-only, sin suid y nodev. Por último, luego de los dos puntos colocamos el dispositivo en cuestión, es decir /dev/hda

Ahora, cada vez que accedamos a /media/misc/cd1 autofs montará el cd que se encuentre en la lectora (si es que hay alguno en ella) de forma transparente, es decir, el usuario ni se enterará que hubo un montaje en el medio. Luego de 5 segundos de inactividad, es decir, 5 segundos donde nadie acceda a archivos en /media/misc/cd1, el cd será desmontado. Eso si, si luego accedemos nuevamente al directorio, el cd se vuelve a montar.


Instalación

La instalación es simple, autofs se encuentra en los repositorios de toda distribución importante, así que pueden instalarlo con su manejador de paquetes. Por ejemplo en debian yo lo instalé ejecutando:
apt-get install autofs5


Problemas

Si bien autofs cumple con el cometido de automontar dispositivos bastante bien, tiene problemas que no me convencen.

Por un lado tenemos el problema de doble montaje. Si bien este no es problema de autofs, el problema existe al utilizarlo. Lo que quiero decir con "doble montaje" es que si autofs monta un dispositivo, y nosotros por nuestra cuenta lo accedemos con algún gestor como dolphin o nautilus a través de su propio sistema de automontaje, estos gestores lo montarán en su directorio predefinido. Por ejemplo, supongamos que autofs monta el cd en /media/misc/cd1, pero dolphin lo monta en /media/cdrom0, ahora tendremos el mismo dispositivo montado en dos lugares distintos.
Esto se puede solucionar fácilmente haciendo que el directorio /media/cdrom0 apunte a /media/misc/cd1 o bien haciendo que automount monte en /media/cdrom0. Yo me quedo con la primer alternativa, debido a que para la segunda debemos configurar en auto.master el directorio /media como raíz, y autofs elimina todos los directorios anidados dentro de su raíz antes de crear los puntos de montaje. Así pues, si teníamos otras cosas montadas como /media/windows, o /media/usb, ahora no veremos dichos directorios gracias a autofs.
Para la solución de linkear /media/cdrom0 al directorio designado en autofs podemos hacer simplemente:
rmdir /media/cdrom0
ln -s /media/misc/cd1 /media/cdrom0
El otro problema aún más molesto de autofs es el del timeout. autofs desmonta los dispositivos luego de t segundos de inactividad, indicado en timeout (en nuestro ejemplo, 5 segundos). Esto quiere decir que no podemos ejecutar la lectora a menos que hayan transcurrido t segundos de inactividad, a menos que seamos root y le indiquemos a autofs que no moleste...
Gracias a esto, tendremos que elegir un timeout adecuado. Hacer que el dispositivo se desmonte a cada rato y luego se vuelva a montar porque lo volvemos a acceder es totalmente ineficiente, pero esperar muchos segundos para poder extraer el dispositivo es extremadamente molesto!


Referencias


- Autofs (gentoo wiki)
- Automounting removable devices (debian wiki)
- Automount mini-Howto

4 comentarios:

Unknown dijo...
Este comentario ha sido eliminado por el autor.
@sapamipir dijo...

excelente
tomándolo como base he logrado hacer los siguiente para automatizarlo un poco mas.
Teniendo en cuenta que en mi trabajo existen dos turnos, por lo cual se debe cargar una carpeta de red para cada uno de los usuarios que usan un mismo equipo, distro kubuntu 12.04, conexión con dominio likewiseopen, domino samba 4, las carpetas a conectar se encuentran en //adcd/nombreusuario.


en la ruta /etc/kde4/kdm se encuentran los archivos encargados del inicio, cierre y configuración de kde de los cuales nos enfocaremos en Xstartup (todos estos archivos corren con permisos de root antes del inicio de sesión y envía información a kdm del usuario que la inicia)

modificar la primer linea del archivo Xstartup de #/!/bin/sh a #!/bin/bash esto para evitar problemas con los comodines \n \a \t al dejarlo por default estas letras desaparecen de los nombres de los usuarios que se guardan en el archivo temporal.
agregar las siguientes lineas bajo la linea /sbin/initctl -q emit desktop-session-start DISPLAY_MANAGER=kdm USER=$USER

######################################################################################################################
#ejecuta consulta de estado al dominio si la respuesta es verdadera ejecuta sentencias de conexión de unidad de lo contrario inicia normalmente
# esto ya que tenemos equipo que no autentican con el dominio
lw-get-status |grep -i 'dominio.red'
if [ $? = 0 ];then
# la variable USER nos muesta dominio\usuario mediante el comando sed eliminamos el prefijo midominio\
# dejando solo el nombre de usuario cada punto corresponde a una letra, esto retorna el nombre del usuario
# el cual se guarda en un archivo
echo $USER|sed 's/^......//'>/home/temp.txt
# hace un backup del archivo nfstab y borra las lineas que contengan //adcd/ de anteriores usuario
sed -i.bak '/adcd/d' /etc/fstab
#carga la informacion del txt con el usuario de dominio en la variable
usuario=$(< /home/temp.txt)
#se agrega la linea con en la ultima linea de /etc/fstab
echo "//adcd/"$usuario" /media/samba smbfs user,noauto,sec=krb5 0 0" >> /etc/fstab
fi

estaré pendiente de cualquier comentario y modificación , dejo pendiente la salida de sesión en la cual estoy trabajando

d3m4s1@d0v1v0 dijo...

Muchas gracias por el aporte @sapamipir! Supongo que tu comentario está relacionado con el artículo Montar shares SMB/CIFS + Automontar shares SMB/CIFS en redes kerberizadas, dado que no veo demasiada relación con este.

@sapamipir dijo...

perdón lo publicare en ese hilo

Publicar un comentario