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


43

私はArduinoを持っていますが、時々Arduinoにバインドされ/dev/ttyUSB0たり、にバインドされたりし/dev/ttyUSB1て、スクリプトが失敗します。

私は自分のデバイスが存在する可能性のあるすべての可能性を列挙したくはありませんが、静的な場所にバインドしたい/dev/arduinoです。

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


4
シンボリックリンク/ dev / arduinoをそのVIDとPIDによって正しいデバイスに割り当てる単純なudev-ruleを書くだけです。
Eddy_Em

arch-wikiを確認してください:wiki.archlinux.org/index.php/Udev#Writing_udev_rules
uzsolt

回答:


41

提案されているように、いくつかの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で読むことができます


魅力のように働いた。一つの質問:どのように終了するにはudevam?そしてmy_uart、下にシンボリックリンクを作成することに注意することが重要/dev/my_uartです。初めて書い/dev/arduinoたのですが、それでarduino十分ですが失敗しました。
k0pernikus

udevadm完了したら自動的に終了します。
コッテ

その後、何らかの不明な理由により、レポートの生成中にRaspberry Piへのターミナルセッションがフリーズしました。
k0pernikus

35

上記のルール構文は、一部のディストリビューションでは機能する可能性がありますが、私の(Raspbian)では機能しませんでした。すべての詳細を説明する単一のドキュメントを見つけたことがなかったので、ここにある独自のドキュメントを作成しまし。これが結果の要約です。
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)

idVendoridProductがまったく同じ場合、解決策はありますか?(2つのセンサーが同一モデルUSBからUARTモジュールに接続)
スティーブンルー

@StevenLuはい、手順2を参照してudevadm info --name=/dev/ttyUSB1 --attribute-walk、両方のデバイスについて行い、シリアル番号を探します。これらはデバイスごとに一意である必要があります。センサーにシリアル番号がない場合、センサーの種類を指定できますか?
RolfBly

それは素晴らしいです、これを試してみると報告します
スティーブンルー

USBからUARTへのドングル2ドルのシリアル番号は0001です。驚いたとは言えません。出力プロトコルに基づいてセンサーを識別する必要があるようです。
スティーブンルー

@StevenLu運が悪い。FTDI USB-UARTコンバーターには、一意のシリアル番号AFAIKがあります。少額の追加費用はかかりますが、開発時間は短縮されます。
-RolfBly

9

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

4台のカメラを搭載したRasperry Piがあります。fswebcamカメラを/dev/video0.. として識別するpixを使用しますvideo3。時にはカメラがありvideo0vide02video4そしてvideo6私たちは、今のところそれを忘れることができます。

カメラ番号を識別するための永続的な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}ポートに関連付けられているもの変更される場合があります。

そのため、ビデオ番号を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

以下のためx1〜8の存在はtst.jpg、このビデオ番号にカメラがあるか否かを各コール後に識別する。これから、アクティブなビデオ番号のリストを作成します。私の経験では、それはどちらかであるとされている0,1,2,3か、0,2,4,6カメラのために私が使用しています。

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

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

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

から抽出KERNELS= lineddます。このプロセスから、カメラの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ポート)になります。


UNIX stackexchangeにようこそ。マークダウンを使用して回答をフォーマットしてください。あなたのためにやっただけです。また、答えが要点であることを忘れないでください。これはブログエントリのように見えます(完全に悪いわけではありません)が、うまくいかなかったアプローチについて最初に読むことはあまり役に立ちません。その部分を廃棄できます。
k0pernikus

ごめんなさい。私はここで新しいです。私はこの問題を何ヶ月も調査しました。私は他の人が同じ問題に苦しんでいるのを見つけましたが、私に役立つ答えは見つかりませんでした。このように投稿することをどこにアドバイスしますか?私は自分自身を抑制し、Pythonソースを含めませんでした:-)
イアンボアグ

1

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

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


0

上記が私のために働いたと言うだけでなく、/ 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

cat /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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.