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
mkdir "$mount_dir"
, perormdir "/media/$device_name"
? ¿Dónde se$mount_dir
establece?set -xv
yexec >> "$HOME"/mount.log 2>&1
en los.sh
archivos?Respuestas:
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=shared
en/usr/lib/systemd/system/systemd-udevd.service
o (mejor) crear y editar su copia en/etc/systemd/system/
Ver
man 5 systemd.exec
para más información,MountFlags
opción.fuente
Al momento de escribir esto, las otras respuestas son incorrectas (o desactualizadas).
No debe ejecutarse
mount
desde un servicio Systemd. Incluso después de comentar elMountFlags
PrivateMounts
líneas ysystemd-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_WANTS
variable Udev para iniciar una unidad Systemd.fuente
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.fuente