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.5 2017/11/25 23:04:32 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   (Toc)

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