mount no se ejecuta cuando lo invoca udev

17

Traté de crear algunas reglas de udev para montar y desmontar mis unidades flash USB; Las reglas por el momento son muy simples:

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"

plug_flash_drive.sh también es muy simple:

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"

unplug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

He hecho algunas pruebas para poder determinar que:

  • Cuando está enchufado, se detecta mi unidad flash; se crea un archivo en / dev
  • udev llama a plug_flash_drive.sh
  • la parte mkdir del guión funciona
  • sin embargo, parece que la parte "montar" del script no se ejecuta, por lo que mi unidad no está montada
  • cuando llamo a mis scripts en la línea de comando, funcionan perfectamente

¿Alguien sabe por qué mount no se ejecuta cuando lo llama udev?

EDITAR 28/08/14: Agregué "grep -q / proc / mounts && echo success || echo failure" al final de mi script para verificar en mi registro de depuración si el dispositivo está realmente montado antes de que finalice el script. Parece que el dispositivo está montado en ese punto, incluso cuando el script es llamado por udev. Entonces, el verdadero problema ahora es "mi dispositivo de bloque aparentemente se desmonta después de que finaliza el script de montaje cuando se llama a través de udev": s

magva
fuente
Esto puede ser fuera de lugar, pero ¿por qué mkdir "$mount_dir", pero rmdir "/media/$device_name"? ¿Dónde se $mount_direstablece?
G-Man dice 'Restablecer a Monica' el
lo siento, esto es un error tipográfico, utilicé algunas alias de variables bastante inútiles en los códigos originales y las
eliminé
¿Has probado la depuración de la vieja escuela? por ejemplo, al poner set -xvy exec >> "$HOME"/mount.log 2>&1en los .sharchivos?
G-Man dice 'Restablecer a Monica' el
1
Lo hice, pero de acuerdo con el registro que obtengo, mount se ejecuta cuando udev llama al script. No hay diferencia en el registro entre una llamada desde udev y desde la línea de comando ... eso es realmente desconcertante
magva
1
en ese caso, el script también fallará cuando se ejecute desde la línea de comandos
magva

Respuestas:

22

systemd-udevd se ejecuta en su propio espacio de nombres del sistema de archivos y, por defecto, los montajes realizados dentro de udev .rules no se propagan al host. Para hacer sus viejos guiones de trabajo se puede establecer MountFlags=shareden /usr/lib/systemd/system/systemd-udevd.serviceo (mejor) crear y editar su copia en/etc/systemd/system/

Ver man 5 systemd.execpara más información, MountFlagsopción.

usuario83388
fuente
¿Qué quieres decir con "no propagar al host"?
sebelk
2
@sebelk Creo que user83388 significa que no se propagan al espacio de nombres "raíz"
Mark
2

Al momento de escribir esto, las otras respuestas son incorrectas (o desactualizadas).

No debe ejecutarse mountdesde un servicio Systemd. Incluso después de comentar elMountFlagsPrivateMounts líneas y systemd-udevd.service, su regla no funcionará para los sistemas de archivos FUSE como NTFS o exFAT, porque Systemd eliminará el proceso FUSE de manera útil.

Ver esta página de ArchWiki que enumera varias opciones mejores. Mi preferencia es un pequeño proyecto en GitHub llamado udev-media-automount , que simplemente reinicia un servicio Systemd desde la regla Udev. Esta es una manera conveniente de sortear las diversas restricciones engorrosas de Udev en los espacios de nombres y procesos secundarios.

Consulte también esta respuesta , que muestra cómo utilizar la SYSTEMD_WANTSvariable Udev para iniciar una unidad Systemd.

Metamórfico
fuente
-1

Podrías intentar usar := lugar de +=en las reglas EJECUTAR asignaciones.

El :=operador establece el valor de la lista y no permite más cambios.

xae
fuente
gracias, pero el montaje todavía no funciona :(
magva
1
Tal vez no sea tu caso, pero en mi sistema de montaje se encuentra en / bin / mount. Prueba con el comando "-v mount".
xae
1
En mi sistema, la ruta devuelta por "command -v mount" es / usr / bin / mount. Me di cuenta de que también tenía un ejecutable / bin / mount, pero tampoco funciona cuando lo
invocó