我试图在连接加密 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