Registrierung
leer
leer
newposts
Users
search
FAQ
Login
Start

Hallo Gast, und Willkommen im Forum. Sie müssen sich einloggen oder registrieren, um alle Funktionen nutzen zu können.


PN's Forum \ Computer \ Software \ Betriebssysteme \ Linux \ Debian Wheezy - automatisch Script beim Anschließen einer USB-Festplatte ausführen


 Poison Nuke  *

#1 Verfasst am 17.02.2014, um 11:26:08



Hio,

folgendes Ziel bei mir: NAS-Server ohne Monitor und nur Zugang über SSH per Key.
Ungefähr einmal pro Woche soll ein Backup aller Daten auf eine externe USB HDD gemacht werden, die aber nicht rund um die Uhr laufen soll, also dafür dann angeschlossen wird.

Regulär müsste man jedes mal sich einloggen, HDD mounten, rsync starten und unmounten, bzw halt entsprechend ein Script aufrufen.


Um das zu vermeiden kann man udev nutzen, den Hotplug-Event Dienst von Linux. Dieser arbeitet bei jedem Hotplug Event alle Regeln ab, die in folgenden Verzeichnissen liegen können

/etc/udev/rules.d/xx-rulename.rules
/lib/udev/rules.de/xx-rulename.rules


Wobei ersteres Verzeichnis Vorrang hat und Regeln aus dem lib überschreibt.


Da für USB-Festplatten leider keine Regeln automatisch erstellt werden, was komischerweise für fast alle anderen Geräte aber gemacht wird, muss man nun eine eigene Regel erstellen.

Dazu erstellt man als root eine neue rules Datei nach dem gleichen Schema wie die anderen Dateien, am besten mit einer freien Nummer. Da die Regeln in der Reihenfolge der Nummer abgearbeitet werden und bei Nummer 60 überhaupt erst das SCSI Subsystem initialisiert wird sollte man die Regel im Bereich der 70-80 ansiedeln.


Ich habe mich für folgende Datei entschieden:

Quellcode
/lib/udev/rules.d/79-persisten-USB.rules




