HOWTO zu udev (user space device system) (C) 2008-2013 T.Birnthaler/H.Gottschalk OSTC Open Source Training and Consulting GmbH http://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. ________________________________________________________________________________ INHALTSVERZEICHNIS 1) Einrichtungsschritte ________________________________________________________________________________ 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