使用 systemd 在插入外部硬盘时自动执行备份脚本

使用 systemd 在插入外部硬盘时自动执行备份脚本

我有一台笔记本电脑、一个外部 USB 硬盘和一个备份脚本。

笔记本电脑运行 Arch Linux。
外部 USB 硬盘使用 LUKS 加密。
备份脚本在给定的挂载点 (/media/backup) 上备份。

目前的情况是,当硬盘插入时,可以手动运行备份脚本,当访问其挂载点时,systemd 将自动解密并挂载硬盘。这是通过以下方式实现的:

/etc/crypttab

backupdrive UUID=xxxyyy-1234-4567-8910-aaabbb /path/to/luks-backup-hdd-keyfile luks,noauto

/etc/fstab

/dev/mapper/backupdrive /media/backup ext4 noauto,nofail,x-systemd.device-timeout=5s,x-systemd.automount,x-systemd.idle-timeout=1min 0 2

这工作正常。我想通过当 systemd 检测到此特定设备时自动执行备份脚本来改进这一点。

这是我不太明白的地方,但我猜挂载应该在设备插入时自动发生,而不是等待挂载点被访问。然后备份脚本应该是一个由挂载触发的 systemd 服务,但我不确定如何(可能吗wants?)。

理想情况下,我希望直接使用本机 systemd 单元来实现这一点,而不是使用 fstab。

答案1

我猜测当设备插入时挂载应该自动发生,而不是等待挂载点被访问。

那就不要使用x-systemd.automount

以前,您所描述的情况曾经只使用常规选项发生过auto,但是该选项已被删除,因为许多人没想到auto启动完成后它就会生效。

使用当前 systemd 版本,您需要手动Wants=media-backup.mount向磁盘添加依赖项。每个设备都有一个虚拟.device单元,虽然这些单元本身并不存在于磁盘上,但它们仍以相同的方式接受其他配置(插件等)。

思考这应该有效:

device_unit=$(systemd-escape -p /dev/disk/by-uuid/xxxyyy-1234-4567-8910-aaabbb).device
mount_unit=$(systemd-escape -p /media/backup).mount

systemctl add-wants "$device_unit" media-backup.mount

如果这不起作用,也可以通过 udev 来实现(例如/etc/udev/rules.d/80-automount.rules):

ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="xxxyyy-1234-4567-8910-aaabbb", ENV{SYSTEMD_WANTS}+="media-backup.mount"

然后备份脚本应该是一个 systemd 服务,应该由挂载触发,但我不确定如何触发(也许是想要触发?)。

是的,将您的服务添加为想要=进入 media-backup.mount。

在你的情况下,media-backup.mount 是从 fstab 条目自动构建的,因此你不能直接编辑整个 .mount 单元,但是你添加与上面示例类似的依赖项:

systemctl add-wants media-backup.mount my-backup-script.service

答案2

您可以查找内核日志或系统日志来捕获插入外部硬盘的事件。之后,您可以在日志文件中查找特定的字符串,并在出现这样的字符串时执行任何操作。

 tail -F /var/log/syslog | grep --line-buffered 'Connected to wireless network' | while read ; do echo "Wifi Connected" ; done

相关内容