Linux :合并旧 Swap 并无缝扩容至 16G
前置知识:关于 Linux Swap
在开始操作之前,简单了解一下 Swap(交换空间)的机制和选择:
1. 什么是 Swap? Swap 是 Linux 的虚拟内存。当物理内存(RAM)快被用满时,系统会将不常访问的数据移动到硬盘上的 Swap 空间,从而为当前运行的程序腾出物理内存。它就像是内存的“备用轮胎”,能防止系统因内存耗尽(OOM)而崩溃。
2. Swap 文件 vs. Swap 分区 早期的 Linux 习惯使用独立的硬盘分区做 Swap,但这导致调整大小非常麻烦(通常需要重新对硬盘分区)。 现在的最佳实践通常是使用 Swap 文件。它就是一个普通的文件,最大的优势是灵活:你可以随时创建、删除、或调整它的大小,而无需改动硬盘分区结构。
3. 为什么合并? 如果系统中有多个散乱的 Swap 文件(如 /swapfile 和 /swap.img),不仅管理混乱,还涉及优先级的调度问题。将它们合并为一个大文件,既整洁又便于通过 fstab 进行统一管理。
最近发现服务器上挂载了两个较小的 Swap 文件(一个 4G,一个 6G),管理起来比较乱,且容量开始捉襟见肘。
为了提升管理效率和系统稳定性,决定将它们合并为一个 16G 的大 Swap 文件。整个过程在系统运行中完成(Live Migration),无需重启,且通过“先建后删”的策略保证了数据平滑迁移。
1. 现状分析
首先检查当前的 Swap 状态:
Bash
sudo swapon --show
输出:
Plaintext
NAME TYPE SIZE USED PRIO
/swap.img file 4G 514M -2 <-- 正在使用,存有数据
/swapfile file 6G 0B -3 <-- 完全空闲
策略:
- 先删除那个空闲的 6G
/swapfile,释放磁盘空间。 - 原地重建一个 16G 的新
/swapfile。 - 关闭旧的
/swap.img(系统会自动将那 514M 数据迁移到新 Swap 或内存中)。 - 删除旧文件并更新配置。
2. 操作步骤
第一步:清理闲置 Swap
由于 /swapfile (6G) 没有被使用,可以直接关闭并删除,为新文件腾出空间。
Bash
sudo swapoff /swapfile
sudo rm /swapfile
第二步:创建新的 16G Swap
使用 fallocate 快速预分配空间(比 dd 快很多)。
Bash
# 1. 分配 16G 空间
sudo fallocate -l 16G /swapfile
# 2. 设置权限(关键安全步骤,仅 root 可读写)
sudo chmod 600 /swapfile
# 3. 格式化为交换空间
sudo mkswap /swapfile
# 4. 立即启用
sudo swapon /swapfile
第三步:平滑迁移旧数据
此时系统挂载了两个 Swap。执行 swapoff 关闭旧的 /swap.img 时,Linux 内核会自动将其中的数据(514M)“挤”到物理内存或新的 Swap 中。
Bash
# 关闭旧 Swap,触发数据迁移
sudo swapoff /swap.img
# 确认迁移完成,现在应该只剩下一个 16G 的 Swap
sudo swapon --show
# 删除旧文件
sudo rm /swap.img
第四步:持久化配置
修改 /etc/fstab 防止重启后 Swap 失效。
Bash
sudo nano /etc/fstab
修改内容:
- 删除 或注释掉包含
/swap.img的行。 - 保留 或修改包含
/swapfile的行,确保如下所示:
Plaintext
/swapfile none swap sw 0 0
3. 结果验证
最后检查内存和 Swap 使用情况:
Bash
free -h
最终状态:
Plaintext
total used free shared buff/cache available
内存: 14Gi 8.8Gi 3.2Gi 1.9Gi 5.0Gi 6.0Gi
交换: 15Gi 0B 15Gi
总结:
- Swap 总量已成功升级为 16G(显示为 15Gi 是因为换算单位差异)。
- 旧数据已成功回收到 RAM 中(因为当前 RAM 充足),Swap 使用率归零,系统状态健康。