2020年10月14日水曜日

2020年10月1日木曜日

Linux USB port固定(2)

 

http://tclip.blog.fc2.com/blog-entry-86.html 参照


LinuxにUSBシリアル変換ケーブルなどを挿すと
 /dev/ttyUSB0
の様に最後に数字が付いて認識されます。

この数字は挿した順によって決定されるので、複数挿しっぱなしで電源を入れたり、挿した順番を忘れてしまうとどれがどれだか分からなくなってしまいます。


そこで見分けるための方法の紹介です。
実は、シリアルデバイスは、/dev/以下だけではなく、/dev/serial/by-id/と/dev/serial/by-path/にもマウントされています。
by-id/はシリアルデバイスのメーカー、種類などが登録され、by-path/にはUSBの場所が登録されるようです。


少し実験してみました。
違う種類のUSBを挿してみると、以下のようになります。
ちなみに環境はUbutu9.10 + ThinkPad X200 です。

$ ls /dev/ | grep ttyUSB
ttyUSB0
ttyUSB1
$ ls /dev/serial/by-id/
usb-FTDI_US232B_FTCEWHMO-if00-port0
usb-Keyspan__a_division_of_InnoSys_Inc._Keyspan_USB_Serial_Adapter-if00-port0
$ ls /dev/serial/by-path/
pci-0000:00:1a.0-usb-0:1:1.0-port0
pci-0000:00:1d.0-usb-0:2:1.0-port0


この様に、そのままでは見分けることのできないttyUSB0とttyUSB1が見分けることができるようになります。
個人的には、by-path/よりby-id/の方が人間が見て分かりやすいので好きなのですが、by-id/だと同一のメーカーのときデバイスが1つしか表示されないため、2つを上手く使用できませんでした。


by-path/の実験で、同じUSBシリアル変換ケーブルを場所を変えてby-pathを表示させてみると、以下のようになります。

$ ls /dev/serial/by-path/ // このコマンドを毎回実行。以下省略
pci-0000:00:1a.0-usb-0:1:1.0-port0 //右側USBポート
pci-0000:00:1d.0-usb-0:2:1.0-port0 //左側手前
pci-0000:00:1d.0-usb-0:1:1.0-port0 //左側奥
pci-0000:00:1d.7-usb-0:1.4:1.0-port0 //左側奥+USBハブ
pci-0000:00:1d.7-usb-0:1.4.1:1.0-port0 //左側奥+USBハブ+USBハブ


人間から見ると少し分かり辛いかもしれませんが、毎回同じ場所に挿したり、挿しっぱなしにしたりするならこちらを使用することで、正しくデバイスを識別できると思います。


同様に他のデバイスにも、by-id/やby-path/が存在しており、これを使用することで、見分けることができます。
例えば/dev/input/は以下のようになっています。

input$ ls
by-id event1 event12 event2 event5 event8 mice mouse2
by-path event10 event13 event3 event6 event9 mouse0
event0 event11 event14 event4 event7 js0 mouse1

input$ ls by-id/
usb-Logitech_Logitech_Cordless_RumblePad_2-event-joystick
usb-Logitech_Logitech_Cordless_RumblePad_2-joystick
usb-Logitech_Logitech_USB_Keyboard-event-kbd
usb-Logitech_USB-PS_2_Optical_Mouse-event-mouse
usb-Logitech_USB-PS_2_Optical_Mouse-mouse

input$ ls by-path/
pci-0000:00:1d.0-usb-0:2:1.0-event-joystick
pci-0000:00:1d.0-usb-0:2:1.0-joystick
pci-0000:00:1d.7-usb-0:1.1:1.0-event-mouse
pci-0000:00:1d.7-usb-0:1.1:1.0-mouse
pci-0000:00:1d.7-usb-0:1.2:1.0-event-kbd
platform-i8042-serio-0-event-kbd
platform-i8042-serio-1-event-mouse
platform-i8042-serio-1-mouse

Linux_USBport固定(1)

 

https://ittechnicalmemos.blogspot.com/2019/09/usblinux.html 参照

下はその内容



SBポートでデバイス名を固定する方法(Linux)

背景


同一デバイスを複数接続し、それらのデバイス名を固定する必要があった。デバイスが同一の為、udevのベンダーIDとプロダクトIDを利用してデバイス名を固定することができなかった。そこで、接続したUSBポートを用いた識別を行った。

記事の目的


同一デバイスを、接続したUSBポートの場所で識別し、デバイス名を固定する

接続したUSBポートでデバイスを識別


ここでは、ベンダーIDとプロダクトIDを利用した通常の識別方法と、接続したUSBポートの場所でデバイスを識別する方法についてそれぞれ記載する。

ベンダーIDとプロダクトIDを利用した識別方法

ベンダーIDとプロダクトIDを利用したデバイスの識別及びデバイス名の固定方法は下記の通りである。

  1. デバイスのベンダーIDとプロダクトIDの検索
  2. lsusbを用いて、デバイスのベンダーIDとプロダクトIDを検索する
    1. $ lsusb
    2. Bus 002 Device 002: ID idVendor:idProduct Intel Corp.
    3. Bus 003 Device 016: ID 054c:06c1 Sony Corp.
    4. :
    5. Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  3. udevルールの作成
  4. /etc/udev/rules.dにルールファイルを作成する
    1. $ sudo nano /etc/udev/rules.d/80-nfc.rules
    2. SUBSYSTEM=="usb", ATTR{idVendor}=="054c", ATTR{idProduct}=="06c1", SYMLINK+="nfc"
    これで、Bus 003 Device 016: ID 054c:06c1 Sony Corp./dev/nfcとして毎回認識されるようになった。

接続したUSBポートの場所を利用した識別方法

上記方法では、同一のデバイスの場合、識別できない。そこで、接続したUSBポートで識別する。
  1. デバイスが接続されたUSBポートを探索する
  2. /dev/serial/by-path/以下に、接続したデバイスがUSBポートの位置で識別され、配置されている
    1. $ ls /dev/serial/by-path/
    2. pci-0000:00:1a.0-usb-0:1:1.0-port0
    3. pci-0000:00:1d.0-usb-0:2:1.0-port0
  3. シンボリックリンクを作成し、デバイス名を固定する
  4. /dev/にシンボリックリンクを作成することで、そのUSBポートに接続したデバイスのデバイス名が固定される
    1. $ sudo ln -s /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1:1.0-port0 /dev/nfc
    これで、USBポートpci-0000:00:1a.0-usb-0:1:1.0-port0に接続されたデバイスが/dev/nfcとして毎回認識されるようになった。

備考

  • /dev/serial/by-id/以下に、接続したデバイスがシリアル番号で識別され、配置されている
  • /dev/disk/以下に、接続したディスクが/dev/serial/と同様の形でに配置されている

まとめ


  • 同一デバイスを、接続したUSBポートの場所で識別し、デバイス名を固定する方法について記載した

参考文献