Linux systemd.swap 怎样配置交换文件单元
来源:17golang原创
时间:2026-11-03 12:31:00 263浏览 收藏
如果要让 systemd 管理一个交换文件,关键不是把命令塞进服务单元,而是创建与受管文件对应的 .swap 单元,并在 [Swap] 中写入必需的 What=。以 /swapfile 为例,原生单元名应使用 swapfile.swap,文件内容至少包含 What=/swapfile。
官方地址:https://www.freedesktop.org/software/systemd/man/latest/systemd.swap.html
最小可用配置是:创建权限正确的/swapfile,写入swapfile.swap,执行daemon-reload后用systemctl enable --now swapfile.swap管理它。若同一交换文件同时写在/etc/fstab,先保留一个配置入口,避免排障时不知道实际采用了哪份配置。
先确定 swap 单元名和 What 路径
systemd 的交换单元文件名需要对应它管理的设备或文件。设备路径会按 systemd 的路径转义规则映射成单元名;对根目录下的 /swapfile,常见结果就是 swapfile.swap。单元中的 What= 则写回绝对路径 /swapfile,它是 [Swap] 段的必填项。
这两个字符串承担不同职责:文件名用于让 systemd 找到并识别单元,What= 用于告诉 swapon 实际启用哪个设备节点或文件。只改其中一个,往往会让排障变得困难。

创建交换文件和最小单元
下面的示例只展示配置形态,不代表已经在当前机器执行。交换文件的大小应按实际内存压力、发行版文档和业务需要决定;本文只聚焦 systemd 单元如何接管它。
# 创建交换文件;大小示例仅用于演示,请按机器规划调整 sudo fallocate -l 2G /swapfile # 交换文件不应对普通用户开放读写权限 sudo chmod 600 /swapfile # 写入交换空间签名;失败时停止后续 systemd 配置 sudo mkswap /swapfile # 创建与 /swapfile 对应的原生单元 sudo tee /etc/systemd/system/swapfile.swap >/dev/null
What= 是必需字段,Priority= 是可选字段。如果把优先级写进 Options=pri=,应避免再用另一处设置同一个含义,以免读配置时产生误判。交换单元只适用于系统服务管理器或 root 的用户服务管理器,普通用户服务管理器不能直接管理 Linux swap。
理解 systemd 自动补上的依赖
对于文件型 swap,systemd 会根据 What= 建立与相应挂载单元的依赖;设备型 swap 则会关联对应设备单元。官方手册把这些关系描述为自动加入的 Requires= 和 After=,因此通常不必手写一套重复的设备等待逻辑。
本地 swap 默认会与 umount.target 形成关闭关系,并排在 swap.target 之前。对于需要网络访问的交换设备,可以使用 _netdev 标记网络边界;这会让它转而与远程文件系统和网络在线目标建立相应关系。

用 systemctl 载入、启用和查看状态
单元文件写入 /etc/systemd/system/ 后,先让 systemd 重新读取配置,再决定是立即启用、只启动本次,还是只查看依赖关系。
# 让 systemd 重新读取新增或修改的单元文件 sudo systemctl daemon-reload # 立即启用并启动;enable 负责开机拉起,--now 同时负责当前启动 sudo systemctl enable --now swapfile.swap # 查看单元状态和最近一次失败原因 systemctl status swapfile.swap --no-pager # 查看 What、依赖和启动目标等解析后的属性 systemctl show swapfile.swap -p What -p After -p Requires -p Before # 从内核视角确认当前启用的交换空间;输出是检查结果,不是配置文件 swapon --show
如果修改了 What= 或单元依赖,先执行 daemon-reload。如果 status 显示启动失败,优先看 What= 指向的文件是否存在、权限是否为 600、是否已经执行 mkswap,以及是否有另一份 fstab 配置。
noauto、nofail 和 _netdev 怎么选
启动策略不要混为一谈:
| 选项 | 适用含义 | 注意点 |
|---|---|---|
auto | 默认加入相关目标,系统启动时自动拉起 | 适合本机稳定存在的交换文件或设备 |
noauto | 不作为 swap.target 的自动依赖 | 需要由其它单元或人工命令显式启动 |
nofail | 只希望启动目标拉起它,不把失败视为必须满足的依赖 | 适合可选交换设备,避免它失败时阻塞启动 |
_netdev | 声明交换设备需要网络访问 | 网络交换与本地文件型 swap 的依赖边界不同 |
其中 noauto、nofail 和 _netdev 常在 /etc/fstab 的选项字段里出现;它们不是可以随意写进原生 [Swap] 单元的同义替代。原生单元需要优先查对应的 systemd 文档和 Options= 语义。
不要让 fstab 和原生单元互相打架
交换空间也可以写在 /etc/fstab 中。systemd 会在启动时或重新加载管理器配置时,把 fstab 条目动态转换成原生单元。如果同一个设备或文件既出现在 fstab,又有同名原生单元,官方规则是原生单元配置优先。
# 只查看 fstab 中是否已经存在同一个交换文件条目 grep -n -- '/swapfile' /etc/fstab # 查看 systemd 当前识别到的单元文件来源和覆盖关系 systemctl cat swapfile.swap # 修改 fstab 或单元后重新读取配置,再观察解析结果 sudo systemctl daemon-reload systemctl show swapfile.swap -p FragmentPath -p UnitFileState
实际维护时建议选一个明确入口:要么让 fstab 管理简单的静态交换文件,要么让原生 .swap 单元承载更细的描述和依赖。重复配置并不会带来两份交换空间,却会让“改了为什么不生效”的判断更复杂。
常见问题
为什么单元名不是任意的 service 名?
因为 .swap 单元需要对应受管的交换设备或文件。对路径进行 systemd 规则转义后得到的名称,能让单元和资源一一对应。
只写 What= 能不能启动?
还要保证目标文件已经初始化为交换空间,并且单元文件被 systemd 重新加载。What= 只是告诉 systemd 要管理谁,不会代替 mkswap 创建签名。
fstab 和原生单元应该保留哪一个?
固定本机资源可以选更简单的 fstab;需要清晰的单元描述、独立状态管理或特殊依赖时再保留原生单元。若两者同时存在,先确认原生单元是否覆盖了 fstab 生成的结果。
-
432 收藏
-
306 收藏
-
462 收藏
-
252 收藏
-
422 收藏
-
227 收藏
-
308 收藏
-
383 收藏
-
285 收藏
-
413 收藏
-
437 收藏
-
247 收藏
-
157 收藏
-
391 收藏
-
369 收藏
-
269 收藏
-
209 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习