登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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 实际启用哪个设备节点或文件。只改其中一个,往往会让排障变得困难。

Linux systemd.swap 交换文件单元与 What 配置关系说明图
图1:swap 文件与 .swap 单元的静态结构说明图,不是运行截图或运行证据。

创建交换文件和最小单元

下面的示例只展示配置形态,不代表已经在当前机器执行。交换文件的大小应按实际内存压力、发行版文档和业务需要决定;本文只聚焦 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 标记网络边界;这会让它转而与远程文件系统和网络在线目标建立相应关系。

Linux swap 单元 fstab 原生配置与 systemd 依赖边界说明图
图2:swap 配置入口与依赖边界结构说明图,不是实际系统运行界面。

用 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 生成的结果。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>