1. 项目概述:为什么 Ubuntu 18.04 用户今天仍需亲手配置 Swap 空间
Ubuntu 18.04 是一个被大量生产环境、开发工作站和老旧硬件设备长期依赖的 LTS 版本,它自带的安装器在默认配置下往往不创建 swap 分区,尤其当系统内存 ≥ 4GB 且检测到 SSD 时,安装程序会直接跳过 swap 配置——这个“善意”的自动化决策,在真实使用中却埋下了不少隐患。我见过太多用户在编译大型项目、运行 Docker 多容器、开启 Chrome 十几个标签页后,系统突然卡死、鼠标失灵、终端无响应,最后发现 free -h 输出里 swap 行赫然写着 0B 。这不是内存不够用,而是系统彻底失去了内存压力缓冲机制。Swap 不是“备用内存”,它是 Linux 内存管理中不可或缺的 压力释放阀 和 OOM(Out-of-Memory)杀手的保险丝 。当你看到 dmesg | grep -i "killed process" 出现 chrome , code , java 这类进程名时,基本可以断定 swap 缺失是根源。Ubuntu 18.04 的内核(4.15.x 系列)对 swap 的依赖逻辑非常清晰:没有 swap,内核就无法执行页面回收(page reclaim)的完整策略,只能硬扛,直到触发 OOM killer 强制杀进程。这和“让系统使用 swap”这种模糊说法完全不同——swap 必须被正确创建、格式化、启用并持久挂载,否则它就是一纸空文。本文聚焦的就是这个最基础、也最容易被忽略的实操环节:如何在已安装完成的 Ubuntu 18.04 系统上,安全、高效、可复用地添加一块 swap 空间。它不涉及 LVM 或加密 swap 这类进阶场景,而是针对绝大多数普通用户的真实需求:快速补上那块缺失的“安全垫”。你不需要重装系统,不需要动硬盘分区表,甚至不需要重启——整个过程在 3 分钟内完成,且全程可逆。如果你正用着一台 8GB 内存的老款 ThinkPad T480 跑着 ROS 和 Gazebo,或者在树莓派 4B 上部署了轻量级 Kubernetes 集群,又或者只是想让自己的日常办公机更稳一点,那么这篇内容就是为你写的。
2. 核心思路拆解:为什么选 swapfile 而非 swap 分区?fallocate 为何优于 dd?
在 Ubuntu 18.04 上添加 swap,本质上只有两条技术路径:创建独立的 swap 分区(swap partition),或创建一个 swap 文件(swapfile)。前者需要修改磁盘分区表,通常意味着要进入 Live CD 环境、用 GParted 调整分区大小、再重新安装引导,风险高、耗时长、对新手极不友好。而后者,即 swapfile 方案,是 Ubuntu 官方自 17.04 起就主推的现代做法,它把 swap 当作一个普通文件来管理,完全绕开了底层分区操作。我之所以在所有客户现场和内部培训中都强制推荐 swapfile,核心原因有三点:第一, 原子性与可逆性 。swapfile 是一个位于 / 或 /home 文件系统内的普通文件,创建失败只需 rm 删除即可,启用失败 sudo swapoff /swapfile 一行命令就能回滚,没有任何副作用。第二, 空间灵活性 。你可以把它放在任何有足够剩余空间的挂载点上,比如外挂的 NTFS 硬盘(需注意文件系统兼容性)、大容量 /home 分区,甚至是一个单独挂载的 ext4 数据盘。这直接回应了热搜词里“如何在外挂的硬盘中扩展 swap”的实际诉求。第三, 性能无损 。很多人误以为 swapfile 比 swap 分区慢,这是过时的认知。在 ext4/xfs 这类现代日志文件系统上,一个预分配、无碎片的 swapfile,其随机读写性能与 swap 分区几乎无差别。Linux 内核对 swapfile 的访问是直接通过 page cache 和 block layer 完成的,不经过 VFS 的常规文件读写路径,因此不存在额外开销。至于工具选择, fallocate 是绝对首选,它比传统 dd if=/dev/zero of=/swapfile bs=1G count=2 快上百倍。 dd 是真的一字节一字节地向磁盘写零,而 fallocate 只是在文件系统元数据层面“声明”这块空间已被占用,瞬间完成,且生成的文件是稀疏文件(sparse file),不实际消耗磁盘 I/O。但这里有个关键前提: fallocate 要求底层文件系统必须支持 fallocate() 系统调用,Ubuntu 18.04 默认的 ext4 完全支持,但如果你挂载的是 NTFS 或 exFAT(比如外接移动硬盘), fallocate 就会报错 Operation not supported ,此时就必须退回到 dd 方案。这也是为什么我在实操步骤里会明确写出两种方案的切换逻辑——不是为了炫技,而是因为真实环境永远比文档复杂。另外, mkswap 的作用常被误解。它并非“格式化”swapfile,而是向该文件写入一个特定的魔数(magic number)和校验信息,让内核能识别出这是一个合法的 swap 区域。这个过程本身极快,毫秒级,但它却是 swap 启用前不可跳过的一步。跳过 mkswap 直接 swapon ,系统会报错 swapon: /swapfile: read swap header failed: Invalid argument ,这是内核在拒绝加载一个未签名的、不可信的 swap 区域。所以, fallocate → chmod → mkswap → swapon 这四步,环环相扣,缺一不可,每一步都有其不可替代的内核级语义。
3. 实操细节解析:从零开始创建 swapfile 的每一步意图与避坑要点
创建 swapfile 看似简单,但每一步背后都有其严谨的设计意图和极易踩中的陷阱。下面我将逐行拆解标准流程,并告诉你为什么必须这样写,以及如果写错会怎样。
3.1 创建文件:fallocate 与 dd 的精确用法及适用场景
第一步是创建文件本身。标准命令是:
sudo fallocate -l 2G /swapfile
这里的 -l 2G 表示申请 2GB 的逻辑空间。注意, 2G 必须是大写 G,小写 g 会被 fallocate 解释为字节(bytes), -l 2g 就等于 2 字节,毫无意义。这个值不是随便定的。Ubuntu 官方建议的 swap 大小规则是:内存 ≤ 2GB 时,swap = 2×RAM;内存 2–8GB 时,swap = RAM;内存 > 8GB 时,swap = 4–8GB 即可。对于一台 8GB 内存的机器,2GB swap 是一个非常平衡的选择——足够应对日常多任务压力,又不会因 swap 过大而拖慢 swappiness 调优效果。如果你的 / 分区剩余


411

被折叠的 条评论
为什么被折叠?



