我的目标是将此 USB 的解锁延迟到系统启动后处于ssh.service
活动状态,并且在输入之前永远不会超时。然而,超时仍然发生并继续getty
。一旦出现密码提示(未连接 TTY),您就无法输入密码
我一直在通过 复制auto
结果/etc/crypttab
。systemd-cryptsetup-generator
我也一直在查看systemctl list-dependencies
附加到控制台 TTY 的sysinit.target
操作。systemd-ask-password-console.path
在/etc/crypttab中
crypt /dev/disk/by-label/crypt none nofail,noauto,timeout=0,x-systemd.device-timeout=0
/etc/systemd/system/finish.target
[Unit]
Description=Mount crypt USB
Requires=multi-user.target
[email protected] systemd-ask-password-console.path
After=ssh.target
[email protected]
[Install]
WantedBy=multi-user.target
如果我这样做Wants=mnt-crypt.mount
或者Wants=dev-mapper-crypt.device
它实际上尊重超时,但仍然不接受密码输入。
ls -la /etc/systemd/system/multi-user.target.wants/finish.target
lrwxrwxrwx. 1 root root 33 Jun 6 00:04 /etc/systemd/system/multi-user.target.wants/finish.target -> /etc/systemd/system/finish.target
systemctl list-dependencies
● ├─finish.target
● │ ├─systemd-ask-password-console.path
● │ ├─[email protected]
│ └─...
如果我这样做,systemctl restart systemd-ask-password-console.service
我实际上可以开始输入密码,并且它都可以在执行终端和屏幕上的控制台上按预期工作(/dev/tty1
)。
似乎某处存在某种关系,阻止systemd-ask-password-console
在初始启动后启动,因为它会很乐意稍后同时启动systemd-ask-password-wall
。
同样,如果我复制它并将其编辑为新服务,它也将启动该systemd-ask password --watch --console
过程。
答案1
经过多次尝试和错误,我发现您无法重用任何内置单元,因为它们严重依赖于启动过程早期的单元。我们必须创建自己的单元并使用非常简单的命令。
这些带有解锁的默认超时时间 300 秒(如果需要,请删除),然后超时后它将像往常一样通过墙壁通知其他密码请求。
我们禁用 ask-password-wall 服务,然后在控制台查询单个密码。为什么不使用systemd-ask-password-console.path|systemd-ask-password-console.service
?
- 因为它也与早期启动过程密切相关,并且是
--watch
为了多个查询而启动的,因为在这种情况下我们只需要 1 个。
如您所见attach-crypt-usb.service
,[email protected]
这首先是因为集成,其次是因为否则挂载单元mnt-crypt.mount
会在请求时触发 systemd-cryptsetup 同时尝试连接 dm-disk。
如果您有任何意见或反馈,请随时留下 - 我会在经过实战测试后回来更新。
# /etc/systemd/system/crypt-usb.target
[Unit]
Description= Mount crypt USB late at boot
Before= [email protected]
After= sysinit.target
Conflicts= systemd-ask-password-wall.service systemd-ask-password-wall.path systemd-ask-password-console.service systemd-ask-password-console.path
Wants= attach-crypt-usb.service unlock-crypt-usb.service mount-crypt-usb.service
[Install]
WantedBy= multi-user.target
# /etc/systemd/system/attach-crypt-usb.service
[Unit]
Description= Attach Crypt USB
After= dm-event.service
# requires After=dm-event.service
ConditionPathExists= !/dev/mapper/crypt
ConditionPathIsSymbolicLink= /dev/disk/by-label/crypt
# To avoid mnt-crypt.mount attempting [email protected]
Conflicts= umount.target [email protected]
BindsTo= dev-disk-by\x2dlabel-crypt.device
After= dev-disk-by\x2dlabel-crypt.device
[Service]
ExecStart= /lib/systemd/systemd-cryptsetup attach 'crypt' '/dev/disk/by-label/crypt' 'none' 'nofail,noauto'
ExecStop= /usr/bin/umount /mnt/crypt
ExecStopPost= /usr/sbin/cryptsetup close crypt
Type= exec
RemainAfterExit= true
Restart= on-failure
[Install]
WantedBy= crypt-usb.target
# /etc/systemd/system/unlock-crypt-usb.service
[Unit]
Description= Unlock Crypt USB on console
Before= mount-crypt-usb.service
After= attach-crypt-usb.service dm-event.service
# requires After=dm-event.service
ConditionPathExists= !/dev/mapper/crypt
[Service]
TimeoutStartSec= 300
ExecStart= /usr/bin/systemd-tty-ask-password-agent --query --console=/dev/tty1
Type= oneshot
RemainAfterExit= yes
[Install]
WantedBy= crypt-usb.target
# /etc/systemd/system/mount-crypt-usb.service
[Unit]
Description= Mount crypt USB and reactivate ask-password-wall
After= unlock-crypt-usb.service dev-mapper-crypt.device
Wants= mnt-crypt.mount
[Service]
ExecStart= /usr/bin/systemctl start systemd-ask-password-wall.service systemd-ask-password-wall.path
Type= oneshot
RemainAfterExit= yes
[Install]
WantedBy= crypt-usb.target