web-dev-qa-db-ja.com

シンボリックリンクを作成するときのudevの番号の付け直し

Voyage linux(Debian Squeezeに基づく)を実行しているALIX3d2ボードにUSBセルラーモデムを接続しています。モデムはそれ自体をTTYデバイスとして登録するため、デフォルトでは、udevは/devに「ttyUSB0」から「ttyUSB3」という名前のTTYデバイスを作成します。ただし、他のUSB-シリアルデバイスが接続されている可能性があるため、モデムへの既知の参照が必要です。そこで、モデムから/dev/ttyModem{0-3}へのリンクを作成する簡単なudevルールを作成しましたが、番号付けを自動的に処理する唯一の方法は、udevの%n変数を使用することでした。これには問題があります。モデムの前に4ポートのUSB-シリアルアダプタが列挙されている場合は、/dev/ttyModem{4-7}を作成します。古いudevドキュメントで%e変数への参照がいくつか見つかりましたが、これは必要なことを実行しますが、しばらく前に削除されたようです。

幸い、ttyデバイスごとにデバイスから参照できるポート番号があるので、手動で番号付けを処理できるはずです。ポート番号に基づいてリンクを作成できますが、ポート番号とUSBベンダーID + productIDの両方を使用しようとすると、ルールが適用されなくなります。これらの属性はudevadm infoに従って異なるデバイスで認識されるため、どこかで「単一の親デバイス」ルールに違反している可能性がありますが、私が知る限り、すべての属性は1つのデバイスからのものである必要があります。その親。

適用したルールは次のとおりです。

このルールは機能し、私が始めたものですが、生成される数は0から始まらない場合があります。

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyUSBID%n"

そこで、このような4つのルールでポート番号を指定しようとしましたが、「ひとり親デバイス」のルールに違反しているため失敗したと思います。

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{port_number}=="0", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyFailingPort0"

このルールのすべての条件は同じノードからのものである必要があるため、このルール(期待どおりに機能します)は親ノードを参照できる必要があります。

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{port_number}=="0", SYMLINK+="ttyPortNumberChild0"

ただし、このルールは失敗し、理由はわかりません。

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{idVendor}=="1199" ATTRS{port_number}=="0", SYMLINK+="ttyFailingPortNumber0

そして、これがudevadm info --attribute-walk for portport1port2port の出力です。上から2番目のデバイスにはポート番号が含まれ、4番目のデバイスには識別用USB情報が含まれています。

これは少し XY問題 だと思います。モデムに定数名を付けるより良い方法を知っている場合は、それを回答として投稿してください。

4
isidor3

構成を複数のルールに分割することで、「1つの親のみ」の制限を回避することになりました。興味のある人のために、これが私が最終的に得たコードです:

ACTION!="add", GOTO="modem_rules_end"
SUBSYSTEM!="tty" GOTO="modem_rules_end"

#ModemType1
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", GOTO="type1_rules_begin"
GOTO="type1_rules_end"
LABEL="type1_rules_begin"

ATTRS{port_number}=="0", SYMLINK:="ttyType1_0"
ATTRS{port_number}=="1", SYMLINK:="ttyType1_1"
ATTRS{port_number}=="2", SYMLINK:="ttyType1_2"
ATTRS{port_number}=="3", SYMLINK:="ttyType1_3"

LABEL="type1_rules_end"
LABEL="modem_rules_end"
1
isidor3

モデムルールは、idVendor、idProduct、およびport_number属性と組み合わせたACTION=="add", SUBSYSTEM=="tty"と一致する必要があります。

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="0", SYMLINK+="ttyPort0"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="1", SYMLINK+="ttyPort1"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="2", SYMLINK+="ttyPort2"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="3", SYMLINK+="ttyPort3"

また、/dev/serial/by-id(モデムに一意のシリアル番号がある場合に役立ちます)または/dev/serial/by-path(常に同じUSBポートにモデムを接続している場合に機能します)の既存のシンボリックリンクのいずれかがあなたの目的。

2
Alex P.

/ dev/ttyUSB *番号を争う他のUSBttyデバイスと一緒に、システム内で一貫した番号付けでUSBセルラーモデムをオンラインにする同様の問題がありました。私の場合、Telitチップセットを搭載したEuroTech ReliaCELL10-20-32でした。ここからいくつかのアイデアを使用して問題を解決し、.rulesに次の抜粋を追加しました。

SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="00", SYMLINK+="ttyUSB_modem_port_0"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="01", SYMLINK+="ttyUSB_modem_port_1"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="02", SYMLINK+="ttyUSB_modem_port_2"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="03", SYMLINK+="ttyUSB_modem_port_3"
0
nohau

UNIXマシンにアクセスするために、複数の同一のUSBシリアルアダプターを使用してセットアップを行いました。

最後の行のKERNELS属性は、私の「ProlificTechnologyInc。」からのものだと思います。一方が他方に接続されている2つのハブの既存のハブ。

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.5:1.0", SYMLINK+="ttyUSB_Sol1"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.6:1.0", SYMLINK+="ttyUSB_Sol2"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.7:1.0", SYMLINK+="ttyUSB_Sol3"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.4:1.0", SYMLINK+="ttyUSB_Sol4"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.3:1.0", SYMLINK+="ttyUSB_HPUX1"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.2:1.0", SYMLINK+="ttyUSB_HPUX2"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.1.4:1.0", SYMLINK+="ttyUSB_HPUX3"