Gentoo Logo

Gentoo udev Leitfaden

Inhalt:

1. Was ist udev?

Das /dev Verzeichnis

Wenn Linuxbenutzer in der Gegenwart von Menschen, die glauben, dass Linux eine Art von Virus oder Kaffeesorte ist, über Hardware auf Ihrem System reden, dann werden Äußerungen wie "slash dev slash foo" mit Sicherheit für seltsame Blicke sorgen. Aber für den versierten User (und damit sind auch Sie gemeint) ist die Verwendung von /dev/hda1 nur eine schnelle Art, um zu erklären, dass wir über die erste Partition am Primary Master IDE reden. Oder etwa nicht?

Wir alle wissen, was eine Geräte(device)datei ist. Einige wissen auch, warum Gerätedateien, wenn wir einen genaueren Blick auf sie werfen (indem wir ls -l in /dev ausführen) besondere Nummern haben. Aber was wir immer für gegeben ansehen, ist, dass die Primary Master IDE Festplatte als /dev/hda bezeichnet wird. Sie mögen es nicht so sehen, aber das ist ein grundlegender Designfehler.

Denken sie an Hotplug Geräte wie USB, IEE1394, hot-swappable PCI... was ist das erste Gerät? Und für wie lange? Wie werden die anderen Geräte benannt, wenn das erste verschwindet? Wie wird das laufende Transaktionen beeinflussen? Wäre es nicht lustig, wenn der Druckauftrag plötzlich von Ihrem superneuen Laserdrucker auf Ihren fast toten Matrix Drucker verschoben würde, weil Ihre Mutter beschlossen hat den Stecker des Laserdruckers herauszuziehen, welcher leider der erste Drucker war?

Hier kommt udev ins Spiel. Die Ziele des udev Projekts sind sowohl interessant als auch nötig:

  • Läuft im userspace
  • Erstellt/entfernt dynamisch Gerätedateien
  • Liefert konsequente Benennung
  • Liefert ein user-space API

Um diese Funktionen zu liefern wird udev in drei unterschiedlichen Projekten entwickelt: namedev, libsysfs und natürlich udev.

namedev

Namedev erlaubt es Ihnen, Geräte separat vom udev Programm zu benennen. Dies erlaubt flexible Benennungsrichtlinien und Namensschemata, entwickelt von verschiedenen Körperschaften. Dieses Subsystem zur Gerätebenennung liefert ein Standardinterface, das udev benutzen kann.

Momentan wird nur ein einzelnes Benennungsschema von namedev geliefert, und zwar jenes, welches von LANANA geliefert wird. Dieses wird von der Mehrheit der Linux Systeme momentan verwendet und ist daher für die Mehrheit der Linuxanwender sehr brauchbar.

Namedev verwendet eine fünfstufige Prozedur um den Namen eines bestimmten Gerätes herauszufinden. Wenn in einem dieser Schritte der Gerätename gefunden wird, wird dieser Name verwendet. Diese Schritte sind:

  • Beschriftung oder Seriennummer
  • Bus Gerätenummer
  • Bus Topologie
  • Statisch vergebener Name
  • Vom Kernel gelieferter Name

Der Beschriftung oder Seriennummer Schritt überprüft, ob das Gerät ein einzigartiges Identifikationsmerkmal hat. Zum Beispiel haben USB Geräte eine einzigartige USB Seriennummer und SCSI Geräte eine einzigartige UUID. Wenn Namedev eine Übereinstimmung zwischen dieser einzigartigen Nummer und einer gegebenen Konfigurationsdatei findet, dann wird der von der Konfigurationsdatei gelieferte Name verwendet.

Der Bus Gerätenummer Schritt überprüft die Bus Gerätenummer. Für nicht-hot-swappable Umgebungen ist diese Prozedur ausreichend, um ein Hardwaregerät zu identifizieren. Zum Beispiel verändern sich PCI Busnummern selten in der Lebenszeit eines Systems. Auch hier wird, wenn namedev eine Übereinstimmung mit dieser Position und einer gegeben Konfigurationsdatei findet, der Name verwendet, der von der Konfigurationsdatei geliefert wird.

