USB-Stick mit udev eindeutig benennen

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
K (udef => udev)
K
 
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Dieses '''HowTo''' beschreibt wie man mit ''udev'' und ''usbmmount'' einen USB-Speicher-Stick anhand der Seriennummer eindeutig identifizieren und im System an einer genau festgelegten Stelle mounten kann. Ein bestimmter Stick wird also nicht mal nach /media/usb0 und ein anders mal nach /media/usb2 gemountet, sondern immer nach z.B. /mnt/videostick. Eindeutige Mountpoints erleichtern z.B. das Erstellen von Befehlen für das [[Filebrowser-plugin]].
+
Diese Anleitung beschreibt wie man mit ''udev'' und ''usbmount'' einen {{wikipedia|USB-Massenspeicher}} anhand der Seriennummer eindeutig identifizieren und im System an einer genau festgelegten Stelle mounten kann. Ein bestimmter USB-Stick wird also nicht mal nach /media/usb0 und ein anders mal nach /media/usb2 eingebunden, sondern immer nach z.B. /mnt/videostick. Eindeutige Mountpoints erleichtern z.B. das Erstellen von Befehlen für das [[Filebrowser-plugin]].
  
 
Das ganze sollte auch mit externen USB-Festplatten und anderen USB-Massenspeichern funktionieren.
 
Das ganze sollte auch mit externen USB-Festplatten und anderen USB-Massenspeichern funktionieren.
  
{{Box Hinweis|Nach diesem HowTo wird ein ein Originalscript aus dem usbmount-Paket verändert. Sie tun dies ausdrücklich '''auf eigene Gefahr!''' Außerdem bedeutet dies, dass bei einem Update des Originalpaketes die Änderung am Script u.U. erneut durchgeführt werden muss.}}
+
{{Box Hinweis|Nach dieser Anleitung wird ein ein Originalskript aus dem usbmount-Paket verändert. Sie tun dies ausdrücklich '''auf eigene Gefahr!''' Außerdem bedeutet dies, dass bei einem Update des Originalpaketes die Änderung am Skript u.U. erneut durchgeführt werden muss.}}
  
 
==Voraussetzungen==
 
==Voraussetzungen==
Zeile 9: Zeile 9:
  
 
==Schritt 1 - Ermittlung der Seriennummer ==
 
==Schritt 1 - Ermittlung der Seriennummer ==
Zunächst stellen wir fest, welche Seriennummer oder andere Identifizierungen unser Stick liefert. Dazu müssen wir wissen, welches Device das System beim Einstecken vergibt. Das ermitteln wir über das Syslog:
+
Zunächst stellen wir fest, welche Seriennummer oder andere Identifizierungen unser USB-Stick liefert. Dazu müssen wir wissen, welches Device das System beim Einstecken vergibt. Das ermitteln wir über das Syslog:
  
 
  tail -f /var/log/syslog
 
  tail -f /var/log/syslog
  
dann den Stick einstecken. Im Syslog sollte dann etwas auftauchen wie "... kernel:  sdh: sdh1". Je nachdem wie viele SATA- oder USB-Geräte ihr angeschlossen habt, unterscheidet sich die Angabe im dritten Buchstaben (sd'''h'''), also ggf. im folgenden anpassen. Mit Strg-c verlassen wir die Syslog-Ausgabe.
+
dann den USB-Stick einstecken. Im Syslog sollte dann etwas auftauchen wie "... kernel:  sdh: sdh1". Je nachdem wie viele SATA- oder USB-Geräte ihr angeschlossen habt, unterscheidet sich die Angabe im dritten Buchstaben (sd'''h'''), also gegebenenfalls im folgenden anpassen. Mit Strg-c verlassen wir die Syslog-Ausgabe.
  
 
Als nächstes ermitteln wir mit udevinfo die eindeutige Seriennummer:
 
Als nächstes ermitteln wir mit udevinfo die eindeutige Seriennummer:
Zeile 33: Zeile 33:
 
Unter /etc/udev/rules.d/ befinden sich einige vordefinierte Regeln (.rules), die in alphanumerischer Reihenfolge abgearbeitet werden. Wir müssen dafür sorgen, dass unsere neue Regeldatei vor der originalen Datei z60_usbmount.rules ausgeführt wird. Unsere Regel sollte also mit z59 beginnen. Wir legen daher die neue Datei /etc/udev/rules.d/z59_usb-identifyer.rules an mit folgendem Inhalt an:
 
