我有一台笔记本电脑、一个外部 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