¿Montar automáticamente unidades externas en / media / LABEL en el arranque sin que un usuario haya iniciado sesión?


73

Esta pregunta es similar, pero un poco opuesta a lo que quiero. Quiero que las unidades USB externas se monten automáticamente en el arranque, sin que nadie inicie sesión, en ubicaciones como /media/<label>.

No quiero tener que ingresar todos los datos en fstab, en parte porque es tedioso y molesto, pero principalmente porque no puedo predecir lo que conectaré o cómo cambiarán las particiones en el futuro.

Quiero que las unidades sean accesibles para cosas como MPD y estén disponibles cuando inicie sesión con SSH. gnome-mountparece que solo se montan cosas cuando estás conectado localmente a una sesión gráfica de Gnome.


44
Gran pregunta, ojalá tuviera una respuesta para ti, ahora tengo curiosidad por cómo se resuelve esto.
invertir

1
Actualicé mi respuesta.
Ryan Thompson, el

1
Y, para que conste, no tengo ningún problema con la instalación de Gnome, como ya lo hago, pero sería mejor una solución para servidores sin GUI sin cabeza.
endolito el

1
ARRRGHH ... error en mi respuesta. en el RUN. /usr/local/sbin/udev-automounter.sh mount %kdebería ser /usr/local/sbin/udev-automounter.sh %k. lo siento.
quack quijote el

1
OK, a partir de Update-3, funciona con espacios. lo hace mediante el uso de una versión "codificada" de <LABEL> que convierte los espacios en \x20's. así que no es bonito, pero funcionará. udev no está manejando bien las etiquetas con espacios, pero hay otra opción que usa guiones bajos en lugar de \x20's (por lo que al menos se ve bien). Parece que el manejo del espacio tiene que entrar en los shellscripts.
quack quijote

Respuestas:


74
  • Nota para Ubuntu Server 11.10: este script falla en Ubuntu Server 11.10 debido al vol_idcomando obsoleto . vol_idha sido sustituida por blkid. Para arreglar el script, reemplace "vol_id" por "blkid -o udev" en el udev-auto-mount.shscript.

He estado golpeándome la cabeza por un tiempo y creo que he encontrado una solución que funciona. Esto está desarrollado y probado en un sistema basado en Debian, por lo que debería funcionar en Ubuntu. Señalaré los supuestos que hace para que también se pueda adaptar a otros sistemas.

  • Montará automáticamente unidades USB en el complemento, y no debería llevar mucho tiempo adaptarse a Firewire.
  • Utiliza UDEV, por lo que no es necesario hacer monos con HAL / DeviceKit / GNOME-Anything.
  • Automáticamente crea un /media/LABELdirectorio para montar el dispositivo.

  • Sin embargo, puede interferir con otros montadores automáticos; No puedo probar para eso. Espero que, con Gnome-VFS activo, ambos intenten hacer el montaje ... si Gnome-VFS falla el montaje, es posible que no configure un icono de escritorio. Desmontar de Gnome debería ser posible, pero podría requerir gksudoo similar.

No he probado esto en el arranque del sistema, pero la única razón por la que puedo ver que podría no funcionar es si intenta montar la unidad USB antes de que el sistema esté listo para montarse. Si ese es el caso, probablemente necesitará un ajuste adicional al script de montaje. (Estoy comprobando con ServerFault para ver si hay algún consejo, pero no hay mucho interés en él allí).

A ello, entonces.


Referencias UDEV:


Fondo (UDEV? Whuzzat?)

UDEV es el sistema de conexión en caliente del núcleo. Es lo que configura automáticamente los dispositivos y enlaces simbólicos del dispositivo (por ejemplo /dev/disk/by-label/<LABEL>), tanto en el momento del arranque como para los dispositivos agregados mientras el sistema se está ejecutando.

D-Bus y HAL se utilizan para enviar eventos de hardware a oyentes como entornos de escritorio. Entonces, cuando inicia sesión en GNOME e inserta un CD o conecta una unidad USB, ese evento sigue esta cadena:

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

