Montaje automático de memorias USB en Debian

10

Estoy ejecutando Debian Squeeze en una computadora enchufable (solo SSH, sin GUI) y lo que intento hacer es obtenerla para que cuando se conecte una memoria USB, se monte automáticamente.

Lo que he hecho es instalar, autofsde lo que obtengo maneja el montaje automático siempre que sepa dónde está el dispositivo /dev.

El problema es que la memoria USB no siempre tiene el mismo nombre de dispositivo. A veces es /dev/sdc1, a veces /dev/sdd1, etc.

Entiendo que para remediar esto, necesito usar udevpara asegurarme de que la memoria USB siempre tenga el mismo nombre.

Obtuve la siguiente información de udevadm:

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/block/sdd/sdd1':
    KERNEL=="sdd1"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{partition}=="1"
    ATTR{start}=="63"
    ATTR{size}=="129339"
    ATTR{ro}=="0"
    ATTR{alignment_offset}=="0"
    ATTR{discard_alignment}=="0"
    ATTR{stat}=="      31      244      275      190        0        0        0        0        0      190      190"
    ATTR{inflight}=="       0        0"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0/block/sdd':
    KERNELS=="sdd"
    SUBSYSTEMS=="block"
    DRIVERS==""
    ATTRS{range}=="16"
    ATTRS{ext_range}=="256"
    ATTRS{removable}=="1"
    ATTRS{ro}=="0"
    ATTRS{size}=="129439"
    ATTRS{alignment_offset}=="0"
    ATTRS{discard_alignment}=="0"
    ATTRS{capability}=="51"
    ATTRS{stat}=="      56      727      783      520        0        0        0        0        0      520      520"
    ATTRS{inflight}=="       0        0"
    ATTRS{events}=="media_change"
    ATTRS{events_async}==""
    ATTRS{events_poll_msecs}=="-1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0':
    KERNELS=="8:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="3"
    ATTRS{vendor}=="        "
    ATTRS{model}=="Flash Disk      "
    ATTRS{rev}=="2.00"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{iocounterbits}=="32"
    ATTRS{iorequest_cnt}=="0x90"
    ATTRS{iodone_cnt}=="0x90"
    ATTRS{ioerr_cnt}=="0x0"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{evt_media_change}=="0"
    ATTRS{queue_depth}=="1"
    ATTRS{queue_type}=="none"
    ATTRS{max_sectors}=="240"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0':
    KERNELS=="target8:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8':
    KERNELS=="host8"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0':
    KERNELS=="1-1.2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{modalias}=="usb:v1976p6025d0100dc00dsc00dp00ic08isc06ip50"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2':
    KERNELS=="1-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="383"
    ATTRS{idVendor}=="1976"
    ATTRS{idProduct}=="6025"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="11"
    ATTRS{devpath}=="1.2"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="197"
    ATTRS{idVendor}=="1a40"
    ATTRS{idProduct}=="0101"
    ATTRS{bcdDevice}=="0111"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="4"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{product}=="USB 2.0 Hub"

  looking at parent device '/devices/platform/orion-ehci.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="24"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.38.8 ehci_hcd"
    ATTRS{product}=="Marvell Orion EHCI"
    ATTRS{serial}=="orion-ehci.0"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/platform/orion-ehci.0':
    KERNELS=="orion-ehci.0"
    SUBSYSTEMS=="platform"
    DRIVERS=="orion-ehci"
    ATTRS{modalias}=="platform:orion-ehci"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

He estado tratando de escribir udevreglas para obligar a la memoria USB a tomar el nombre, /dev/usbstickpero hasta ahora no he tenido éxito.

¿Alguien puede ayudarme con la regla que necesito especificar en mi archivo de reglas para que esta memoria USB siempre tenga el mismo nombre?

- O, ¿hay una forma mucho más fácil de montar automáticamente la memoria USB que me falta por completo?

ACTUALIZAR

OK, así que he hecho algunos progresos. Agregué la siguiente regla:

SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"

Sé que esto todavía necesita algo de trabajo en términos de manejo de agregar / quitar, pero es solo una prueba básica por ahora.

El efecto de esto es que ahora logro obtener tres nuevos nodos de dispositivo /dev, a saber /dev/usbstick-sdc, /dev/usbstick-sdc1y usbstick-sg2.

