Ich habe versucht, einige udev-Regeln zu erstellen, um meine USB-Flash-Laufwerke zu aktivieren und zu deaktivieren. Die Regeln für den Moment sind sehr einfach:
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 ist auch sehr einfach:
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"
Ich habe einige Tests durchgeführt, damit ich feststellen kann, dass:
- Beim Anschließen wird mein Flash-Laufwerk erkannt. Eine Datei wird in / dev erstellt
- plug_flash_drive.sh wird von udev aufgerufen
- Der mkdir-Teil des Skripts funktioniert
- Es scheint jedoch, dass der "Mount" -Teil des Skripts nicht ausgeführt wird, sodass mein Laufwerk nicht gemountet ist
- Wenn ich meine Skripte auf der Kommandozeile aufrufe, funktionieren sie perfekt
Weiß jemand, warum mount nicht ausgeführt wird, wenn es von udev aufgerufen wird?
EDIT 28/08/14: Ich habe am Ende meines Skripts "grep -q / proc / mounts && echo success || echo failure" hinzugefügt, um in meinem Debug-Protokoll zu überprüfen, ob das Gerät tatsächlich eingehängt ist, bevor das Skript endet. Es scheint, dass das Gerät an diesem Punkt eingehängt ist , auch wenn das Skript von udev aufgerufen wird. Das eigentliche Problem ist nun "Mein Block-Gerät scheint nach dem Ende des Mount-Skripts, wenn es über udev aufgerufen wird, nicht gemountet zu sein": s
mkdir "$mount_dir"
aberrmdir "/media/$device_name"
? Wo wird$mount_dir
gesetzt?set -xv
undexec >> "$HOME"/mount.log 2>&1
in die.sh
Akten legt ?Antworten:
systemd-udevd wird in einem eigenen Dateisystem-Namespace ausgeführt. Standardmäßig werden Bereitstellungen, die in udev-Regeln ausgeführt werden, nicht auf den Host übertragen. Um Ihre alte Schriften arbeiten können Sie einstellen ,
MountFlags=shared
in/usr/lib/systemd/system/systemd-udevd.service
oder (besser) die Erstellung und Bearbeitung seine Kopie an/etc/systemd/system/
Siehe
man 5 systemd.exec
weitere InformationenMountFlags
Option.quelle
Zum jetzigen Zeitpunkt sind die anderen Antworten falsch (oder veraltet).
Sie sollten nicht
mount
von einem Systemd-Dienst ausgeführt werden. Auch nach dem Kommentieren der ZeilenMountFlags
undPrivateMounts
insystemd-udevd.service
funktioniert Ihre Regel nicht für FUSE-Dateisysteme wie NTFS oder exFAT, da der FUSE-Prozess von Systemd hilfreich beendet wird.Siehe diese ArchWiki-Seite, die mehrere bessere Optionen auflistet. Ich bevorzuge ein kleines Projekt auf GitHub namens udev-media-automount , das einfach einen Systemd-Dienst von der Udev-Regel aus neu startet. Dies ist eine bequeme Möglichkeit, um die verschiedenen umständlichen Einschränkungen von Udev für Namespaces und untergeordnete Prozesse zu umgehen.
Siehe auch diese Antwort , die zeigt, wie die
SYSTEMD_WANTS
Udev-Variable zum Starten einer Systemd-Unit verwendet wird.quelle
Sie könnten versuchen , zu verwenden ,
:=
anstatt+=
in den Regeln Zuweisungen RUN.Der
:=
Bediener legt den Listenwert fest und lässt weitere Änderungen nicht zu.quelle