sicheres unmounten und andere udev-Regeln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

sicheres unmounten und andere udev-Regeln

Beitrag von smutbert » 24.10.2015 22:30:27

Hallo allerseits,

das hier ist die Fortsetzung meines Threads über die Benachrichtigung bei neu angeschlossenen Eingabegeräten ("heimliche USB-Eingabegeräte").

Es geht aber auch noch um etwas neues: Unter Gnome, Mate, XFCe und uU anderen Desktopumgebungen kann man nicht immer auf Anhieb erkennen, ob ein in der grafischen Oberfläche gemounteter USB-Stick oä bereits vollständig ausgehängt ist oder nicht.
In Debiannautilus und möglicherweise auch anderen Dateimanagern verschwindet der Datenträger nämlich sofort nachdem man auf "Auswerfen"/ geklickt hat. Die Schreibvorgänge gehen danach oft noch eine Zeit weiter und wenn man die Aktivitäts-LED des Datenträgers nicht sieht oder es gar keine gibt, kann man eigentlich gar nicht wissen wann man den Datenträger abziehen darf ohne verlorene Daten oder zumindest ein beschädigtes Dateisystem befürchten zu müssen.
Bei wichtigen Dingen habe ich immer in einem Terminalfenster den Befehl

Code: Alles auswählen

$ sync
eingegeben und abgewartet, bis er abgeschlossen ist, aber das ist natürlich keine besonder schöne Lösung.

Also habe ich mir mit

Code: Alles auswählen

$ udevadm monitor 
angesehen was so alles passiert. wenn ich einen Datenträger in Debiannautilus oder Debiangnome-disk-utility "auswerfe" und daraufhin folgende Regeln geschrieben und das Skript aus dem eingangs erwähnten Thread etwas erweitert.

Das Ergebnis poste ich erstens natürlich, weil ich hoffe, dass es jemand nützlich findet, ich würde mich aber auch sehr freuen, wenn es ein paar ausprobieren würden. Gerade beim Schreiben der Regeln bin sehr unsicher, welche Attribute und Variablen man sinnvollerweise zum Eingrenzen der Events verwendet, damit nicht bei jedem Unmounten oder Anstecken eines Geräts gleich dutzende Benachrichtigungen erscheinen…

Voraussetzung ist, dass das Paket Debianlibnotify-bin installiert ist und man zwei Dateien anlegt:

/etc/udev/rules.d/71-local.rules

Code: Alles auswählen

ACTION=="add", ENV{DEVNAME}=="/dev/input/event*", SUBSYSTEM=="input", RUN+="/usr/local/bin/udev-notification add_input"
ACTION=="add", SUBSYSTEM=="net", RUN+="/usr/local/bin/udev-notification add_net"
ACTION=="remove", ENV{ID_FS_USAGE}=="filesystem", SUBSYSTEM=="block", RUN+="/usr/local/bin/udev-notification remove_block"
/usr/local/bin/udev-notification

Code: Alles auswählen

#!/bin/sh

case "${1}" in
remove_block)
	HEADER="Block device removed"
	MESSAGE="${ID_VENDOR} ${ID_MODEL} with ${ID_FS_LABEL} (${ID_FS_TYPE}) on ${DEVNAME}."
	ICON="media-removable-symbolic"
	PRIORITY="low"
;;
add_input)
	HEADER="Warning: New input device"
	MESSAGE="${ID_VENDOR} ${ID_MODEL} (${DEVNAME}) via ${ID_BUS} (interface ${ID_USB_INTERFACE_NUM})"
	ICON="input-keyboard-symbolic"
	PRIORITY="critical"
;;
add_net)
	HEADER="Warning: New network interface"
	MESSAGE="${ID_VENDOR} ${ID_MODEL} (driver: ${ID_NET_DRIVER}) as ${INTERFACE} via ${ID_BUS} (interface ${ID_USB_INTERFACE_NUM})"
	ICON="network-wired-symbolic"
	PRIORITY="critical"
;;
*)
	exit 0
esac


for SESSIONID in $(loginctl --no-legend list-sessions | awk '{print $1}')
do
	SESSION=$(loginctl show-session ${SESSIONID})

	USERNAME=$(echo "${SESSION}" | sed -ne 's/^Name=//p')
	DISPLAY=$(echo "${SESSION}" | sed -ne 's/^Display=//p')
	TYPE=$(echo "${SESSION}" | sed -ne 's/^Type=//p')
	REMOTE=$(echo "${SESSION}" | sed -ne 's/^Remote=//p')
	ACTIVE=$(echo "${SESSION}" | sed -ne 's/^Active=//p')
	if [ ${TYPE} = "x11" ] && [ ${REMOTE} = "no" ]
	then
		export XAUTHORITY="$(getent passwd ${USERNAME} | cut -d: -f6)/.Xauthority"
		export DISPLAY
		su ${USERNAME} -c "notify-send -u ${PRIORITY} -i ${ICON} \"${HEADER}\" \"${MESSAGE}\""
	fi
done
Hat man die Dateien angelegt, muss man dafür sorgen, dass die zweite ausführbar ist und die udev-Regeln neu einlesen lassen

Code: Alles auswählen

# udevadm control --reload-rules
und schon sollte beim Anstecken eines Eingabegeräts oder Netzwerkcontrollers eine Warnung erscheinen, genauso wie man nach dem Unmounten eines USB-Stick benachrichtigt werden sollte.

