我在外置硬盘上有一个 LUKS 分区。当我插入它时,Ubuntu 22.04自动解密分区和坐骑因为我将密码保存到了密钥环中。我想运行备份脚本当这个情况发生时。
这确实不是工作:
ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="uuid-of-the-decrypted-partition", RUN+="/path/to/backup/script"
有没有办法在 UDEV 中检测分区何时被挂载?
答案1
不,udev 不处理挂载(它们不是“设备”)。它可以对解锁的卷做出反应(因为这会创建一个“映射器”设备),但不能对挂载卷做出反应(这既不会添加设备也不会“更改”设备)。
创建一个运行备份脚本的 systemd 服务,然后将其添加为与磁盘挂载位置相对应的 .mount 单元的依赖项run-media-whatever.mount
。(Fstab 条目会创建真实的 .mount 单元,但无论文件系统挂载的原因是什么,虚拟 .mount 单元都存在,因此即使使用普通的 GNOME 自动挂载,这也将起作用。)
对于备份脚本来说,服务通常应该是Type=oneshot
。
systemctl enable
.mount 单元到您服务的依赖关系可以通过和部分添加[Install]
(用于systemd-escape -p
让其输出路径的正确 .mount 名称,或者直接在 中找到它systemctl -t mount
)。如果您希望服务由多个路径触发,您可以在 [Install] 中列出多个单元。
[Unit]
Description=System backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cron.backup
[Install]
WantedBy=run-media-backup.mount
此后systemctl enable
,每次挂载 /run/media/backup 时都会运行此服务。
如果自动挂载导致路径不够唯一 - 添加一个 /etc/fstab 条目,为每个 UUID 指定一个自定义路径(GNOME 自动挂载将遵守 fstab;您甚至可以通过 GNOME 磁盘的“挂载选项”来完成此操作);或者让脚本本身检查已挂载的内容(使用 findmnt),如果文件系统 UUID 错误,则让脚本直接退出。
请注意,您需要一个服务反正,因为您无法(再)从 udev 规则运行长时间运行的脚本 - 无论如何都需要间接运行这些脚本(ENV{SYSTEMD_WANTS}
如果您正在处理设备)。