|
|
|
Udev: Passende Anwendungen zu Geräten automatisch starten |
|
|
|
Man steckt den MP3-Player ein und es startet automatisch der Filemanager mit den passenden Verzeichnissen. br>
Man schließt die Kammera an und die neuen Bilder werden von selbst ins Fotoalbum übertragen.
So sollte es sein und so kann man es auch einrichten.
Es geht mit udev. Etwas Handarbeit ist nötig, aber es lohnt sich.
Udev sorgt dafür das Geräte im System angelegt und verfügbar gemacht werden. Mit Hilfe von udev kann man aber auch scripte zu bestimmten Geräten ausführen. Genau wie das geht wird hier erklärt.
Als Beispiel dient hier ein MP3-Player. Das Verfahren kann man aber ansich auf jedes andere Gerät genauso übertragen.
Im Verzeichnes /etc/udev/rules.d/ werden die Regeln (rules) definiert, wie bzw. was udev mit Geräten machen soll, wenn diese angeschlossen werden.
Es empfielt sich die bestehenden rules nicht zu ändern, sondern eine eigene Datei anzulegen.
Die Hauptdatei ist 50-udev-default.rules. Damit die eigenen Regeln berücksichtigt werden, sollten diese vor denen ausgelesen werden.
Als Beispiel nennen wir die Datei zB. 10-my.rules .
In der Rules Datei (im Beispiel 10-my.rules), gilt es jetzt die Hardware zu definieren für die man eine Aktion ausführen will.
In der Regel bestimmt man das Gerät zB. über die Art und Namen des Herstellers und Produkts. Manchmal muss man noch etwas genauer werden, aber dazu später mehr. Die Nötigen Informationen liefert das tool udevinfo.
Also direkt zu unserem Beispiel.
Man schließt seinen MP3-Player (USBStick wäre hier identisch) an.
Je nachdem wie viele Massenspeicher man im System hat, bekommt der MP3 Player eine andere Gerätedatei zu gewiesen. Hat man zB. eine Festplatte, so ist diese das Gerät /dev/sda , in dem Fall wird der MP3Player /dev/sdb.
Wer nicht weiß, welche Gerätebezeichnung sein MP3Player jetzt genau hat, der findet diese nach dem einstecken mit Hilfe von dmesg | tail herraus.
Dies führt zum Beispiel zu solch einer Ausgabe:
usb-storage: waiting for device to settle before scanning
scsi 15:0:0:0: Direct-Access Samsung YP-U2 0100 PQ: 0 ANSI: 4
sd 15:0:0:0: [sdd] 254656 2048-byte hardware sectors (522 MB)
sd 15:0:0:0: [sdd] Write Protect is off
sd 15:0:0:0: [sdd] Mode Sense: 3e 00 00 00
sd 15:0:0:0: [sdd] Assuming drive cache: write through
sdd: sdd1
sd 15:0:0:0: [sdd] Attached SCSI removable disk
sd 15:0:0:0: Attached scsi generic sg2 type 0
usb-storage: device scan complete
Man sieht also in dem Beispiel wird der MP3-Player als Gerät /dev/sdd bezeichnet. Wie gesagt, die Bezeichnung hängt von der Anzahl der angeschlossenen Massenspeicher ab.
Um den MP3-Player jetzt exakt in der udev-rule identifizieren zu können, brauchen wir ja zumindest schon mal die Angaben zur Art des Geräts, Name des Herstellers und Produkts. Wenn man genau hinguckt, kann man diese zwar auch schon aus der obigen Ausgabe erkennen, aber ich möchte trotzdem noch mal erläutern wie man die entscheidenden Felder im sysfs findet, damit man die Regeln nach bedarf auch anders oder enger definieren kann und damit man besser das Prinzip versteht, wie man das ganze auch auf andere Geräte anwenden kann.
Wie schon gesagt, kann man mit udevinfo Informationen zu den angeschlossenen Geräten auslesen. Dies tun wir jetzt auch mal mit udevinfo -a -p /sys/block/sdd .
/sys/block/sdd ergibt sich daraus, weil wir ja gerne Informationen zum block device sdd hätten. Die Ausgabe sie dann wie folgt aus (etwas gekürzt):
looking at device '/block/sdd':
KERNEL=="sdd"
SUBSYSTEM=="block"
DRIVER==""
ATTR{dev}=="8:48"
ATTR{range}=="16"
ATTR{removable}=="1"
ATTR{size}=="1018624"
ATTR{stat}==" 65 10 360 71 0 0 0 0 0 56 71"
ATTR{capability}=="13"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host15/target15:0:0/15:0:0:0':
KERNELS=="15:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}=="Samsung "
ATTRS{model}=="YP-U2 "
....
Die Ausgabe ist etwas gekürzt aber wir interessieren uns vor allem ja für die Art und Bezeichnung der Geräts und Namen des Herstellers.
SUBSYSTEMS=="scsi"
ATTRS{vendor}=="Samsung "
ATTRS{model}=="YP-U2 "
Das ist eigentlich erstmal alles was wir brauchen.
Mit diesen Daten können wir jetzt die erste udev Regel bestimmen.
Dafür einfach die Datei /etc/udev/rules.d/10-my.rules mit einem beliebigen Editor öffnen und mit den ermittelten Daten den MP3-Player definieren wie folgt:
SUBSYSTEMS=="scsi", SYSFS{vendor}=="Samsung", SYSFS{model}=="YP-U2"
Diese Angaben bestimmen jetzt schon mal den MP3-Player, aber es passiert im Moment noch nichts. Also weiter im Text. Interessant für Aktionen und Personalisierung sind jetzt die Angaben von NAME und RUN+.
Mit NAME kann man den Gerät einen Namen zu ordnen zB. mp3player zur besseren Identifikation.
Mit RUN+ kann man einen Befehl übergeben der ausgeführt werden kann. Da udev einen Befehl aber nicht wie die eine Shell verarbeitet, sollte man bei dem gebraucht von Schaltern und co lieber auf ein Script verweisen.
Das tun wir jetzt mal und ergänzen den Eintrag oben:
SUBSYSTEMS=="scsi", SYSFS{vendor}=="Samsung", SYSFS{model}=="YP-U2" NAME="mp3player" RUN+="/usr/local/bin/mp3player-script"
(alles in einer Zeile)
/usr/local/bin/mp3player-script ist ein Script, das wir gleich noch schreiben werden. Mit diesem script könnte man dann zB. den Mp3Player automatisch oder gleich im Filemanager starten. Im folgenden Beispiel wird das Script so angelegt, das es den Konqueror in zwei Fenster Ansicht startet. Natürlich kann man aber auch ganz andere Anwendungen nehmen.
Damit man bequem Musik vom PC auf den MP3-Player verschieben kann, nutze ich gerne den Konqueror in zwei Fenster Ansicht. In dem einen Fenster mein MP3-Player in dem anderen mein Musikverzeichnis.
Der Konqueror erlaubt es, solche Ansichten als Profile zu speichern. Das ist sehr praktisch und wir machen das gleich mal.
Also den Konqueror starten. Auf Fenster klicken und in rechte und linke Hälfte teilen auswählen. Dann navigiert man in dem einen Fensterhälfte in des Verzeichnis in den man seinen MP3-Player mountet zB. /media/mp3player und in der anderen Hälfte in das Verzeichnis in dem man seine Musik aufbewahrt; Beispiel $HOME/Musik.
Wenn man also die beiden passenden Verzeichnisse hat, klickt man auf Einstellungen > Ansichtsprofil speichern und gibt in der obersten Zeile einen passenden Namen ein zB. "mp3manager".
Das konqueror Profil kann man mit dem Aufruf konqueror --profil mp3manager laden.
Damit das jetzt auch automatisch geschieht, wenden wir uns jetzt wieder dem Script zu, das wir in der udev Regel für den MP3-Player zum Aufruf angegeben haben, zu.
Öffnen wir also /usr/local/bin/mp3player-script mit einem Editor.
Dort tragen wir jetzt die Zeile konqueror --profil mp3manager ein.
Weil das zwar den Konqueror starten würde, aber der MP3-Player vorher erst n och eingebunden werden muss, brauchen wir vorher noch einen mount Befehl: sudo mount /dev/mp3player.
Leider ist das aber auch noch nicht alles, denn der MP3Player und der Konqueror sollen natürlich auch einem als Benutzer zu gewiesen werden, also muss man das ganze noch etwas anders mit su formuliern. Letztendlich würde das ganze dann so aussehen:
#!/bin/sh
su BENUTZERNAME -c "sudo mount /dev/mp3player"
su BENUTZERNAME -c "export DISPLAY=:0.0;/usr/bin/konqueror --profile mp3manager"
Su BENUTZERNAME -c übergibt hier den Befehl für dich als Benutzer.
export DISPLAY=:0.0; sorgt dafür das der Konqueror auch auf dem ersten Display ausgegeben wird. Bei Anwendungen die nicht über X ausgegben werden (wie zB. der mount Befehl) ist dies natürlich nicht nötig.
Zu beachten ist ausserdem, das der Pfad zum konqueror natürlich abweichen kann. Bei manchen Distributionen ist er zum Beispiel unter /opt/kde3/bin/konqueror zu finden. Im Zweifel kann locate hier sicher helfen.zB: locate konqueror | grep bin
So, als letztes fehlt eigentlich nur noch ein Eintrag in der /etc/fstab.
Folgender sollte es tun:
/dev/mp3player /media/mp3player/ vfat noauto,rw,users,umask=000 0 0
users,umask=000 erlauben hier jedem Zugriffsrechte und die Möglichkeit den MP3Player wieder auszuhängen. Beim Heim-Computer eine simple Lösung. Wenn es mehrere Benutzer und unterschiedliche Gruppenberechtigungen gibt, sollte man das evtl. ändern.
So, das war es dann jetzt auch.
Steckt man den MP3-Player ein, wird er automatisch eingebunden und der Konqueror wird mit den passenden Verzeichnissen gestartet.
Natürlich kann man von einem entsprechenden Script auch ganz andere Aktionen ausführen lassen. Ein Beispiel wäre das man seinen Bluetooth-Stick einsteckt und im Script entsprechende Anweisungen angibt um diesen automatisch zu verbinden. Es müssen natürlich auch keine USB Geräte sein; Auch PCMCIA oder Firewire wäre hier denkbar.
Troubleshooting
Ein Gerät ist für udev oft nicht nur ein Gerät sondern es definiert sich über mehrere Eigenschaften. Im Beispiel oben auch der MP3-Player als USB-Gerät, als Massenspeicher, als SCSI Gerät usw. . Das führt dazu das die definition eines Gerätes in der udev Regel öfters zutreffen kann. Ansich nicht weiter schlimm, nur würde dann auch ein angegebenes Script öfters aufgerufen werden, das würde dann dazu führen das man am Ende nicht nur einmal den Konqueror hat, sondern vielleicht drei mal.
Wie folgt lässt sich raus bekommen, wie oft die Regel trifft (bezogen auf das Beispiel des MP3-Player oben):
SUBSYSTEMS=="scsi", SYSFS{vendor}=="Samsung", SYSFS{model}=="YP-U2", ENV{USB}="%p", RUN+="/usr/bin/usb_test"
Das Script /usr/bin/usb_test sollte wie folgt aus sehen:
#!/bin/bash
/bin/echo $USB >> /tmp/usb_devices
(ausführbar machen: chmod +x /usr/bin/usb_test)
Jetzt den MP3-Player einstecken und mit cat /tmp/usb_test ausgeben lassen.
Die Treffer sollte man sich mit udevinfo -a -p nochmal ausgeben lassen und dann die Definition in der udev Regel änger fassen.
Beim MP3-Player wäre zB. die Angabe von KERNEL schon passendes Element.
KERNEL=="sd?", SUBSYSTEMS=="scsi", SYSFS{vendor}=="Samsung", SYSFS{model}=="YP-U2", NAME="mp3player" RUN+="/usr/local/bin/mp3player-script"
(bitte immer beachten, die udev Regel in einer Zeile zu schreiben)
KERNEL=="sd?" steht einfach für SCSI DISK da der MP3-Player ja als solcher behandelt wird. Das "?" steht für eine Variable Gerätebezeichnung denn der MP3-Player könnte ja jegliche haben, auch wenn man mehrere Massenspeichergeräte anschließt, würde diese ja auch immer variieren.
Natürlich macht es Sinn, die Regel von Anfang enger zu definieren. Zum Beispiel mit der KERNEL Angabe. Ich will hier nur verdeutlichen, wie man vorgehen sollte, wenn die Regel immer noch zu weit ist.
Ähnlich kann man auch bei USB Festplatten unterschiedlichen Partitionen verschiedene Aktionen oder Mountpunkte zuweisen.
Gut, ich hoffe ich konnte das ganze halbwegs gut erklähren. Auch wenn es zu Anfang etwas kompliziert anmutet, hat man erstmal das erste Geräte wie man es gerne hätte per udev regel eingerichtet, dann geht der Rest ruckzuck und auf dauer erspart es einem sehr viel klick-arbeit. Die Mühe lohnt sich definitiv.
Wie immer, wenn es Fragen oder Verbesserungsvorschläge, einfach bei mir melden.
|
|