为什么这个 udev 规则没有运行?

为什么这个 udev 规则没有运行?

我有一个相当基本的 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 Bullseye

这是 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()shell 而不是给 shell 的,因此您不能使用像>.附上您的命令,例如:

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 在 shell 中运行 RUN 中的命令,所以你的>意思并不像你想象的那样。 (它可能只是作为参数传递给 /usr/bin/echo)

尝试编写自己的 shell 脚本来创建文件,或者用户类似logger

此外,在分区出现时触发的情况也不常见,这种情况发生在检测到设备、udev 触发分区扫描并填充新设备节点之后。我不知道这是否有太多意义 - 幸运的是,udevadm monitor当您连接存储设备时,您可以看到 udev 收到了哪些通知。

相关内容