Genauso ist auch die Bus Topologie ein eher statischer Weg zur Definition von Geräten solange die Benutzer nicht Geräte auswechseln. Wenn die Position des Gerätes zu einer vom Benutzer gelieferten Einstellung passt wird der beiliegende Name verwendet.

Der vierte Schritt Statisch vergebener Name ist ein simpler String Ersatz. Wenn der Kernelname (der Standardname) zu einem gegebenen Ersatzstring passt, wird der Ersatzname stattdessen verwendet.

Der letzte Schritt (Vom Kernel gelieferter Name) ist ein "Allesfänger": Dieser nimmt den vom Kernel gelieferten Standardnamen. In den meisten Fällen ist dies ausreichend, da es zu der Gerätebenennung, welche auf momentanen Linuxsystem verwendet wird, passt.

libsysfs

udev interagiert mit dem Kernel durch das sysfs Pseudodateisystem. Das libsysfs Projekt liefert ein Standard API um auf die Informationen gegeben durch das sysfs Dateisystem in einem gängigen Verfahren zuzugreifen. Dies erlaubt eine Abfrage von aller Art von Hardware, ohne dass man Vermutungen über die Art der Hardware anstellen muss.

udev

Jedes Mal, wenn der Kernel ein Update in der Gerätestruktur feststellt, ruft er das /sbin/hotplug Programm auf. Hotplug führt die Anwendung aus, welche im /etc/hotplug.d/default Verzeichnis, wo Sie auch einen Symlink zum udef-Programm finden werden, verlinkt ist. Hotplug übergibt die Informationen vom Kernel an das udev Programm, welches die notwendingen Aktionen (Erstellen oder Entfernen von Gerätedateien) an der /dev Struktur ausführt.

2. udev unter Gentoo benutzen

Voraussetzungen

udev sollte in Verbindung mit einem 2.6 Kernel verwendet werden (wie gentoo-sources mit dem 2005.0 Standardprofil). Wenn Sie einen solchen Kernel verwenden müssen Sie nur sicherstellen, dass Sie eine aktuelle Version von sys-apps/baselayout haben. Das ist alles was Sie benötigen.

Befehlsauflistung 2.1: Installieren von udev

 # emerge udev

udev wird hotplug-base als eines seiner Abhängigkeiten installieren. Sie müssen hotplug nicht installieren, nur wenn Sie wünschen, dass Ihre Module automatisch geladen werden sobald Sie Geräte anschließen. sys-apps/hotplug erledigt auch das automatische Hochfahren von Netzwerkgeräten, sowie den Firmware Download.

Befehlsauflistung 2.2: Installieren optionaler Hotplug-Skripte

 # emerge hotplug

Stellen Sie sicher, dass folgende Optionen im Kernel aktiviert sind:

Befehlsauflistung 2.3: Benötigte Kerneloptionen

General setup --->
  [*] Support for hot-pluggable devices

File systems --->
  Pseudo filesystems --->
    [*] /proc file system support
    [*] Virtual memory file system support (former shm fs)

Wenn Sie möchten, können Sie den /dev file system support (OBSOLETE) aktiviert lassen, aber Sie müssen sicherstellen, dass "Automatically mount at boot" deaktiviert ist.

Befehlsauflistung 2.4: Binden Sie nicht automatisch devfsd ein

File systems --->
  Pseudo Filesystems --->
     [*] /dev file system support (OBSOLETE)
       [ ]   Automatically mount at boot

Wenn Sie genkernel verwenden, dann sollten Sie nicht vergessen, es mit der --udev Option auszuführen, um alle benötigten Einstellungen zur Kernelkonfigurationen zu aktivieren. Die Standardkonfiguration gegeben durch diesen genkernel Aufruf ist ausreichend.

Konfiguration

Wenn Sie, um Ihr Leben einfacher zu machen, die udev Verbesserungen, die Gentoo hinzugefügt hat, benutzen wollen, müssen Sie nicht weiterzulesen. Gentoo wird udev verwenden aber ein statisches /dev erhalten, damit Sie nie fehlende Device-Nodes haben werden. Die Gentoo init Skripte werden den devfsd Dämon nicht ausführen und werden devfs deaktivieren wenn Sie booten.

