Automount einer USB-Festplatte unter Linux (hier Debian Lenny 5.0.4) per udev

warning: fread(): Length parameter must be greater than 0 in /var/www/elchs-kramkiste.de/lapurd/includes/common.inc(1695) : eval()'d code on line 19.

Auf einem als NAS zu konfigurierenden Mini-ITX-PC mit Debian Lenny 5.0.4 wollte ich die im Netz verfügbaren Festplatte(n) als USB-Gerät(e) anstecken. Diese sollte(n) in fest definierten Verzeichnissen auf dem NAS unterhalb von /media automatisch eingebunden werden.

Das weitere Vorgehen stelle ich nachfolgend an einer 500 GByte fassenden, 2,5" USB-Platte von WD vor:

- Auf dem NAS unterhalb von /media erzeugte ich ein Verzeichnis namens WD500GB.

- Die Verzeichnisrechte darauf habe ich gleich so gesetzt, dass alle Benutzer, die Zugriff auf das NAS haben, auf dieses Verzeichnis lesen und schreiben können. Bei Verwendung per Samba, FTP oder NFS muss man anders vorgehen, aber das ist hier nicht Thema.

- In einer Konsole auf dem NAS den Befehl tail -f /var/log/messages abgesetzt und die USB-Festplatte angeschlossen.

In der Konsole erschien folgende Ausgabe:

-kernel: [ 7529.980078] usb 1-2: new high speed USB device using ehci_hcd and address 5
                                            
-kernel: [ 7530.114002] usb 1-2: configuration #1 chosen from 1 choice
-kernel: [ 7530.114858] scsi2 : SCSI emulation for USB Mass Storage devices
-kernel: [ 7530.116181] usb 1-2: New USB device found, idVendor=1058, idProduct=0704
-kernel: [ 7530.116217] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
-kernel: [ 7530.116246] usb 1-2: Product: External HDD
-kernel: [ 7530.116269] usb 1-2: Manufacturer: Western Digital                      
-kernel: [ 7530.116294] usb 1-2: SerialNumber: 57584E5830384E3432363035                      
-kernel: [ 7535.125229] scsi 2:0:0:0: Direct-Access     WD       5000BEV External 1.05 PQ: 0 ANSI: 4
-kernel: [ 7535.141577] sd 2:0:0:0: [sda] 976773168 512-byte hardware sectors (500108 MB)
-kernel: [ 7535.145537] sd 2:0:0:0: [sda] Write Protect is off
-kernel: [ 7535.147000] sd 2:0:0:0: [sda] 976773168 512-byte hardware sectors (500108 MB)
-kernel: [ 7535.147995] sd 2:0:0:0: [sda] Write Protect is off
-kernel: [ 7535.148245]  sda: sda1                                       
-kernel: [ 7535.183422] sd 2:0:0:0: [sda] Attached SCSI disk                                         
-kernel: [ 7535.183755] sd 2:0:0:0: Attached scsi generic sg1 type 0

- Da es später durchaus möglich ist, dass weitere / andere Festplatten (zusätzlich) angeschlossen werden, musste ein halbwegs eindeutiger Bezeichner dieser Festplatte gefunden werden, um Verwechselungen (weitestgehend) auszuschließen.

Also per

udevinfo -a -p $(udevinfo -q path -n /dev/<device>) >> ~/udevinfo.txt