Unter /etc/udev/rules.d/ befinden sich einige vordefinierte Regeln (.rules), die in alphanumerischer Reihenfolge abgearbeitet werden. Wir müssen dafür sorgen, dass unsere neue Regeldatei vor der originalen Datei z60_usbmount.rules ausgeführt wird. Unsere Regel sollte also mit z59 beginnen. Wir legen daher die neue Datei /etc/udev/rules.d/z59_usb-identifyer.rules an mit folgendem Inhalt an:
  
KERNEL=="sd*", ATTRS{serial}=="0123456789ABCDEF", ATTRS{product}=="Cn Memory", \
+
<pre>KERNEL=="sd*", ATTRS{serial}=="0123456789ABCDEF", ATTRS{product}=="Cn Memory", SYMLINK+="videostick%n", \
      SYMLINK="videostick%n", ENV{SPECIALMOUNTPOINT}="/mnt/videostick"
+
ENV{SPECIALMOUNTPOINT}="/mnt/videostick"
 +
</pre>
  
Der Teil mit SYMLINK ist für unseren Zweck zwar nicht erforderlich, kann aber hilfreich werden, wenn wir später mal den Stick manuell mounten wollen. Dann kann man statt /dev/sd[?]1 /dev/videostick1 verwenden. ATTRS{product} wurde als zusätzliches Kriterium eingefügt, nur für den Fall.
+
Der Teil mit SYMLINK ist für unseren Zweck zwar nicht erforderlich, kann aber hilfreich werden, wenn wir später mal den USB-Stick manuell mounten wollen. Dann kann man statt /dev/sd[?]1 /dev/videostick1 verwenden. ATTRS{product} wurde als zusätzliches Kriterium eingefügt, nur für den Fall.
  
Wichtig hingegen ist ENV{SPECIALMOUNTPOINT}="/mnt/videostick". Hiermit übergeben wir eine neue Umgebungsvariable mit dem Wunschverzeichnis an das usbmount-Script (nächster Schritt).
+
Wichtig hingegen ist ENV{SPECIALMOUNTPOINT}="/mnt/videostick". Hiermit übergeben wir eine neue Umgebungsvariable mit dem Wunschverzeichnis an das usbmount-Skript (nächster Schritt).
  
 
Den Mountpoint sollten wir dann noch einmalig anlegen:
 
Den Mountpoint sollten wir dann noch einmalig anlegen:
  
mkdir /mnt/videostick
+
<pre>mkdir /mnt/videostick</pre>
  
 
Wenn Sie mehrere USB-Massenspeicher zuordnen wollen, wiederholen Sie die Schritte 1 und 2 für die anderen Geräte und legen Sie für jede Seriennummer eine neue Zeile in unserer udev-Regel z59.. an und vergeben dort je einen eindeutigen SYMLINK und einen SPECIALMOUNTPOINT.
 
Wenn Sie mehrere USB-Massenspeicher zuordnen wollen, wiederholen Sie die Schritte 1 und 2 für die anderen Geräte und legen Sie für jede Seriennummer eine neue Zeile in unserer udev-Regel z59.. an und vergeben dort je einen eindeutigen SYMLINK und einen SPECIALMOUNTPOINT.
  
==Schritt 3 - Script von usbmount anpassen==
+
==Schritt 3 - Skript von usbmount anpassen==
 
Über die vorhandene udev-Regel z60_umount.rules wird dann usbmount aufgerufen.
 
Über die vorhandene udev-Regel z60_umount.rules wird dann usbmount aufgerufen.
  
Da hier am Anfang des Scripts die Variable $MOUNTPOINTS leider geleert wird, können wir diese nicht direkt aus udev übergeben, deshalb der Umweg.
+
Da hier am Anfang des Skripts die Variable $MOUNTPOINTS leider geleert wird, können wir diese nicht direkt aus udev übergeben, deshalb der Umweg.
  
Wir ändern also das Script /usr/share/usbmount/usbmount wie folgt. Nach dem folgenden Originalabsatz...
+
Wir ändern also das Skript /usr/share/usbmount/usbmount wie folgt. Nach dem folgenden Originalabsatz...
 
  # Read configuration file.
 
  # Read configuration file.
 
  if test -r /etc/usbmount/usbmount.conf; then
 
  if test -r /etc/usbmount/usbmount.conf; then
Zeile 64: Zeile 65:
 
Erläuterung: In der original usbmount.conf steht
 
Erläuterung: In der original usbmount.conf steht
 
  MOUNTPOINTS="/media/usb0 /media/usb1 ... /media/usb7"
 
  MOUNTPOINTS="/media/usb0 /media/usb1 ... /media/usb7"
