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