Sin embargo, lo que he encontrado es que el código en la RUNsección solo se ejecuta una vez y solo crea un directorio mnt/usbstick-sdc. También descubrí que el directorio siempre está vacío, por lo que es evidente que algo sigue yendo mal. (Aunque estoy haciendo progresos).

jon
fuente
¿Se /dev/sdc1suponía que era el segundo sdd1? Y puede usar blkidpara identificar de forma exclusiva la unidad (bueno, en realidad la partición; cambiará si reformatea)
Kevin
Correcto, solo lo arreglé. Todo lo que quiero que suceda es que cuando se conecta una memoria USB se monta en algún directorio. Estoy bastante seguro de que debería estar usando una udevregla para crear nodos de dispositivo para cada partición, ¡pero no estoy seguro de para qué nivel de udevadmsalida se deben hacer las reglas!
Jon
Tu regla parece demasiado complicada. Intente hacer uno simple, con solo uno ACTION==, uno KERNEL==y uno ATTRS{something}==(es completamente factible, esto es lo que uso). Además, considere ejecutar un solo script instalado de la cadena de comandos en RUN+=.
rozcietrzewiacz
Gracias por el consejo, pero la pregunta sigue siendo: ¿a qué nivel del árbol de dispositivos debería apuntar con mi regla? Todo esto parece terriblemente confuso y realmente no hay mucha información en línea para explicar esto. Realmente aprecio el tiempo que me has tomado para explicarme hasta ahora, siento que ya casi estoy allí, pero me falta el nivel para apuntar.
Jon
Ahora he probado esta regla muy básica: KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"pero no, por supuesto, esto tampoco funciona. Ahora me siento cada vez más frustrado después de pasar casi todo el día simplemente tratando de averiguar cómo obtener una memoria USB que está conectada para montarse. ¿Deberían las cosas ser realmente tan difíciles? La salida de udevadm test /sys/block/sddes, por supuesto, prácticamente ilegible, por lo que no tengo forma de saber dónde me estoy equivocando. ¿Alguien puede señalarme en la dirección correcta en esto?
Jon

Respuestas:

13

Pensé que debería haber una manera mucho más fácil de abordar un problema tan común, y lo hay. Esto es lo que probé en mi servidor wheezy / sid:

sudo apt-get install usbmount

Enchufe el dispositivo USB, ¡listo! Mi palo ahora es accesible a través de /media/usb.

Por cierto, usbmount no tiene una página de manual, lea en su /usr/share/doc/usbmount/README.gzlugar. Parece que usbmount monta su dispositivo con la opción de sincronización de forma predeterminada. Puede ser mucho mejor para su dispositivo montarlo de forma asíncrona y ejecutarlo synco umountantes de desenchufarlo. Eso es configurable.

Arjan Drieman
fuente
ver tambiénpumount
Alex
Preste atención que usbmountya no admite NTFS desde debian jessie: bugs.debian.org/774149
malat
Al ejecutar esto en Debian Jessie, usbmount nunca parece montarlo. La página del paquete dice que ahora está sin mantenimiento y estoy ejecutando systemd. Me pregunto si este paquete ya no funciona con los cambios del sistema.
Travis Griggs
De hecho, no funcionó para mí en Jessie, vea mi respuesta (esto: ddumont.wordpress.com/2015/09/27/… funcionó)
Paul
2

Tenga en cuenta que no puede tener un solo nodo de dispositivo para representar cualquier posible pendrive conectado. ¿Qué pasa si conectas dos de ellos? ¿O cuando el pendrive tiene más de una partición?

