一、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
- 为虚拟机添加一块新硬盘,确认
/dev/sdb已被识别; - 用
fdisk创建分区并将类型改为82; mkswap格式化后swapon启用;- 用
free -g、swapon -s验证; - 写入
/etc/fstab实现开机自动启用,重启后再次验证。
练习 3:用文件做 Swap
- 用
dd创建 1G 的swapfile,权限设为600; mkswap、swapon启用,free -m观察 Swap 总量变化;swapoff停用,再次观察;- 查看并临时修改
/proc/sys/vm/swappiness,理解其含义。
此处评论已关闭