Y listo, su unidad se monta. Pero en un sistema sin cabeza, no queremos tener que iniciar sesión para obtener los beneficios del montaje automático.

Reglas Udev

Dado que UDEV nos permite escribir reglas y ejecutar programas en la inserción del dispositivo, esta es una opción ideal. Vamos a aprovechar las reglas existentes de Debian / Ubuntu, dejar que configuren el /dev/disk/by-label/<LABEL>enlace simbólico para nosotros y agregar otra regla que montará el dispositivo para nosotros.

Las reglas de UDEV se guardan en /etc/udev/rules.d(y /lib/udev/rules.den Karmic) y se procesan en orden numérico. Cualquier archivo que no comience con un número se procesa después de los archivos numerados. En mi sistema, las reglas de HAL se encuentran en un archivo llamado 90-hal.rules, así que puse mis reglas 89-local.rulespara que se procesen antes de llegar a HAL. Principalmente, debe asegurarse de que estas reglas sucedan después del 60-persistent-storage.rules. local.rulespuede ser lo suficientemente bueno

Ponga esto en su nuevo archivo de reglas:

# /etc/udev/rules.d/local.rules 
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="add",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-automounter.sh %k"
  • Asegúrese de que no haya espacios después del \, solo un newline( \n).

  • Cambie SUBSYSTEMS=="usb"a SUBSYSTEMS=="usb|ieee1394"para soporte Firewire.

  • Si desea que el dispositivo sea propiedad de un usuario en particular, agregue una OWNER="username"cláusula. Si solo necesita los archivos de un usuario en particular, modifique el script de montaje.

Leyendo la regla

Esto agrega un programa para ejecutar a la lista de programas para ejecutar del dispositivo. Identifica los dispositivos de partición USB <LABEL>, luego pasa esta información a un script que realiza el montaje. Específicamente, esta regla es coincidente:

  1. ENV{ID_FS_LABEL_ENC}=="?*"- una variable de entorno establecida por una regla del sistema anterior. No existe para los sistemas que no son de archivos, por eso lo comprobamos. En realidad, queremos usarlo ID_FS_LABELpara el punto de montaje, pero no he convencido a UDEV para que escape por mí, así que dejaremos que el script de montaje se encargue de eso.

    Udev obtiene esta y otras variables de entorno utilizando el vol_idcomando (en desuso ). Es una herramienta útil para ver detalles rápidos y agradables en una partición:

    $ sudo vol_id /dev/sdc1
    ID_FS_TYPE=ext2
    ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
    ID_FS_LABEL=Travel Dawgs
    ID_FS_LABEL_ENC=Travel\x20Dawgs
    ID_FS_LABEL_SAFE=Travel_Dawgs
    
  2. ACTION=="add"- solo coincide con addeventos ...

  3. SUBSYSTEMS=="usb"- solo coincide con los dispositivos que están en el bus USB. Usamos SUBSYSTEMSaquí porque esto coincide con los padres de nuestro dispositivo; el dispositivo que nos interesa en realidad será SUBSYSTEM == "scsi". Hacer coincidir un dispositivo USB principal evita agregar nuestro programa a las unidades internas.

  4. RUN+="..."- no es una coincidencia, sino una acción: agregue este programa a la lista de programas para ejecutar. En los argumentos del programa, %kse expande al nombre del dispositivo (p sdc1. Ej. , No /dev/sdc1) y $env{FOO}obtiene el contenido de la variable de entorno FOO.

Probar la regla

El primer enlace de referencia (arriba) es un excelente tutorial de UDEV, pero está un poco desactualizado. Los programas que ejecuta para probar sus reglas ( udevtesten particular) han sido reemplazados por la udevadmutilidad catch-all .

Después de agregar la regla, conecte su dispositivo. Espere unos segundos, luego verifique a qué dispositivo se le ha asignado:

