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:
- Besitzer
- Gruppe
- Rechte
- 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
Link über udev anlegen lassen
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.
