跳转至内容

dm-crypt/登录时挂载

来自 ArchWiki
(从 Pam exec 重定向而来)

本文或本章节的准确性存在争议。

原因: 可以受益于实例化的单元,例如 cryptsetup@.service (在 Talk:Dm-crypt/Mounting at login 中讨论)

可以通过配置 PAMsystemd,在用户登录时自动挂载 dm-crypt 加密的家目录分区,并在用户注销时自动卸载。

本教程假设您已经创建了加密分区,具体方法请参阅 Dm-crypt/Encrypting a non-root file system

  • 您需要使用与用户账户相同的密码以及 LUKS 的密码。
  • 在所有示例中,请将 username 替换为您的用户名,1000 替换为您的用户 ID,PARTITION 替换为您的加密分区设备名称。

登录时解锁

可以使用 pam_exec 在登录时解锁设备。编辑 /etc/pam.d/system-login,在 auth include system-auth 之后添加下面加粗显示的行。

本文章或章节需要扩充。

原因: GDM, LightDM, 以及其他显示管理器可能也需要在 session 中使用 pam_exec,请参阅 Talk:Dm-crypt/Mounting at login#pam_exec required for session & using script。(在 Talk:Dm-crypt/Mounting at login 中讨论)
/etc/pam.d/system-login
...

auth       include    system-auth
auth       optional   pam_exec.so expose_authtok /etc/pam_cryptsetup.sh

...

然后创建上述提到的脚本。

/etc/pam_cryptsetup.sh
#!/bin/sh

CRYPT_USER="username"
PARTITION="/dev/sdXY"
NAME="home-$CRYPT_USER"

if [ "$PAM_USER" = "$CRYPT_USER" ] && ! [ -e "/dev/mapper/$NAME" ]; then
    /usr/bin/cryptsetup open "$PARTITION" "$NAME"
fi

使脚本可执行

自动挂载和卸载

systemd-logind 会在用户至少有一个活动会话时维护 user@1000.service。它会在第一次成功登录后自动启动,并在最后一个会话注销后停止。因此,我们可以为映射的卷创建并 启用 一个 systemd.mount(5) 单元,并将其连接到 user@1000.service,以便它自动挂载和卸载。

/etc/systemd/system/home-username.mount
[Unit]
Requires=user@1000.service
Before=user@1000.service

[Mount]
Where=/home/username
What=/dev/mapper/home-username
Type=btrfs
Options=defaults,relatime,compress=zstd

[Install]
RequiredBy=user@1000.service

卸载后锁定

卸载后,设备仍将处于解锁状态,可以直接挂载而无需重新输入密码(关机或重启会锁定分区,因为密钥已从 RAM 中清除,但仅卸载不会)。您可以创建并 启用 一个在设备解锁时启动(BindsTo=dev-mapper-home\x2dusername.device)并在设备卸载后停止(Requires,Before=home-username.mount)的服务,并在过程中锁定设备(ExecStop=cryptsetup close)。

/etc/systemd/system/cryptsetup-username.service
[Unit]
DefaultDependencies=no
BindsTo=dev-PARTITION.device
After=dev-PARTITION.device
BindsTo=dev-mapper-home\x2dusername.device
Requires=home-username.mount
Before=home-username.mount
Conflicts=umount.target
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutSec=0
ExecStop=/usr/bin/cryptsetup close home-username

[Install]
RequiredBy=dev-mapper-home\x2dusername.device
注意 dev-PARTITIONsystemd-escape -p /dev/PARTITION 的结果。