私は次の非常に基本的なudevルールを持っています/etc/udev/rules.d/99-sd.rules
。
ACTION=="add", SUBSYSTEM=="mmc", KERNEL=="mmcblk0p1", RUN+="/usr/bin/echo 'aa' > /tmp/test"
目的は、test
SDカードを挿入し、そのp1
パーティションを認識したらファイルを作成することです。
これで、このルールを作成した後にすべてのことを行いました。
sudo udevadm control --reload-rules
sudo systemctl restart udev
sudo reboot
ところで、SDカードを挿入してもファイルは生成されません。 (SDカードも動作し、マウントすることもできます。)
ここで問題は何ですか?これは私を狂わせ、何が間違っているのかわかりません。 udevadmを使用すると、SDカードのカーネルイベントを表示できます。しかし、なぜ私のファイルが生成されないのですか?
オペレーティングシステム: Debian ブルスアイ
これはdmesgです:
[ 85.299246] mmc0: new ultra high speed SDR104 SDXC card at address aaaa
[ 85.301507] mmcblk0: mmc0:aaaa SN64G 59.5 GiB
[ 85.307164] mmcblk0: p1
/tmp
「bash」を使っても空です。
$ cat /etc/udev/rules.d/99-sd.rules
ACTION=="add", SUBSYSTEM=="mmc", KERNEL=="mmcblk0p1", RUN+="/bin/bash -c '/usr/bin/echo aa > /tmp/test'"
udevadm monitor
:
$ sudo udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[191.651922] add /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)
KERNEL[191.655196] add /devices/virtual/bdi/179:96 (bdi)
UDEV [191.656246] add /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)
UDEV [191.656604] add /devices/virtual/bdi/179:96 (bdi)
KERNEL[191.657702] add /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block)
KERNEL[191.657862] add /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block)
KERNEL[191.658527] bind /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)
UDEV [191.689858] add /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block)
UDEV [191.732813] add /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block)
UDEV [191.735289] bind /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)
答え1
実行するコマンドはexec()
シェル用ではなくシェル用であるため、>
次のコマンドを追加することはできません。
RUN+="/bin/bash -c '/usr/bin/echo aa > /tmp/test'"
一重引用符内にスペースを引用する必要がある場合は、エスケープされた二重引用符を使用できます(例:)\"abc def\"
。
ログからより多くのデバッグ情報を取得するには、一時を使用してデバッグレベルを設定し、sudo udevadm control --log-priority=debug
テールログを使用してsudo journalctl -f
カードを挿入すると、RUNコマンドが表示されます。リセットレベルを使用してくださいsudo udevadm control --log-priority=info
。
答え2
私はudevがシェルのRUNでコマンドを実行するとは思わないので、>
考えることを意味しません。 (/usr/bin/echoにパラメータとして渡すこともできます)
独自のシェルスクリプトを作成してファイルを生成するか、次のユーザーを試してください。logger
また、デバイスが検出された後にudevがパーティションスキャンをトリガし、新しいデバイスノードをいっぱいにした後に発生するパーティションの外観をトリガーすることも一般的です。これが大きな意味なのかはわかりません。幸いなことにudevadm monitor
、ストレージデバイスを接続すると、udevがどの通知を受け取ったかを確認できます。