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, autofs
de 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 udev
para 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 udev
reglas para obligar a la memoria USB a tomar el nombre, /dev/usbstick
pero 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-sdc1
y usbstick-sg2
.
Sin embargo, lo que he encontrado es que el código en la RUN
secció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).
/dev/sdc1
suponía que era el segundosdd1
? Y puede usarblkid
para identificar de forma exclusiva la unidad (bueno, en realidad la partición; cambiará si reformatea)udev
regla para crear nodos de dispositivo para cada partición, ¡pero no estoy seguro de para qué nivel deudevadm
salida se deben hacer las reglas!ACTION==
, unoKERNEL==
y unoATTRS{something}==
(es completamente factible, esto es lo que uso). Además, considere ejecutar un solo script instalado de la cadena de comandos enRUN+=
.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 deudevadm test /sys/block/sdd
es, 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?Respuestas:
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:
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.gz
lugar. 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 ejecutarlosync
oumount
antes de desenchufarlo. Eso es configurable.fuente
pumount
usbmount
ya no admite NTFS desde debian jessie: bugs.debian.org/774149Tenga 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 enman 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%k
variable).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 .
fuente
udev
reglas con scripts que lo acompañan. Puede echar un vistazo a las reglas y adaptarlas fácilmente a sus necesidades.udevadm
y 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é.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"). :
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
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):
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
Ahora creé "auto.usb" con el siguiente contenido:
Este auto.usb debe ser ejecutable, para que autofs use esto como un script (bash). Así por ejemplo
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:
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":
fuente
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.
fuente
removable
atributo que debes probar, y enblock
lugar de hacerloscsi
.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
Puedes hacer esto usando nano:
Explicación:
/dev/sr0
es 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 -l
para enumerar los dispositivos)/media/bluray
Es el punto de montaje. Puedes elegir otro punto de montajenofail
es necesario para evitar un informe de falla al arrancar sin un disco en la unidad ópticax-systemd.automount
es la opción para configurar systemd para montar automáticamente el disco insertadoNo especifique noauto: esto evitaría que systemd monte automáticamente un disco, lo que frustra el propósito.
Prueba
Ejecute el comando
journalctl -x -f
en una terminal para verificar qué está sucediendo con systemdVuelva 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:
Más lejos
Para montar con éxito unidades NTFS tuve que instalar ntfs-3g (viejos ntfsprogs)
No tuve que instalar hfsprogs para que un usb con formato OSX funcionara, pero debe verificarlo usted mismo.
fuente