如何通过UDEV规则检测已解密并挂载的LUKS分区?
如何通过UDEV规则检测已解密并挂载的LUKS分区?
嗨,我懂你的需求——当那台LUKS加密的外接硬盘被Ubuntu 22.04自动解密挂载后,自动触发备份脚本对吧?你之前的UDEV规则没生效,问题出在触发时机上:ACTION=="add"事件触发时,解密后的分区刚被系统创建,但还没完成挂载操作,这时候脚本跑起来根本找不到挂载点,自然达不到预期效果。
下面给你几个可行的解决方案,从简单到可靠排序:
方案1:调整UDEV规则,监听挂载完成状态
UDEV可以通过ENV{MOUNTPOINT}属性判断分区是否已经挂载,再结合change事件(挂载操作会触发设备的change事件)来精准触发脚本。把你的规则改成这样:
ACTION=="change", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="uuid-of-the-decrypted-partition", ENV{MOUNTPOINT}!="", RUN+="/path/to/backup/script"
ENV{MOUNTPOINT}!="":确保只有当分区已经被挂载(有合法挂载点)时才执行脚本ACTION=="change":挂载完成后会触发设备的change事件,时机刚好合适
注意:如果你的备份脚本运行时间较长,不建议用UDEV的RUN指令——UDEV处理长时间进程的能力有限,可能会导致阻塞,这种情况推荐用方案2。
方案2:用UDEV触发systemd服务(更可靠)
把备份脚本做成systemd服务,让UDEV去触发这个服务,是更稳定的做法,尤其适合耗时较长的备份任务:
- 创建systemd服务文件:
/etc/systemd/system/luks-backup.service,内容如下:
[Unit] Description=执行LUKS分区挂载后的备份脚本 After=local-fs.target [Service] Type=oneshot ExecStart=/path/to/backup/script # 如果脚本需要等待挂载完全稳定,可以加个短延迟 # ExecStartPre=/bin/sleep 2 [Install] WantedBy=multi-user.target
- 修改UDEV规则,让它触发这个服务:
ACTION=="change", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="uuid-of-the-decrypted-partition", ENV{MOUNTPOINT}!="", RUN+="/bin/systemctl start luks-backup.service"
- 最后重新加载配置,让修改生效:
sudo udevadm control --reload-rules sudo systemctl daemon-reload
方案3:用inotify监听挂载点(备选方案)
如果上面的方法都不符合你的需求,还可以写一个后台脚本,用inotifywait监听挂载点的变化,适合需要自定义触发逻辑的场景:
#!/bin/bash # 替换成你的LUKS分区挂载点 MOUNT_POINT="/media/your-username/your-luks-partition" BACKUP_SCRIPT="/path/to/backup/script" # 监听挂载点的创建/打开事件 inotifywait -m -e create,open "$MOUNT_POINT" | while read -r dir events file; do # 触发备份脚本 "$BACKUP_SCRIPT" # 避免重复触发,执行一次后退出循环 break done
把这个脚本做成systemd服务设为开机自启,就能在分区挂载完成后自动触发备份。
最后提醒一下:你可以用udevadm info -a /dev/mapper/your-luks-device命令,查看解密后设备的所有UDEV属性,确保你填的ID_FS_UUID是正确的,避免因为UUID填错导致规则不触发。
备注:内容来源于stack exchange,提问作者Majal
相关产品推荐
相关产品推荐

