Inhaltsverzeichnis

UDEV

UDEV kurz und gut

alle Geräte neu einzulesen:

> udevadm trigger

udev neu starten:

> service udev reload

Geräteinfos von allen Block-Geräten anzeigen:

> for i in $(ls /sys/class/block/);do echo "- ${i} ------------------------------";udevadm test /sys/class/block/${i} 2>/dev/null | egrep 'DEVNAME=|ID_SERIAL|ID_VENDOR';done

Gerät-Symlink-Beziehung anzeigen:

> udevadm info --root --query=symlink --name=/dev/GERÄTEDATEI_ODER_SYMLINK
> udevadm info --root --query=symlink --name=/dev/dvd
/dev/cdrom /dev/cdrw /dev/disk/by-id/ata-HL-DT-ST_DVD+_-RW_GH50N_K25ACDN2807 /dev/disk/by-id/wwn-0x5031480000000000 /dev/disk/by-path/pci-0000:00:1f.2-scsi-1:0:0:0 /dev/dvd /dev/dvdrw
> udevadm info --root --query=symlink --name=/dev/dm-0
/dev/disk/by-id/dm-name-system-temp /dev/disk/by-id/dm-uuid-LVM-5Iyxly1W0Hvt9kiy9xRQ5z3Hc5oThL7qDdITkF9vSqJiDMTxYyHa7xE8wnZef4a3 /dev/disk/by-label/TEMP /dev/disk/by-uuid/acdaff76-c3de-488b-8485-7a0e0a56620e /dev/mapper/system-temp /dev/system/temp

UDEV Restart

wenn man an den UDEV-Regeln Veränderungen vorgenommen hat, dann ist es oft sinnvoll UDEV neu zu starten:

# /etc/init.d/udev reload 

oder

# service udev reload 

neu einlesen lassen.

Wurden Regeln für fest eingebaute Geräte (z.B. PCI-Karten) festgelegt, muss UDEV zusätzlich dazu veranlasst werden, alle Geräte neu einzulesen!

Dies geschieht mittels

# /etc/init.d/udevtrigger restart

oder

# udevadm trigger

Wurden die Regel für entfernbare Geräte erstellt, müssen diese einfach nur entfernt und wieder eingesteckt werden.

LVM + UDEV

Es sollte nicht der Symlink verwendet werden:

# ls -la /dev/home/fritz 
lrwxrwxrwx 1 root root 20 2010-03-19 15:27 /dev/home/fritz -> ../mapper/home-fritz

… sondern die vom Kernel angelegte Datei:

# ls -l /dev/mapper/home-fritz
brw-rw---- 1 root disk 252, 0 2010-03-19 15:30 /dev/mapper/home-fritz

Mit diesem Kommando bekommt man dann alle Infos, die von UDEV ausgewertet werden können:

udevadm info -a -p $(udevadm info -q path -n /dev/mapper/home-fritz)

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/virtual/block/dm-5':
  KERNEL=="dm-5"
  SUBSYSTEM=="block"
  DRIVER==""
  ATTR{range}=="1"
  ATTR{ext_range}=="1"
  ATTR{removable}=="0"
  ATTR{ro}=="0"
  ATTR{size}=="8192"
  ATTR{alignment_offset}=="0"
  ATTR{capability}=="10"
  ATTR{stat}=="     224        0     1792     2950        1        0        8        0        0      480     2950"

udevadm info -q path -n /dev/mapper/home-fritz
  /devices/virtual/block/dm-5

fgrep -H fritz /sys/block/*/dm/name
  /sys/block/dm-5/dm/name:System-fritz
fgrep -l fritz /sys/block/*/dm/name
  /sys/block/dm-5/dm/name

Möchte man, dass ein bestimmtes logisches Laufwerk (erstellt mit LVM) ganz bestimmte Rechte bekommt, dann kann man das mit udev machen.

Und so geht das:

Als erstes legt man ein LV an, in unserem Fall lautet das LV /dev/mapper/home-fritz.

Jetzt müssen wir den Kernel-Namen herausfinden:

# basename $(udevadm info -q path -n /dev/mapper/home-fritz)
dm-4
# basename $(udevadm info -q path -n /dev/mapper/home-fritz2)
dm-5

Und damit können wir jetzt unsere Regel formulieren:

# echo 'KERNEL=="dm-4|dm-5", OWNER="fritz", GROUP="gruppe", MODE="0660"' >> /etc/udev/rules.d/meine.rules

Jetzt braucht nur noch UDEV neu gestartet werden, und schon sind die Rechte immer wie gewünscht:

# /etc/init.d/udev restart

Nach dem Neustart von UDEV gehört das LV nur noch Fritz:

# ls -l /dev/mapper/home-fritz
brw-rw---- 1 fritz fritz 252, 0 2010-03-19 15:30 /dev/mapper/home-fritz

USB-Stick beim einstecken personalisieren

Steckt man einen USB-Stick an, dann wird von UDEV eine neue Gerätedatei erstellt. In unserem Fall ist das /dev/sdb.

# ls -la /dev/sdb
brw-rw---- 1 root disk 8, 16 2010-03-23 09:25 /dev/sdb

