QEMU/Ubuntu 22.04系统中dm-crypt加密交换分区无法在重启后自动生效的问题求助
QEMU/Ubuntu 22.04系统中dm-crypt加密交换分区无法在重启后自动生效的问题求助
我在QEMU虚拟机的Ubuntu 22.04系统里,手动创建了一个用随机密钥加密的dm-crypt交换分区,操作过程完全正常,但重启后交换分区就消失了。推测是/etc/crypttab或/etc/fstab配置有误,或者还有其他环节没设置对,希望能得到大家的帮助。
手动成功创建加密swap的操作流程
以下是我手动执行的成功步骤及对应输出:
执行命令
# swapoff -a # cryptsetup --type plain open /dev/mapper/vg0-swap encswap # mkswap /dev/mapper/encswap # /etc/init.d/cryptdisks start # swapon /dev/mapper/encswap # swapon -s
命令输出
swapon -s的输出:
Filename Type Size Used Priority /dev/dm-3 partition 2097148 0 -2
lsblk的输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot ├─sda3 8:3 0 13G 0 part │ ├─vg0-swap 253:0 0 2G 0 lvm │ │ └─encswap 253:3 0 2G 0 crypt [SWAP] │ ├─vg0-data 253:1 0 36.1G 0 lvm /data │ └─vg0-root 253:2 0 10.9G 0 lvm / └─sda4 8:4 0 36G 0 part └─vg0-data 253:1 0 36.1G 0 lvm /data sr0 11:0 1 4M 0 rom
cryptsetup status的输出:
# cryptsetup status /dev/mapper/encswap /dev/mapper/encswap is active and is in use. type: PLAIN cipher: aes-cbc-essiv:sha256 keysize: 256 bits key location: dm-crypt device: /dev/mapper/vg0-swap sector size: 512 offset: 0 sectors size: 4194304 sectors mode: read/write
当前的配置文件内容
/etc/crypttab
swap /dev/mapper/encswap /dev/urandom plain,cipher=aes-xts-plain64,size=256,hash=sha256,swap,noearly
/etc/fstab
/dev/mapper/swap none swap sw 0 0
重启后的异常现象
- 系统启动时会进入90秒的超时等待,提示等待
/dev/mapper/encswap的密钥 - 启动完成后,
swapon -s无输出,lsblk中看不到encswap加密设备及swap挂载点 - syslog中记录了“timed out waiting /dev/mapper/encswap”的日志
问题分析与解决建议
你当前的配置存在两个核心错误,导致系统无法自动创建加密swap:
1. /etc/crypttab的设备路径完全搞反了
crypttab的格式是:映射名 原始未加密设备 密钥源 选项
- 手动操作时,你是把**原始LVM设备
/dev/mapper/vg0-swap**解密映射为encswap - 但当前
crypttab中第二列写的是/dev/mapper/encswap(这是解密后的设备,并非原始未加密设备),系统启动时找不到这个“原始设备”,所以会错误地等待密钥(实际上用/dev/urandom根本不需要手动输入密钥)
2. 映射名与手动操作不一致,导致fstab关联逻辑混乱
你手动用的映射名是encswap,但crypttab第一列写的是swap,虽然fstab对应了这个名字,但核心问题还是原始设备路径错误。
修正后的配置方案
步骤1:修正/etc/crypttab
将内容改为和手动操作一致的映射名与原始设备:
encswap /dev/mapper/vg0-swap /dev/urandom plain,cipher=aes-cbc-essiv:sha256,size=256,swap,noearly
- 第一列
encswap:和手动操作的解密映射名保持一致,方便后续维护 - 第二列
/dev/mapper/vg0-swap:正确的原始未加密LVM设备路径 - 选项中
cipher改为你手动使用的aes-cbc-essiv:sha256(如果想改用更安全的aes-xts-plain64也可以,由于每次启动用随机密钥重建swap,模式修改不会有兼容性问题) swap选项会告诉系统这个加密设备是swap,自动处理相关挂载逻辑
步骤2:修正/etc/fstab
对应解密后的映射名encswap,修改为:
/dev/mapper/encswap none swap sw 0 0
步骤3:验证配置并启用服务
- 先关闭当前的swap并销毁加密映射:
# swapoff /dev/mapper/encswap # cryptsetup close encswap
- 测试crypttab配置是否生效:
# cryptdisks_start encswap
- 测试swap挂载:
# swapon /dev/mapper/encswap # swapon -s
如果能正常看到swap设备,说明配置正确。
- 确保systemd服务自动启动(Ubuntu 22.04默认用systemd,需要启用相关服务):
# systemctl enable cryptdisks # systemctl enable cryptsetup.target
额外注意事项
- 用
/dev/urandom作为密钥源,每次启动都会生成新的随机密钥,这意味着休眠的系统无法唤醒(因为休眠时swap里的内存镜像用的是上次的密钥,重启后密钥丢失),如果需要休眠功能,你需要把密钥存在一个加密的文件里,而不是用/dev/urandom - 如果你想改用更安全的
aes-xts-plain64模式,直接修改crypttab里的cipher参数即可,无需额外操作(因为随机密钥每次都会重建swap)
备注:内容来源于stack exchange,提问作者QF0
相关产品推荐
相关产品推荐

