USBストレージデバイスに一致するUdevルール


10

udev特定のUSB大容量ストレージデバイスだけでなく、接続されているUSB大容量ストレージデバイスのルールを実装するにはどうすればよいですか?では何を変更する必要がidVendorありidProductますか?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

回答:


7

ストレージデバイスはblockサブシステム内にあるためSUBSYSTEM=="block"、次のようにルールに含める必要があります。

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

を使用している場合は、USBストレージデバイスが追加されるたびにユニットをsystemd実行できますsystemd。ユニットファイルを作成します。例/etc/systemd/system/my-usb-rule.service

[Service]
Type=oneshot
ExecStart=/path/to/script

とルール、例えば/etc/udev/rules.d/85-my-usb-rule.rules

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

これで、USBストレージデバイスの追加イベントでudevトリガーmy-usb-rule.serviceされます(スクリプトが実行されます)。


ルール/ユニットを編集した後、設定をリロードすることを忘れないでください:

udevadm control --reload
systemctl daemon-reload

USBマスストレージを追加するとき、そこに含まれているパーティションを操作したいと思います。udevレベルでは、4つのサブシステム(usb、scsi、bdi、block)からのイベントをこの順序で確認できます。最初の3つは、パーティションがまだ認識されていないため、使用できません。ブロックイベントにはID_BUS = scsiがあり、コード例のようにusbではありません。ブロックイベントに適切な属性が表示されません。これは、USBマスストレージかどうかを教えてくれます。(udevadm monitorとudevadm infoを使用して行われた調査)。ID_BUS = scsiは、USBマスストレージ以外の何物でもあり得ないと私が信じられない限り。
Uwe Geuder 2017年

@UweGeuder-デバイス名をプログラムの引数として使用することを妨げるものはなく、パーティションでのその動作に基づく...
don_crissti

USBイベントでは、デバイス名は/ dev / bus / usb / 002/040のようになります。私のプログラムでそれをどうするかわかりません。ブロックイベントでは、デバイス名は/ dev / sdbまたは/ dev / sdb1のようなものです。それが私の望みですが、今度はID_BUS = scsiという問題に戻ります。私は少し得ました:プロパティID_DRIVE_THUMBを追加するルールファイル80-udisk2があります。どれほど堅牢かはわかりませんが、リストされているベンダーは非常に少ないようです。私のルールファイルは70- *と呼ばれていたため、予想どおり、/ dev / sdbが一致しませんでした。奇妙なことに/ dev / sdb1は十分一致しましたが、私のルールが最初に実行されます。
Uwe Geuder 2017年

1
ああ、私は元の質問をした注意任意の USBマスストレージドライブ。これはルールで機能するはずですSUBSYSTEM=="block", SUBSYSTEMS=="usb"Sとの違いに注意してください)。ENV{ID_BUS}=="usb"ここにscsiという値が表示されているため、元の回答では常に機能することはないと思います。しかし、私は最初に要求されたものとは少し異なる問題に取り組んでいます。USBスティック(ペンドライブ)が必要ですが、外付けドライブは必要ありません。
Uwe Geuder 2017年

1
実際、厄介な真実は、ENV{ID_BUS}値がすべてのシステムで同じというわけではないということです。昨日、udev 210を搭載した古いシステムで作業していました(マシンがインターネット上にないため、今は確認できません)。そこの値はscsiでした。今、私はudev 228の新しいマシンを使用しており、値はusbです。同じUSBスティックで、私はそれを携帯しています。(ここでudevバージョンが関連する要素であるかどうかはわかりませんが、カーネルまたはudevルールをインストールする他のパッケージ、たとえばudisks2である可能性もあります)まだSUBSYSTEM=="block", SUBSYSTEMS=="usb"Sに注意 )は移植可能で安全かもしれません。
Uwe Geuder 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.