You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:验证配置并启用服务

  1. 先关闭当前的swap并销毁加密映射:
# swapoff /dev/mapper/encswap
# cryptsetup close encswap
  1. 测试crypttab配置是否生效:
# cryptdisks_start encswap
  1. 测试swap挂载:
# swapon /dev/mapper/encswap
# swapon -s

如果能正常看到swap设备,说明配置正确。

  1. 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:34:34