Das mit den Warnungen bei neuen Eingabegeräten und Netzwerkinterfaces kommt daher, dass das die beiden Arten von Geräten sind, die (mir) im Zusammenhang mit BadUSB am relevantesten erscheinen:
http://www.heise.de/security/meldung/Vi ... 54715.html
Noch schöner wäre es irgendwie, wenn man das notification-System auf diese Art dazu verwenden könnte erst nachzufragen, ob man das Aktivieren des jeweiligen Geräts zulassen will. Interaktive Nachfragen sind ja grundsätzlich möglich, aber bei Eingabegeräten ist das uU auch eine etwas ungünstige Idee, wenn sich etwa die einzige Maus oder Tastatur aus irgendeinem Grund neu am System anmelden will und man überhaupt kein Eingabegerät mehr zu Verfügung hat um die Nachfrage zu bestätigen, ganz abgesehen davon, dass ich weniger als keine Ahnung habe, wie man das machen so eine Nachfrage realisieren könnte.

Benutzeravatar
GregorS
Beiträge: 3133
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: sicheres unmounten und andere udev-Regeln

Beitrag von GregorS » 30.10.2015 16:52:35

smutbert hat geschrieben:Hallo allerseits...[ und noch viel mehr ]
Danke für dieses Posting! Sobald ich mich mit udev beschäftigt habe, was mir in kürze bevorsteht, werde ich mir Dein Posting noch einmal in Ruhe ansehen.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: sicheres unmounten und andere udev-Regeln

Beitrag von smutbert » 30.10.2015 19:31:18

Inzwischen habe ich leider feststellen müssen, dass der Teil mit dem Benachrichtigung nach dem Unmounten nicht immer funktioniert. Er funktioniert unter Gnome (und wohl auch mit mate) nur deshalb, weil es da bei Geräten, die man softwaremäßig ausschalten kann, das Unmounten bzw. eben "Auswerfen" im Nautilus einhergeht mit dem Ausschalten des Geräts und meine udev-Regel reagiert erst auf das Ausschalten.
Kann also eine USB-Festplatte gar nicht softwaremäßig ausgeschaltet werden, wie zB ein etwas merkwürdiges 1,8"-Modell, das ich zu Hause habe, dann kommt keine Benachrichtigung.

guennid

Re: sicheres unmounten und andere udev-Regeln

Beitrag von guennid » 30.10.2015 23:11:01

smutbert hat geschrieben:Unter Gnome, Mate, XFCe und uU anderen Desktopumgebungen kann man nicht immer auf Anhieb erkennen, ob ein in der grafischen Oberfläche gemounteter USB-Stick oä bereits vollständig ausgehängt ist oder nicht.
U.a. dewegen benutze ich keine Desktopumgebungen und hänge meine Sticks händisch ein/aus. Allenfalls Debianusbmount kommt auf Geräten, bei deren Benutzern ich nicht sicher bin, ob sie händisches Einhängen hinkriegen, zum Einsatz. Und auch da muss händisch ausgehängt werden. Das wird im Terminal erledigt, soviel console muss sein. Ein sync war bisher nicht erforderlich, da man den Prompt erst zurückkriegt, wenn alles geschrieben ist.

Ist halt das alte Lied, wenn Datenträger digital benutzt, aber auch mechanisch entfernt werden können.

Das ist immer murksanfällig.

Immerhin, wenn Nautilus so schlau ist, das Aushängen zu erledigen, sollte er auch schlau genug sein, erst nach getaner Arbeit zu signalisieren, dass der Job erledigt ist. Kriegt ja sogar Windows hin - meine ich gesehen zu haben. :wink:

Grüße, Günther

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: sicheres unmounten und andere udev-Regeln

Beitrag von smutbert » 30.10.2015 23:36:16

Irgendwie bilde ich mir, war das unter Gnome auch schon einmal schlauer gelöst, aber es wundert mich auch etwas, dass ich der einzige mit dem Problem bin. Vielleicht übersehe ich noch etwas... denn grundsätzlich mag ich es schon, wenn ich in der grafischen Oberfläche Speichermedien automatisch gemountet werden und wenn das passiert will ich sie auch ohne Kommandozeile unmounten können, selbst wenn ich ohnehin ständig ein Terminal offen habe.

Windows mountet USB-Sticks afaik jedenfalls quasi mit der sync-Option (und hat deswegen schon einen meiner Sticks auf dem Gewissen).

guennid

Re: sicheres unmounten und andere udev-Regeln

Beitrag von guennid » 01.11.2015 17:46:44

Ich halte das schon immer für einen grundsätzlichen Hardware-Design-Fehler, dass etwas, was von software gebraucht wird, auch mechanisch vom User missbraucht werden kann. Die Crux fing schon bei den Floppys an. Warum sich die beim optischen Laufwerk gefundene Lösung nicht durchgesetzt hat, weiß ich nicht. Vielleicht war Gates davor. :wink: Ich hatte vor Jahrzehnten einen Compaq Armada 7770. Der einzige Rechner, den ich jemals gesehen habe, dessen Floppy-Laufwerk nur elektronisch freigegeben wurde.

Im Terminal hast du immerhin durch den fehlenden Prompt einen Hinweis darauf, dass die Software mit dem Stick noch beschäftigt ist, bevor du den "Stecker" ziehst.
Ich meine, Debianxfe wüde sich ähnlich verhalten, da kannst du nicht aushängen, wenn noch Schreibvorgänge anstehen. Anders gesagt: Wenn der Eintrag "einhängen" ausgegraut ist, ist der Stick eingehängt. Und verfügbar wird die Option (durch "aushängen") erst wieder, wenn alle Schreibvorgänge abgeschlossen sind.

Was zerstreute Menschen wie mich natürlich auch nicht daran hindert, den Stick trotzdem abzuziehen, womit wir wieder bei Satz 1 wären. :mrgreen:

Grüße, Günther

Antworten