udevでシンボリックリンクを作成したときの番号の再割り当て

udevでシンボリックリンクを作成したときの番号の再割り当て

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

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

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

このルールは効果があり、私が使い始めたルールですが、生成される数字はゼロから始まらないかもしれません。

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これはの出力です。ポート0ポート1ポート2ポート3。上部の2番目のデバイスにはポート番号が含まれ、4番目のデバイスにはUSB識別情報が含まれています。

これはちょっとわかります。XYの問題したがって、モデムの定数名を指定するより良い方法がわかっている場合は、いつでも回答として投稿してください。

答え1

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

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

複数のルール間で構成を分割して、「単一の親」制限を解決しました。興味のある方のために私が書いたコードは次のとおりです。

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"

答え3

/ dev / ttyUSB *番号を置いて競合する他のUSB ttyデバイスとシステムの番号を一致させるためにUSBセルラーモデムを取得する際にも同様の問題がありました。私の場合は、Telitチップセットを搭載したEuroTech ReliaCELL 10-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"

答え4

私はUNIXコンピュータにアクセスするために複数の同じUSBシリアルアダプタを使って設定しました。

最後の行の KERNELS 属性は私の「Prolific Technology Inc.」から来たようです。ハブは 2 つのハブで構成され、1 つはもう 1 つと接続されます。

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"

関連情報