$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1

Si su unidad extraíble contiene label_Baz, está en el dispositivo sdc1. Ejecute esto y mire la salida hacia el final:

$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...)                           (many lines about files it reads)
import_uevent_var: import into environment: (...)   (many lines about env variables)
(...)                                               (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'

Busque el nombre del script de nuestra RUN+=regla en las últimas líneas (tercero en la parte inferior en este ejemplo). Puede ver los argumentos que se usarían para este dispositivo. Puede ejecutar ese comando ahora para verificar que los argumentos son sólidos; si funciona en su línea de comando, debería funcionar automáticamente cuando se inserta un dispositivo.

También puede monitorear los eventos de UDEV en tiempo real: ejecutar sudo udevadm monitor(consulte los man udevadmdetalles sobre los conmutadores). Luego, simplemente conecte un nuevo dispositivo y vea los eventos desplazarse. (Probablemente exagere a menos que le gusten los detalles de bajo nivel ...)

Recargando las Reglas

Una vez que haya verificado que la regla se está leyendo correctamente, debe decirle a UDEV que vuelva a cargar sus reglas para que la nueva surta efecto. Utilice cualquiera de estos métodos (si el primero no funciona, el segundo debería ... pero pruebe el primero primero):

  • correr sudo udevadm control --reload-rules

  • correr sudo /etc/init.d/udev reload

  • reiniciar


¡Guión! En realidad, 2 scripts ...


Aquí está el primer guión. Dado que el programa que ejecutamos debe completarse rápidamente, esto simplemente hace girar el segundo script en segundo plano. Pon esto en /usr/local/sbin/udev-automounter.sh:

#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-mount.sh ${1} &

Aquí está el segundo guión. Esto hace un poco más de verificación de entrada. Pon esto en /usr/local/sbin/udev-auto-mount.sh. Es posible que desee ajustar las opciones de montaje a continuación. Este script ahora maneja la búsqueda de la etiqueta de partición por sí mismo; UDEV solo envía el nombre del DISPOSITIVO.

Si hay un problema al montar unidades en el momento del arranque , puede poner un buen tiempo sleep 60en este script, para darle tiempo al sistema para que llegue al final antes de que el script intente montar el disco.

He dado una sugerencia en los comentarios sobre cómo verificar (ejecutar pspara ver si se está ejecutando un servidor web), pero querrá modificar eso para su sistema. Creo que la mayoría de los servidores de red que podría estar utilizando serían suficientes para este propósito: nfsd, smbd, apache, etc. El riesgo, por supuesto, es que el script de montaje fallará si el servicio no se está ejecutando, por lo que tal vez pruebe un la existencia de un archivo en particular sería una mejor solución.

#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
   echo "error: seems /dev/${DEVICE} is already mounted"
   exit 1
fi

# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
#     sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up.  A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
#    sleep 30
#    HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done


# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`

if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
   echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
   exit 1
fi


# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then

   # make the mountpoint
   mkdir "/media/${ID_FS_LABEL}"

   # mount the device
   # 
   # If expecting thumbdrives, you probably want 
   #      mount -t auto -o sync,noatime [...]
   # 
   # If drive is VFAT/NFTS, this mounts the filesystem such that all files
   # are owned by a std user instead of by root.  Change to your user's UID
   # (listed in /etc/passwd).  You may also want "gid=1000" and/or "umask=022", eg:
   #      mount -t auto -o uid=1000,gid=1000 [...]
   # 
   # 
   case "$ID_FS_TYPE" in

       vfat)  mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # I like the locale setting for ntfs
       ntfs)  mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # ext2/3/4 don't like uid option
       ext*)  mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;
   esac

   # all done here, return successful
   exit 0
fi

exit 1

¡Súper script de limpieza extra!

Un guion más. Todo lo que hace es desmontar el dispositivo y eliminar los directorios de punto de montaje. Se supone que tiene privilegios para hacer esto, por lo que deberá ejecutarlo sudo. Este script ahora toma el punto de montaje completo en la línea de comandos, por ejemplo:

