如何使用 systemd-cryptsetup 生成的单元

如何使用 systemd-cryptsetup 生成的单元

我试图在连接加密 USB 设备时自动安装它。因此我在以下位置添加了一个新条目/etc/crypttab

ext /path/to/dev /path/to/key bitlk,noauto

这将使 systemd-cryptsetup-generator 创建一个新的服务单元,用于在连接设备时解密该设备。

但由于某种原因该服务未启用,必须手动启动。此外,它无法通过 systemctl 启用,因为缺少 [Install] 部分。

添加该部分似乎很乏味。自动启动这些服务的最佳工作流程是什么?

我正在使用 manjaro 22(等离子 KDE)

答案1

这些生成的单元实际上是作为依赖项添加的。设备解锁后将创建的单位。例如,生成器dev-mapper-ext.device依赖于 .device 进行扩展[email protected],因此任何依赖于此 .device 的内容都会导致它自动解锁。

> tree /run/systemd/generator*
/run/systemd/generator/
├── dev-mapper-archive2.device.requires/
│   └── [email protected] -> ../[email protected]
├── dev-mapper-data.device.requires/
:   └── [email protected] -> ../[email protected]

这意味着 /etc/fstab 条目引用/dev/mapper/ext(或者更确切地说,从该 fstab 条目生成的 .mount 单元)将间接依赖于 systemd-cryptsetup@ext ,并将导致设备在需要安装时被解锁(启动时或使用 手动systemctl start /mnt/ext)。

myth> systemctl list-dependencies -a /mnt/hdd
mnt-hdd.mount
● ├─dev-mapper-data.device
● │ └─[email protected]
● :   └─dev-disk-by\x2duuid-1eb9bbbb\x2dcb37\x2d4fab\x2dad12\x2da512fed4a0a9.device

与大多数 systemd 启动过程一样,这里的设计不是基于事件的 cryptsetup 设备“热插拔”解锁,而是基于依赖性的“按需”解锁。

(您仍然可以通过将挂载的依赖项添加到原始.device单元来实现“热插拔”解锁和挂载,例如使“dev-sdb.device”想要“mnt-ext.mount”将导致磁盘被解锁和挂载一旦连接成功。)

请注意,在 KDE 中,通过 Dolphin 交互安装磁盘不应需要 systemd-cryptsetup,因为 UDisks2 本身会在安装 LUKS 或其他设备之前负责解锁它们。


您可以使用 手动创建依赖项systemctl add-wants,其作用大致相同,systemctl enable只是使用命令行参数而不是 [Install] 指令。

# systemctl add-wants foo.service [email protected]

不过,如果您的服务取决于可用的设备,那么最好直接并依赖在设备上而不是任何实现细节:

# systemctl add-wants foo.service dev-mapper-ext.device

相关内容