我有一个相当基本的 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 收到了哪些通知。