Für die Regeln dieser Datei benötigt man nun noch Informationen über das Gerät. Dazu nutzt man die udev-tools, das Gerät muss dazu schon angeschlossen sein und man muss wissen, welchen aktuellen Gerätenamen es hat (lässt sich am besten über die letzten Einträge im syslog herausfinden:


Quellcode
tail /var/log/syslog

Feb 15 09:44:29 nas kernel: [  305.327866] usb 3-3: new SuperSpeed USB device number 2 using xhci_hcd
Feb 15 09:44:29 nas kernel: [  305.344561] usb 3-3: New USB device found, idVendor=174c, idProduct=55aa
Feb 15 09:44:29 nas kernel: [  305.344565] usb 3-3: New USB device strings: Mfr=2, Product=3, SerialNumber=1
Feb 15 09:44:29 nas kernel: [  305.344568] usb 3-3: Product: External HDD
Feb 15 09:44:29 nas kernel: [  305.344570] usb 3-3: Manufacturer: 01234567890123456789012345678901234567890123
Feb 15 09:44:29 nas kernel: [  305.344573] usb 3-3: SerialNumber: 201311210379
Feb 15 09:44:30 nas kernel: [  305.383583] Initializing USB Mass Storage driver...
Feb 15 09:44:30 nas kernel: [  305.383891] scsi1 : usb-storage 3-3:1.0
Feb 15 09:44:30 nas kernel: [  305.383994] usbcore: registered new interface driver usb-storage
Feb 15 09:44:30 nas kernel: [  305.383996] USB Mass Storage support registered.
Feb 15 09:44:39 nas kernel: [  315.285816] scsi 1:0:0:0: Direct-Access     WESTERN DIGITAL WD7500BVPT          1AA0 PQ: 0 ANSI: 5
Feb 15 09:44:39 nas kernel: [  315.287124] sd 1:0:0:0: Attached scsi generic sg2 type 0
Feb 15 09:44:39 nas kernel: [  315.287600] sd 1:0:0:0: [sdc] 1465149168 512-byte logical blocks: (750 GB/698 GiB)
Feb 15 09:44:39 nas kernel: [  315.287969] sd 1:0:0:0: [sdc] Write Protect is off
Feb 15 09:44:39 nas kernel: [  315.287973] sd 1:0:0:0: [sdc] Mode Sense: 23 00 00 00
Feb 15 09:44:39 nas kernel: [  315.288225] sd 1:0:0:0: [sdc] No Caching mode page present
Feb 15 09:44:39 nas kernel: [  315.289819] sd 1:0:0:0: [sdc] Assuming drive cache: write through
Feb 15 09:44:39 nas kernel: [  315.292520] sd 1:0:0:0: [sdc] No Caching mode page present
Feb 15 09:44:39 nas kernel: [  315.294100] sd 1:0:0:0: [sdc] Assuming drive cache: write through
Feb 15 09:44:39 nas kernel: [  315.302489]  sdc: unknown partition table
Feb 15 09:44:39 nas kernel: [  315.303338] sd 1:0:0:0: [sdc] No Caching mode page present
Feb 15 09:44:39 nas kernel: [  315.304908] sd 1:0:0:0: [sdc] Assuming drive cache: write through
Feb 15 09:44:39 nas kernel: [  315.306468] sd 1:0:0:0: [sdc] Attached SCSI disk
Feb 15 09:47:34 nas kernel: [  488.937975] sd 1:0:0:0: [sdc] No Caching mode page present
Feb 15 09:47:34 nas kernel: [  488.939578] sd 1:0:0:0: [sdc] Assuming drive cache: write through
Feb 15 09:47:34 nas kernel: [  488.941365]  sdc: sdc1


daran ist zu sehen, es handelt sich um /dev/sdc


Um die nötigen Attribute heraus zu finden, damit man eine Rule für udev schreiben kann, die immer nur für dieses Gerät und keine andere Festplatte ausgeführt wird, führt man nun folgenden Befehl aus:


Quellcode
udevadm info -a -p /dev/sdc

Je nach System kann es auch sein, dass man einen anderen Befehl benötigt:

Quellcode
udevinfo -a -p /dev/sdc



Aus der folgenden Ausgabe sucht man sich am besten "ATTRS{model}" und "ATTRS{serial}" heraus, das sind normalerweise zusammen relativ eindeutige Parameter.
Allerdings muss man aufpassen, es kommt vor, dass es zwei serial Attribute gibt mit verschiedenen Werten. Dann funktioniert das ganze leider nicht mehr korrekt.


Nun kann man die Regel erstellen:

Quellcode
KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{serial}=="201311210379", ATTRS{model}=="WD7500BVPT         " , SYMLINK+="usbhd%n", RUN+="/root/USBbackup.sh"


Kurz erläutert:
- Wenn ein neues Kernel-Gerät beginnend mit "sd" erstellt wird, prüfe die folgenden Attribute.
- SYMLINK+ erstellt einen zusätzlichen Eintrag in /dev, damit könnte man die Festplatte dann unter einem eindeutigen Gerätenamen ansprechen, wobei das bei mir nicht so zuverlässig funktioniert hat
- RUN+ ist der wichtige Part, hier wird das genannte Script ausgeführt.


Starte nun udev neu

Quellcode
/etc/init.d/udev restart





Quellcode
#warte für 5 Sekunden, da die Festplatte einen kurzen Moment benötigt um hoch zu fahren
sleep 5s

mount -t xfs /dev/sdc1 /mnt/backup

/usr/bin/rsync -aq --delete '/home/' '/mnt/backup'


#warte eine Sekunde auf kflushd
sleep 1s

#erzwinge einen zusätzlichen sync, umount macht das zwar auch, bricht aber gern mit einem busy ab
/bin/sync

#jetzt warte noch etwas und führe dann zwei umounts aus, da es trotz sync immer noch passieren kann, dass der erste umount mit einem "busy" Fehler abbricht
sleep 1s
umount /mnt/backup
sleep 1s
umount /mnt/backup





Wenn man das Verhalten testen möchte, dann kann man dies mit


Quellcode
udevadm --trigger --sysname-match=sdc

triggern. Es empfiehlt sich dafür dann entweder in der udev.conf das Error-Level auf Debug zu stellen, damit man im Syslog überhaupt etwas sieht, oder alternativ in das Run-Script eine Echo-Ausgabe zu implementieren.



Ich brauch jetzt für ein Backup einfach nur noch die USB Festplatte einschalten/anschließen, dann warte ich ab bis die LED aufhört zu blinken und kann sie dann wieder gefahrlos entfernen




greetz
Poison Nuke

bearbeitet von Poison Nuke, am 17.02.2014, um: 11:45:58

PN's Forum \ Computer \ Software \ Betriebssysteme \ Linux \ Debian Wheezy - automatisch Script beim Anschließen einer USB-Festplatte ausführen


- Zurück zur Homepage - Eigene Beiträge - Neue Beiträge - Wer ist online? - Impressum - Datenschutz - Statistiken -



Board coded and provided by: Poison Nuke
Copyright 2007-2014, Robert Menger