一、Swap 交换分区概述

Swap 即交换分区(交换空间)。当物理内存紧张时,内核会把部分暂时不用的内存页换出(swap out)到 Swap 设备上,从而缓解内存压力;需要时再换入(swap in)。

要点:

  • Swap 设备没有文件系统。存取磁盘数据不一定需要文件系统,swap 就是典型例子,它由 mkswap 写入专用的签名与元数据,而不是 mkfs 创建的文件系统。
  • Swap 可以是独立分区(MBR 分区类型 ID 为 82,Linux swap),也可以是一个普通大文件。
  • Swap 位于磁盘上,速度远低于内存。频繁换页(swap 抖动)意味着内存不足,应该加内存或优化程序,而不是无限扩大 Swap。

容量规划参考

常见的分区方案中,Swap 一般规划为一个独立的主分区或逻辑分区:

分区示例 大小 用途
分区 4 / 逻辑分区 1 4 GB Swap 交换分区
/dev/sda5 4 GB Swap(分区类型 ID 82)

经验规则:

  • 物理内存较小(≤ 4 GB)时,Swap 可取内存的 1~2 倍;
  • 物理内存较大(≥ 16 GB)时,Swap 取 4~8 GB 即可,主要用于应急与休眠;
  • 需要支持休眠(hibernate)时,Swap 不应小于物理内存。

二、方式一:用新增硬盘分区创建 Swap

1. 确认新硬盘已被识别

ls /dev/sdb

2. 使用 fdisk 为新磁盘创建分区

fdisk /dev/sdb

交互操作如下:

输入 含义
n 创建新分区
t 更改分区类型,代码填 82(Linux swap)
w 保存并退出(写入 MBR)

补充说明:

  • 修改分区类型(t)时,先输入要修改的分区号,再输入类型 ID;输入 L 可列出所有支持的分区类型,常用的有 82(Linux swap)、83(Linux)、8e(Linux LVM)、7(NTFS)。
  • 分区表修改后如果内核未刷新设备文件,可以重启或通知内核重读分区表:
sudo reboot       # 方法一:重启
sudo partprobe    # 方法二:通知内核重新读取分区表

3. 将分区格式化为 swap

mkswap /dev/sdb1

对已有分区(如 /dev/sda5)同理:

sudo mkswap /dev/sda5          # 格式化 Swap 分区

4. 启用交换分区

swapon /dev/sdb1

5. 确认生效

free -g

6. 开机自动启用

如需开机自动挂载,将下列内容追加到 /etc/fstab:

/dev/sdb1   swap   swap   defaults   0 0

三、方式二:用文件创建 Swap

当没有可用的空闲磁盘或分区,但需要临时扩大 Swap 时,可以用一个大文件模拟交换分区。

1. 创建一个 1G 的空文件

dd if=/dev/zero of=./swapfile bs=1M count=1024

其他等价写法:

# 使用 head 生成 1GB 空文件
head -c 1G /dev/zero > swapfile

# 或使用 dd(注意 bs=1024 count=1024 只有 1MB,按需调整 count)
sudo dd if=/dev/zero of=./swapfile bs=1024 count=1024

2. 将该文件格式化为 swap

mkswap ./swapfile

3. 启用交换分区

swapon ./swapfile

4. 关闭交换分区

swapoff ./swapfile

提示:Swap 文件应设置为仅 root 可读写(chmod 600 swapfile),否则 swapon 可能给出不安全权限的警告。


四、Swap 的查看与启停

free -m                    # 查看内存与交换分区使用量(以 MB 为单位)
free -g                    # 以 GB 为单位查看
mkswap /dev/sda5           # 格式化为交换分区
swapon /dev/sda5           # 启用交换分区
swapoff /dev/sda5          # 停用交换分区

常用查看方式:

swapon -s                  # 列出当前所有已启用的 Swap 设备/文件及其大小、优先级
cat /proc/swaps            # 与 swapon -s 等价的内核视图
swapon -a                  # 启用 /etc/fstab 中所有标记为 swap 的条目
swapoff -a                 # 停用全部 Swap

换出倾向:swappiness

swappiness 控制内核使用 Swap 的积极程度,取值 0~100:0 表示尽可能使用物理内存,100 表示积极使用 Swap。

cat /proc/sys/vm/swappiness

生产环境中应尽量通过调整 swappiness(/proc/sys/vm/swappiness)来控制换出倾向,而不是无限扩大 Swap 文件。调优规则:物理内存够大就尽量不用 Swap,可调小如 swappiness=10。


五、fstab 持久化

/etc/fstab 用于配置系统启动时的自动挂载(含 Swap 的自动启用)。

文件格式

挂载源  挂载目标  文件系统类型  挂载选项  dump备份  开机自检

配置示例

UUID=db6a4392-ccb0-41af-863f-4de76cad1c0a /        ext4  errors=remount-ro  0  1
UUID=67a2f488-1421-495a-ada1-dc022c29d77d none     swap  sw                 0  0
UUID=96A4-6194                            /disk/C  vfat  defaults           0  0
UUID=51c35f8c-c9dd-498e-9f05-203d6f931fa6 /disk/boot  ext2  defaults        0  0
UUID=c9edda7d-dbc2-443a-81a4-5a729fc9b27a none     swap  sw                 0  0
/disk/ubuntu-16.04.4-server-amd64.iso     /opt     iso9660  loop,ro         0  0
/dev/sdb1                                 swap     swap  defaults           0  0

字段说明

字段 说明
挂载源 建议使用 UUID,也可用设备路径或标签
挂载目标 挂载点目录,Swap 填 none(或写 swap)
文件系统类型 ext4、vfat、ntfs-3g、swap、iso9660 等
挂载选项 如 defaults、sw、rw、ro、noauto、loop
dump 备份 0 表示不备份,1 表示备份
开机自检 0 表示不自检,1 表示根分区自检,2 表示其它分区自检;Swap 填 0

获取 UUID 与应用配置

sudo blkid                 # 查看所有块设备的 UUID
sudo blkid /dev/sda1       # 查看指定分区的 UUID
mount -a                   # 挂载 /etc/fstab 中所有尚未挂载的条目
swapon -a                  # 启用 fstab 中所有 swap 条目

为什么推荐使用 UUID

设备名称(如 /dev/sda1)可能因硬盘变动(删除中间分区、添加硬盘等)而发生改变;而 UUID 是分区的唯一标识符,只要分区未重新格式化,UUID 就保持唯一、不会冲突。

注意:/etc/fstab 写错会导致系统开机失败或进入紧急模式,修改后建议立即执行 mount -a、swapon -a 验证。


练习

练习 2:用新增硬盘做 Swap

  1. 为虚拟机添加一块新硬盘,确认 /dev/sdb 已被识别;
  2. 用 fdisk 创建分区并将类型改为 82;
  3. mkswap 格式化后 swapon 启用;
  4. 用 free -g、swapon -s 验证;
  5. 写入 /etc/fstab 实现开机自动启用,重启后再次验证。

练习 3:用文件做 Swap

  1. 用 dd 创建 1G 的 swapfile,权限设为 600;
  2. mkswap、swapon 启用,free -m 观察 Swap 总量变化;
  3. swapoff 停用,再次观察;
  4. 查看并临时修改 /proc/sys/vm/swappiness,理解其含义。
最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