Udev

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung.
Installationsmethoden LiveCDs Kernel & Hardware Laptops & Notebooks Portage System Netzwerke & Services X Software Anderes alphabetischer HOWTO Index



Inhaltsverzeichnis

[Bearbeiten] UDEV installieren

Anmerkung: dieses Howto bezieht sich auf ein reines Udev-System. Gerade bei frühen 2.6er Versionen gab es oft Probleme und es wurden Mischformen benutzt. Aktuelle Kernel bieten aber inzwischen eine hervorragende Udev-Unterstützung.

[Bearbeiten] Benötigte Versionen wichtiger Pakete

Erstens braucht man einen möglichst aktuellen (!!) 2.6er Kernel. Das Paket baselayout sollte mindestens Version 1.8.6.13-r1 sein. Auch hier gilt, je aktueller desto besser. nVidia-Besitzer sollten mindestens Version 1.0.5336-r1 (nvidia-glx, nvidia-kernel) installieren, ansonsten funktioniert das nvidia-Modul nicht.

[Bearbeiten] Kernel-Konfiguration

[Bearbeiten] Vorbereitung

Es empfiehlt sich immer, wenn man aus dem Kernel Optionen entfernt, vorher make mrproper durchlaufen zu lassen, da diese ansonsten trotzdem mit einkompiliert werden. Vorher noch schnell die .config-Datei sichern:

cp .config ../config
make mrproper
mv ../config .config

[Bearbeiten] Konfiguration

make menuconfig
General setup  --->
[*] Support for hot-pluggable services

Findet ihr diese Option nicht im Menü, könnt ihr mit folgendem Befehl prüfen, ob sie trotzdem aktiviert ist:

grep CONFIG_HOTPLUG /usr/src/linux/.config

Als Ausgabe müsste zu sehen sein:

CONFIG_HOTPLUG=y
File systems --->
Pseudo filesystems --->
[ ] /dev file system support (OBSOLETE)

Falls vorhanden (Kernelversionen >= 2.6.13) sollte der Support für inotify aktiviert werden. udev-103 verwendet diesen Mechanismus, um Änderungen in seinen Konfigurationsdateien zu überwachen und beschwert sich beim Systemstart, wenn es diese Option nicht findet.

 File Systems --->
 [*] Inotify file change notification support

Um Kartenleser zu verwenden sollte noch Folgendes gesetzt werden:

Device Drivers --->
SCSI device support --->
[*] Probe all LUNS on each SCSI device

Jetzt noch den Kernel kompilieren. In der Zwischenzeit kann man das Howto bis zum Neustart durcharbeiten.

[Bearbeiten] genkernel

Benutzer von genkernel sollten Folgendes ausführen:

genkernel --udev all

[Bearbeiten] UDEV emergen

Die erforderliche udev-Software braucht man natürlich auch:

emerge -av udev

Als Abhängigkeit sollten sysfsutils und hotplug mitemerged werden, wenn diese Pakete noch nicht installiert sind. Ansonsten noch Folgendes ausführen:

emerge -av sysfsutils hotplug

[Bearbeiten] Hotplug (Version >=20040920) einrichten

Wer sich schonmal das init-Skript der neuen hotplug-Versionen angeschaut hat, wird feststellen, dass das init-Skript lediglich überprüft, ob hotplug-Unterstützung in den Kernel einkompiliert ist. Da man auf diese Überprüfung getrost verzichten kann, braucht man es auch nicht zu starten. Mit folgendem Kommando sieht man, welche Dienste in den Runleveln gestartet werden:

rc-update -s

Um es aus dem Runlevel zu entfernen:

rc-update -d hotplug

[Bearbeiten] Coldplug

Coldplug wird seit udev-103 nicht mehr benötigt. Dieser Abschnitt gilt also nur für ältere Versionen von udev.

Bei den neuen Versionen von Hotplug, also ab 20040920, ist es notwendig Coldplug zu emergen, da das Laden von Modulen beim Bootvorgang technisch gesehen kein Hotplugging ist und diese Funktion deshalb aus Hotplug entfernt wurde. Damit weiterhin die notwendigen Module beim Start geladen werden, sind folgende Schritte notwendig:

emerge coldplug

Und ein:

rc-update -a coldplug boot

Am einfachsten und sichersten ist es aber immer noch die Module in /etc/modules.autoload.d/kernel-2.x einzutragen, falls man Probleme mit Coldplug hat. Man sollte auch bedenken, dass die neue Hotplug-Version die Firmware von WLAN-Karten z.B. in /lib/firmware erwartet. Dies sollte man entsprechend ändern.

