Links:
Gerätemanagement über dynamischen Kernel mithilfe von udev
ubuntu Wiki
Linux Magazin
uDev Regeln
Debian Wiki
Archlinux Wiki udev
/dev/ippp? | Netzwerkdevice für PPP-Verbindungen über ISDN (SyncPPP) |
/dev/modem | default Schnittstelle für Modem, meiste ein SymLink auf /dev/ttys? |
/dev/ttyI? | isdn4linux virtual modem (eingehende Verbindungen) |
/dev/cui? | isdn4linux virtual modem (ausgehende Verbindungen) cui1 ist das Gegenstück zu ttyI1 |
/dev/capi20 | CAPI 2.0 interface |
/dev/ttys? | serielle Schnittstellen (eingehende Verbindungen) ttys0=COM1, ttys1=COM2 usw. |
/dev/cua? | serielle Schnittstellen (ausgehende Verbindungen) cua1 ist das Gegenstück zu ttys1 |
/dev/ttyp? | Pseudo TTY |
/dev/tty? | virtuelle Konsole |
/dev/null | geschriebene Daten werden ignoriert |
/dev/zero | Leseanforderungen liefern immer eine folge von Nullbyte zurück (kann benutzt werden um eine SWAP Datei zu erzeugen) |
/dev/hda1 | erste Partition der ersten Festplatte |
/dev/mem | Physikalischer Speicher des Systems |
/usr/src/linux/Documentation/devices.txt hier kann man die Major / Minor Nummern nachsehen
# ls -l brw-rw---- 1 root disk 3, 0 May 19 1994 /dev/hda
- erste Buchstabe im Berechtigungsfeld
b - steht für Block-Device (blockorientiertes Gerät)
c - steht für Character-Device (zeichenorientiertes Gerät)
Das Feld für die Dateigröße besteht aus zwei Zahlen, die durch
ein Komma getrennt sind.
Der erste Wert ist die Major Device Number, der zweite die Minor Device Number.
- eine Gerätedatei erzeugen mit:
mknod -m Berechtigungen Name Typ Major Minor
wobei
name der komplette Pfadname der zu erzeugenden Gerätedatei ist, zum Beispiel
/dev/rft0.
typ entweder c für Character-Device oder b für Block-Device ist.
major die Major Number des Gerätes ist.
minor die Minor Number des Gerätes ist.
-m berechtigungen ein optionales Argument ist, mit dem die Berechtigungen für
das neue Gerät auf berechtigungen gesetzt werden z.B.
mknod /dev/blogg b 42 0
erstellt ein Block-Device (b) unter dem Namen blogg (dev/blogg) Major Number 42 und der Minor Number 0
mknod -m 666 /dev/bogus b 42 0
wie oben nur mit der Berechtigung 666 statt Standard 644.
man kann auch mit dem Shellscript MAKEDEV eine Gerätedatei anlegen, es brauch nur noch der Name angegeben werden, Major und Minor Nummer findet MAKEDEV selbstständig.
dem Benutzer keine direkten Berechtigungen auf Gerätedateien geben, das
sie sonst mit "mkfs" z.B. die Daten einer Partition vernichtet werden
kann.
mit Schreibberechtigung können Daten zerstört werden, mit Leseberechtigungen
z.B. (/dev/hda2) auf eine Partition kann man Daten anderer Benutzer einsehn,
oder bei (/dev/mem) steht für den physikalischen Speicher eines Systems,
kann man Passwörter einsehen die beim Login eingegeben werden.
Bei statischen Device, werden alle möglichen Gerätedateien unter /dev schon im vorraus angelegt, im Gegensatz zu dynamischen Device wie bei uDev die erst beim vorhandensein der Hardware erzeigt werden.
- einen Grundstock von Gerätedateien anlegen.
MAKEDEV generic-i386
- Gerätedateien updaten, eine Liste aus /proc/devices wird gelesen und die fehlenden Device unter /dev werden angelegt.
MAKEDEV update
- alle ttyXX Gerätedateien erstellen
MAKEDEV console
- ein einzelnes Device anlegen, im Beispiel das TUN Tunnel-Device
mknod /dev/net/tun c 10 200
Der Kernel ermittelt, welcher Treiber zu einem Gerät gehört, anhand der IDs die jedes Gerät beim anstecken übermittelt. Dies sind die VendoeID, DeviceID, SubvendorID und SubdeviceID, alsauch die Geräteklasse. Die Treiber ihrerseits, teilen dem Kernel über das Makro MODULE_ALIAS alle IDs mit für die sie verantwortlich sind. Diese werden für PCI Device in der Datei /lib/modules/$(uname -r)/modules.pcimap verzeichnet. modinfo <modulname> zeigt die IDs für die das einzelne Module verantwortlich ist an. Hat der Kernel einen Treiber geladen, ist das Gerät eigentlich betriebsbereit. Soll eine Anwendung auf ein Gerät zugreifen, benötigt es den Namen des DeviceFiles. Für das anlegen des DeviceFiles ist dann der uDev Daemon zuständig. Der uDev Daemon wird vom Kernel über ein User-Event (Uevent) benachrichtigt, wenn neue Hardware erkannt wurde.
Verzeichnis/Datei | Beschreibung |
---|---|
/etc/udev | Konfigurationsverzeichnis |
/etc/udev/udev.conf | Konfigurationsdatei für udev |
/lib/udev | Programmverzeichnis |
/etc/udev/rules.d | Verzeichnis für die Regeln, Benutzerdefinierte Regeln |
/lib/udev/rules.d | Grundlegende Regeln |
/etc/udev/rules.d/z25_persistent-net.rules | Benutzerdefinierte Regeldatei, Netzwerkkarten wie eth0, eth1 werden in der folgenden Datei (unter Debian) zugeordnet |
- bei Problemen mit udev, kann der LogLevel auf err, info (Default) oder debug gesetzt werden.
# /etc/udev/udev.conf # see udev.conf(5) for details # # udevd is started in the initramfs, so when this file is modified the # initramfs should be rebuilt. udev_log="info"
es sollten in den Verzeichnissen keine Dateien bearbeitet werden, lieber für neue oder geänderte Regeln auch neue Dateien anlegen, die dann auch ein uDev Update überstehen. Die Regeln werden in alphabetischer Reihenfolge abgearbeitet.
Die Regeln bestehen aus einer oder mehere Bedingung(en) und der Aktion.
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0b:5d:96:a3:0f", ATTR{type}=="1", NAME="eth0"
Der Netzwerkkarte mit der MAC 00:0b:5d:67:12:05 wid der das Device eth0 zugewiesen.
SUBSYSTEM=="usb", ATTRS{serial}=="0815", OWNER="1000" , MODE="0600"
Des USB Gerät mit der Seriennummer 0815, darf nur vom User mit der ID 1000 genutzt werden.
Mobiltelefon als UMTS Modem einbinden
SUBSYSTEMS=="usb", KERNEL=="ttyacm[0-9]*", ATTR{idVendor}=="0fce", \ ATTR{idProduct}=="0076", ATTR{serial}=="?*", SYMLINK+="umtsmodem"
max. fünf ATTR oder ENV-Attribut Aufrufe sind pro Regel erlaubt. uDev schaut im /sys Verzeichnis des angegebenen Gerätes (usb) nach der Datei idVendor und prüft ob da der Eintrag 0fce enthalten ist, dann werden noch die Dateien idProduct und serial geprüft, stimmen diese mit den Angaben überein wird der Symlink umtsmodem angelegt. Als erstes mit udevadm monitor die uevents anzeigen lassen, dann mit udevinfo -a -p <Device> die übergebenen Attribute anzeigen lassen.
# udevadm monitor udevmonitor will print the received events for: UDEV the event which udev sends out after rule processing UEVENT the kernel uevent UDEV [1226406560.453882] add /devices/pci0000:00/0000:00:1d.7/usb5/5-3 (usb) UEVENT[1226406560.454893] add /devices/pci0000:00/0000:00:1d.7/usb5/5-3/5-3:1.0 (usb) UEVENT[1226406560.454931] add /class/usb_endpoint/usbdev5.3_ep01 (usb_endpoint) ...
# udevadm info -a /sys/devices/pci0000\:00/0000\:00\:14.0/usb3/3-2/ P: /devices/pci0000:00/0000:00:14.0/usb3/3-2 N: bus/usb/003/002 E: BUSNUM=003 E: DEVNAME=/dev/bus/usb/003/002 E: DEVNUM=002 E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-2 E: DEVTYPE=usb_device E: DRIVER=usb E: ID_BUS=usb E: ID_MODEL=6362 E: ID_MODEL_ENC=6362 E: ID_MODEL_FROM_DATABASE=Flash Card Reader/Writer E: ID_MODEL_ID=6362 E: ID_REVISION=0100 E: ID_SERIAL=058f_6362 E: ID_USB_INTERFACES=:080650: E: ID_VENDOR=058f ...
# udevadm info -a /sys/devices/pci0000\:00/0000\:00\:14.0/usb3/3-2/ Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-2': KERNEL=="3-2" SUBSYSTEM=="usb" DRIVER=="usb" ATTR{authorized}=="1" ATTR{avoid_reset_quirk}=="0" ATTR{bConfigurationValue}=="1" ATTR{bDeviceClass}=="00" ATTR{bDeviceProtocol}=="00" ATTR{bDeviceSubClass}=="00" ATTR{bMaxPacketSize0}=="64" ATTR{bMaxPower}=="100mA" ATTR{bNumConfigurations}=="1" ATTR{bNumInterfaces}==" 1" ATTR{bcdDevice}=="0100" ATTR{bmAttributes}=="80" ATTR{busnum}=="3" ATTR{configuration}=="" ATTR{devnum}=="2" ATTR{devpath}=="2" ATTR{idProduct}=="6362" ATTR{idVendor}=="058f" ATTR{ltm_capable}=="no" ATTR{maxchild}=="0" ATTR{quirks}=="0x0" ATTR{removable}=="removable" ATTR{speed}=="480" ATTR{urbnum}=="11845" ATTR{version}==" 2.00"
Attribut | Beispiel | Beschreibung |
---|---|---|
ACTION | ACTION=="add" | Event Typen add, change oder remove |
ATTR | ATTR{serial}=="0815" | vergleicht den Inhalt einer Datei im SysFS Path des Devices |
ATTRS | ATTRS{serial}=="0815" | wie ATTR, sucht auch in übergeordneten Verzeichnissen |
DRIVER | DRIVER=="8139too" | Name des Kernel Moduls SysFS Path des Devices |
DRIVERS | DRIVERS=="?*" | wie DRIVER, sucht auch in übergeordneten Verzeichnissen |
ENV | ENV{COMMENT}=="" | Vergleicht mit einer Variablen |
KERNEL | KERNEL=="event[0-9]" | Kernel Device Bezeichnung |
KERNELS | KERNELS=="[0-9]*:*[0-9]" | wie Kernel, sucht auch in übergeordneten Verzeichnissen |
PROGRAM | PROGRAM=="/bin/true" | führt den Befehl aus, bei Rückgabewert 0 ist das Ereignis wahr |
RESULT | PROGRAM=="/bin/echo test", RESULT=="test" | Ausgabe des zuvor ausgeführten Proramms wird verglichen |
SUBSYSTEM | SUBSYSTEM=="pcmcia" | Kernel-Subsystem das das Event auslöst |
SUBSYSTEMS | SUBSYSTEMS=="usb" | wie SUBSYSTEM, sucht auch in übergeordneten Verzeichnissen |
TEST | TEST=="/var/run/network/initialized" | prüft ob es die angegebene Datei gibt |
Aktionsattribute | Beispiel | Beschreibung |
ATTR | ATTR{queue/read_ahead_kb}="256" | schreibt den Wert in die angegebene SysFS Datei |
ENV | ENV{libsane_matched}="yes" | exportiert die Variable mit diesem Wert ins Environment |
GROUP | GROUP="audio" | setzt die Gruppe die auf das Device zugreifen darf |
MODE | MODE="660" | Zugriffsrechte für das Device setzen |
NAME | NAME="capi20" | Name des Device festlegen |
OWNER | OWNER="lp" | Eigentümer des Device |
OPTIONS | OPTIONS="ignore_device" | Optionen für das Device |
RUN | RUN+="/sbin/modprobe ..." | führt Befehl aus ohne auf Rückgabewert zu achten |
SYMLINK | SYMLINK+="libmtp-%k" | legt einen Symbolischen Link mit den angegebenen Namen an, der auf das Device verweist |
Vergleiche im Bedingungsteil der Regel | |
---|---|
== | gleich |
!= | ungleich |
Attribute zuweisen | |
= | zuweisen |
:= | schreibgeschützt |
+= | mehrere Werte zuweisen |
Variable | Beschreibung |
---|---|
%E{...}, $env{...} | Inhalt der angegebenen Umgebungsvariable |
%M, $major | Major Device Nummer des Geräts |
%N, $tempnode | temporärer Device Node des Geräts |
%P, $parent | Device Node des übergeordneten Geräts |
%S, $sys | Mountpoint von Sys |
%b, $id | Name des übergeordneten Device/Busses |
%c, $result | Ausgabe des letzten Programmaufrufes |
%d, $driver | Treiber Name |
%k, $kernel | Device-Bezeichnung des Kernels |
%m, $minor | Minor Device Nummer des Gerätes |
%n, $number | Nummer der Kernel Device Bezeichnung z.B. 1 bei sda |
%p, $devpath | Device Path des aktuellen Gerätes |
%r, $root | RootVerzeichnis von uDev |
%s{..}, $attr{..} | Inhalt der angegebenen Sysfs Datei |
Programme | Beschreibung |
---|---|
ata_id | Stellt Udev eine einmalige Beschreibung und weitere Informationen (uuid, label) für ein ATA-Laufwerk zur Verfügung. |
cdrom_id | Stellt Udev die Geräteeigenschaften von CD-Rom- und DVD-ROM-Laufwerken zur Verfügung. |
create_floppy_devices | Erstellt alle möglichen Diskettenlaufwerks-Gerätedateien basierend auf dem CMOS-Typ. |
edd_id | Stellt Udev die EDD-ID für ein BIOS-Laufwerk zur Verfügung. |
firmware.sh | Lädt Firmware in angeschlossene Geräte. |
path_id | Stellt den kürzesten einmaligen Pfad zu einer Hardware zur Verfügung. |
scsi_id | Stellt Udev einen einmaligen SCSI-Bezeichner zur Verfügung. Dieser basiert auf dem Rückgabewert einer SCSI-INQUIRY-Anfrage an das angegebene Gerät. |
udevcontrol | Stellt einige Parameter zum Ausführen des udevd-Daemon ein. Dazu gehört z.B. die Protokollierstufe. |
udevd | Dieser Daemon wacht über uevents an einem netlink-Socket, erzeugt Geräte-Dateien und führt bestimmte externe Programme als Reaktion auf diese uevents aus. |
udevinfo | Ermöglicht Anwendern, die Udev-Datenbank nach Informationen über die zur Zeit verfügbare Geräte im System abzufragen. Es stellt außerdem eine Möglichkeit dar, jedes Gerät im sysfs-Dateisystem abzufragen, um beim Erzeugen von udev-Regeln behilflich zu sein. |
udevmonitor | Zeigt die vom Kernel erhaltenen Ereignisse und die von Udev erzeugte Reaktion darauf an, nachdem eine Regel abgearbeitet wurde. |
udevsettle | Überwacht die Warteschlange der Udev-Ereignisse und beendet sich, wenn alle wartenden Ereignisse abgearbeitet wurden. |
udevtest | Simuliert ein Udev-Ereignis für das angegebene Gerät und gibt den Namen der Gerätedatei oder der Netzwerkschnittstelle aus, die ein echter udev-Aufruf für dieses Gerät erzeugt hätte. |
udevtrigger | Sorgt für eine Wiederholung der Kernel-Geräte-Ereignisse. |
usb_id | Stellt Udev Informationen zu USB-Geräten zur Verfügung. |
vol_id | Stellt Udev label und uuid eines Dateisystems zur Verfügung. |
write_cd_rules | Dieses Skript erzeugt Udev-Regeln, die stabile Namen für optische Laufwerke unterstützen (siehe auch Abschnitt 7.12, „Erzeugen von benutzerdefinierten symbolischen Links zu Geräten“). |
write_net_rules | Dieses Skript erzeugt Udev-Regeln, die stabile Namen für Netzwerkschnittstellen unterstützen (siehe auch Abschnitt 7.13, „Einrichten des network-Skripts“). |
Bibliotheken | Beschreibung |
libudev | Eine Schnittstellen-Bibliothek zu Udev-Geräteinformationen. |
libvolume_id | Eine Schnittstellen-Bibliothek zum Auslesen von Volumen-Kennungen (labels) und uuids. |
Beispiele | Beschreibung |
---|---|
lsusb -v | Infos zu eingesteckten USB Geräten anzeigen |
lsusb -t | USB Device in Baumansicht |
lsusb -d 046d:c52b | USB Geräte -d mit Angabe der Vendor:Product Nummer |
udevadm info /sys/class/net/eth0/ | Info zum Device |
udevadm info -a -n /dev/ttyACM0 | Info zum Device -n über den DeviceName |
udevadm info -a -p /sys/block/sda | Info zum Device -p über SysPath |
udevadm info -q path -n /dev/sda | SysPath des Device anzeigen |
udevadm monitor | Default, zeigt vom Kernel Uevents und udev Events an (-k -u) |
udevadm monitor --property | Erweiterte Ausgabe vom Kernel Uevents und udev Events (-p) |
udevadm control --reload-rules | udev Regeln neu einlesen |
udevadm control log_priority=<level> | Log Level des Daemons ändern (temporär) |
udevadm test $(udevadm info -q path -n <device>) | Regeln testen |
- mit udevadm testen, welche Regeln zur Anwendung kommen
udevadm test $(udevadm info -q path -n /dev/ttyACM0) calling: test version 229 This program is for debugging only, it does not run any program specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run. === trie on-disk === tool version: 229 file size: 7058303 bytes header size 80 bytes strings 1762191 bytes nodes 5296032 bytes Load module index timestamp of '/etc/systemd/network' changed timestamp of '/lib/systemd/network' changed Parsed configuration file /lib/systemd/network/99-default.link Created link configuration context. timestamp of '/etc/udev/rules.d' changed Reading rules file: /lib/udev/rules.d/39-usbmuxd.rules Reading rules file: /lib/udev/rules.d/40-bridge-network-interface.rules Reading rules file: /lib/udev/rules.d/40-crda.rules ... GROUP 20 /lib/udev/rules.d/50-udev-default.rules:26 IMPORT builtin 'hwdb' /lib/udev/rules.d/60-serial.rules:7 IMPORT builtin 'usb_id' /lib/udev/rules.d/60-serial.rules:8 ...
udevadm test $(udevadm info -q path -n /dev/ttyACM0) 2>&1 | \
sed -n 's/.* \(\/[^ ]*\)\.rules:\([0-9]\+\)/\1.rules \2/p' | \
while read -r f n; do printf "%03d:%-50s " $n "$f"; sed -n ${n}p $f; done 026:/lib/udev/rules.d/50-udev-default.rules KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout" 007:/lib/udev/rules.d/60-serial.rules SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=pci" 008:/lib/udev/rules.d/60-serial.rules SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" 008:/lib/udev/rules.d/60-serial.rules SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" 015:/lib/udev/rules.d/60-serial.rules IMPORT{builtin}="path_id" 016:/lib/udev/rules.d/60-serial.rules ENV{ID_PATH}=="?*", ENV{.ID_PORT}=="", SYMLINK+="serial/by-path/$env{ID_PATH}" 019:/lib/udev/rules.d/60-serial.rules IMPORT{builtin}="usb_id" 023:/lib/udev/rules.d/60-serial.rules ENV{.ID_PORT}=="", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$env{ID_USB_INTERFACE_NUM}"
- ggf Kernel Module temporär nachladen, im Beispiel mit Angabe von Vendor und Produkt ID
modprobe usbserial
modprobe -v ftdi_sio vendor=0x1234 product=0x1234 debug modprobe -v mct_u232 vendor=0x050d product=0x0109
- Kernelmodule permanent laden, in der modules.conf können noch Parameter mitgegeben werden
# /etc/modules-load.d/modules.conf oder /etc/modules ... usbserial ftdi_sio pl2303 mct_u232
# /etc/modules-load.d/modules.conf
mct_u232 options 'mct_u232' vendor=0x050d product=0x0109
- wenn im Modul kein Alias für die Hardware definiert ist, kann er wie folgt übergeben werden
echo "050d 0109" > /sys/bus/usb-serial/drivers/mct_u232/new_id
im Modul hinterlegten aliase von Vendor und Produkt anzeigen
modinfo mct_u232 modprobe -c | grep -i "usbserial"
Befehl | Beschreibung |
---|---|
lsusb | USB-Device als List ausgeben |
lsusb -t | als Baumansicht |
usb-devices | grep 050d | |
ls -Al /dev/tty[A,U]* | USB Device anzeigen |