weitere Infos zu dem Device ausgelesen (vorher natürlich den Teil "<device>" durch "sda1" ersetzt. Damit hatte ich die Infos zu den udev-Geräten in eine Datei geschrieben. Dort konnte ich dann die Merkmale der Festplatte nachlesen. Für mich relevant war der Teil:

looking at parent device '/devices/pci0000:00/0000:00:10.3/usb1/1-2/1-2:1.0/host1/target1:0:0/1:0:0:0':
    KERNELS=="1:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="3"
    ATTRS{vendor}=="WD      "
    ATTRS{model}=="5000BEV External"
    ATTRS{rev}=="1.05"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{iocounterbits}=="32"
    ATTRS{iorequest_cnt}=="0x2b"
    ATTRS{iodone_cnt}=="0x2b"
    ATTRS{ioerr_cnt}=="0x0"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{evt_media_change}=="0"
    ATTRS{queue_depth}=="1"
    ATTRS{queue_type}=="none"
    ATTRS{max_sectors}=="240"

- Mithilfe dieser Angaben habe ich mir dann eine neue udev-Regel in eine Datei geschrieben und diese dann als /dev/.udev/rules.d/10-local.rules gespeichert. Diese "udev-rules-Dateien" müssen in diesem Verzeichnis stehen, um automatisch abgearbeitet zu werden. Zudem müssen sie mit ".rules" enden. Die Reihenfolge der Abarbeitung bei mehreren ".rules-Dateien" geschieht in lexikalischer Reihenfolge. Sie können in eine ".rules-Datei" ohne Problem Regeln für mehrere Geräte eintragen (je Gerät eine Zeile, keine Zeilenumbrüche innerhalb einer Gerätedefinition).

Der Inhalt meiner neuen ".rules-Datei" lautet:

# Für die 500 GB 2,5" WD-HDD
KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="5000BEV External", \
SYMLINK+="usb_hd%n", RUN+="/bin/mount /dev/usb_hd%n /media/WD500GB"

Bitte beachten: Das "\" zeigt an, dass kein wirklicher Zeilenumbruch stattfindet, sondern die Zeile an sich hier weitergeht. Es muss also alles fortlaufend in einer Zeile stehen, damit es als ein Befehl abgearbeitet wird.

Linux-typisch werden Kommentar-Zeilen mit einem "#" begonnen. Danach kommt der eigentlich wichtige Teil:

KERNEL=="sd*": steht für ein SCSI-Device-Kernel-Treiber.
SUBSYSTEMS=="scsi": bedeutet wohl das Kernel-Subsystem.
ATTRS{model}=="5000BEV External": Diese Info stammt aus dem o.a. udevinfo-Dateiinhalt. Damit ist eine Unterscheidung zu anderen USB-Festplatten in meinem Besitz gegeben, da ich sonst nur welche anderer Größe und Hersteller habe. Ansonsten wäre ein ATTRS{serial}=="57584E5830384E3432363035" evtl. sinnvoller (wie es in der udevinfo.txt später noch zu lesen war).

Damit sind die 3 Unterscheidungsmerkmale von anderen udev-Geräten festgelegt bzw. benannt. Jetzt kommen die beiden daraus abzuleitenden Aktionen für udev.

SYMLINK+="usb_hd%n": Hierdurch werden symbolische Geräte-Links unterhalb von /dev/udev/names sowie unterhalb von /dev beim Anschließen dieser Platte automatisch erzeigt und zwar mit einer dynamisch erzeugten Nummer (durch den Parameter "%n"). Statt "usb_hd" können Sie auch einen beliebigen anderen Text wählen.
RUN+="/bin/mount /dev/usb_hd%n /media/WD500GB": Nun wird automatisch das Laufwerk (besser Device) "usb_hd%n" nach /media/WD500GB (das Verzeichnis wie am Anfang erstellt) gemountet bzw. in das System eingebunden. Hier wird ebenfalls die dynamisch erzeugte Nummer verwendet um eine eindeuitige Zuordnung gewährleisten zu können.

Hinweis / Wichtig(!): Anscheinend sind die von Hand angelegten Dateien unter /dev/.udev/rules.d nur bis zum nächsten Neustart des Systems vorhanden. Die Datei 10-local.rules muss deshalb unter /etc/udev/rules.d angelegt werden, um auch einen System-Neustart zu überstehen.

Wie immer ist die Einhaltung der genauen Syntax zwingend erforderlich. Insbesondere die teilweise verwendeten "+"-Zeichen bei SYMLINK und RUN und die Kommatas sind wesentlich. Falls nach doppelter Überprüfung doch nichts funktioniert, für den Device-Namen "usb_hd1" (für die erste angeschlossene USB-Festplatte, sonst kann es auch usb_hd2 usw. sein) kein automount erfolgt und das "message-Log" wie oben aussieht, geben Sie bitte bei angeschlossenem USB-Drive den mount-Befehl ("/bin/mount /dev/usb_hdX /media/WD500GB") in einer Konsole ein. Sollte die zu mountende Partition in einem vom mount-Befehl nicht selbst erkannten Format vorliegen (z.B. NTFS), dann müssen Sie dies dem Befehl als Option (Parameter "-t") mitteilen.

Bei mir sieht das "message-Log" jetzt wie folgt aus

... (ab der drittletzten-Zeile vom obigen Log)
-kernel: [ 8552.628164]  sda: sda1
-kernel: [ 8552.660902] sd 5:0:0:0: [sda] Attached SCSI disk
-kernel: [ 8552.661226] sd 5:0:0:0: Attached scsi generic sg1 type 0
-kernel: [ 8553.904201] kjournald starting.  Commit interval 5 seconds
-kernel: [ 8553.906539] EXT3 FS on sda1, internal journal
-kernel: [ 8553.906567] EXT3-fs: mounted filesystem with ordered data mode.

und ich kann auf den Inhalt der WD-USB-Festplatte in vollem Umfang zugreifen.