[Bearbeiten] /etc/conf.d/rc anpassen

Einfach folgende Variablen ändern:

RC_DEVICE_TARBALL="no"
RC_DEVFSD_STARTUP="no"

Noch eine Anmerkung dazu: dieser Schritt ist zur Zeit noch erforderlich, da man mit diesen beiden Variablen einstellen kann, ob Gentoo Udev und/oder devfs verwendet und ob mit oder ohne der Datei /lib/udev-state/devices.tar.bz2

Dies ist zur Zeit für Übergangslösungen gedacht und wird mit späteren Udev-Versionen überflüssig werden.

[Bearbeiten] Schritte bei Fehlermeldung: "WARNING: Unable to open an initial console."

Als Root:

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

Die vorhandenen Dateien "console" und "null" am besten vorher löschen, sicher ist sicher.

 mknod -m 660 console c 5 1 
 mknod -m 660 null c 1 3
 cd /
 umount /test
 rmdir /test

Beim nächsten Neustart sollte diese Warnung verschwinden!

[Bearbeiten] Bootloader-Konfiguration

Folgende Optionen sind nur notwendig, falls man devfs-Unterstützung mit einkompiliert hat:

[Bearbeiten] lilo

image ="/boot/kernel-2.6.9" 
 root="/dev/hdb2" label="GentooUDEV" 
 append = "gentoo=nodevfs devfs=nomount ide0=ata66 ide1=ata66 hdc=ide-cd" 
 read-only

Erneutes Installieren des Lilo-Bootloaders in den MBR nicht vergessen.

[Bearbeiten] grub

title=Gentoo UDEV 
root (hd0,0) 
kernel (hd0,0)/kernel-2.6.9 root=/dev/hda3 gentoo=nodevfs devfs=nomount

[Bearbeiten] Abschließen der Installation

[Bearbeiten] reboot

Udev und Hotplug werden durch den Kernel geladen, nun fehlt nur noch eins:

shutdown -r now

Folgendes sollte beim Booten zu erkennen sein:

mounting sysfs at /sys 
mounting ramfs at /dev 
configuring system to use udev 
populating /dev with device nodes 
using /sbin/hotplug for udev management

Fertig. Nun kannst du dich über ein reines UDEV-System erfreuen.

[Bearbeiten] devfsd unmergen

Wenn das System einwandfrei funktioniert, kann man nun folgendes ausführen um devfs endgültig zu verbannen:

emerge -C devfsd

[Bearbeiten] Wo sind die CDROM-Laufwerke hin?

Für den Fall, dass man das Modul ide-cd noch nicht zur modules.autoload hinzugefügt hat, kann es sein, dass die CD/DVD-Laufwerke nicht erkannt werden (und somit /dev/cdrom oder /dev/cdrw nicht existieren). In diesem Fall hilft

modprobe ide-cd
echo "ide-cd" >> /etc/modules.autoload.d/kernel-2.6

Danach sollten die Geräte wie gewohnt funktionieren. Alternativ kann man natürlich auch auch IDE-CD-Unterstützung direkt in den Kernel einkompilieren.

[Bearbeiten] UDEV-Regeln erstellen

Der Sinn von UDEV-Regeln ist, dass man für bestimmte Geräte, die normalweise dynamisch vom System zugeordnet werden, feste Gerätenamen zuzuweisen. So möchte man z.B. seinen USB-Stick mit /dev/usbstick und/oder die Kamera mit /dev/digicam mounten können. Üblicherweise werden aber die Gerätenamen durch den SCSI-Treiber in der Reihenfolge, wie die Geräte angeschlossen werden, zugewiesen. Wenn man zuerst seinen USB-Stick einsteckt, dann hat man per /dev/sda1 auf ihn Zugriff. Falls man danach noch eine Digitalkamera einsteckt, kann man über /dev/sdb1 auf diese zugreifen. Schließt man jedoch die Kamera zuerst an, ist sie auf /dev/sda1 und der Stick auf /dev/sdb1. Um dem aus dem Weg zu gehen, benutzt man eigene UDEV-Regeln. Weiterführende Informationen findet man im Udev Rules Howto.

[Bearbeiten] Konfigurationsdatei für UDEV-Regeln erstellen

Ins Konfigurationsverzeichnis von udev wechseln

cd /etc/udev