$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"

Pon esto en /usr/local/sbin/udev-unmounter.sh:

#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
#   MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"

if [ -z "$MOUNTPT" ]; then
   exit 1
fi


# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

3
¡Eres genial! :)
kolypto el

1
Si ejecuto auto-mount.sh manualmente, funciona, pero no si conecto una unidad y no en el arranque. : /
endolith el

entonces el problema es con las reglas UDEV. déjame expandir esa sección un poco para ayudarte a depurar.
quack quijote el

3
He reunido todos los scripts en github: github.com/fatso83/Code-Snippets/tree/master/system-utils/... Funcionan bien en Ubuntu 10.10, y también incluyen auto-desmontaje
oligofren

1
Referencia: udev_237 - man udev (Ubuntu_18.04) Tenga en cuenta que los programas en ejecución que acceden a la red o montan / desmontan sistemas de archivos no están permitidos dentro de las reglas de udev , debido al entorno limitado predeterminado que se aplica en systemd-udevd.service. fuente: unix.stackexchange.com/questions/200194/… Para obtener una solución, consulte serverfault.com/questions/766506/…
Pro Backup

9

Una última opción que otros han sugerido en la red es ivman, pero parece depender de pmounteso, lo que ya has dicho que no funciona. pmountestá abandonado y ivmanes casi lo mismo.

El reemplazo de ivmanes halevt, y está disponible en Karmic. Es una reimplementación de ivman(léase: "mantenido" y "no depende de pmount"). El paquete no está disponible en Jaunty, aunque puede construirlo usted mismo si no planea actualizar.

Ambas herramientas se encuentran por encima de las capas DBus y HAL y responden a los eventos de ellas. Aparentemente, ambos pueden ejecutarse como un demonio del sistema o como un administrador de montaje de sesión de usuario (a la Gnome-VFS): los /etc/defaults/{ivman,halevt}archivos están a cargo de la configuración del sistema.

Aquí hay algunas instrucciones para ajustar el ivmanuso de /media/<LABEL>puntos de montaje. Es probable que halevttenga una forma más sencilla de hacerlo, pero tal vez lo ayuden a encontrar una respuesta.


Trabajando con HALEVT

Actualización : en aras de obtener también montajes automáticos de CD, que mi respuesta UDEV no proporciona, analicé más a fondo halevt. Encontré esta publicación de blog que ayudó a explicar mucho sobre el proceso. Tuve que compilar mi propio halevtpaquete para Debian Lenny (afortunadamente todas las dependencias estaban en la sección de lenny-backports). Una vez instalado, el proceso fue en su mayoría no horrible:

  1. Asegúrese de que el sistema halevt-daemon esté habilitado en /etc/default/halevt
  2. Permita que el usuario del sistema pueda montar dispositivos /etc/PolicyKit/PolicyKit.conf(ver abajo; fuente )
  3. Modifique la política HAL para copiar la etiqueta de volumen en el punto de montaje preferido en /etc/hal/fdi/policy/preferences.fdi(ver más abajo)
  4. Si desea compatibilidad con CD / DVD, tome el eject.halscript de la entrada de blog anterior, modifíquelo y guárdelo /usr/local/bin.
  5. Modifique la configuración del sistema halevt para habilitar los montajes en /etc/halevt/halevt.xml
  6. Agregue código a los scripts previos y posteriores a la sesión de su administrador de inicio de sesión para detener el sistema halevt-daemon cuando alguien inicie sesión y reinícielo cuando cierre la sesión.

Si necesita reiniciar los demonios HAL y HALEVT para verificar sus nuevas configuraciones, use esto para obtenerlos en el orden correcto:

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

Paso 1

Compruebe que START_DAEMON=yesen /etc/default/halevt.

Paso 2