Wenn Sie aber ein zäher Kämpfer sind und ein nur-udev, nicht-optimiertes System verwenden wollen, so wie es von der udev Entwicklung vorgesehen wurde (einschließlich der Schwierigkeiten von fehlenden Device-Node-Dateien, da udev sie noch nicht untersützt), dann lesen Sie einfach weiter :)

Wir werden die Regeln deaktivieren, die die Device-Node-Dateien speichern: editieren Sie die RC_DEVICE_TARBALL Variable in /etc/conf.d/rc und setzen Sie diese auf no:

Befehlsauflistung 2.5: /etc/conf.d/rc

RC_DEVICE_TARBALL="no"

Wenn Sie devfs Unterstützung in Ihrem Kernel haben, können Sie es in Ihrer Bootloaderkonfiguration deaktivieren: Fügen Sie gentoo=nodevfs als Kernelparameter hinzu. Wenn Sie devfs verwenden wollen und udev deaktivieren wollen, dann fügen Sie gentoo=noudev als Kernelparamter hinzu.

3. Bekannte Probleme

Fehlende Device-Node-Dateien beim booten

Wenn Sie nicht erfolgreich booten können, da Sie eine Fehlemeldung darüber erhalten, dass /dev/null nicht gefunden wurde oder weil die initiale Konsole fehlt, dann ist das Problem, dass Ihnen einige Gerätedateien fehlen, die verfügbar sein müssen, bevor /dev eingebunden ist und von udev verwaltet wird. Dies ist oft auf Gentoo-Rechnern, bei deren Installation alte Medien verwendet wurden, der Fall.

Wenn Sie sys-apps/baselayout-1.8.12 oder neuer laufen haben, dann ist dieses Problem bereits entschärft, da der Bootvorgang trotzdem komplett durchlaufen müsste. Um diese nervigen Warnungen loszuwerden sollten Sie die fehlenden Device-Nodes wie untenstehend beschrieben erstellen.

Um zu sehen, welche Device-Nodes vorhanden sind bevor das /dev Dateisystem eingebunden ist, führen Sie folgende Befehle aus:

Befehlsauflistung 3.1: Auflistung der Device-Nodes vorhanden zum Systemstart

# mkdir test
# mount --bind / test
# cd test/dev
# ls

Die für einen erfolgreichen Boot benötigten Device-Nodes sind /dev/null und /dev/console. Wenn Sie im vorangegangenen Test nicht vorhanden waren, dann müssen Sie diese manuell erstellen. Führen Sie folgende Befehle im zuvor erstellten test/dev/ Verzeichnis aus:

Befehlsauflistung 3.2: Erstellen notwendiger Device-Node-Dateien

# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3

Wenn Sie fertig sind, vergessen Sie nicht die Einbindung des test/ Verzeichnisses wieder zu lösen:

Befehlsauflistung 3.3: Lösen der Einbindung des test/ Verzeichnisses

# cd ../..
# umount test
# rmdir test

udev und nvidia

Wenn Sie auf einem nur-udev System den proprietären Treiber von nVidia verwenden und der X Server nicht gestartet werden kann, stellen Sie sicher, dass Sie Folgendes besitzen:

  • das nvidia Modul aufgeführt in /etc/modules.autoload.d/kernel-2.6
  • den nvidia-kernel mit der Version media-video/nvidia-kernel-1.0.5336-r2 oder neuer
  • das Basislayout mit der Version sys-apps/baselayout-1.8.12 oder neuer

Wenn xorg-x11 sich weigert zu starten, könnte es unter Umständen daran liegen, dass die /dev/nvidia Gerätedatei fehlt. Wenn dies der Fall ist, führen Sie /sbin/NVmakedevices.sh aus um diese (neu) zu erstellen.

LVM2 Namen verschwinden

Wenn Sie udev und LVM2 zusammen verwenden ist Ihnen vielleicht aufgefallen, dass die von Ihnen erstellten Volumen verschwunden sind. Nun, sie sind es nicht, aber unglücklicherweise sind sie als /dev/dm-# benannt; wobei # 0,1,usw ist.

Um dies zu korrigieren editieren Sie /etc/udev/rules.d/50-udev.rules und entkommentieren Sie die folgende Zeile:

