Ubuntu 24.04.1 LTS TPM全磁盘加密环境下添加解密口令以调整交换分区大小的问题
我太懂你现在的困境了——用TPM做全磁盘加密的Ubuntu,平时启动全靠自动解锁,根本没设置手动口令,现在要调swap分区得进live环境解锁,但recovery key不被live系统认,直接跑luksAddKey又要现有口令,连dmsetup拿的都不是正经主密钥,确实挺闹心的。
先给你捋明白为啥dmsetup输出的不是主密钥:Ubuntu用TPM加密时,是靠systemd-cryptsetup的logon机制自动从TPM里取密钥的,dmsetup显示的只是这个密钥的系统引用标识,不是LUKS的原始主密钥,所以没法直接拿来用。
不过好在系统正常启动后分区已经解锁了,我们可以蹭这个“已解锁”的状态,用系统当前正在用的密钥来加新的手动口令,具体步骤如下:
确认加密数据分区的映射名称
先跑lsblk命令,找到你的加密分区(比如你说的/dev/nvme0n1p4)对应的映射名,一般是ubuntu-data或者带UUID后缀的名字(比如ubuntu-data-xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。也可以用cryptsetup status确认:sudo cryptsetup status ubuntu-data输出里会明确显示映射名和对应的原始分区。
找到系统临时存的解锁密钥文件
系统正常解锁分区后,会把从TPM拿到的密钥临时存在/run/systemd/cryptsetup/<映射名称>/keyfile路径下,比如映射名是ubuntu-data,那路径就是/run/systemd/cryptsetup/ubuntu-data/keyfile。这个文件只有root能访问,而且是临时的,重启就没了,所以必须在当前正常启动的系统里操作。用临时密钥文件添加新LUKS口令
执行下面的命令(记得把<映射名称>换成你实际的映射名,分区路径也对应改):sudo cryptsetup luksAddKey /dev/nvme0n1p4 /run/systemd/cryptsetup/<映射名称>/keyfile之后系统会提示你输入新的口令,再重复确认一次就行——这里不用输现有口令,因为临时密钥文件已经帮你完成认证了。
验证新口令是否有效
你可以重启系统,或者做个Ubuntu live USB启动,然后试试用新口令解锁分区:sudo cryptsetup luksOpen /dev/nvme0n1p4 mydata要是能成功解锁,说明新口令生效了。
调整swap分区大小
现在就可以在live环境下解锁分区后,用GParted图形工具或者命令行(先swapoff /dev/mapper/ubuntu-swap,调整分区大小后再mkswap重新格式化swap)来扩容swap,满足休眠需求了。
注意事项
- 操作过程别断电,防止分区损坏;
- 新口令一定要记牢,原有的TPM恢复密钥也别丢,留着以防万一。
备注:内容来源于stack exchange,提问作者Peter N