In verschiedenen Howtos wird empfohlen hier eine Datei namens udev.rules zu erstellen, die wird aber bei aktuellen udev versionen nicht beachtet. UDEV-Regeln erstellt man im Unterverzeichnis rules.d

cd /etc/udev/rules.d

Die datei 50-udev.rules sollte man nicht bearbeiten, da diese bei einem UDEV-Update überschrieben wird. Stattdessen erstellt man eine eigene:

touch 10-udev.rules

[Bearbeiten] Beispieldatei: 10-udev.rules

Um die Funktionsweise der Udev-Regeln zu zeigen, hier eine Beispieldatei die ich für meine Geräte nutze:

Hinweis: ab der udev-Version 103 heißt es nicht mehr SYSFS{model} sondern ATTRS{model}

#digicam
BUS=="scsi", KERNEL=="sd?1", SYSFS{model}=="Sony DSC", NAME="digicam"
#usbstick
BUS=="scsi", KERNEL=="sd?1", SYSFS{model}=="Mobile Disk", NAME="usbstick"
#cardreader
BUS=="scsi", KERNEL=="sd?1", SYSFS{model}=="223 U HS-MS", NAME="cardreader/ms"
BUS=="scsi", KERNEL=="sd?1", SYSFS{model}=="223 U HS-CF", NAME="cardreader/cf"
BUS=="scsi", KERNEL=="sd?1", SYSFS{model}=="223 U HS-SM", NAME="cardreader/sm"
BUS=="scsi", KERNEL=="sd?1", SYSFS{model}=="223 U HS-SD/MMC", NAME="cardreader/sd-mmc"


Hinweis: Die Auswertung der .rules-Dateien erfolgt nach einem Kurzschlussverfahren! Trifft eine Regel zu, werden spätere Regeln, die für die selbe Hardware genutzt werden sollen, nicht mehr beachtet! Daher ist es wichtig, dass die Datei mit den eigenen Regeln vor der 50-udev.rules abgearbeitet wird. Um das zu erreichen muss man seine eigene Datei ebenfalls mit einer Nummer, die allerdings kleiner als 50 ist, versehen (10-udev.rules erfüllt dieses Kriterium). Auch innerhalb einer Datei muss dieses Abarbeitungsverfahren beachtet werden!

[Bearbeiten] Eine eigene 10-udev.rules bearbeiten

Wie ersichtlich ist die SYSFS{model}-Variable für jedes Gerät anders. Um an die Informationen zu kommen, muss man das Gerät einstecken.

ls /dev

Man sollte die Dateien /dev/sda und /dev/sda1 zu Gesicht bekommen, um die Infomationen zu dem Gerät zu sehen muss folgender Befehl eingegeben werden:

udevinfo -a -p /sys/block/sda

Die Ausgabe müsste so aussehen (wurde von mir gekürzt):

udevinfo starts with the device the node belongs to and then walks up the
device chain, to print for every device found, all possibly useful attributes
in the udev key format.
Only attributes within one device section may be used together in one rule,
to match the device for which the node will be created.

 looking at class device '/sys/block/sda':
   SYSFS{dev}="8:0"
   SYSFS{range}="16"
   SYSFS{removable}="1"
   SYSFS{size}="253952"
   SYSFS{stat}="       1        0        8        0        0        0        0        0        0        0        0"

follow the class device's "device"
 looking at the device chain at '/sys/devices/pci0000:00/0000:00:10.4/usb1/1-1/1-1:1.0/host7/7:0:0:0':
   BUS="scsi"
   ID="7:0:0:0"
   SYSFS{detach_state}="0"
   SYSFS{device_blocked}="0"
   SYSFS{max_sectors}="240"
   SYSFS{model}="Mobile Disk     "
   SYSFS{queue_depth}="1"
   SYSFS{rev}="    "
   SYSFS{scsi_level}="3"
   SYSFS{state}="running"
   SYSFS{timeout}="30"
   SYSFS{type}="0"
   SYSFS{vendor}="USB 2.0 "

Nochmal ein Ausschnitt aus meiner 10-udev.rules

BUS=="scsi", KERNEL=="sd?1", SYSFS{model}=="Mobile Disk", NAME="usbstick"