En general, lo que usa para crear un nodo de dispositivo con nombre personalizado es SYMLINK+=. grep para ello en las reglas para ver cómo se usa: grep SYMLINK /etc/udev/rules.d/*. Como en todos los comandos activados por udev, puede usar algunas variables significativas que se describen en man udev. Puede darse cuenta de que realmente no necesita dar un nombre personalizado al dispositivo, ya que puede alimentar su nombre a un script (a través de la %kvariable).

En cuanto a la solución de montaje automático, eche un vistazo a UAM , que he descrito un poco en la respuesta a esta pregunta .

rozcietrzewiacz
fuente
Entiendo estas limitaciones. De hecho, solo necesito admitir una única memoria USB conectada en este momento a este sistema en particular. Sin embargo, necesitaría admitir varias particiones en la memoria USB (sería bueno si se pudieran montar en subcarpetas desde el punto de montaje). Dados estos requisitos, ¿tiene algún consejo para una posible solución? Debido a la naturaleza del proyecto, tengo que evitar el uso de software adicional de terceros si es posible.
Jon
Luego eche un vistazo a la edición que acabo de hacer (la parte central). ¿Sería esto suficiente?
rozcietrzewiacz
También tenga en cuenta que UAM no es realmente un programa, es un montón de buenas udevreglas con scripts que lo acompañan. Puede echar un vistazo a las reglas y adaptarlas fácilmente a sus necesidades.
rozcietrzewiacz
Gracias por el consejo. Otra cosa: ¿cree que podría mirar mi salida udevadmy decirme qué dispositivo es el dispositivo al que realmente debería apuntar con mi regla? Los diversos ejemplos que he visto en línea parecen involucrar árboles mucho más cortos y cada ejemplo parece apuntar a un nivel diferente de dispositivo, sin explicación de a cuál se debe apuntar y por qué.
Jon
Acabo de agregar una actualización arriba, ¿alguna idea? ¡Gracias!
Jon
2

Así es como lo hice recientemente, y ahora estoy bastante contento con este enfoque. Esto es para Ubuntu 12.04 + Gentoo, pero supongo que cualquier distribución que permita instalar udev y autofs debería funcionar.

Requisitos previos: debe haber instalado udev + autofs.

Paso 1)

Cree el siguiente archivo "/etc/udev/rules.d/90-usbsd-auto.rules" (por supuesto, puede usar cualquier nombre siempre que termine con ".rules"). :

# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9] 
# for automounter support

ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    SYMLINK+="usbdisks/%k", MODE:="0660", \
    RUN+="/bin/rm /media/usb/%k", \
    RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"

# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<...>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    RUN+="/bin/rm /media/usb/%k"

Qué hace esto: crea dos enlaces simbólicos, uno para la partición del dispositivo de almacenamiento USB en "/ dev / usbdisks / <...>".

El segundo enlace simbólico se vinculará desde "/ media / usb / <...>" a "/ media / autousb / <...>", esto se hace para el soporte del montador automático (consulte el paso 2).

Para asegurarse de que udev lea estas reglas use

sudo udevadm control --reload-rules

Nota: el mismo nombre para el mismo dispositivo USB: posible pero quizás peligroso: puede usar, por ejemplo, "$ env {ID_FS_LABEL_ENC}", en lugar de "% k" en las reglas UDEV anteriores. Esto usará la etiqueta de volumen para crear / media / usb / <...>, pero qué sucede si conecta dos memorias USB y ambas usan la misma etiqueta de volumen ...

Con este archivo de reglas de udev, todo está configurado para montar automáticamente la partición del dispositivo de almacenamiento USB. Sin embargo, tenga en cuenta que en este momento, el dispositivo NO se montará automáticamente (intencionalmente). Se montará automáticamente una vez que lo use con

Paso 2)

Configure autofs en automount / media / autousb / <...>: agregué la siguiente línea a mi archivo "/etc/auto.master" (para Ubuntu 12.04):

/media/autousb /etc/auto.usb --timeout=60

Esto significa que AutoFS desmontará el dispositivo después de 60 segundos de inactividad. Es posible que desee usar menos o más, dependiendo de su gusto.

Para Gentoo, debe modificar "/etc/autofs/auto.master" para que tenga sentido usar

/media/autousb /etc/autofs/auto.usb --timeout=60

Ahora creé "auto.usb" con el siguiente contenido:

#!/bin/bash

key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
  echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
  echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
  echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
  exit 0
fi

exit 1

Este auto.usb debe ser ejecutable, para que autofs use esto como un script (bash). Así por ejemplo

sudo chmod 0755 /etc/auto.usb

Qué hace esto: este script le dirá a AutoFS (/ usr / sbin / automount) cómo montar la partición del dispositivo de almacenamiento usb.

El script primero usará "/ sbin / blkid" para averiguar qué tipo de sistema de archivos hay en la partición.

El script proporcionará las opciones de montaje adecuadas según la partición del dispositivo.

Nota: Incluí código de muestra para los sistemas de archivos "vfat" (probablemente el más común para memorias USB), "ntfs" y "ext4". Por supuesto, es bastante fácil extender esto para admitir más sistemas de archivos.

Paso 3)

Opcional ... Para "expulsar" == desmontar sus dispositivos USB (o particiones en su dispositivo USB), cree un script en / sbin / usbeject:

#!/bin/bash
# make sure everything is written to USB disk(s)
sync
# sending SIUGSR1 to automount will unmount the media
killall -s SIGUSR1 /usr/sbin/automount

Con este script, puede usar "sudo usbeject" para desmontar todas las particiones de dispositivos USB montadas (diciéndole a automount que las desmonte).

Por supuesto, simplemente puede asegurarse de que la partición no se use en ningún lado; automounter desmontará la partición después del tiempo de espera de 60 segundos ...

El verdadero truco aquí es usar enlaces simbólicos de "/ media / usb" a "/ media / autousb":

  • Los enlaces simbólicos "/ media / usb" serán creados por udev, dando al usuario una descripción simple de las particiones de dispositivos de almacenamiento usb que hay
  • AutoFS montará automáticamente la partición a pedido si la usa a través de / media / usb
  • Con el archivo "auto.usb" con script, puede admitir cualquier tipo de sistema de archivos y, además, también puede admitir cualquier tipo de esquema de nomenclatura.
  • Este enfoque admite memorias USB con múltiples particiones, incluso si estas particiones usan diferentes tipos de sistemas de archivos.
Ingo Blackman
fuente
¿Podría mostrarle cómo la sugerencia de autofs destruye mi directorio / home / frank? Gracias.
Frank
1

Lamento responder mi propia pregunta, y muchas gracias a rozcietrzewiacz por contribuir, pero finalmente logré hacer un gran progreso usando la siguiente regla después de horas de leer en línea:

SUBSYSTEMS=="scsi", KERNEL=="sd[a-h]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"

Esto montará la primera partición de cualquier dispositivo SCSI. Supongo que la siguiente pregunta será cómo montar múltiples particiones, pero ese es otro problema para otro día.

jon
fuente
1
No es una buena regla. Esto coincidirá también con las particiones de los discos duros . hay un removableatributo que debes probar, y en blocklugar de hacerlo scsi.
rozcietrzewiacz
1

Descubrí que la mejor respuesta en realidad ha quedado en desuso, ya que no se mantiene y no funciona en / de Jessie (ver comentario de malat)

Para mí (en Jessie), la solución en este blog funcionó de maravilla.

Créditos a "ddumont", pero publicando una descripción general de su blog / respuesta aquí, para hacer frente a la posible pudrición de enlaces en el futuro.

Agregue la siguiente línea a /etc/fstab

/dev/sr0 /media/bluray auto defaults,nofail,x-systemd.automount 0 2

Puedes hacer esto usando nano:

sudo nano /etc/fstab

Explicación:

/dev/sr0es el archivo del dispositivo También puede usar uno de los enlaces simbólicos configurados por udev en / dev / disk / by-id. Tendrá que cambiar esto de acuerdo con el archivo de su dispositivo ( sudo fdisk -lpara enumerar los dispositivos)

/media/blurayEs el punto de montaje. Puedes elegir otro punto de montaje

nofail es necesario para evitar un informe de falla al arrancar sin un disco en la unidad óptica

x-systemd.automount es la opción para configurar systemd para montar automáticamente el disco insertado

No especifique noauto: esto evitaría que systemd monte automáticamente un disco, lo que frustra el propósito.

Prueba

Ejecute el comando journalctl -x -fen una terminal para verificar qué está sucediendo con systemd

Vuelva a cargar la configuración de systemd con sudo systemctl daemon-reload.

cargar un disco en su unidad óptica

Entonces, journalctl debería mostrar algo como:

Sept. 27 16:07:01 frodo systemd[1]: Mounted /media/bluray.

Más lejos

Para montar con éxito unidades NTFS tuve que instalar ntfs-3g (viejos ntfsprogs)

sudo apt-get install ntfs-3g

No tuve que instalar hfsprogs para que un usb con formato OSX funcionara, pero debe verificarlo usted mismo.

Paul
fuente
No se monta automáticamente en mi Debian jessie con un USB-HDD.
buhtz
@buhtz pero el montaje manual ¿funciona? Los pasos anteriores en realidad solo funcionaron para mí para las unidades que estaban en el sistema al inicio, no para insertar y quitar "dinámicamente" USB mientras el sistema está en funcionamiento.
Paul