web-dev-qa-db-ja.com

USBデバイスを静的な名前でバインドする方法は?

Arduinoを使用していて、時々/dev/ttyUSB0にバインドされ、他の場合は/dev/ttyUSB1にバインドされるため、スクリプトが失敗します。

デバイスが存在する可能性のあるすべての可能性を列挙したくはありませんが、むしろどこかに静的にバインドさせたいです。 /dev/arduino

どうすればそれを達成できますか?

46
k0pernikus

提案されているように、いくつかのudevルールを追加できます。私は/etc/udev/rules.d/10-local.rulesを編集して以下を含めました:

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

次のコマンドを実行すると、デバイスの変数を確認できます

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

あなたが読むことができるより深いガイドがあります http://www.reactivated.net/writing_udev_rules.html

43
Kotte

上記のルール構文は、一部のディストリビューションでは機能する可能性がありますが、私(Raspbian)では機能しませんでした。すべてのインとアウトを説明する単一のドキュメントを見つけたことがないので、自分で作成しました here を見つけてください。これは結局のところです。
1。 ttyUSBの内容を確認します。

dmesg | grep ttyUSB  

2.デバイスのすべての属性を一覧表示します。

udevadm info --name=/dev/ttyUSBx --attribute-walk

(もちろん、xの代わりにデバイス番号を使用)。一意の識別子セットを選択します(例:idVendor + idProduct)。 idVendorとidProductが同じデバイスが複数ある場合も、SerialNumberが必要になることがあります。 SerialNumbersは、デバイスごとに一意である必要があります。
3。ファイルを作成します/etc/udev/rules.d/99-usb-serial.rules次のような行が含まれています。

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(そこではシリアル番号は必要なく、もちろんステップ2で見つけたidVendorとidProductの番号が必要だと仮定します。
4。新しいルールをロードします。

Sudo udevadm trigger

5.何が起こったかを確認します。

ls -l /dev/your_device_name  

シンボリックリンクが行ったttyUSB番号が表示されます。もし /dev/ttyUSB1、次に、それを所有している人と、それが属するグループを確認します。

ls -l /dev/ttyUSB1   

それからそれを楽しむためだけに:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)
37
RolfBly

複数の同一のUSBデバイスの問題

4台のカメラを備えたRasperry Piを持っています。カメラを/dev/video0 .. video3として識別するfswebcamを使用してpixを取得します。カメラがvideo0vide02video4video6の場合もありますが、今のところは忘れることができます。

カメラ番号を特定するために永続的なIDが必要です。 video0は写真にキャプションを付けるため、常に同じカメラです。残念ながら、これは確実には起こりません。起動時に、カメラはvideo0..video3として列挙されますが、常に同じとは限りません。

すべてのカメラのIDとシリアル番号は同じです。

この問題の解決にはudevルールが関係しますが、そこにはたくさんの釣り針もあります。

コマンドを発行する場合

udevadm info –attribute-walk –path=/dev/video0

あなたは出力のスクリードを取得しますが、顕著なビットは

KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.

KERNELSビットはUSBハブポートです。 4台のカメラでは、4台のカメラがあります。これらは、再起動時に変更されませんが、ポートに関連付けられているvideo{x}mayの変更です。

したがって、ビデオ番号をUSBハブポートに関連付けるためのudevルールが必要です。

KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0” 

シンプルに見える–でカメラにアクセス

fswebcam –d  $realpath /dev/camera0

それが機能しないことを除いて、これをudevルールに入れ、システムがvideo0(起動時)を別のポートに割り当てた場合、udevルールは無視されます。 /dev/camera0へのシンボリックリンクは、基本的にno such deviceです。スクエアワン。

シンボリックリンクをvideo{x}番号ではなくUSBハブアドレスにバインドする必要があります。 Pythonプログラムが必要です。

最初のステップは実行することでした

fswebcam –d /dev/video${x}  tst.jpg

xの場合は1から8の間。各呼び出しの後にtst.jpgが存在すると、このビデオ番号にカメラが存在するかどうかが識別されます。これから、アクティブなビデオ番号のリストを作成します。私の経験では、これまで使用したカメラでは0,1,2,3または0,2,4,6のどちらかです。

もちろん、別のプロセスを使用してこのリストを作成することもできます。

次に、リストの各ビデオ番号について実行します

udevadm info –attribute-walk –path=/dev/videox > dd

ddからKERNELS= lineを抽出します。このプロセスから、カメラのUSBポートアドレスのリストが作成されます。このリストを並べ替えて、次のステップで常に同じ順序で処理されるようにします。これを「アドレスリスト」と呼びます。

udevadm … > ddをもう一度実行して、次のようなリストを作成します。

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.

次に、アドレスリストをステップ実行します。各エントリについて、ビデオリストから対応するエントリを見つけます。次のような行のコレクションのように見える新しいリストを作成します

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”

X(シンボリックリンク番号)は、アドレスリストのシーケンス番号に置き換えられます。

これで、機能するudevルールが作成されました。起動時にそのポートに割り当てられているビデオ番号に関係なく、USBハブアドレスに関連付けられているシンボリックリンク。

最終的なリストをファイル/etc/udev/rules.d/cam.rulesに書き込みます。 udevadm triggerを実行してアクティブ化すると、ジョブが完了します。 /dev/camera2は、ビデオ番号に関係なく、同じカメラ(USBポート)になります。

11
Ian Boag

/dev/serial/by-idでもユニークなデバイスを見つけることができました。私はまだ再起動を試みていませんが、そのディレクトリ内のファイルは適切なデバイスファイル(ttyACM[0-9])へのリンクでした。`

私はRaspberry PiでArch Linuxを実行していますが、「Arduino」を含むファイル名に対してfindを実行するだけでそれらを偶然見つけました。私のpythonプログラムは、これらのファイルをデバイスとして使用して、Arduinoからデータを読み書きするために正常に動作します(これまでのところ、1つのPiで2つ)。

1
huey_driver

/ etc/fstabにエントリを配置した後、上記が機能し、デバイスを自動マウントしたことを言うだけです(また、スティックを取り外した後にumountを呼び出します)。

つまり.

/ etc/fstab

# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup     /vol/backup     ext4    defaults,errors=remount-ro 0       1

猫/etc/udev/rules.d/5-usb-stick.rules

#
# the next line creates a symlink to this disk drive called /dev/backup 
# i.e.
#   root:# ls -la /dev/backup 
#   lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0

# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade    "
ACTION=="add", ATTRS{model}=="Cruzer Blade    ", SYMLINK+="backup"

# Clean up after removal  
ACTION=="remove", ATTRS{model}=="Cruzer Blade    ", RUN+="/bin/umount /vol/backup"

USBスティックを挿入すると、次のようになります。

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
0
Will