dm-crypt/登录时挂载

出自 ArchWiki

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

原因: 建议使用实例化的单元,例如 cryptsetup@.service (在 Talk:Dm-crypt/Mounting at login 中讨论)

可以配置 PAMsystemd,以便在其所有者登录时自动挂载 dm-crypt 加密的 home 分区,并在他们注销时卸载它。

本教程假定您已按照 Dm-crypt/加密非根文件系统 中的描述创建了加密分区。

注意
  • 您需要为您的用户帐户和 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 的结果