Jetzt ermitteln wir mit Hilfe dieser Gerätedatei alle Eigenschaften (bei UDEV werden sie Attribute genannt), die UDEV vom USB-Stick bekommen kann und filtern davon die drei Eigenschaften raus, mit denen man den USB-Stick eindeutig identifizieren kann.

Dazu zählen Hersteller-ID (idVendor), Produkt-ID des Herstellers (idProduct) und Seriennummer (serial):

# udevadm info -a -p $(udevadm info -q path -n /dev/sdb) | egrep 'idVendor|idProduct|serial'
    ATTRS{idVendor}=="1307"
    ATTRS{idProduct}=="0165"
    ATTRS{serial}=="97921499123129"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{serial}=="0000:00:1d.7"

Von dieser Ausgabe brauchen wir nur die ersten drei Zeilen, die letzten drei Zeilen gehören zu einem anderen Block.

Mit diesen Infos können wir schon eine Regel erstellen.

In diesem Beispiel möchte ich die folgenden Eigenschaften der Gerätedatei verändern:

  1. Besitzer
  2. Gruppe
  3. Rechte
  4. Name

diese zu verändernden Eigenschaften hängen wir hinter die zu verändernden einfach an:

vi /etc/udev/rules.d/usbstick.rules
ATTRS{idVendor}=="1307", ATTRS{idProduct}=="0165", ATTRS{serial}=="97921499123129", OWNER="fritz", GROUP="fritz", MODE="0600", NAME="usbstick"

Zu beachten ist hierbei, dass die Eigenschaften, die zur Identifikation verwendet werden, Vergleichsoperationen sind. Deshalb enthalten sie auch ein doppeltes Gleichheitszeichen: "=="!

Die Eigenschaften, die wir verändern wollen, sind Zuweisungsoperationen, hier steht nur ein einfaches Gleichheitszeichen: "="!

Jetzt braucht nur noch UDEV neu gestartet werden, und schon sind die Rechte immer wie gewünscht:

# /etc/init.d/udev restart

Nach dem Neustart von UDEV stecken wir den USB-Stick erneut an:

# ls -l /dev/usbstick
brw------- 1 fritz fritz   8, 17 2010-03-23 09:56 /dev/usbstick

… und alles wie erwartet. ;-)

Man könnte aber auch sagen, dass man lieber einen sprechenden Symlink haben möchte und die Gerätedateinamen für die Laufwerke (der besseren Übersicht wegen) lieber unverändert lassen möchte.

Dann tauscht man in der oben genannten Regel das

NAME="usbstick"

gegen ein

SYMLINK+="usbstick"

aus.

Dann würde das ganze so aussehen:

# ls -la /dev/sdb* /dev/usbstick
brw------- 1 fritz fritz  8, 16 2010-03-23 10:14 /dev/sdb
brw------- 1 fritz fritz  8, 17 2010-03-23 10:14 /dev/sdb1
lrwxrwxrwx 1 root  root       3 2010-03-23 10:14 /dev/usbstick -> sdb

Allerdings sieht man, dass der Symlink nicht auf die Partition zeigt und deshalb auch nicht zum mounten verwendet werden kann!

Um dieses Problem zu lösen, sagen wir einfach in der UDEV-Regel, das die erste Partition mit dem Sysmlink verknüpft werden soll. Dazu muss nur eine ATTR-Regel hinzugefügt werden:

ATTR{partition}=="1"

Die komplette Regel würde dann so aussehen:

vi /etc/udev/rules.d/usbstick.rules
ATTR{partition}=="1", ATTRS{idVendor}=="1307", ATTRS{idProduct}=="0165", ATTRS{serial}=="97921499123129", OWNER="fritz", GROUP="fritz", MODE="0600", SYMLINK+="usbstick"

Jetzt noch einmal UDEV neu starten:

# /etc/init.d/udev restart

… den Stick erneut anstecken … und schon ist alles wie gewünscht:

# ls -la /dev/sdb* /dev/usbstick
brw------- 1 fritz fritz  8, 16 2010-03-23 10:27 /dev/sdb
brw------- 1 fritz fritz  8, 17 2010-03-23 10:27 /dev/sdb1
lrwxrwxrwx 1 root  root       3 2010-03-23 10:27 /dev/usbstick -> sdb1

Einige moderne Distributionen wie z.B. Ubuntu verwenden udev um über Regeln die Links während des Bootens anzulegen. Leider fehlt oft die Regel um den Link auf /dev/dvdram anzulegen. Die Regeln werden unter /etc/udev/rules.d/ gespeichert und können sich auch je nach Distribution unterscheiden.

Beispiel für Ubuntu, Kubuntu und Xubuntu: Öffnen Sie die Datei /etc/udev/rules.d/40-permissions.rules und fügen Sie folgende Zeile ein:

ENV{ID_CDROM_DVD_RAM}=="?*"             GROUP="dvdram"

Öffnen Sie die Datei /etc/udev/rules.d/60-symlinks.rules und fügen Sie folgende zwei Zeilen ein:

# Create /dev/dvdram* symlinks for DVD-RAM devices
ENV{ID_CDROM_DVD_RAM}=="?*",            SYMLINK+="dvdram", MODE="0777"

Öffnen Sie die Datei /etc/groups und fügen Sie noch analog der Gruppe cdrom die Gruppe dvdram ein.