我将这个相当基本的 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)
要运行的命令是给
exec()
shell 的,而不是给 shell 的,所以你不能使用像>
. 附上您的命令,例如:如果您需要在单引号内引用空格,您可以使用转义双引号,例如
\"abc def\"
.要在日志中获得更多调试,请使用 临时设置调试级别
sudo udevadm control --log-priority=debug
,并使用 尾随日志sudo journalctl -f
,然后插入卡,您应该会看到任何 RUN 命令。用 重置关卡sudo udevadm control --log-priority=info
。我不认为 udev 在 shell 中运行 RUN 中的命令,所以你的
>
意思并不像你认为的那样。(它可能只是作为参数传递给 /usr/bin/echo)尝试编写自己的 shell 脚本来创建文件,或者使用类似
logger
此外,在检测到设备、udev 触发分区扫描并填充新设备节点之后,出现分区时触发也是不常见的。我不知道这是否有意义 - 幸运的是,
udevadm monitor
当你连接你的存储设备时,你可以看到 udev 收到了哪些通知。