udev
特定のUSB大容量ストレージデバイスだけでなく、接続されているUSB大容量ストレージデバイスのルールを実装するにはどうすればよいですか?では何を変更する必要がidVendor
ありidProduct
ますか?
ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
RUN+="/home/workspace/bash_script.sh"
udev
特定のUSB大容量ストレージデバイスだけでなく、接続されているUSB大容量ストレージデバイスのルールを実装するにはどうすればよいですか?では何を変更する必要がidVendor
ありidProduct
ますか?
ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
RUN+="/home/workspace/bash_script.sh"
回答:
ストレージデバイスは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
SUBSYSTEM=="block", SUBSYSTEMS=="usb"
(Sとの違いに注意してください)。ENV{ID_BUS}=="usb"
ここにscsiという値が表示されているため、元の回答では常に機能することはないと思います。しかし、私は最初に要求されたものとは少し異なる問題に取り組んでいます。USBスティック(ペンドライブ)が必要ですが、外付けドライブは必要ありません。
ENV{ID_BUS}
値がすべてのシステムで同じというわけではないということです。昨日、udev 210を搭載した古いシステムで作業していました(マシンがインターネット上にないため、今は確認できません)。そこの値はscsiでした。今、私はudev 228の新しいマシンを使用しており、値はusbです。同じUSBスティックで、私はそれを携帯しています。(ここでudevバージョンが関連する要素であるかどうかはわかりませんが、カーネルまたはudevルールをインストールする他のパッケージ、たとえばudisks2である可能性もあります)まだSUBSYSTEM=="block", SUBSYSTEMS=="usb"
(Sに注意 )は移植可能で安全かもしれません。