HOWTO zu udev (user space device system)
(C) 2008-2013 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
OSTC Open Source Training and Consulting GmbH
www.ostc.de
$Id: unix-udev-HOWTO.txt,v 1.6 2019/11/26 19:37:07 tsbirn Exp $
Dieses Dokument beschreibt Verhaltensweise und Konfiguration des udev-Systems
unter SLES10 anhand dem Beispiel eines USB-Sticks, der beim Einstecken
automatisch unter einem individuell zugeordneten Verzeichnis montiert werden
soll.
1) Einrichtungsschritte
Beim Einstecken eines bestimmten USB-Sticks des Herstellers "Yakumo" soll er
unter dem Verzeichnis "/media/usb/yakumo" eingehängt werden. Der Device-Name
des USB-Sticks lautet "/dev/sda1" (kann aber wechseln, wenn der USB-Stick nicht
als 1., sondern als 2., ... eingesteckt wird; auch dies soll funktionieren).
* Bisher über USB-Geräte verfügbare Informationen merken:
udevinfo -e > /tmp/usb-info # --export-db
* USB-Stick einstecken und dabei das Verhalten des Systems beobachten.
sudo tail -f /var/log/messages
liefert:
Apr 4 04:29:13 r02 kernel: usb 1-2: new full speed USB device using uhci_hcd and address 4
Apr 4 04:29:13 r02 kernel: usb 1-2: new device found, idVendor=0ea0, idProduct=6803
Apr 4 04:29:13 r02 kernel: usb 1-2: new device strings: Mfr=1, Product=2, SerialNumber=3
Apr 4 04:29:13 r02 kernel: usb 1-2: Product: Solid state disk
Apr 4 04:29:13 r02 kernel: usb 1-2: Manufacturer: USB
Apr 4 04:29:13 r02 kernel: usb 1-2: SerialNumber: 17E71B693E9A6A0D
Apr 4 04:29:13 r02 kernel: usb 1-2: configuration #1 chosen from 1 choice
Apr 4 04:29:13 r02 kernel: scsi1 : SCSI emulation for USB Mass Storage devices
Apr 4 04:29:13 r02 kernel: usb-storage: device found at 4
Apr 4 04:29:13 r02 kernel: usb-storage: waiting for device to settle before scanning
Apr 4 04:29:18 r02 kernel: Vendor: OTi Model: Flash Disk Rev: 1.11
Apr 4 04:29:18 r02 kernel: Type: Direct-Access ANSI SCSI revision: 02
Apr 4 04:29:18 r02 kernel: SCSI device sda: 516096 512-byte hdwr sectors (264 MB)
Apr 4 04:29:18 r02 kernel: sda: Write Protect is off
Apr 4 04:29:18 r02 kernel: sda: Mode Sense: 03 00 00 00
Apr 4 04:29:18 r02 kernel: sda: assuming drive cache: write through
Apr 4 04:29:18 r02 kernel: SCSI device sda: 516096 512-byte hdwr sectors (264 MB)
Apr 4 04:29:18 r02 kernel: sda: Write Protect is off
Apr 4 04:29:18 r02 kernel: sda: Mode Sense: 03 00 00 00
Apr 4 04:29:18 r02 kernel: sda: assuming drive cache: write through
Apr 4 04:29:18 r02 kernel: sda: sda1
Apr 4 04:29:18 r02 kernel: sd 1:0:0:0: Attached scsi removable disk sda
Apr 4 04:29:18 r02 kernel: sd 1:0:0:0: Attached scsi generic sg0 type 0
Apr 4 04:29:18 r02 kernel: usb-storage: device scan complete
* Über den USB-Stick neu hinzugekommene Infos ansehen (Unterschied zu vorher):
udevinfo -e | diff - /tmp/usb-info
udevinfo --export-db | diff - /tmp/usb-info
liefert als neue Einträge (auf alle Variablen vom Typ "ID_..." kann in
den udev-Regeln zugegriffen werden mit ENV{ID_...}=="TEXT"):
P: /block/sda
N: sda
S: disk/by-id/usb-OTi_Flash_Disk_17E71B693E9A6A0D
S: disk/by-path/pci-0000:00:07.2-usb-0:2:1.0-scsi-0:0:0:0
E: ID_VENDOR=OTi
E: ID_MODEL=Flash_Disk
E: ID_REVISION=1.11
E: ID_SERIAL=OTi_Flash_Disk_17E71B693E9A6A0D
E: ID_TYPE=disk
E: ID_BUS=usb
E: ID_PATH=pci-0000:00:07.2-usb-0:2:1.0-scsi-0:0:0:0
P: /block/sda/sda1
N: sda1
S: disk/by-id/usb-OTi_Flash_Disk_17E71B693E9A6A0D-part1
S: disk/by-path/pci-0000:00:07.2-usb-0:2:1.0-scsi-0:0:0:0-part1
S: disk/by-uuid/2E8E-3F4A
E: ID_VENDOR=OTi
E: ID_MODEL=Flash_Disk
E: ID_REVISION=1.11
E: ID_SERIAL=OTi_Flash_Disk_17E71B693E9A6A0D
E: ID_TYPE=disk
E: ID_BUS=usb
E: ID_PATH=pci-0000:00:07.2-usb-0:2:1.0-scsi-0:0:0:0
E: ID_FS_USAGE=filesystem
E: ID_FS_TYPE=vfat
E: ID_FS_VERSION=FAT16
E: ID_FS_UUID=2E8E-3F4A
E: ID_FS_LABEL=
E: ID_FS_LABEL_SAFE=
P: /class/usb_device/usbdev1.3
N: bus/usb/001/003
* Verzeichis "/media/usb/yakumo" anlegen:
mkdir -p /media/usb/yakumo
* In "/etc/fstab" folgenden Eintrag machen (wichtig ist, dass die Option
"hotplug" statt "noauto" verwendet wird; sie besagt, dass das Gerät beim
Booten nicht vorhanden sein muss, aber falls es später auftaucht, automatisch
montiert werden soll):
/dev/sda1 /media/usb/yakumo auto hotplug,user,uid=tsbirn,gid=users,fmask=137,dmask=027 0 0
Soll der Mountvorgang unabhängig vom Gerätenamen seim (z.B. weil der USB-Stick
nicht als 1. sondern als 2., ... eingesteckt wird) dann muss über die ID
des Geräts bzw. des Dateisystems der Partition gearbeitet werden:
/dev/disk/by-uuid/2E8E-3F4A /media/usb/yakumo auto hotplug,user,uid=tsbirn,gid=users,fmask=137,dmask=027 0 0
* Da auf dem USB-Stick ein Windows FAT-Dateisystem ohne UNIX-Zugriffsrechte
vorhanden ist, dienen die Angaben "uid=tsbirn,gid=users,fmask=137,dmask=027"
dazu, die Daten auf dem Stick einem Benutzer "tsbirn" und einer Gruppe "users"
mit sinnvollen Datei- und Verzeichnisrechten zuzuordnen:
drwxr-x--- 2 tsbirn users 4096 Apr 4 05:03 VERZ/
-rw-r----- 1 tsbirn users 23832 Nov 25 11:45 DATEI
* In Datei "/etc/udev/rules.d/85-mount-fstab.rules" eine neue Regel aufnehmen,
die dafür sorgt, dass genau dieser USB-Stick bzw. die Partition darauf an der
vorbereiteten Mount-Stelle eingebunden wird (dazu die eindeutige Seriennummer
des Sticks oder des darauf angelegten FAT-Dateisystems verwenden):
# ENV{ID_SERIAL}=="OTi_Flash_Disk_17E71B693E9A6A0D" SUBSYSTEM=="block", # ACTION=="add", KERNEL=="sd*[0-9]|hd*[0-9]", RUN+="mount.sh"
ENV{ID_FS_UUID}=="2E8E-3F4A" SUBSYSTEM=="block", ACTION=="add", KERNEL=="sd*[0-9]|hd*[0-9]", RUN+="mount.sh"
Leerzeilen und Kommentarzeilen beginnend mit "#" werden ignoriert, Zeilen mit
"\" als letztem Zeichen müssen in EINE Zeile geschrieben werden (es gibt
KEINE Line continuation!).
* Den USB-Stick einstecken und den Vorgang beobachten:
sudo udevmonitor
liefert dabei:
UEVENT[1207276920.523592] add@/devices/pci0000:00/0000:00:07.2/usb1/1-2
UEVENT[1207276920.532353] add@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0
UEVENT[1207276920.532408] add@/class/scsi_host/host2
UEVENT[1207276920.532425] add@/class/usb_device/usbdev1.5
UDEV [1207276920.590382] add@/devices/pci0000:00/0000:00:07.2/usb1/1-2
UDEV [1207276920.646320] add@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0
UDEV [1207276920.664575] add@/class/scsi_host/host2
UDEV [1207276920.689740] add@/class/usb_device/usbdev1.5
UEVENT[1207276925.543583] add@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0/host2 /target2:0:0/2:0:0:0
UEVENT[1207276925.588195] add@/block/sda
UEVENT[1207276925.588981] add@/block/sda/sda1
UEVENT[1207276925.589041] add@/class/scsi_device/2:0:0:0
UEVENT[1207276925.589092] add@/class/scsi_generic/sg0
UDEV [1207276925.667148] add@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0/host2 /target2:0:0/2:0:0:0
UDEV [1207276925.719008] add@/block/sda
UDEV [1207276925.746555] add@/class/scsi_device/2:0:0:0
UDEV [1207276925.749500] add@/class/scsi_generic/sg0
UEVENT[1207276926.191732] mount@/block/sda/sda1
UDEV [1207276926.227085] add@/block/sda/sda1
UDEV [1207276926.266285] mount@/block/sda/sda1
* Beim Einstecken des USB-Sticks wird Skript "/lib/udev/mount.sh" ausgeführt,
das den Haupt-Gerätenamen des Devices (hier "/dev/sda1") und weitere
Gerätenamen als Parameter übergeben bekommt. Hier sind das folgende
Gerätenamen (der 1. ist der Hauptgerätename, dieser erlaubt aber keine
Identifikation des Geräts; der 2. identifiziert den Stick; der 3. den Namen
des USB-Anschlusses; der 4. den Namen des Dateisystems):
/dev/sda1
/dev/disk/by-id/usb-OTi_Flash_Disk_17E71B693E9A6A0D-part1
/dev/disk/by-path/pci-0000:00:07.2-usb-0:1:1.0-scsi-0:0:0:0-part1
/dev/disk/by-uuid/2E8E-3F4A
/dev/disk/by-label/...
Das Skript liest die Datei "/etc/fstab", sucht darin alle Einträge mit Option
"hotplug" und vergleicht deren Gerätenamen mit ALLEN übergebenen Gerätenamen
des gerade erkannten Geräts. Falls einer der übergebenen Gerätenamen passt,
wird mit
fsck -M -a GERÄTENAME
überprüft, ob er nicht montiert ist und ein gültiges Dateissystem enthält.
Wenn ja, wird das Geräte mit genau diesem Namen eingehängt per
mount -av GERÄTENAME
* Beim Abziehen des USB-Sticks verschwinden alle seine Gerätenamen "/dev/*" und
das Gerät wird automatisch demontiert.
sudo udevmonitor
liefert dabei:
UEVENT[1207277028.000231] remove@/class/scsi_generic/sg0
UEVENT[1207277028.000326] remove@/class/scsi_device/2:0:0:0
UEVENT[1207277028.000344] remove@/block/sda/sda1
UEVENT[1207277028.000361] remove@/block/sda
UEVENT[1207277028.000377] remove@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0/host2 /target2:0:0/2:0:0:0
UEVENT[1207277028.000394] remove@/class/scsi_host/host2
UEVENT[1207277028.000410] remove@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0
UEVENT[1207277028.000427] remove@/class/usb_device/usbdev1.5
UEVENT[1207277028.000443] remove@/devices/pci0000:00/0000:00:07.2/usb1/1-2
UDEV [1207277028.006238] remove@/class/scsi_generic/sg0
UDEV [1207277028.008760] remove@/class/scsi_device/2:0:0:0
UEVENT[1207277028.014081] umount@/block/sda/sda1
UDEV [1207277028.025873] remove@/block/sda/sda1
UDEV [1207277028.028346] remove@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0/host2/ target2:0:0/2:0:0:0
UDEV [1207277028.029543] remove@/class/scsi_host/host2
UDEV [1207277028.031353] remove@/class/usb_device/usbdev1.5
UDEV [1207277028.034334] remove@/block/sda
UDEV [1207277028.036465] umount@/block/sda/sda1
UDEV [1207277028.046821] remove@/devices/pci0000:00/0000:00:07.2/usb1/1-2/1-2:1.0
UDEV [1207277028.051682] remove@/devices/pci0000:00/0000:00:07.2/usb1/1-2