服务器:使用 systemd 自动挂载 USB 驱动器

服务器:使用 systemd 自动挂载 USB 驱动器

我有一台运行 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.ruleslsusb用于获取产品 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

我使用的不同来源:

答案1

我知道这是一个老问题,问题可能已经解决了,但 mounts 和所有其他 systemd 单元一样,应该支持依赖关系

常见的配置项在通用的[Unit]和[Install]部分中配置。

因此添加以下[Install]部分就足够了:

[Install]
After = systemd-cryptsetup-generator.service

(我不确定 systemd-cryptsetup-generator 是否是一项服务,但如果它是其他服务,更改扩展就足够了)

相关内容