Wie führe ich ein Programm aus, wenn eine bestimmte Festplatte angeschlossen ist (unter Debian)?

Wie führe ich ein Programm aus, wenn eine bestimmte Festplatte angeschlossen ist (unter Debian)?

Ich möchte automatisch einen bestimmten Befehl ausführen, wenn ein Laufwerk (ein bestimmtes Laufwerk oder ein beliebiges Laufwerk) im laufenden Betrieb angeschlossen wird. Ich verwende ein Headless-Debian-System.

Genauer gesagt möchte ich das Laufwerk automatisch mounten. Ich könnte das mit AutoFS machen, aber das ist ein Truecrypt-Laufwerk, und AutoFS funktioniert meines Wissens nach damit nicht. Ich muss also jedes Mal, wenn ein Laufwerk angeschlossen wird, eine Art Skript ausführen, das das Laufwerk erkennt und die erforderlichen Befehle ausführt.

Wie kann ich automatisch etwas tun, wenn ein Laufwerk angeschlossen wird? Und wie kann ich wiederum etwas anderes tun, wenn das Laufwerk entfernt wird?

Antwort1

Eigentlich ist es ganz einfach: Sie müssen eine benutzerdefinierte udev-Regel schreiben, die Sie in

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

Dies hat den Vorteil, dass Ihre benutzerdefinierte Regel vor den anderen Regeln gelesen wird.

Diese Datei enthält eine einzelne Zeile dieses Formulars

  <conditions to be met> KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"

Dies bedeutet:

  1. „Zu erfüllende Bedingungen“ sind eine Reihe von Bedingungen, die speziell für Ihre Festplatte gelten und diese eindeutig identifizieren, so dass beim Einsetzen einer anderen Festplatte keine Aktion ausgeführt wird.
  2. KERNEL=="sd?1" weist udev an, diese Regel nur dann zu überprüfen, wenn neue Partitionen /dev/sda1, /dev/sdb1, ... erkannt werden. Falls erforderlich, können Sie dasselbe nicht mit einer Partition, sondern mit dem Gerät tun. In diesem Fall ist KERNEL=="sd?" die entsprechende Anweisung.
  3. NAME="my_usb_adapter" erstellt einen dauerhaften Knoten unter /dev/my_usb_adapter, sodass Sie wissen, wo Sie das zu mountende Gerät finden, falls Sie es mounten müssen.
  4. Die RUN-Regel ist selbsterklärend. Denken Sie daran, my_programdie Datei ausführbar zu machen, ohne dass eine Terminaleingabe oder -ausgabe erforderlich ist.

Die für den Abgleich notwendigen Informationen erhalten Sie mit dem folgenden Befehl:

 udevadm info -a -p $(udevadm info -q path -n /dev/sdb)

wenn Ihre Festplatte /dev/sdb ist, ändern Sie sie ansonsten nach Bedarf. Dies wird eine große Menge an Informationen liefern. Ich würde suchen nach

  ATTRS{idVendor}=="18a5"
  ATTRS{idProduct}=="0302"
  ATTRS{serial}=="TT0E4E008XW3DT9H"

(Diese Werte gelten für einen meiner USB-Dongles, Ihre Werte werden anders sein.) Ein wichtiger Vorbehalt: Die Übereinstimmungsregeln müssen vom selben übergeordneten Gerät übernommen werden, Sie können sie nicht mischen.

Jetzt können wir die endgültige Regel wie folgt schreiben:

 ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0302", ATTRS{serial}=="TT0E4E008XW3DT9H", KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"

Beachten Sie, dass udev-Dateien keine Zeilenumbrüche ausführen können. Wenn Sie dies tun, betrachtet udev die unterbrochene Zeile als zwei separate Regeln. Es erfolgt keine Ausgabe auf Ihrem Terminal. Außerdem habe ich sehr sorgfältig zwischen =, ==, und unterschieden +=: Stellen Sie sicher, dass Sie hier keine Fehler machen.

verwandte Informationen