CentOS 7一键添加Swap交换分区脚本

一键安装脚本为CentOS 7 添加Swap交换分区

前言

由于阿里云,腾讯云等云服务器默认系统镜像不带Swap分区,本文将介绍使用简单的一键安装脚本为CentOS7添加Swap交换分区.

什么是 Swap,云服务器为什么默认不带

Swap(交换分区)是操作系统在物理内存不足时,把暂时不活跃的内存页写入磁盘的一块区域,从而为活跃进程腾出物理内存。它本质上是用磁盘空间换内存空间,读写速度比物理内存慢几个数量级,但它的价值不在于快,而在于「兜底」:当物理内存被占满时,没有 Swap 的机器只能靠内核的 OOM Killer 直接杀掉进程,而有了 Swap 至少能撑过流量高峰,让业务平滑降级。

至于云服务器为什么默认不带 Swap,原因主要有三点。第一是成本:云厂商按磁盘容量计费,默认关闭 Swap 可以让系统盘更小、镜像更精简。第二是性能与稳定性考量:云主机底层多采用分布式块存储,Swap 的高频随机写入会放大存储压力,也容易触发邻居干扰,所以在共享存储的环境里厂商倾向于不预置 Swap。第三是运维导向:云厂商更希望你通过升配内存来解决问题,而不是把性能问题掩盖在换页上。

配置流程

一、检查Swap分区

登录服务器
输入

free -m
  

Swap分区为0则表示无Swap分区
1.jpg

二、下载一键安装脚本

输入

curl -O https://raw.githubusercontent.com/stilleshan/code/main/shell/swap.sh && chmod +x swap.sh && ./swap.sh
# 以下为国内镜像
curl -O https://github.ioiox.com/stilleshan/code/raw/branch/main/shell/swap.sh && chmod +x swap.sh && ./swap.sh

2.jpg

三、运行脚本添加Swap分区

输入

./swap.sh

选1添加Swap分区
3.jpg
输入分区大小,单位为M,无需乘以1024计算.例如需要4G,则输入4000.
4.jpg
添加完成
5.jpg
再次检查Swap分区

free -m

6.jpg

脚本到底做了什么:手动添加 Swap 的完整步骤

一键脚本省事,但把它背后的动作看懂,排障时就不至于抓瞎。脚本的实质就是下面这五步,任何一步出错都会导致 free -m 里 Swap 仍为 0。

1. 用 dd 创建交换文件

在根分区上创建一个固定大小的文件。bscount 相乘即为文件大小,此处为 1M × 2048 = 2G。块大小选 1M 是为了让写入以较大的块进行,比默认 512 字节快得多。

dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
# 或者用 fallocate,速度更快(普通 ext4/xfs 文件系统上推荐)
fallocate -l 2G /swapfile

注意:fallocate 在部分文件系统(如 btrfs、zfs)上生成的可能是稀疏文件,Swap 无法使用,这种情况下必须退回 dd。此外磁盘剩余空间必须大于文件本身,否则 dd 写到一半就失败,留下一个残缺文件。

2. 收紧文件权限

交换文件里可能残留进程的内存内容,权限必须是 600,且属主为 root。脚本里这一步往往被忽略,但它是安全审计会检查的项。

chmod 600 /swapfile
chown root:root /swapfile

3. 格式化为交换分区并启用

mkswap /swapfile
swapon /swapfile

执行 swapon 之后立刻用 free -mswapon -s 验证。如果报 swapon failed: Invalid argument,多半是文件系统不支持(如上面的 btrfs 稀疏文件)或文件权限/属主不对。

4. 写入 /etc/fstab 实现开机自动挂载

echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 校验 fstab 语法,避免下次开机进入紧急模式
mount -a

这一步是最容易翻车的地方。fstab 写错一个字段,重启后系统可能直接掉进 emergency mode。写完务必执行 mount -a 验证无报错,或者用 swapon --show 交叉确认。

5. 在 /proc/swaps 中确认

cat /proc/swaps
swapon --show

/proc/swaps 是内核视角的权威结果,比 free 更直接。它的输出里 Type 为 file 表示是交换文件,partition 表示是独立分区。

一键脚本读取逻辑解析

理解了手动步骤,脚本的行为就很好预测了。以本文使用的 swap.sh 为例,它的流程是:

  • 启动时读取 free -m/proc/swaps,判断当前是否已有 Swap,并把已用/总量打印给你看。
  • 给出菜单:1 为添加 Swap,2 为删除 Swap。选择后进入对应分支。
  • 添加分支中交互式询问大小,单位为 M,输入 4000 即代表 4000M ≈ 3.9G,无需自己乘 1024。这一点与不少教程不同,输入时要按提示来,否则会得到比预期小得多的交换文件。
  • 按上面的五步执行 dd、chmod、mkswap、swapon,并把条目追加进 /etc/fstab
  • 最后调用 free -m 打印结果,让你直接看到 Swap 一行由 0 变成目标值。