Unsere Ergänzung schreibt nun das Wunschziel an den Anfang der Liste. Falls dieses zur Laufzeit aus irgendeinem Grunde nicht verfügbar ist weil zuvor fehlerhaft ge(un)mountet wurde oder der Mountpoint noch nicht mit mkdir angelegt war, wird dann als Rückfallebene wieder auf /media/usb[n] gemountet.
+
Unsere Ergänzung schreibt nun das Wunschziel an den Anfang der Liste. Falls dieses zur Laufzeit aus irgendeinem Grunde nicht verfügbar ist weil zuvor fehlerhaft ge(un)mountet wurde oder der Mountpoint noch nicht mit mkdir angelegt war, wird dann als Rückfallebene wieder auf /media/usb[n] eingebunden.
  
 
==Schritt 4 - Abschlussarbeiten==
 
==Schritt 4 - Abschlussarbeiten==
Zeile 71: Zeile 72:
 
/etc/init.d/udev restart
 
/etc/init.d/udev restart
  
Damit sollte zumindest das automatische Mounten beim Einstecken des Sticks funktionieren. Starten Sie zum Testen wieder das aus Schritt 1 bekannte
+
Damit sollte zumindest das automatische Mounten beim Einstecken des USB-Sticks funktionieren. Starten Sie zum Testen wieder das aus Schritt 1 bekannte
  
 
  tail -f /var/log/syslog
 
  tail -f /var/log/syslog
  
und stecken dann den Stick ein, usbmount sollte dann nach wenigen Sekunden etwa folgendes melden:
+
und stecken dann den USB-Stick ein, usbmount sollte dann nach wenigen Sekunden etwa folgendes melden:
 
  usbmount[30261]: executing command: mount -tvfat -o...[gekürzt]... /dev/sdh1 /mnt/videostick
 
  usbmount[30261]: executing command: mount -tvfat -o...[gekürzt]... /dev/sdh1 /mnt/videostick
 
Glückwunsch! Sie haben es geschafft.
 
Glückwunsch! Sie haben es geschafft.

Aktuelle Version vom 30. Juni 2013, 21:56 Uhr

Diese Anleitung beschreibt wie man mit udev und usbmount einen USB-Massenspeicher anhand der Seriennummer eindeutig identifizieren und im System an einer genau festgelegten Stelle mounten kann. Ein bestimmter USB-Stick wird also nicht mal nach /media/usb0 und ein anders mal nach /media/usb2 eingebunden, sondern immer nach z.B. /mnt/videostick. Eindeutige Mountpoints erleichtern z.B. das Erstellen von Befehlen für das Filebrowser-plugin.

Das ganze sollte auch mit externen USB-Festplatten und anderen USB-Massenspeichern funktionieren.

Hinweis
Hinweis

Nach dieser Anleitung wird ein ein Originalskript aus dem usbmount-Paket verändert. Sie tun dies ausdrücklich auf eigene Gefahr! Außerdem bedeutet dies, dass bei einem Update des Originalpaketes die Änderung am Skript u.U. erneut durchgeführt werden muss.


Inhaltsverzeichnis

[Bearbeiten] Voraussetzungen

Dieser Artikel basiert auf einer Installation des C't-VDR 6, bzw. auf Debian Etch mit installiertem udev und usbmount. Bei anderen Systemen sind die Pfadangaben möglicherweise anders.

[Bearbeiten] Schritt 1 - Ermittlung der Seriennummer

Zunächst stellen wir fest, welche Seriennummer oder andere Identifizierungen unser USB-Stick liefert. Dazu müssen wir wissen, welches Device das System beim Einstecken vergibt. Das ermitteln wir über das Syslog:

tail -f /var/log/syslog

dann den USB-Stick einstecken. Im Syslog sollte dann etwas auftauchen wie "... kernel: sdh: sdh1". Je nachdem wie viele SATA- oder USB-Geräte ihr angeschlossen habt, unterscheidet sich die Angabe im dritten Buchstaben (sdh), also gegebenenfalls im folgenden anpassen. Mit Strg-c verlassen wir die Syslog-Ausgabe.

Als nächstes ermitteln wir mit udevinfo die eindeutige Seriennummer:

udevinfo -a -p /sys/block/sdh

Hier erhalten wir eine in Blöcke unterteilte lange Ausgabe. In einem der Blöcke finden sich die für uns interessanten Angaben:

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2.4':
   KERNELS=="5-2.4"
   SUBSYSTEMS=="usb"
   DRIVERS=="usb"
   ATTRS{serial}=="0123456789ABCDEF"
   ATTRS{product}=="Cn Memory"

