Ubuntu 在多块硬盘间分配 Swap 的可行方案
- 使用多个交换分区(每块盘一个),通过 /etc/fstab 的 pri= 设置优先级,实现按磁盘性能或剩余空间自动分配与回退。
- 使用交换文件(每块盘一个),同样以 pri= 控制优先级,便于随时增删与迁移。
- 使用 ZRAM(内核压缩内存)作为第一层高速交换,再叠加一块或多块硬盘上的交换分区/文件作为第二层,兼顾性能与容量。
方案一 多交换分区按优先级分配
- 步骤
- 在目标硬盘上创建并初始化交换分区(示例为 /dev/sdb1)
- 分区类型设为 Linux swap(82):
sudo fdisk /dev/sdb → n → t → 82 → w
- 格式化:
sudo mkswap /dev/sdb1
- 启用测试:
sudo swapon /dev/sdb1
- 持久化:获取 UUID →
sudo blkid /dev/sdb1
写入 /etc/fstab(示例,优先级 10 高于默认 0):
UUID=xxxx-xxxx-xxxx none swap sw,pri=10 0 0
- 如需在旧盘保留部分交换,重复以上步骤为旧盘创建分区(如 /dev/sda2),并在 fstab 中给较低优先级(如 pri=1)。
- 验证:
swapon --show 或 free -h,应看到多块盘上的 Swap 均已启用,且按 pri 优先使用高优先级盘。
- 调整/移除:先
sudo swapoff /dev/sdXN,再修改 /etc/fstab 后 sudo swapon -a。
说明:使用分区方式时,推荐用 UUID 而非设备名,避免盘序变化导致错误挂载。
方案二 多交换文件按优先级分配
- 步骤
- 在目标硬盘创建交换文件(示例在 /mnt/data/swapfile2,大小 8G)
- 创建:
sudo fallocate -l 8G /mnt/data/swapfile2(若失败可用 dd if=/dev/zero of=/mnt/data/swapfile2 bs=1G count=8)
- 权限:
sudo chmod 600 /mnt/data/swapfile2
- 格式化:
sudo mkswap /mnt/data/swapfile2
- 启用测试:
sudo swapon /mnt/data/swapfile2
- 持久化:写入 /etc/fstab(示例,优先级 5)
/mnt/data/swapfile2 none swap sw,pri=5 0 0
- 如需多盘,重复创建并分配不同优先级;验证:
swapon --show。
- 调整/移除:
sudo swapoff /mnt/data/swapfile2,再编辑 /etc/fstab 并 sudo swapon -a。
说明:交换文件更灵活,易于在不同硬盘间迁移与调整大小。
方案三 ZRAM 叠加硬盘交换
- 思路
- 启用 ZRAM 作为第一层高速交换(压缩内存,低延迟),再配置一块或多块硬盘上的交换分区/文件作为第二层,容量不足时自动落到硬盘。
- 快速启用 ZRAM(Ubuntu 桌面版通常已内置)
- 查看/启用服务:
sudo systemctl enable --now zramswap.service
- 查看状态:
zramctl 或 swapon --show
- 叠加硬盘交换
- 按方案一或二创建并挂载硬盘上的交换(如 pri=1),系统将优先使用 ZRAM,超出后再使用硬盘交换。
说明:ZRAM 能显著减少磁盘 I/O,适合作为前置层;当内存压力继续升高,再由硬盘交换承接。
关键注意事项
- 使用 UUID 而非设备名(如 /dev/sda1)写入 /etc/fstab,提升可靠性。
- 正确设置 pri= 实现“优先用哪块盘”:数值越大优先级越高;未设置时默认为 0。
- 变更前先
sudo swapoff -a,变更后用 sudo swapon -a 使 /etc/fstab 生效,并用 swapon --show、free -h 校验。
- 若从旧盘迁移,记得在 /etc/fstab 中移除旧盘 swap 条目,避免开机报错或误用旧盘。
- 硬盘空间不足或误配过大交换文件,可能导致系统无法进入图形界面;必要时进入 TTY 检查并释放空间。