语境
我有一个加密的 /home 分区,可以使用密码和密钥文件解锁。此密钥文件位于我放在家里的 USB 驱动器上。这意味着,如果有人在我旅行时从我的包里偷走了我的笔记本电脑,他就无法访问我的个人文件,但当我在家时,我不必输入它。我的系统的其余部分(/
、/boot
等)未加密。我知道这可能存在安全风险,但这不是我关心的问题。
按预期运作的事情
使用 USB 正确启动可解密并挂载 /home。输入密码后,使用“使用密码启动”可正确解密并挂载 /home(无论是否连接 USB)。
未按预期运作的事情
如果我在没有连接 USB 的情况下启动第一个选项“使用 USB 或密码启动”,1 分 30 秒后会出现以下错误(!):
systemd[1]: Timed out waiting for device /dev/disk/by-uuid/<USB_UUID>.
systemd[1]: Dependency failed for /run/systemd/cryptsetup/keydev-encHome.
systemd[1]: Dependency failed for Cryptography Setup for encHome.
systemd[1]: Dependency failed for Local Encrypted Volumes.
等待1分30秒(!)后,第二项作业超时:
systemd[1]: dev-mapper-encHome.device: Job dev-mapper-encHome.device/start timed out.
systemd[1]: Timed out waiting for device /dev/mapper/encHome.
systemd[1]: Dependency failed for /home.
systemd[1]: Dependency failed for Local File Systems.
systemd[1]: Dependency failed for File System Check on /dev/mapper/encHome.
我用感叹号表示 1 分 30 秒 (!),因为我已在内核参数中rd.luks.options=timeout=16,keyfile-timeout=16
设置rootflags=x-systemd.device-timeout=16
,所以我预计它们最多持续 16 秒。File System Check
尽管我已经fsck.mode=skip
设置,但依赖项失败让我感到惊讶。
第二次失败后,我没有收到任何输入密码的提示,而是直接被转入紧急 shell 中。
我期望事情如何运作
我希望 systemd 等待 16 秒,直到我的 USB 上线,如果上线则直接解密 /home。如果没有上线,我希望它向我询问密码,然后使用该密码解密我的 /home。
配置
/etc/mkinitcpio.conf
MODULES=()
HOOKS="base systemd autodetect modconf block keyboard sd-vconsole sd-encrypt filesystems fsck"
/etc/fstab
/dev/mapper/encHome /home ext4 defaults 0 2
(此处没有包含密钥文件的 USB)
在/etc/crypttab中
空的
/etc/defaults/cryptsetup
不存在的
/boot/refind_linux.conf
"Boot with USB or passphrase"
"ro root=UUID=<ROOT_UUID>
apparmor=1 security=apparmor
resume=UUID=<SWAP_UUID>
initrd=/boot/intel-ucode.img initrd=/boot/initramfs-%v.img
rd.luks.name=<CRYPT_UUID>=encHome
rd.luks.key=<CRYPT_UUID>=/keyfile:UUID=<USB_UUID>
rd.luks.options=timeout=16,keyfile-timeout=16
rootflags=x-systemd.device-timeout=16
fsck.mode=skip"
"Boot with passphrase"
"ro root=UUID=<ROOT_UUID>
apparmor=1 security=apparmor
resume=UUID=<SWAP_UUID>
initrd=/boot/intel-ucode.img initrd=/boot/initramfs-%v.img
rd.luks.name=<CRYPT_UUID>=encHome"
(实际文件没有换行符,但为了易读性,我添加了它们)
lsblk -o name,fstype,uuid
NAME FSTYPE UUID
sda
├─sda2 swap <SWAP_UUID>
├─sda4 crypto_LUKS <CRYPT_UUID>
│ └─encHome ext4
└─sda6 ext4 <ROOT_UUID>
sdb
└─sdb1 ext4 <USB_UUID>
(以及其他几个不相关的分区)
cryptsetup luksDump /dev/sda4
UUID: <CRYPT_UUID>
Key Slot 0: ENABLED ( the passphrase )
Key Slot 1: ENABLED ( the keyfile )
systemd 服务
systemd-fsck-root.service
是enabled-runtime
[email protected]
是static
并active
在密钥文件启动时(连接 USB)。
版本
uname -r
5.5.2-1-MANJARO
core/systemd 242.153-3
core/cryptsetup 2.3.0-1.1
extra/refind-efi 0.11.3-1
答案1
显然配置文件没有什么问题,但由于我已经更新到
5.5.8-1-MANJARO
systemd 244.3-2
它完全按照预期工作。