Die Variablen BUS und die SYSFS{model} sind entsprechend der Ausgabe von udevinfo anzupassen. Nachgestellte Leerzeichen bei SYSFS{model} kann man wie im Beispiel entfernen. Die Variable KERNEL="sd?1" sorgt dafür dass diese Regel für alle sd?1 (sda1, sdb1, sdc1, usw) angewandt wird. Nur wenn die SYSFS{model} übereinstimmt, wird entsprechend NAME="usbstick" eine Gerätedatei /dev/usbstick erzeugt. Diese wird beim Abziehen des usbsticks wieder gelöscht. Statt SYSFS{model} kann man bespielsweise auch SYSFS{serial} nehmen. Das wichtigste ist, dass eine eindeutige Zuordnung erkennbar ist. Bei manchen Geräten ist es notwendig dass BUS="usb" anstatt BUS="scsi" gesetzt ist, alles weitere dazu im Udev Rules Howto.

[Bearbeiten] Anmerkung zu Kartenlesern

Ein Problem bei den meisten USB-Kartenlesern ist, dass diese ohne eingesteckte Flash-Karte beim Einstecken nicht erkannt werden. Generell sollte man sie mit einer (eingesteckten) Karte anstecken und mit der Karte wieder abziehen. Ist der Kartenleser mit dem PC verbunden und wird dann erst eine Karte eingesteckt, wird diese meistens nicht erkannt. Bei eingesteckter Karte werden je nach Leser mehrere Geräte erstellt (bei mir z.B. sda, sdb, sdc und sdd). Für jedes ist dann ein separates udevinfo auszuführen, um die Regeln erstellen zu können. Damit die einzelnen Geräte vom Kernel erkannt werden, muss ggf. eine besondere Option in Kernel aktiviert werden (CONFIG_SCSI_MULTI_LUN). Damit hört die Erkennung der Geräte nicht beim ersten erkannten auf. Device Drivers > SCSI Device Support > Probe all LUNs on each SCSI device

Die Variable KERNEL="sd?1" macht Probleme mit SATA-Festplatten. (Beispiel: 1. Festplatte /dev/sda1, 2. Festplatte /dev/sdb1) Speziell, wenn /boot auf sda1 oder sdb1 liegt.)

[Bearbeiten] Digitalkameras

Solltet ihr eure Kamera absolut nicht zum Laufen bekommen und hat diese auch unter devfs nicht funktioniert, dann liegt es daran, dass diese kein richtiges Laufwerk unterstützt. (was wohl bedeutet, dass es kein MASS-STORAGE-DEVICE ist -> gphoto2 verwenden).

[Bearbeiten] Bemerkungen

Hat man die Regeln erstellt, sollte man beim erneuten Einstecken des USB-Sticks mit ls /dev neben sda1 auch usbstick zu sehen bekommen. Wenn dies der Fall ist, funktioniert die Regel perfekt ;)

[Bearbeiten] /etc/fstab

Um nun die Geräte praktisch mounten zu können, muss man abschließend noch die /etc/fstab konfigurieren. hier ein Auszug aus meiner:

/dev/usbstick                   /mnt/usbstick           vfat            noauto,rw,user,noatime          0 0
/dev/digicam                    /mnt/digicam            auto            noauto,rw,user,noatime          0 0
/dev/cardreader/ms              /mnt/cardreader/ms      auto            noauto,rw,user,noatime          0 0
/dev/cardreader/cf              /mnt/cardreader/cf      auto            noauto,rw,user,noatime          0 0
/dev/cardreader/sm              /mnt/cardreader/sm      auto            noauto,rw,user,noatime          0 0
/dev/cardreader/sd-mmc          /mnt/cardreader/sd-mmc  auto            noauto,rw,user,noatime          0 0

die Verzeichnisse unter /mnt muss man natürlich noch erstellen

Eventuell ist die Option users anstatt user interessant, die allen Benutzern das unmounten der Wechseldatenträger erlaubt.

[Bearbeiten] Problemgeräte

[Bearbeiten] Mäuse

Wenn die Maus nicht mit UDEV funktioniert, liegt das daran dass /dev/mouse in der xorg.conf eingetragen ist. Sollte /dev/mouse eingetragen sein, kann es dazu führen, dass der X-Server nicht startet und evtl. ein Umschalten auf andere Konsolen fehlschlägt. Der Befehl xorgconf ändert diesen Eintrag nicht automatisch, deshalb sollte es manuell in eins der drei folgenden umgeändert werden oder bei xorgconf angegeben werden:

/dev/input/mice 
/dev/input/mouse0
/dev/misc/psaux