Die Seriennummer lautet hier also 0123456789ABCDEF. Die "product"-Kennung kann man für alle Fälle auch noch verwenden.

[Bearbeiten] Schritt 2 - Anlegen einer Regel für udev

Unter /etc/udev/rules.d/ befinden sich einige vordefinierte Regeln (.rules), die in alphanumerischer Reihenfolge abgearbeitet werden. Wir müssen dafür sorgen, dass unsere neue Regeldatei vor der originalen Datei z60_usbmount.rules ausgeführt wird. Unsere Regel sollte also mit z59 beginnen. Wir legen daher die neue Datei /etc/udev/rules.d/z59_usb-identifyer.rules an mit folgendem Inhalt an:

KERNEL=="sd*", ATTRS{serial}=="0123456789ABCDEF", ATTRS{product}=="Cn Memory", SYMLINK+="videostick%n", \
ENV{SPECIALMOUNTPOINT}="/mnt/videostick"

Der Teil mit SYMLINK ist für unseren Zweck zwar nicht erforderlich, kann aber hilfreich werden, wenn wir später mal den USB-Stick manuell mounten wollen. Dann kann man statt /dev/sd[?]1 /dev/videostick1 verwenden. ATTRS{product} wurde als zusätzliches Kriterium eingefügt, nur für den Fall.

Wichtig hingegen ist ENV{SPECIALMOUNTPOINT}="/mnt/videostick". Hiermit übergeben wir eine neue Umgebungsvariable mit dem Wunschverzeichnis an das usbmount-Skript (nächster Schritt).

Den Mountpoint sollten wir dann noch einmalig anlegen:

mkdir /mnt/videostick

Wenn Sie mehrere USB-Massenspeicher zuordnen wollen, wiederholen Sie die Schritte 1 und 2 für die anderen Geräte und legen Sie für jede Seriennummer eine neue Zeile in unserer udev-Regel z59.. an und vergeben dort je einen eindeutigen SYMLINK und einen SPECIALMOUNTPOINT.

[Bearbeiten] Schritt 3 - Skript von usbmount anpassen

Über die vorhandene udev-Regel z60_umount.rules wird dann usbmount aufgerufen.

Da hier am Anfang des Skripts die Variable $MOUNTPOINTS leider geleert wird, können wir diese nicht direkt aus udev übergeben, deshalb der Umweg.

Wir ändern also das Skript /usr/share/usbmount/usbmount wie folgt. Nach dem folgenden Originalabsatz...

# Read configuration file.
if test -r /etc/usbmount/usbmount.conf; then
    . /etc/usbmount/usbmount.conf
fi

fügen wir neu ein:

#Add special mountpoint for udev-z59-identified devices
if test "$SPECIALMOUNTPOINT" != ""; then
    MOUNTPOINTS="$SPECIALMOUNTPOINT $MOUNTPOINTS"
fi

Erläuterung: In der original usbmount.conf steht

MOUNTPOINTS="/media/usb0 /media/usb1 ... /media/usb7"

Unsere Ergänzung schreibt nun das Wunschziel an den Anfang der Liste. Falls dieses zur Laufzeit aus irgendeinem Grunde nicht verfügbar ist weil zuvor fehlerhaft ge(un)mountet wurde oder der Mountpoint noch nicht mit mkdir angelegt war, wird dann als Rückfallebene wieder auf /media/usb[n] eingebunden.

[Bearbeiten] Schritt 4 - Abschlussarbeiten

Wir müssen noch den udev-daemon neu starten, damit die neue z59-Regel auch aktiv wird:

/etc/init.d/udev restart

Damit sollte zumindest das automatische Mounten beim Einstecken des USB-Sticks funktionieren. Starten Sie zum Testen wieder das aus Schritt 1 bekannte

tail -f /var/log/syslog

und stecken dann den USB-Stick ein, usbmount sollte dann nach wenigen Sekunden etwa folgendes melden:

usbmount[30261]: executing command: mount -tvfat -o...[gekürzt]... /dev/sdh1 /mnt/videostick

Glückwunsch! Sie haben es geschafft.

Zum manuellen Mounten ergänzt man geschickter Weise noch die /etc/fstab um den in Schritt 2 angelegten SYMLINK:

/dev/videostick1 /mnt/videostick vfat rw,async,group

[Bearbeiten] Literatur

  • Mirko Dölle: USB-Automateur. USB-Geräte unter Linux erkennen und in automatische Prozesse einbinden. In: c't. 16/2007, S. 184-186.

[Bearbeiten] Weblinks