首页 > Sysadmin > 正文

Linux 增加 Swap 空间:分区与文件两种方案

huyuanwen 2026-11-05 Sysadmin

草稿待审:Swap 分区创建步骤(fdisk/parted、分区类型 82)基于文档核查,尚未在 WSL 上实际执行;Swap 文件创建、mkswap、swapon、swappiness 调整、权限修复已在 WSL2 Ubuntu 24.04 验证。

Swap 空间作为物理内存的扩展,在内存不足时承接冷页,避免进程被 OOM Killer 终止。

查看现有 Swap 状态

在修改前先确认当前 Swap 使用情况:

free -h
swapon --show
cat /proc/swaps
  • free -h 的 Swap 行显示总量和已用量
  • swapon --show 列出当前活跃的 Swap 分区或文件 [2]
  • /proc/swaps 提供同样的原始信息

方案一:新建 Swap 分区

Swap 分区是传统方案,适合磁盘有未分配空间的服务器 [1]。

1. 创建新分区并设置分区类型为 Linux swap(fdisk 下类型 82,parted 下 set <num> swap on) 2. 初始化分区:

mkswap /dev/sdxY

3. 立即启用:

swapon /dev/sdxY

4. 写入 /etc/fstab 持久化 [3]:

UUID=<交换分区UUID> none swap sw 0 0

UUID= 比设备路径更稳定,可通过 blkid /dev/sdxY 获取。

方案二:新建 Swap 文件

Swap 文件不需要重新分区,适合云主机和测试环境。

1. 确认可用空间后创建文件。dd 配合 /dev/zero 创建的是连续零填充文件,不存在空洞,是兼容性最广的方式 [4]:

dd if=/dev/zero of=/swapfile bs=1MiB count=4096 conv=fsync status=progress

fallocate 预分配速度更快,但在 ext4 上实际可用;某些文件系统(如 XFS)或内核版本下 fallocate 创建的文件可能被识别为有空洞而被 swapon 拒绝 [4]。

2. 设置权限为 0600,防止其他用户读取该文件:

chmod 0600 /swapfile

mkswap 和 swapon 都会对 0644 权限发出警告,但不会阻止启用 [1]。

3. 初始化为 Swap 区域并启用:

mkswap -f /swapfile
swapon /swapfile

4. 写入 /etc/fstab 持久化 [3]:

/swapfile none swap sw 0 0

调整 Swappiness 和优先级

vm.swappiness 控制内核将内存页换出到 Swap 的倾向,范围 0–100,默认值 60 [5]。

临时调整:

sysctl vm.swappiness=10

sysctl 用于临时或持久化内核参数 [6]。持久化需在 /etc/sysctl.conf 或 /etc/sysctl.d/99-swap.conf 中添加:

vm.swappiness=10

多个 Swap 区域可通过 swapon -p <优先级> 或 fstab 中的 pri=<N> 调整使用顺序,数值越大越优先 [2]。

排错速查表

现象 原因 处理
swapon: /swapfile: insecure permissions 文件权限非 0600 chmod 0600 /swapfile 后重试
swapon: /swapfile: appears to have holes 文件含空洞(常见于 fallocate 或 truncate 创建) 用 dd if=/dev/zero 重建
swapon /dev/sdxY: device is busy 分区正在被使用或内核持有 先 swapoff,或重启后操作
Swap 开机不生效 fstab 格式错误或 UUID 不对 用 blkid 核对 UUID

回滚与清理

禁用 Swap 文件并删除:

swapoff /swapfile
rm -f /swapfile
sed -i '/\/swapfile none swap/d' /etc/fstab

禁用 Swap 分区并标记为普通分区:

swapoff /dev/sdxY
mkswap -f /dev/sdxY  # 仅清除 swap 签名,不破坏数据

附录

  • 测试机:WSL2 Ubuntu 24.04
  • 内核:Linux 6.6.114.1-microsoft-standard-WSL2
  • 测试日期:2026-11-04
  • 观察结果:dd if=/dev/zero 创建 512M 文件耗时约 0.5s,mkswap 报权限警告但成功,swapon 报权限警告但成功启用,swapon --show 确认文件型 Swap 活跃,默认 vm.swappiness = 60。

常见问题

  • 问:Swap 文件性能比分区差吗?

在 NVMe SSD 上差异极小;机械硬盘上两者都慢于内存,Swap 文件更灵活。

  • 问:2GB 内存配多少 Swap 合适?

传统建议是 2 倍内存,实际取决于休眠需求。日常桌面 2–4GB 足够,服务器可按负载调整。

  • 问:Swap 能代替内存升级吗?

不能。Swap 延迟在毫秒级,内存是纳秒级。Swap 只能延缓 OOM,不能解决内存不足的卡顿问题。

  • 问:WSL 能创建 Swap 文件吗?

可以,但 WSL 已有基于虚拟磁盘的内置 Swap,手动添加的 Swap 文件优先级为 -3,低于内置的 -2,实际使用率极低,主要用于测试流程。

  • 问:mkswap --file 有什么用?

util-linux 2.41+ 在 Btrfs 上会自动设置 nocow 属性,避免写时复制开销;ext4/XFS 上不影响 [1]。


参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。