Gentoo udev Leitfaden
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 |
# 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.
Die Inhalte dieses Dokuments sind unter der Creative Commons -
Namensnennung / Weitergabe Lizenz lizenziert.
|