1. 背景与准备条件
在 Ubuntu 系统中对 Swap 进行加密,目的是在系统进入休眠、交换数据到磁盘时提供额外的隐私保护。核心思路是借助 dm-crypt/LUKS 在交换设备上建立一个受保护的映射,再将该映射设备用作 Swap。这样即使硬件被转移,未授权方也无法直接读取 Swap 中的页面数据。
在动手之前,请确保具备管理员权限并对当前磁盘分区结构有基本认识,避免误操作导致数据丢失。备份重要数据始终是第一步,尤其是在涉及分区改动时。

此外,Ubuntu 的内核与 cryptsetup 通常已经集成所需工具,但仍应确保系统处于可更新状态以获取最新的安全修补。下面给出可执行性检查的参考命令:
sudo apt update
sudo apt install -y cryptsetup
cryptsetup --version
uname -r2. 选择加密对象:分区与文件
2.1 加密 Swap 分区的适用场景
如果系统已经使用独立的 Swap 分区,对该分区直接进行 LUKS 加密能够实现目标且改动相对集中。此方式的优点是与当前分区布局的耦合较强,影响点集中在交换设备本身。
需要注意的是,若将来需要休眠恢复,你需要在引导阶段处理好 resume 设备的映射。分区级别的加密在某些场景下对初始引导的依赖较低,但若分区表被修改,系统可能需要重新配置 initramfs 以及 crypttab 相关参数。
2.2 加密 Swap 文件的优点与适用场景
将 Swap 以文件形式放置在根文件系统中并进行加密,通常对磁盘分区结构的改动更小,适合没有空闲专用 Swap 分区的场景。此方案的灵活性更高,且在多磁盘系统中也容易实现。
要点在于确保 Swap 文件所在分区有足够的空闲空间,并考虑在引导阶段能否自动解密。若需要引导时解密,可以通过在 crypttab 指定密钥文件来实现自动化解密,但这也增加了密钥管理的复杂性与风险。
3. 方案一:加密 Swap 分区(使用 LUKS)
3.1 准备工作
在开始操作前,先关闭当前系统的 Swap,并确认要加密的分区。关闭 Swap可以避免在加密过程中出现数据写入冲突。
为了确保后续步骤可重复,建议记录现有 Swap 分区信息并在需要时回滚。以下命令用于检查当前 Swap 配置与分区情况:
# 关闭当前 Swap,确保后续操作安全
sudo swapoff -a# 查看现有 Swap 设备信息
cat /proc/swaps
lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT# 注意:记录要加密的分区,例如 /dev/sdb2
3.2 执行步骤
使用 LUKS 对目标分区进行加密后,创建映射设备并将其用作 Swap。以下步骤以分区 /dev/sdb2 为例,实际请替换为你的目标分区。
# 1) 使用 LUKS 对分区加密
sudo cryptsetup luksFormat /dev/sdb2# 2) 打开映射设备,映射名为 cryptswap
sudo cryptsetup open /dev/sdb2 cryptswap# 3) 在映射设备上创建 Swap
sudo mkswap /dev/mapper/cryptswap# 4) 启用 Swap
sudo swapon /dev/mapper/cryptswap# 5) 将映射设备添加到 crypttab 以实现开机自动解密
echo 'cryptswap /dev/sdb2 none luks' | sudo tee -a /etc/crypttab# 6) 将 Swap 挂载到 /dev/mapper/cryptswap 并写入 fstab
echo '/dev/mapper/cryptswap none swap sw 0 0' | sudo tee -a /etc/fstab# 7) 更新 initramfs 以包含新的加密设置
sudo update-initramfs -u -k all# 8) 重启验证
sudo reboot
在引导阶段,系统将提示输入加密分区的口令以解锁映射设备,一旦解锁完成,系统会像平常一样启动并启用加密后的 Swap。若日后需要休眠功能,请确保 resume 参数正确指向解密后的 Swap 设备,相关配置可在 initramfs 或 grub 级别调整。
4. 方案二:加密 Swap 文件(使用 LUKS)
4.1 准备工作
若你选择通过 Swap 文件来实现加密,请先确保当前未启用热敏感的 Swap,并为新 Swap 文件腾出空间。Swap 文件方式的核心在于将一个加密容器放在一个常规文件中,然后将它映射为 Swap 使用。该方案对分区结构的依赖较小,适合动态调整 Swap 容量。
小心点:确保根文件系统有足够的空闲空间来容纳新的 Swap 文件,并预估未来的内存压力以决定 Swap 文件的大小。
4.2 执行步骤
以下步骤演示如何在根文件系统中创建一个 4G 的加密 Swap 文件,并在启动时通过 crypttab 自动解密。请据实际需求调整大小与密钥管理方式。
# 1) 关闭当前 Swap
sudo swapoff -a# 2) 移除旧的 Swap 文件(如果存在)
sudo rm -f /swapfile# 3) 创建新的 Swap 文件(以 4G 为例)
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile# 4) 使用 LUKS 对 Swap 文件进行加密
sudo cryptsetup luksFormat /swapfile# 5) 打开映射设备,映射名为 cryptswap
sudo cryptsetup open /swapfile cryptswap# 6) 在映射设备上创建 Swap
sudo mkswap /dev/mapper/cryptswap# 7) 启用 Swap
sudo swapon /dev/mapper/cryptswap# 8) 将 Swap 通过 crypttab 自动解密并通过 fstab 挂载
echo 'cryptswap /swapfile none luks' | sudo tee -a /etc/crypttab
echo '/dev/mapper/cryptswap none swap sw 0 0' | sudo tee -a /etc/fstab# 9) 更新 initramfs 以纳入新的加密设置(如需要)
sudo update-initramfs -u -k all# 10) 重启验证
sudo reboot
通过上述设置,系统启动时将解密 Swap 文件并启用交换空间。若需要在引导阶段使用自动解密,请采用包含密钥文件的 crypttab 配置,并妥善保存密钥文件的位置与权限。
5. 注意事项与故障排查
5.1 常见问题与解决
若遇到无法启用加密 Swap 的情况,首先确认加密容器是否已正确打开,并验证映射设备是否存在。可以使用 cryptsetup status 和 lsblk 查看当前映射状态,例如:
sudo cryptsetup status cryptswap
lsblk -f
swapon --show
若显示错误,请检查 /etc/crypttab 和 /etc/fstab 的条目是否正确,确保分区或文件路径无误,且在执行 swapoff 后再进行变更。必要时可重新生成 initramfs 以确保新配置生效。
5.2 数据安全与密钥管理
加密 Swap 的核心在于密钥的保护与管理。请避免把密钥放在未加密的位置或可被轻易访问的目录里。若使用密钥文件,请确保 权限仅限 root 访问,并定期轮换密钥。同时,记得将密钥备份到安全的位置以防止遗失导致无法解密。
6. 维护与最佳实践
6.1 休眠与恢复的影响
启用 Swap 加密后,休眠文件通常会把系统内存页写入到 Swap 中。请确保休眠分区/文件能够被正确解密并在唤醒时恢复,否则可能导致恢复失败或数据损坏。若使用分区级加密,resume 的设备标识应指向解密后的映射设备;若使用 Swap 文件,需在 initramfs 或 grub 配置中确保解密流程正确执行。
对于启用加密的交换空间,禁用休眠(关闭 hibernation)是一种更简单的选择,特别是在服务器场景或对稳定性要求较高的桌面使用中。
6.2 性能与参数调优
加密会对 Swap 的读写性能带来一定开销。建议根据实际内存容量与工作负载调整 Swap 文件大小,并避免在 I/O 高峰期进行加密映射操作。可以通过监控工具(如 vmstat、iostat、htop)观察 Swap 的使用情况与性能瓶颈。
常见优化点包括适度增大物理内存、调整 swappiness(内核对 Swap 的倾向)以及在必要时使用更高性能的存储设备(如 NVMe)。
7. 实操要点与快速回顾
7.1 实操要点摘要
核心步骤:关闭现有 Swap、对目标对象进行加密、建立映射、创建并启用 Swap、将配置写入 crypttab 与 fstab、更新 initramfs、重启验证。以上两种方案分别对应“分区对分区加密”和“文件对文件加密”。
在实施前,请确保你了解系统当前的 Swap 结构、备份数据,并准备好在遇到锁定失败时回滚的方案。对引导阶段的解密流程有清晰的规划,能避免启动时卡死在密码输入界面。
7.2 常见落地情况与替代方案
若当前环境对引导阶段的加密解锁处理能力有限,建议优先采用 Swap 文件方式实现“无破坏性”加密,且便于后续调整。对于分区加密,若系统包含多重启动(多系统共用磁盘),需确保各系统的 crypttab 与 initramfs 配置互不冲突。


