我有一台运行 Ubuntu Server 20.04 的服务器,我想在已知 USB 加密(LUKS)设备插入服务器后立即启动脚本。
为了启动脚本,我已经有了脚本和systemd
在驱动器安装后启动服务的服务:
/etc/systemd/system/mybackup.service
[Unit]
Description=Backup
Requires=mnt-encrypted.mount
After=mnt-encrypted.mount
[Service]
ExecStart=/path/to/script.sh
对于外部 USB 加密驱动器,我有一个入口在/etc/crypttab中
encrypted UUID=<UUID> /path/to/key luks,noauto
以及一项服务/etc/systemd/system/mnt-encrypted.mount
[Unit]
Description=Mount unit for backup
[Mount]
What=/dev/mapper/encrypted
Where=/mnt/encrypted
Options=defaults
然而,我知道mnt-加密.mount单元不完整。它必须在生成的文件之后运行systemd-cryptsetup-generator,因此该卷已被解密并可以挂载。
我该怎么做呢?或者,我的mnt-加密.mount文件?
编辑
在阅读了各种帖子(最后添加)后,我终于明白了,systemd
插入驱动器时不会自动安装驱动器。它udev
会触发安装,你可以通过指示执行此操作systemd
。
必须要做的事情:
/etc/crypttab
如果磁盘已加密,则添加一个条目/etc/fstab
使用外部驱动器的条目进行修改。这将生成一个systemd
用于安装的单元- 复制 `systemd`` 服务,该服务将在磁盘挂载时启动备份
- 创建一个规则,当磁盘插入时
udev
启动服务systemd
例如:
[Unit]
Description=Backup service
Requires=mnt-human-readable-label.mount
After=mnt-human-readable-label.mount
[Service]
ExecStart=/path/to/backup-script.sh
User=your-user
Group=your-group
[Install]
WantedBy=mnt-human-readable-label.mount
/etc/crypttab
human-readable-label UUID=your-disk-uuid /path/to/key luks,noauto,nofail
/etc/fstab
/dev/mapper/human-readable-label /mnt/human-readable-label ext4 defaults,noauto,nofail,x-systemd.automount,x-systemd.device-timeout=15s,x-systemd.idle-timeout=30 0 0
/etc/udev/rules.d/99-my-usb-dribe.rules
(lsusb
用于获取产品 ID)
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idProduct}=="id-product", ENV{SYSTEMD_WANTS}="external-backup.service", TAG+="systemd"
然后:
# Copy the systemd service that will start the backup script to the right place
sudo cp external-drive/external-backup.service /etc/systemd/system/external-backup.service
# Reload file system services for creating mount services for the external drive
sudo systemctl restart local-fs.target
sudo systemctl restart remote-fs.target
# Enable the backup service
sudo systemctl enable external-backup.service
# Reload the UDEV ruls
sudo udevadm control --reload-rules
# Reload systemd daemon
sudo systemctl daemon-reload
我使用的不同来源:
- http://jasonwryan.com/blog/2014/01/20/udev/
- https://withblue.ink/2020/01/19/auto-mounting-encrypted-drives-with-a-remote-key-on-linux.html
- https://unix.stackexchange.com/questions/246935/set-systemd-service-to-execute-after-fstab-mount
- 当安装特定的闪存驱动器时如何运行脚本?
- https://serverfault.com/questions/766506/automount-usb-drives-with-systemd
- https://unix.stackexchange.com/a/570987
答案1
我知道这是一个老问题,问题可能已经解决了,但 mounts 和所有其他 systemd 单元一样,应该支持依赖关系
因此添加以下[Install]部分就足够了:
[Install]
After = systemd-cryptsetup-generator.service
(我不确定 systemd-cryptsetup-generator 是否是一项服务,但如果它是其他服务,更改扩展就足够了)