Befehlsauflistung 3.4: Entkommentieren Sie diese Zeile in /etc/udev/rules.d/50-udev.rules

KERNEL="dm-[0-9]*",     PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK="%c"

Installieren Sie als nächstes sys-fs/multipath-tools, welches die devmap_name Anwendung enthält.

Befehlsauflistung 3.5: Installation von multipath-tools

(Zum Zeitpunkt des Verfassens ist multipath-tools nur in Testing (~) verfügbar:)
# echo "=sys-fs/multipath-tools-0.4.2 ~x86" >> /etc/portage/package.keywords
# emerge multipath-tools

Keine einheitliche Namensgebung zwischen DevFS und udev

Obwohl es unsere Absicht ist ein einheitliches Namensschema für beide dynamischen Gerätemanagementlösungen zu haben, gibt es trotzdem manchmal Unterschiede in der Benennung.

Ein gemeldeter Konflikt existiert mit dem HP Smart Array 5i RAID Controller (genauer gesagt mit dem cciss Kernelmodul). Mit udev werden die Geräte als /dev/cciss/cXdYpZ benannt; wobei X,Y und Z reguläre Nummern sind. Mit devfs sind die Geräte /dev/hostX/targetY/partZ oder symbolisch verlinkt von /dev/cciss/cXdY.

Wenn dies der Fall ist, dann vergessen Sie bitte nicht /etc/fstab und die Bootloader Konfigurationsdateien entsprechend zu aktualisieren.

Dasselbe geschieht mit universellen symbolischen Links die in /dev existierten, wie /dev/mouse, welches udev nicht länger erstellt. Überprüfen Sie Ihre X Konfigurationsdatei und stellen Sie sicher, dass die Geräteregel für Ihre Maus auf ein existierendes Gerät verweist.

Ein weiteres Problem ist der Unterschied in der Benennung der Terminals zwischen devfs und udev. Während devfs die Terminals tty nennt, benennt udev sie vc und tty. Dies führt zu einem Problem, wenn Sie Root-Logins von der Konsole mit /etc/securetty einschränken. Sie werden sicherstellen müssen, dass sowohl tty1 als auch vc/1 in /etc/securetty aufgeführt werden um zu garantieren, dass root sich an der Konsole anmelden kann.

Sonstige Probleme

Falls Device-Nodes nicht erstellt werden, wenn ein Modul aus /etc/modules.autoload.d/kernel-2.6 geladen wird, aber erscheinen, wenn Sie ein Modul manuell mit modprobe laden, dann sollten Sie versuchen sys-apps/baselayout-1.8.12 oder neuer zu installieren.

Unterstützung für die Framebuffer-Geräte (/dev/fb/*) ist im Kernel ab der Version 2.6.6-rc2 enthalten.

Für Kernel älter als 2.6.4 müssen Sie explizit Unterstützung für das /dev/pts Dateisystem einarbeiten.

Befehlsauflistung 3.6: Aktivieren des /dev/pts Dateisystems

File systems --->
  Pseudo filesystems --->
    [*] /dev/pts file system for Unix98 PTYs

4. Ressourcen & Quellenangaben

Die udev Diskussion beim Linux Symposium (Ottawa, Ontario Kanada - 2003) geführt von Greg Kroah-Hartman (IBM Corporation) lieferte ein solides Verständnis der udev Anwendung.

Decibel's UDEV Primer ist ein detailliertes Dokument über udev und Gentoo.

Schreiben von udev Regeln vom Gentoo-Entwickler Daniel Drake ist ein exzellentes Dokument, um zu lernen, wie Sie Ihre udev-Installation verändern können.



Drucken

Aktualisiert 12. März 2007

Die Originalversion dieses Dokuments wurde zuletzt am 10. April 2007 aktualisiert

Zusammenfassung: Dieses Dokument erklärt was udev ist und wie Sie udev verwenden können um Ihren Bedürfnissen zu entsprechen

Sven Vermeulen
Autor

Gregorio Guidi
Mitarbeiter

Jan Hendrik Grahl
Übersetzer

Donate to support our development efforts.

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

php|architect

php|architect

Copyright 2001-2007 Gentoo Foundation, Inc. Questions, Comments? Contact us.