En /etc/PolicyKit/PolicyKit.conf, agregue esto dentro de la <config></config>sección:

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

Paso 3

En /etc/hal/fdi/policy/preferences.fdi, agregue esto dentro de la sección `:

<match key="volume.label" empty="false">
    <match key="volume.label" is_absolute_path="false">
        <merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
    </match>
</match>

Paso 4

El script es bueno pero necesita ejecutarse /bin/bash; algunos sistemas pueden usar realmente /bin/dashcuando /bin/shse llama. Así que cambie la línea superior en el script para asegurarse de obtener la correcta:

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

Paso 5

Esta es la parte divertida. Es posible que su sistema ya proporcione un básico /etc/halevt/halevt.xml, por lo que deberá adaptarlo para su propio uso. En mi caso, mi sistema ya proporcionaba un montaje extraíble básico, pero tuve que agregar soporte para el montaje de CDROM y el botón de expulsión.

La publicación de blog que mencioné tiene un buen ejemplo de configuración XML para ver sus propios ajustes. Se trata principalmente de configurar un reemplazo de montaje en gnomo para el fluxboxentorno del autor , por lo que su ejemplo XML hace más de lo que querrá, pero es una excelente manera de tener una idea de lo que puede hacer. También hay algunos buenos ejemplos en /usr/share/doc/halevt/examples.

También tuve que correr sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"antes de que todo funcionara.

Aquí están mis adiciones para hacer que el montaje automático de CD / DVD funcione:

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; hal.volume.disc.has_data = true">
   <halevt:Property name="hal.volume.is_mounted">
      <halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
   </halevt:Property>
</halevt:Device>

<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
   <halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>

Paso 6

Una vez que haya funcionado el sistema halevt-daemon, deberá deshabilitarlo cuando inicie sesión en GNOME y reiniciarlo nuevamente cuando cierre la sesión. (Consulte mi respuesta a esta pregunta para los administradores de inicio de sesión que no son GDM). Esto es teórico ya que no lo uso, pero debería funcionar.

En /etc/gdm/PreSession/Default, agregue esto para detener el sistema halevt-daemon:

/etc/init.d/halevt stop

En /etc/gdm/PostSession/Default, agregue esto para reiniciar el sistema halevt-daemon:

/etc/init.d/halevt start

3
Para las personas que lean esto en 2013, ahora deberían saber que HAL ha quedado en desuso, y deberían recurrir a soluciones basadas en udev, como el quijote de curandero que se dio anteriormente.
oligofren

6

A medida que pasa el tiempo, aparecen soluciones más fáciles.

Esta solución se basa en el paquete de software udevil que fue escrito para este propósito y no requiere ajustes con las reglas udev. Probablemente sea preferible (para usuarios nuevos y antiguos) como una solución directa.

El devmonguión de udevil hace toda la magia y solo depende de udev y glib. Funciona casi fuera de la caja sin necesidad de configuración inicial.

Todo lo que hice en mi estación de trabajo fue llamar a devmon de rc.localesta manera:
devmon 2>&1 >> /var/log/devmon &
para su comodidad, es posible que desee integrar esto en un script de inicio en lugar de rc.localutilizar una herramienta automatizada como pleaserunpara crearlo: https://unix.stackexchange.com/ a / 124609/42673

Después de ejecutarlo, se inspecciona el almacenamiento que conecto (busca particiones y, si se encuentra, mira las etiquetas del sistema de archivos), luego se monta /media/FILESYSTEM_LABEL.
No podría imaginar nada más simple que eso, excepto tal vez que el sistema (in) famoso incorporara esta funcionalidad en algún momento en el futuro.

udevil de un vistazo ( github.io/udevil )
Script: devmon ( igurublog / script-devmon )


3

la respuesta de quack quixote no funciona en Ubuntu Lucid Lynx (10.04): no hay /sbin/vol_idcomando.

En lugar de ser elegante y usar udev, pon esto en tu /etc/rc.local y listo:

for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
  label=$(basename $dev)
  mkdir -p /media/$label
  $(mount | grep -q /media/$label) || mount $dev /media/$label
done

1
GRACIAS ... esta fue la forma más sencilla de lo que quería lograr. Incluso trabajé en Ubuntu Server 16 con un volumen ntfs
ChrisPrime

3

Para los sistemas basados ​​en Debian (por ejemplo, Ubuntu, etc.) existe el paquete usbmount que monta automáticamente las unidades USB por usted. Básicamente, utiliza un enfoque basado en udev como ya se describió, solo que es solo una instalación de paquete simple. Parece que el autor original del paquete se ha quedado sin vapor, pero Ubuntu / Debian todavía parece mantenerlo (supongo que no es tan complejo), por lo que todavía está disponible en las últimas versiones.

Los scripts instalados se pueden configurar (/etc/usbmount/usbmount.conf) para proporcionar los puntos de montaje adecuados.


1
Sin embargo, Usbmount no puede montarse por etiqueta, a menos que complete la lista de etiquetas en el archivo de configuración.
Gilles 'SO- deja de ser malvado'

1
Vea la publicación esite.ch/2014/04/11/… si desea agregar el montaje a la etiqueta a usbmount sin mantener una lista.
Oliver Sauder

3

Para eliminar las excelentes instrucciones de eliminación de quack quixote:

Agregue la siguiente línea al archivo de reglas de udev que creó anteriormente (/etc/udev/rules.d) "

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

A continuación, cree el siguiente script y ejecute chmod en él (/usr/local/sbin/udev-autounmounter.sh) con los siguientes contenidos:

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

Finalmente, el script de desmontaje en sí mismo (udev-auto-unmount.sh):

#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
   echo "error: the device is not already mounted"
   exit 1
fi

# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

Entonces, con las otras instrucciones, el directorio aparecerá y desaparecerá automáticamente en los eventos udev.


Creo que if [ -n "$device_is_mounted" ]; thendebería ser if [ -z "${MOUNTPT}" ]; then, ¿no?
eresonance

2

Es posible que desee probar Pysdm


Ese es solo otro editor fstab, ¿no?
endolito el

Sí, pero "También permite la creación de reglas udev para la configuración dinámica de dispositivos de almacenamiento"
Sathyajith Bhat

¿La "creación de reglas de udev" me ayudaría de alguna manera? No tengo idea de lo que eso significa. ¿Monta dispositivos extraíbles previamente desconocidos sin que un usuario haya iniciado sesión localmente?
endolito el

Lo siento, no tengo ni idea de las reglas de udev. Puede echar un vistazo a fredericiana.com/2006/03/15/writing-udev-rules-short-notes y reactivated.net/writing_udev_rules.html
Sathyajith Bhat

2

Puedes intentar poner su username -c gnome-volume-manager/etc/rc.local. Puede ser suficiente simplemente tener gnome-volume-manager ejecutándose.

Editar: Parece que gnome-volume-manager ya no es parte de la distribución predeterminada, incluso en el escritorio de Ubuntu.

wajig policy  gnome-volume-manager
gnome-volume-manager:
  Installed: (none)
  Candidate: 2.24.0-0ubuntu1
  Version table:
     2.24.0-0ubuntu1 0
        500 http://ubuntu.secs.oakland.edu jaunty/universe Packages

Sin embargo, tal vez si lo instala, seguirá funcionando. Vale la pena intentarlo. Si no funciona, quítelo nuevamente.

También está el usbmountpaquete, que hace lo que desea, pero que posiblemente interfiera con el montaje automático normal.


Comando desconocido "gnome-volume-manager". Estoy en Ubuntu Jaunty.
endolito el

Hay un / usr / lib / gnome-volume-manager / gnome-volume-manager, pero no hace nada.
Endolith

Oh ya veo. También hay un paquete llamado gnome-volume-manager. Relacionado: crunchbanglinux.org/forums/topic/239/…
endolith

¿Parece que gnome-volume-manager usa HAL para montar cosas? Y "a partir de 2009, HAL está en proceso de ser desaprobado en favor de DeviceKit". ¿Por qué todo en Linux siempre es así? Simplemente comienzan a hacer que algo funcione casi bien y luego lo destripan y lo reemplazan con algo nuevo que no funciona.
endolito el

pmount ya ni siquiera funciona. > pmount / dev / disk / by-label / STORAGE Error: el dispositivo / dev / sdc1 no es extraíble togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolith el

2

Mis apéndices editados para la solución basada en udev de quack quixote fueron rechazados, así que los pondré aquí. Por favor, consulte su publicación primero.

En primer lugar, si desea que su regla udev actúe cuando cualquier dispositivo está conectado a través del subsistema SCSI (que incluye USB, FireWire y eSATA), cambie la coincidencia SUBSYSTEMS en la regla udev a SUBSYSTEMS=="scsi".

Sin embargo, tenga en cuenta que esto montará automáticamente casi cualquier cosa, incluidas las unidades internas si las conecta en caliente mientras el sistema está en funcionamiento, por lo que puede que no sea lo que desea.

En segundo lugar, aquí está el script que estoy usando que reemplaza todos los scripts en esa publicación. También limpia automáticamente los puntos de montaje creados en / media / tan pronto como se retira el dispositivo de bloque montado, sin necesidad de intervención manual. Además, en lugar de llamar a un script diferente para que se ejecute en segundo plano, se pone en segundo plano cuando no se ejecuta desde un terminal (por ejemplo, cuando se ejecuta a través de udev).

Utiliza inotifywait para esperar hasta que el dispositivo que se montó desaparezca, y luego elimina el directorio que creó. Por lo tanto, debe tener instaladas las herramientas de inotify en su sistema. En distribuciones basadas en Debian (incluido Ubuntu), sudo apt-get install inotify-toolsdebería ser suficiente.

#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.

MOUNT_OPTS="ro,noatime,nodiratime"



# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
    ($0 $1 backgrounded &)
    exit
fi



# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"

# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"

# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
    NUM=1
    while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
    MOUNTPOINT="$MOUNTPOINT $NUM"
fi

# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"



# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1

# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
    rmdir "$MOUNTPOINT"
    sleep 1s
    TRIES=$((TRIES+1))
done

Notarás que monte dispositivos sin sincronización y solo lectura. Eso es solo porque el 99% del tiempo, mi caso de uso es leer desde un disco externo, y cada vez que necesite escribir en él, estaré activo en el servidor de todos modos, y puedo emitir fácilmente un mount -o remount,rw <mountpoint>comando. Edite para satisfacer sus necesidades :)


¿Cómo ejecutas este script? halevtNo parece ser un apt-getpaquete capaz actual para las versiones modernas.
Campbeln

Agh ... tal vez si sigo la entrada de la respuesta TOP / Aceptada de quack quixote's ... Todavía sería bueno tener una respuesta más completa aquí :)
Campbeln

1

Intente configurar a través de mountmanager, para no tener que ingresar datos manualmente.

Debería ser parte del repositorio de ubuntu.


Deberá habilitar la sección del universo para obtenerla.
quack quijote

apt: mountmanager? section = universe;)
endolith

¿Eso solo va a crear un fstab para mí?
endolito el

@endolith: ¿No sería apto: universe? install = mountmanager ser más lógico? ;)
Bobby el

¿Funciona ese formato? No lo dice en la página man manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
endolith

-5

Si solo tiene una unidad montada a la vez, simplemente puede editar esto en su /etc/fstabarchivo. Algo en la línea de:

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

Esto debería montarlo en el arranque y hacerlo accesible para cualquier persona con permisos permanentes. Si tiene más de una unidad, aún puede hacer esto con:

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

66
claramente no es lo que pregunta la pregunta.
quack quijote
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.