Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
| linux:udev [2011/11/01 00:24] – [Testing und debugging] st | linux:udev [2012/06/07 14:59] (aktuell) – st | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ===== udev ===== | ||
| + | udev ist ein Programm, mit welchem der [[linux: | ||
| + | |||
| + | udev ersetzt seit dem [[linux: | ||
| + | |||
| + | Mit der Einführung von udev waren sowohl udev als auch devfs im [[linux: | ||
| + | |||
| + | **Quellen**: | ||
| + | |||
| + | ===== Rules schreiben ===== | ||
| + | |||
| + | udev rules sind sehr flexibel. Einige Beispiele, was man mit udev rules anstellen kann: | ||
| + | |||
| + | * Ein device node vom Standardnamen in irgendwas anderes umbenennen | ||
| + | * Einen alternativen / persistenten Namen für ein device node durch einen symbolischen Link zum default device node erstellen | ||
| + | * Ein device node based nach der Ausgabe eines Programmes benennen | ||
| + | * Berechtigungen und Besitzer eins device node ändern | ||
| + | * Ein Skript starten, wenn ein device node erstellt oder gelöscht wurde (typischerweise wenn ein device angeschlossen oder abgezogen wird) | ||
| + | * Netzwerk-interfaces umbenennen | ||
| + | |||
| + | Nehmen wir an, wir haben zwei USB devices: Eine Digitalkamera und einen USB-Stick. Diese devices werden normalerweise zu den device nodes /dev/sda und /dev/sdb zugewiesen, aber die exakte Zuweisung hängt davon ab, in welcher Reihenfolge die beiden original angeschlossen wurden. Das könnte zu Problemen mit Usern führen und es wäre doch schön, wenn diese Geräte permanent nach z.b /dev/camera und / | ||
| + | |||
| + | |||
| + | Desweiteren ist es bestimmt sinnvoll, wenn man das [[http:// | ||
| + | |||
| + | |||
| + | |||
| + | ==== Rule-files und Bedeutung ==== | ||
| + | |||
| + | Wenn man sich entscheidet, | ||
| + | |||
| + | Die default udev rules sind unter **/ | ||
| + | |||
| + | Die Files in / | ||
| + | |||
| + | Ein Device kann von mehr als einer Rule gematched werden. Das hat praktische Gründe, zum Beispiel kann man **zwei Rules für dasselbe Device** schreiben, wobei jede Rule dem Device einen eigenen Namen zuweist. Es werden dann beide alternativen Namen erstellt, auch wenn die Rules sich in verschiedenen Rule-files abgelegt sind. udev wendet jede Regel an, die es für eine Device findet und stoppt nicht, nachdem eine Regel auf ein Device gmatcht hat. | ||
| + | |||
| + | |||
| + | ====Rule Syntax==== | ||
| + | |||
| + | Jede Regel wird von Serien aus Keys-values Paaren erstellt, die durch Kommas getrennt sind. Match-Keys sind die Bedingungen, | ||
| + | |||
| + | Als Beispiel: | ||
| + | |||
| + | < | ||
| + | |||
| + | Das Beispiel hat also einen Match-Key (KERNEL) und einen Zuweisungs-Key (NAME). Wichtig ist, dass der **match key** seinen Wert durch das doppelte Gleichheitszeichen (**==**) erhält, der **assignment key** aber nur durch ein einzelnes Gleichheitszeichen (**=**). | ||
| + | |||
| + | Es ist darauf zu achten, dass udev keinen Support von irgendeiner Form von Zeilenfortführung unterstützt. Also keine line breaks in die Regeln einbauen, denn udev wird diese als eine weitere Rule ansehen und nicht so fortfahren, wie man es sich wahrscheinlich wünscht...\\ (Anm.: Bin mir jetzt nicht wirklich sicher, ob das noch aktuell ist, wenn ich mir so die bestehenden Rules anschaue...) | ||
| + | |||
| + | ====Basic Rules==== | ||
| + | |||
| + | udev unterstützt viele match-keys, die verwendet werden können in rules. Die meist verwendeten hier.\\ | ||
| + | Eine komplette Liste findet man in der udev man page. | ||
| + | |||
| + | * **KERNEL** - passend zum kernel Name für ein Device | ||
| + | * **SUBSYSTEM** - passend zum subsystem von einem Device | ||
| + | * **DRIVER** - passend zum Namen des Treibers von einem device | ||
| + | |||
| + | Nachdem man also per match-keys ein Device ' | ||
| + | |||
| + | * **NAME** - der Name, der für das device node verwendet werden soll | ||
| + | * **SYMLINK** - eine Liste von symbolischen Links, die als alternative Namen für ein device node dienen sollen | ||
| + | |||
| + | Es gilt also festzustellen, | ||
| + | |||
| + | Ein Device, welches vom [[linux: | ||
| + | |||
| + | < | ||
| + | |||
| + | Ein Device, welches vom [[linux: | ||
| + | |||
| + | < | ||
| + | |||
| + | Das ist eine recht typische udev-rule die häufig verwendung findet. Es erstellt zwei Symbolische Links (/dev/cdrom und / | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== Matching sysfs Attribute ==== | ||
| + | |||
| + | Mit den match-keys haben wir soweit nur eingeschränkte Möglichkeiten. In der Realität wünscht man sich oft die feinere Kontrolle: Man will devices nach erweiterten Eigenschaften wie vendor codes, exakter Produktnummer, | ||
| + | Viele Treiber exportieren diese Informationen nach sysfs und udev erlaubt es diese Informationen per **sysfs-matching** in Regeln einzubinden, | ||
| + | |||
| + | Eine Beispiel-Rule die ein einzelnes Attribut per sysfs ausliest: | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== Device Hierarchie ==== | ||
| + | |||
| + | Der [[linux: | ||
| + | |||
| + | Die vier Haupt-Match-Keys (KERNEL/ | ||
| + | |||
| + | * **KERNELS** - passend zum kernel Namen eines device, oder zum kernel Name eines parent devices | ||
| + | * **SUBSYSTEMS** - passend zum subsystem eines device, oder zum subsystem eines parent devices | ||
| + | * **DRIVERS** - passend zum Namen eines Treibers des device, oder zum Namen eines Treibers des parent devices | ||
| + | * **ATTRS** - passend zum sysfs Attribut des device, oder zum sysfs Attribut eines parent devices | ||
| + | |||
| + | In Betrachtung der Hierarchie scheinen die Rules schon ein kleines bisschen komplizierter | ||
| + | |||
| + | ====String substitutions==== | ||
| + | |||
| + | Wenn man Rules schreibt wird man eventuell mehrere ähnliche Devices vorfinden. udev's printf-ähnliches String-Replacment ist da sehr hilfreicht. Man kann einfach diese Operatoren in Zuweisungen der Rules aufnehmen und udev wird diese auswerten. | ||
| + | |||
| + | Die meist verwendeten Operatoren sind **%k** und **%n**.\\ | ||
| + | **%k** ermittelt den **kernel Namen** für ein device, zB. " | ||
| + | **%n** ermittelt die **Kernel Nummer** für ein device (Die Partitionsnummer eines Speichergerätes), | ||
| + | |||
| + | udev unterstützt natürlich weitere Operatoren für erweiterte Abfragen. Diese findet man in der udev man page. Es gibt auch eine alternative Synatx - **$kernel** und **$number** für die obigen Beispiele. Möchte man auf ein % matchen, muss %% verwendet werden, möchte man auf $ matchen, analog dazu $$. | ||
| + | |||
| + | Um das zu veranschaulichen, | ||
| + | |||
| + | < | ||
| + | KERNEL==" | ||
| + | KERNEL==" | ||
| + | </ | ||
| + | |||
| + | Die erste Rule checkt, dass der Maus-Device node exklusiv im /dev/input erscheint (by default würde es /dev/mice sein). Die zweite Rule checkt, dass der device node mit dem Namen loop0 unter /dev/loop/0 erstellt wird und erstellt ebenso einen symbolischen link unter /dev/loop0. | ||
| + | |||
| + | Die Verwendung im obigen beispiel ist jedoch fraglich, denn diese Regeln hätten auch ohne Substitutions gemacht werden können. Besseren Einsatz dieser weiter unten.... | ||
| + | |||
| + | ====String matching==== | ||
| + | |||
| + | Genauso wie genaues String-matching erlaubt udev auch shell-style pattern matching. Diese 3 patterns werden unterstützt: | ||
| + | |||
| + | * ***** - passend zu jedem Zeichen, das null oder mehrere mal vorkommt | ||
| + | * **?** - passend zu jedem Zeichen das nur einmal vorkommt | ||
| + | * **[]** - passend zu einem einzelnen Zeichen (spezifiziert in Klammer), ranges sind erlaubt | ||
| + | |||
| + | Beispiele zu den obigen Zeichen. Es werden auch substitution Operatoren verwendet: | ||
| + | |||
| + | < | ||
| + | KERNEL==" | ||
| + | KERNEL==" | ||
| + | </ | ||
| + | |||
| + | Die erste Rule matched auf alle Floppy-Disk drivers und stellt sicher, dass die devices nodes unter /dev/floppy erstellt werden und ein Symbolischer Link zum default Namen erstellt wird.\\ Die zweite Rule stellt sicher, dass hiddev devices nur im /dev/usb directory vorhanden sind. | ||
| + | |||
| + | =====Informationen von sysfs===== | ||
| + | |||
| + | ====Der sysfs Tree==== | ||
| + | |||
| + | Um rules basierend auf sysfs Informationen schreiben zu können, muss man zuerst die Namen der Attribute und deren Werte kennen. | ||
| + | |||
| + | Sysfs hat eigentlich eine sehr simple Struktur. Es ist logisch aufgeteilt in Verzeichnisse. Jedes Verzeichnis beinhaltet eine Anzahl von Dateien (Attribute) wobei jede typischerweise nur einen Wert beinhaltet. Einige symbolische Links sind vorhanden, die auf die device parents verweisen (siehe weiter oben) | ||
| + | |||
| + | Einige Verzeichnisse verweisen zu Top-Level device Pfaden. Diese Verzeichnisse repräsentierien aktuelle Devices mit entsprechenden device nodes. Top-level device Pfade können als sysfs Verzeichnisse klassifiziert werden, die ein dev file beinhalten. Mit diesem Kommando kann man diese auflisten: | ||
| + | |||
| + | < | ||
| + | |||
| + | Als Beipsiel, das / | ||
| + | |||
| + | Wenn man also rules basierend auf den sysfs Informationen schreibt, matcht man einfach die Attribute des Inhalts von einigen Files in einen Teil von der Kette. Zum Beispiel lese ich die Grüsse meiner Harddisk wie folgt: | ||
| + | |||
| + | < | ||
| + | cat / | ||
| + | 234441648 | ||
| + | </ | ||
| + | |||
| + | In einer udev rule könnte ich also ATTR{size}==" | ||
| + | |||
| + | Obwohl dies nützlich und interessant ist, ist ein manuelles durchforsten durch sysfs zeitaufwändig und unnötig. | ||
| + | |||
| + | ====udevinfo (udevadm info)==== | ||
| + | |||
| + | **Achtung**: | ||
| + | |||
| + | Mit udevinfo hat man wahrscheinlich das " | ||
| + | |||
| + | < | ||
| + | |||
| + | dasselbe für Debian lautet: | ||
| + | < | ||
| + | |||
| + | <color green> | ||
| + | looking at device '/ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | <color blue> | ||
| + | looking at parent device '/ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | <color red> | ||
| + | looking at parent device '/ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | udevinfo generiert einfach eine Liste der Attribute, welche man " | ||
| + | |||
| + | < | ||
| + | < | ||
| + | |||
| + | Anhand der Farben im obigen Beispiel wird veranschaulicht, | ||
| + | Ein Device, wie das obige mit einem einzigen Parent device kann **nicht vermischt mit match-attributen von verschiedenen Parent devices werden** - eine solche Regel würde nicht funktionieren. | ||
| + | |||
| + | Als Beispiel also eine " | ||
| + | |||
| + | < | ||
| + | |||
| + | Gewöhnlicherweise erhält man eine grosse Anzahl von Attributen, von denen man eines auswählt, mit dem die Regel konstruiert wird. | ||
| + | Normalerweise wird ein Attribut gewählt, welches das device in einem von " | ||
| + | ATTRS{iodone_cnt}==" | ||
| + | |||
| + | Beachten wir nochmals die Effekte von der Hierarchie im udevinfo output:\\ | ||
| + | Die <color green> | ||
| + | Die <color blue> | ||
| + | |||
| + | Ein weiterer Punkt, den man beachten sollte ist, dass Text-Attribute im udevinfo-output eingebettet in Leerzeichen erscheinen | ||
| + | (siehe zb. ST3120827AS oben). In eigenen rules kann man den extra Leerschlag spezifizieren oder man kann ihn einfach wegschneiden, | ||
| + | |||
| + | Die einzige Komplikation in Verwendung mit udevinfo ist, dass man den top-level device Pfad kennen muss (/ | ||
| + | |||
| + | < | ||
| + | |||
| + | ====Alternative Methoden==== | ||
| + | |||
| + | Obwohl udevinfo beinahe der am meisten straightforward way zum Listen der exakten Attribute ist, um rules zu erstellen, gibt es Alternativen, | ||
| + | |||
| + | =====Erweiterte Themen===== | ||
| + | |||
| + | ====Berechtigungen und Ownership==== | ||
| + | |||
| + | udev erlaubt weitere Assignments in Rules, mit denen man Besitzer und Berechtigungen auf jedes device zuweisen kann. | ||
| + | |||
| + | Mit dem **GROUP** Assignment hat man auch die Möglichkeit, | ||
| + | Als Beispiel definieren wird die Gruppe " | ||
| + | |||
| + | < | ||
| + | |||
| + | Mit dem **OWNER** Assignment, wahrscheinlich weniger nützlich, kann man auch festlegen, welcher Unix-User der Besitzer des device-nodes sein soll. | ||
| + | Im Beispiel hier gehören John alle floppy-devices: | ||
| + | |||
| + | < | ||
| + | |||
| + | udev selbst erstellt grundsätzlich nodes mit der Unix-Berechtigung von 0660 (lesen/ | ||
| + | |||
| + | Im Beispiel hier definieren wir dem [[inotify]]-node lese- und schreibzugriff für alle: | ||
| + | |||
| + | < | ||
| + | |||
| + | ====Externe Tools zur Benennung verwenden==== | ||
| + | |||
| + | Unter gewissen Umständen möchte man ein bisschen mehr Flexibilität als die Standard udev-rules bieten. In dieser Situation kann udev ein Programm starten und den Standard-Output dieses Programmes für den device-namen verwenden. | ||
| + | |||
| + | Um diese Funktionalität zu verwenden, trägt man einfach den absoluten Pfad des zu startenden Programmes (und dessen Paramter) in das **PROGRAM**-Assignment ein. Jetzt kann man eine Variante von der **%c Substitution** im NAME/ | ||
| + | |||
| + | In den folgenden Beispielen wird ein fiktionales Programm (/ | ||
| + | |||
| + | Im ersten Beispiel nehmen wir an, dass device_namer einen Output mit einer Nummer von Teilen ausgibt. Jeder dieser Teile dient dazu einen Symlink (alternativen Namen) für das gefragt device zu erstellen. | ||
| + | |||
| + | < | ||
| + | |||
| + | Im nächsten Beispiel nehmen wir an, dass device_namer zwei Teile ausgibt. Der erste Teil ist der device name, der zweite ist der Name für einen zusätzlichen symbolischen Link. Jetzt verwenden wir die **%c{N} Substitution**, | ||
| + | |||
| + | < | ||
| + | |||
| + | In nächsten Beispiel nehmen wir an, dass device_namer einen Teil für den device-namen ausgibt, gefolgt von irgendeiner Nummer von Teilen, welche zusätzliche Symlinks erstellen. Jetzt wird die **%c{N+} substitution** verwendet, welche die Teile N, N+1, N+2, ... auswertet bis zum Ende des Outputs: | ||
| + | |||
| + | < | ||
| + | |||
| + | Die Output-Parts können in jedem Assignment-Key verwendet werden, nicht nur in NAME and SYMLINK. | ||
| + | Das nächste Beispiel verwendet das fiktionale Programm zum auslesen der Unixgruppe, welcher das Device gehören soll: | ||
| + | |||
| + | < | ||
| + | |||
| + | ====Externe Programme aufgrund bestimmter Ereignisse==== | ||
| + | |||
| + | Ein weiterer Grund um udev-Rules zu schreiben ist ein bestimmtes Programm zu starten, sobald das Device verbunden oder disconnected wird. Zum Beispiel ein Skript, welches automatisch alle Fotos von der Digitalkamera herunterlädt, | ||
| + | |||
| + | Man darf diese Aktion nicht mit der PROGRAM Funktionalität von oben verwechseln. PROGRAM wird verwendet, um device Namen zu generieren (diese Programmes sollten für nichts anderes benutzt werden). Wenn diese Programme ausgeführt werden, wurde das device node noch gar nicht genreriert, somit ist eine Aktion aufgrund des Devices noch gar nicht möglich. | ||
| + | |||
| + | Die Funktionalität die hier gezeigt wird erlaubt es aber, ein Programm zu starten, wenn das device-node vorhanden ist. | ||
| + | Dieses Programm kann auf dem device agieren, jedoch sollte es nicht sehr lange laufen, denn solange das Programm läuft ist udev auf Pause... Ein Workaround für diese Limitation könnte sein, dass sich das Programm sofort ablöst. | ||
| + | |||
| + | Ein Beispiel, die das **RUN** list assignment verwendet: | ||
| + | |||
| + | < | ||
| + | |||
| + | Wenn / | ||
| + | |||
| + | udev startet diese Programme nicht in einem aktiven Terminal oder im context einer Shell. Man sollte natürlich sicherstellen, | ||
| + | |||
| + | ====Environment Interaktion==== | ||
| + | |||
| + | udev stellt einen **ENV** Key für Environment Variabeln zur Verfügung, welcher für matching und assignment rules verwendet werden kann. | ||
| + | |||
| + | Im Assignment-Fall kann man eine Environment Variable setzen welche dann später matcht. Man kann auch Environment Variablen setzen, die von externen Programmen verwendet werden | ||
| + | |||
| + | Eine fiktionale Beispielrule setzt eine Environment Variable: | ||
| + | |||
| + | < | ||
| + | |||
| + | Im Matching-Fall kann man sicherstellen, | ||
| + | Environment Variabeln in udev sind **nicht dieseleben**, | ||
| + | |||
| + | Eine fiktionale Beispielrule bezieht sich auf einen match.\\ Diese Rule erstellt den /dev/floppy Link nur dann, wenn $an_env_var ist auf " | ||
| + | |||
| + | < | ||
| + | |||
| + | ====Weitere Optionen==== | ||
| + | |||
| + | Ein weiteres, nützliches Assignment ist die **OPTIONS** Liste. Davon sind folgende verfügbar: | ||
| + | |||
| + | * **all_partitions** - create all possible partitions for a block device, rather than only those that were initially detected | ||
| + | * **ignore_device** - ignore the event completely | ||
| + | * **last_rule** - ensure that no later rules have any effect | ||
| + | |||
| + | Die nächste Rule, als Beispiel, setzt das Gruppenrecht auf dem harddisk-node und stellt sicher, dass keine spätere Rule mehr angewendet wird: | ||
| + | |||
| + | < | ||
| + | |||
| + | =====Beispiele===== | ||
| + | |||
| + | ====USB Printer==== | ||
| + | |||
| + | Wenn der Printer eingeschalten wird, wird im wahrscheinlich etwas wie /dev/lp0 zugewiesen. Sagt nicht sehr viel aus, also warum nicht etwas aussagekräftigeres verwenden und einen alternativen Namen zuweisen. | ||
| + | |||
| + | < | ||
| + | # udevinfo -a -p $(udevinfo -q path -n /dev/lp0) | ||
| + | looking at device '/ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | looking at parent device '/ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Die Regel schaut so aus: | ||
| + | |||
| + | < | ||
| + | |||
| + | ====USB Camera==== | ||
| + | |||
| + | Die meisten Kameras identifizieren sich selbst als externe Harddisk. Um die Fotos zu kopieren, mountet man das device und kopiert die Bilder. Aber nicht alle Kameras arbeiten auf diese Weise, einige verwenden ein anderes Protokoll (wie zb. Kameras, die von gphoto2 unterstützt werden). In diesem Fall möchte ich nicht alle Rules neu schreiben, da diese ausschliesslich durch den userspace kontrolliert werden (anstatt eines spezifischen [[linux: | ||
| + | |||
| + | USB-Kameras identifieren sich gewöhnlich als Disk mit einer einzigen Partition, zum Beispiel als /dev/sdb mit /dev/sdb1. Der sdb node ist hier aber uninteressant, | ||
| + | |||
| + | Im dieses Problem zu umgehen, muss man sich also überlegen, was denn sdb und sdb1 unterscheidet. Überraschenderweise ist es ganz einfach: der Name selbst! Also matchen wir doch einfach auf das NAME-Feld: | ||
| + | |||
| + | < | ||
| + | # udevinfo -a -p $(udevinfo -q path -n /dev/sdb1) | ||
| + | looking at device '/ | ||
| + | | ||
| + | | ||
| + | |||
| + | looking at parent device '/ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | und die Rule schaut so aus: | ||
| + | |||
| + | < | ||
| + | |||
| + | ====USB Hard Disk==== | ||
| + | |||
| + | Eine USB-Harddisk ist vergleichbare mit einer USB-Kamera. Trotzdem verwenden wir hier andere Patterns. Im Kamera-Beispiel war sdb uninteressant für uns, das ist ja nur Partitionieren usw. interessant. Wer partitioniert denn schon seine Kamera? | ||
| + | Bei einer Harddisk, zb. einer 100GB USB Harddisk, ist es aber verständlich, | ||
| + | Hier können wir die Vorteile von udev's string substitutions anwenden: | ||
| + | |||
| + | < | ||
| + | |||
| + | Diese Rule erstellt symbolische Links wie: | ||
| + | |||
| + | * /dev/usbhd - den fdiskable node | ||
| + | * /dev/usbhd1 - die erste Partition (mountable) | ||
| + | * /dev/usbhd2 - die zweite Partition (mountable) | ||
| + | |||
| + | ====USB Card Reader==== | ||
| + | |||
| + | USB Card Readers (CompactFlash, | ||
| + | |||
| + | Diese Geräte informieren typischerweise den Hostcomputer nicht, wenn ein Medium gewechselt wurde. Wenn man also einen leeren Cardreader einstekct und erst dann die Speicherkarte einlegt, wird der Computer es nicht mitbekommen und man hat keine mountbare sdb1 Partition für das Medium. | ||
| + | |||
| + | Eine mögliche Lösung ist, sich der **all_partitions** Option zu bedienen. Dieses erstellt 16 Partition-nodes für jedes Blockdevice für welche die rule matcht: | ||
| + | |||
| + | < | ||
| + | |||
| + | Jetzt wird man nodes mit den Namen: cfrdr, cfrdr1, cfrdr2, cfrdr3, ..., cfrdr15 erhalten | ||
| + | |||
| + | ====USB Palm Pilot==== | ||
| + | |||
| + | Diese Geräte werden als USB-Seriell-Devices erkannt, bekommen also standardmässig den ttyUSB1 device-node | ||
| + | Die Palm utilities beziehen sich aber auf /dev/pilot, Palm-User möchten also eine Rule, die das sicherstellt: | ||
| + | |||
| + | < | ||
| + | |||
| + | Der Produkt-String variiert von Produkt zu Produkt, dies sollte erst also noch mit udev-info geprüft werden. | ||
| + | |||
| + | ====CD/DVD drives==== | ||
| + | |||
| + | Nehmen wir an, wir haben zwei optische Devices im Rechner, einen DVD-Reader (hdc) und einen DVD-Brenner (hdd). Ich erwarte jetzt nicht, dass sich diese beiden Namen jemals ändern (solange ich nicht an den Kabeln rumfummle...) | ||
| + | Nichtsdestotrotz gibt es User, die lieber ein /dev/dvd haben möchten. | ||
| + | |||
| + | da wir die KERNEL Namen für diese Geräte kennen, ist das ja ganz simpel: | ||
| + | |||
| + | < | ||
| + | SUBSYSTEM==" | ||
| + | SUBSYSTEM==" | ||
| + | </ | ||
| + | |||
| + | ====Netzwerk-interfaces==== | ||
| + | |||
| + | Obwohl Netzwerkinterfaces referenziert sind mit Namen, haben sie gewöhnlicherweise keinen device node verknüpft damit. Trotzdem ist das rule schreiben beinahe identisch. Es macht Sinn, sich bei NICs auf die MAC-Adresse zu konzentrieren... | ||
| + | |||
| + | < | ||
| + | # udevinfo -a -p / | ||
| + | looking at class device '/ | ||
| + | KERNEL==" | ||
| + | ATTR{address}==" | ||
| + | </ | ||
| + | |||
| + | Und hier die Rule...: | ||
| + | |||
| + | < | ||
| + | |||
| + | Natürlich muss der Netzwerktreiber neu gestartet werden damit die Rule " | ||
| + | Es kann zu Problemen führen (zB. das interface wird nicht umbenannt), bis nicht auch wirklich alle Referenzen zu eth0 bereinigt wurden. | ||
| + | |||
| + | Ich denke mir, dass man das ganze aber auch mit der bestehenden udev-Rule in ''/ | ||
| + | |||
| + | =====Testing und debugging===== | ||
| + | |||
| + | Eine Ausgabe aktueller udev-Ereignisse bietet < | ||
| + | udevadm monitor | ||
| + | ====Rules aktivieren==== | ||
| + | |||
| + | Verwendet man einen aktuellen [[linux: | ||
| + | |||
| + | Trotzdem wird udev nicht automatisch alle Rules neu durchführen, | ||
| + | |||
| + | Wenn der [[linux: | ||
| + | |||
| + | ====udevtest (udevadm test)==== | ||
| + | |||
| + | Wenn man den top-level device Pfad in sysfs kennt, kann man **udevtest** verwenden, um die Aktionen anzuzeigen, die udev durchführen würde. Auch hier gilt bei Debian wieder, dass man udevadm verwendet, diesmal einfach mit dem Parameter test. Dies ist hilfreich zum debuggen von rules. Möchte man zb. eine Rule debuggen, die auf / | ||
| + | |||
| + | < | ||
| + | # udevtest / | ||
| + | main: looking at device '/ | ||
| + | udev_rules_get_name: | ||
| + | udev_rules_get_name: | ||
| + | udev_device_event: | ||
| + | udev_node_add: | ||
| + | udev_node_add: | ||
| + | </ | ||
| + | |||
| + | ...bei Debian gibt man also einfach **udevadm test / | ||
| + | |||
| + | Zu beachten ist, dass der / | ||
| + | udevtest ist nur zum testen/ | ||