Udev
Aus Gentoo Linux Wiki
| 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.