删除分支的逻辑是 swapoff 关闭、删除文件、用 sed 去掉 fstab 中对应的行,再关闭 Swap 相关的开机自启项。如果脚本中途失败(比如磁盘满),它可能只完成了前两步,此时需要手动清理残留的 /swapfile 和 fstab 条目,再重新运行。

Swap 大小建议

Swap 大小一般建议为物理内存的 1-2 倍:1G 内存建议 1-2G,2G 内存建议 2-4G,4G 以上可按需配置 2-8G。云服务器磁盘多为 SSD,Swap 读写性能尚可,但注意 Swap 不能替代物理内存,高负载场景仍建议升级内存配置。

如果按「休眠/挂起」场景考虑,传统的经验公式是 Swap ≥ 物理内存;而纯粹作为 OOM 兜底时,现代实践普遍认为 Swap ≥ 内存的 50% 就已足够,把更多磁盘留给数据更有价值。另一方面,Swap 也不是越大越好:过大的 Swap 会让系统在内存压力下长时间「抖动」(thrashing),表现为磁盘 IO 跑满而 CPU 空闲、SSH 卡顿,这是比直接 OOM 更难排查的故障形态。

让 Swap 用得更聪明:swappiness 调优

内核参数 vm.swappiness 决定内存页被换出到 Swap 的积极程度,取值范围 0-100。默认值通常是 60,意味着内核在内存有一定压力时就会开始换出匿名页。

场景 建议 swappiness 说明
数据库、Redis、低延迟服务 0 - 10 尽量只在真正耗尽时才用 Swap,避免热数据被换出导致延迟尖刺
通用 Web / 应用服务器 10 - 30 兼顾兜底与性能,是云上最常见的取值
桌面 / 内存紧张的构建机 60 - 100 愿意用性能换取不杀进程,编译卡一点可以接受

临时修改与永久生效的方式如下:

# 临时生效,重启后失效
sysctl vm.swappiness=10

# 永久生效
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

若使用的是 systemd 系统,部分发行版同时读取 /usr/lib/sysctl.d//etc/sysctl.d/,建议写入 /etc/sysctl.d/99-swap.conf 以避免被包管理器的默认文件覆盖。另外可以顺带调整 vm.vfs_cache_pressure,在内存充足时降低它对目录项和 inode 缓存的回收倾向。

删除 Swap 分区

如需删除 Swap,可先执行 swapoff /swapfile 关闭 Swap,再删除交换文件并注释 /etc/fstab 中的相关开机挂载项。不同脚本生成的 Swap 文件位置略有不同,可通过 swapon -s 查看实际路径。

完整的删除流程如下,注意顺序:先关闭,再删文件,最后清理 fstab,中间任何一步颠倒都可能留下失效条目。

# 1. 查看当前 Swap 文件的实际路径
swapon -s

# 2. 关闭 Swap
swapoff /swapfile

# 3. 删除交换文件
rm -f /swapfile

# 4. 注释掉 fstab 中的 Swap 行
sed -i '/swapfile/s/^/#/' /etc/fstab

# 5. 确认
free -m

常见问题

  • 执行 swapon 报「Invalid argument」 —— 常见于 btrfs / zfs 文件系统上的稀疏文件,或交换文件权限不是 600。改用 dd 创建,并确认 ls -l /swapfile 显示 -rw-------
  • 添加后 free -m 仍然显示 Swap 为 0 —— 脚本执行失败被中断,或 swapoff 被其它服务拉起了。检查 dmesg | tail 看是否有内核报错,并确认磁盘剩余空间。
  • 重启后 Swap 消失 —— fstab 条目缺失或写错。用 swapon --showcat /etc/fstab 交叉核对,字段顺序为「设备 挂载点 类型 选项 dump pass」,Swap 行的挂载点必须是 none、类型必须是 swap
  • 内存没满但磁盘 IO 一直很高 —— 说明系统在频繁换页。先用 vmstat 1si/so 两列,若持续不为 0 就是换页活跃,应降低 swappiness 并考虑加内存。
  • 容器里看不到 Swap —— Docker 默认使用宿主机的内存与 Swap,容器内 free 显示的是 cgroup 视图。要限制容器 Swap 用量,用 --memory-swap 参数而非在容器内加交换文件。

注意事项

1. Swap 仅用于缓解内存不足,频繁读写 Swap 会明显降低性能,应结合业务实际内存使用情况配置;2. 添加/删除 Swap 操作不影响系统数据,但仍建议操作前备份重要文件;3. 本教程适用于 CentOS 7,其他系统(Debian/Ubuntu)换源脚本同样支持。

如果你还想了解网卡与内核层面的系统调优,可以参考站内的 Linux 服务器运维实战:从选型到故障排查全攻略Linux 运维高阶命令实战指南:五大场景排障;需要给更多 VPS 批量处理 Swap 增删时,可以结合 Linux VPS 一键添加/删除 Swap 虚拟内存 的做法,另外 Debian 一键更新源文件 里的脚本写法也可以直接套用到本文的批量场景。


 

结语