Links anlegen mit udev

Maik Holtkamp s-y-l at gmx.net
So Jun 17 11:46:03 UTC 2012


Hi,

0n 12/06/17 at 12:11 Nils Kassube told me:

> Maik Holtkamp wrote:
> > 0n 12/06/16 at 19:41 Nils Kassube told me:
> > > Probier doch mal mit SUBSYSTEM=="usb" statt SUBSYSTEMS=="usb". Bei
> > > den Dateien in meinem Verzeichnis /etc/udev/rules.d gibts nämlich
> > > kein "SUBSYSTEMS", nur "SUBSYSTEM".
> > 
> > Gerade noch mal geschaut und google findet fuer beide Varianten
> > Beispiele. Was ist denn richtig?
> 
> Beides kann wohl richtig sein - siehe "man -7 udev".
> 
> > udevadmin spuckt beim device selbst auch SUBSYSTEMS aus:
> > 
> > ---cut---
> >  looking at parent device
> > '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/1-1.3.2':
> >     KERNELS=="1-1.3.2"
> >     SUBSYSTEMS=="usb"
> ...
> 
> In der erstem Mail stand dies:
> 
> | root at server:/etc/udev/rules.d# cat 10-usbserial.rules 
> | SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{serial}=="AH01B9TD",
> | SYMLINK+="easy0"
> 
> Wenn ich mir für meinen USB-Seriell-Adapter ansehe, was mit "udevadm 
> info -n /dev/ttyUSB0 -a" ausgegeben wird, fällt mir auf, dass 
> KERNELS=="ttyUSB0" für eine Device angegeben wird, bei dem auch steht 
> SUBSYSTEMS=="usb-serial" aber eben nicht SUBSYSTEMS=="usb". Hast Du 
> vielleicht Attribute verschiedener Devices gemixt, so dass es das von 
> Dir definierte Device gar nicht gibt?

Also udevadmin gibt ja die gesamte Hierachie des devices aus. Im
Prinzip stellt das Geraet ja ein serielles Terminal da. Daher gibt
udevadmin erstmal dieses Terminal aus:

looking at device
'/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/1-1.3.2/1-1.3.2:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

Das ist fuer mich aber keine Hardware sondern das kernel modul fuer
Terminals. Dann kommt bei mir ein modul zu Umsetzung von usb auf
seriell:

looking at parent device
'/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/1-1.3.2/1-1.3.2:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="ftdi_sio"
    ATTRS{latency_timer}=="1"
    ATTRS{port_number}=="0"

Auch hier ein Teil des kernels. Dann folgt das Modul fuer die
serielle Schnittstelle:

  looking at parent device
'/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/1-1.3.2/1-1.3.2:1.0':
    KERNELS=="1-1.3.2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ftdi_sio"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{interface}=="FT232R USB UART"

Das eigentliche Stueck Hardware ist fuer mich das darauf folgende:

looking at parent device
'/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/1-1.3.2':
    KERNELS=="1-1.3.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bMaxPower}==" 90mA"
    ATTRS{urbnum}=="16"
    ATTRS{idVendor}=="0403"
    ATTRS{idProduct}=="6001"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="7"
    ATTRS{devpath}=="1.3.2"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{serial}=="AH01B9TD"

Das will ich ansprechen. Es folgen noch der Hub, der EHCI Host
controller und schliesslich der pci bus an sich. Als Ident String
macht fuer mich nur aber eigentlich nur dieses:

ATTRS{serial}=="AH01B9TD"

wirklich Sinn. Alle anderen Werte sind bei den anderen beiden
Geraeten auch gleich. Dieser Wert gehoert IMHO zu
SUBSYSTEMS=="usb".

Udevadmin sagt mir auch:

A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

daher wuerde ich eigentlich vermuten, dass sowas:

KERNEL=="ttyUSB0", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
       |                     |
       v                     v
one singel parent     attribute of device
    device

schon matchen wuerde. Geht aber auch nicht :(.

Zur Zeit sieht die rules Datei so aus:

SUBSYSTEM=="tty", KERNEL=="ttyUSB*", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
SUBSYSTEMS=="tty", KERNEL=="ttyUSB*", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
SUBSYSTEM=="usb-serial", KERNEL=="ttyUSB*", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
SUBSYSTEMS=="usb-serial", KERNEL=="ttyUSB*", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
SUBSYSTEM=="usb", KERNEL=="ttyUSB*", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
KERNEL=="ttyUSB0", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"
KERNEL=="ttyUSB0", ATTRS{serial}=="AH01B9TD", SYMLINK+="easy0"

tut sich aber trotzdem nichts :(. 

Ich glaube aber ich habe eine Weg gefunden wie ich die Teile doch
noch unabhaengig vom Kernel mapping angesprochen bekomme:

---cut---
root at server:/dev/serial/by-id# ls -l
insgesamt 0
lrwxrwxrwx 1 root root 13 Jun 15 21:25 usb-FTDI_FT232R_USB_UART_AH01B3OJ-if00-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Jun 15 21:25 usb-FTDI_FT232R_USB_UART_AH01B9TD-if00-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 Jun 15 21:25 usb-FTDI_FT232R_USB_UART_AH01B9TL-if00-port0 -> ../../ttyUSB2
---cut---

Ich bin zwar nicht dahinter gekommen, wer wo wann diese links legt
und besonders handlich finde ich die auch nicht wirklich, aber wenn
ich in den configs der Software angebe:

SERIAL = /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AH01B3OJ-if00-port0

sollte ich das gleiche device ansprechen egal auf welche /dev/ttyUSB* 
der kernel dieses Endgeraet gerade gemapt hat. Da ich das ganze
remote fuer einen Bekannten mache, waere es mir zwar lieber gewesen,
ich haette ihm etwas intuitivere links als:

usb-FTDI_FT232R_USB_UART_AH01B3OJ-if00-port0

ins /dev schieben koennen, aber sei es drum, wenigstens noch ne
passende sig dazu ;).

-- 
Abgesehen davon ist die Brustwarze das einzige intuitive Interface *alles*
andere ist erlernt.                  [Wolfgang Weisselberg auf suse-linux]




Mehr Informationen über die Mailingliste ubuntu-de