Alternativ kann man sich eine Regel schreiben, die /dev/mouse erzeugt ;) Das macht auch Sinn, denn sollte man /dev/input/mouse0 in xorg.conf eingetragen haben, kann es sein, das UDEV nach dem Ausstecken und Wiedereinstecken der Maus während dem Betrieb (an Notebooks z.B. ...) das Gerät nun /dev/input/mouse1 nennt, und in X daher die Maus nicht mehr funktioniert.

[Bearbeiten] Beispiel

udevinfo -a -p /sys/class/input/mouse2

looking at the device chain at '/sys//devices/pci0000:00/0000:00:1d.2/usb2/2-1':
   BUS=="usb"
   ID=="2-1"
   DRIVER=="usb"
   SYSFS{bConfigurationValue}=="1"
   SYSFS{bDeviceClass}=="00"
   SYSFS{bDeviceProtocol}=="00"
   SYSFS{bDeviceSubClass}=="00"
   SYSFS{bMaxPower}=="100mA"
   SYSFS{bNumConfigurations}=="1"
   SYSFS{bNumInterfaces}==" 1"
   SYSFS{bcdDevice}=="0010"
   SYSFS{bmAttributes}=="a0"
   SYSFS{configuration}=="HID Mouse"
   SYSFS{detach_state}=="0"
   SYSFS{devnum}=="3"
   SYSFS{idProduct}=="0011"
   SYSFS{idVendor}=="05fe"
   SYSFS{manufacturer}=="Cypress Sem"
   SYSFS{maxchild}=="0"
   SYSFS{product}=="PS2/USB Browser Combo Mouse"
   SYSFS{speed}=="1.5"
   SYSFS{version}==" 1.00"

nano -w /etc/udev/rules.d/05-usbmouse.rules

BUS=="usb", SYSFS{idProduct}=="0011", SYSFS{product}=="PS2/USB Browser Combo Mouse", NAME="input/%k", SYMLINK="input/optical_usb_mouse"

nano -w /etc/X11/xorg.conf

#Maus anlegen (Geraet ist jetzt der Link der durch udev angelegt wird)
Section "InputDevice"
    Identifier "usbmouse"
    Driver     "mouse"
    Option     "Protocol"      "auto"
    Option     "Device"        "/dev/input/optical_usb_mouse"
    Option     "Buttons"       "5"
    Option     "ZAxisMapping"  "4 5"
EndSection
#Maus hinzufügen
Section "ServerLayout"
    #alle möglichen optionen
    InputDevice "touchpad" "CorePointer"
    #die Maus als zusätzliches Eingabegerät
    InputDevice "usbmouse" "SendCoreEvents"
EndSection
  • Am X11/x.org hotplug für Eingaberäte wird noch gearbeitet. Zur Zeit gibt es keine hotplug-Lösung. Daher funktioniert die Maus nach dem Entfernen und Wiederanstecken nicht.

UPDATE: Mit dem 'evdev'-Treiber ist es möglich, die Maus per Plug-and-Play ein- und auszustecken. Hier ein Auszug aus meiner xorg.conf (erstellt aus "man evdev")

nano -w /etc/X11/xorg.conf

Section "InputDevice"
       Identifier  "USB-Maus"
       Driver      "evdev"
       Option      "Dev Name" "Logitech USB-PS/2 Optical Mouse"
       Option      "evBits"  "+1-2"
       Option      "keyBits" "~272-287"
       Option      "relBits" "~0-2 ~6 ~8"
       Option      "Pass"    "3"
EndSection

Das "Dev Name" ist der Identifier für die Maus (bleibt für ein Gerät immer gleich) und kann aus "cat /proc/bus/input/devices | grep Name" ausgelesen werden.

[Bearbeiten] Alsa/nVidia

Sollte der X-Server nicht starten, dann als root Folgendes ausführen:

udevstart

Dabei werden evtl. fehlende Gerätedateien erzeugt und man kann danach den X-Server starten.

[Bearbeiten] Festplatten können nicht eingebunden werden

Wenn das System nicht startet, weil Gentoo beim Booten für die root-Partition keine Devices findet, sollte man im Dev Verzeichnis das .devfs Device entfernen:

rm /dev/.devfs

[Bearbeiten] Links zum Thema UDEV

Udev Rules Howto Mehr Informationen über das Schreiben von UDEV-Regeln.

[Bearbeiten] www.kernel.org Links

Udev FAQ

Udev vs. devfs

Offizielle UDEV-Dokumentation

'Persönliche Werkzeuge
Andere Sprachen