银河麒麟服务器操作系统关闭 Swap 分区

1. 适用范围

  • 操作系统:银河麒麟高级服务器操作系统

2. 问题现象

按通用教程在 /etc/fstab 中注释掉 swap 挂载行后重启,swap 仍然被自动启用:

查看 swap 单元状态:

[root@192 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           15G         1.2G        13G         12M        1.1G         14G
Swap:         7.9G           0B        7.9G
[root@192 ~]# systemctl list-unit-files | grep swap
dev-mapper-klas\x2dswap.swap               generated       -
swap.target                                 masked          disabled

3. 原因分析

(1)swap 单元是 generated(运行时生成)状态

dev-mapper-klas\x2dswap.swap 对应设备 /dev/mapper/klas-swap(单元名中的 \x2d 是 systemd 对字符 - 的转义)。该单元并非磁盘上真实存在的单元文件,而是由 systemd 生成器在系统启动时根据探测到的交换设备动态生成的。

对于 generated 状态的单元:

  1. systemctl disable 无法禁用(磁盘上没有可移除的启用链接);
  2. 仅注释 /etc/fstab 只是移除了 fstab 生成器的一个来源,swap.target 仍会被设备型 swap 单元拉起,重启后 swap 依旧启用。

(2)必须使用 systemctl mask

mask 会在 /etc/systemd/system/ 下创建指向 /dev/null 的软链接,从根源上阻止该单元(及其依赖链上的所有 swap 单元)被启动。屏蔽 swap.target 后,任何 swap 单元都无法再被激活,这是麒麟服务器操作系统上彻底关闭 swap 的有效方法。

4. 操作步骤

建议以 root 用户执行;操作前确认物理内存充足(关闭 swap 后无交换空间兜底)。

4.1 查看当前 swap 状态

swapon --show
free -h
systemctl list-unit-files | grep swap

确认 swap 设备名称(本文以 /dev/mapper/klas-swap 为例,实际以查询结果为准)。

4.2 备份并注释 /etc/fstab 中的 swap 行

cp /etc/fstab /etc/fstab.bak
vi /etc/fstab

将 swap 挂载行注释掉(行首加 #):

# /dev/mapper/klas-swap  none  swap  defaults  0  0

该行也可能写作 UUID=xxxx-xxxx-xxxx swap swap defaults 0 0 形式,同样注释即可。此步骤用于消除 fstab 来源,单独执行并不彻底,需配合 4.4。

4.3 立即关闭当前已启用的 swap

swapoff -a

或精确关闭指定设备:

swapoff /dev/mapper/klas-swap

执行后 free -h 的 Swap 行应变为 0。

4.4 关键步骤:屏蔽 swap.target

systemctl mask swap.target

如需双保险,可同时屏蔽具体的 swap 单元(注意用引号保留 \x2d 转义):

systemctl mask "dev-mapper-klas\x2dswap.swap"

屏蔽后再次查询,swap.target 的状态应显示为 masked

[root@192 ~]# systemctl list-unit-files | grep swap
dev-mapper-klas\x2dswap.swap                masked       -
swap.target                                 masked          disabled

4.5 重启并验证

reboot

5. 验证方法

重启后逐项确认:

# 1) 无任何 swap 设备输出
swapon --show

# 2) Swap 总量为 0
free -h

# 3) swap.target 状态为 masked
systemctl list-unit-files | grep swap

三项均符合预期(swapon --show 无输出、Swap total 为 0、swap.target 为 masked)即表示关闭成功。

6. 回退(恢复 swap)方法

如需恢复 swap,按相反顺序操作:

# 1) 解除屏蔽
systemctl unmask swap.target
systemctl unmask "dev-mapper-klas\x2dswap.swap"

# 2) 取消 /etc/fstab 中 swap 行的注释
vi /etc/fstab

# 3) 立即启用(或直接重启)
swapon -a
reboot

7. 注意事项与常见问题

问题 说明
为什么注释 fstab 不生效? swap 单元为 generated 状态,由 systemd 启动时动态生成并挂接到 swap.target,注释 fstab 只是移除了其中一个来源,必须 mask 才能彻底阻断。
systemctl disable dev-mapper-klas\x2dswap.swap 报错? generated 单元没有磁盘单元文件,disable 无效,属预期行为;请改用 systemctl mask。
masked 单元无法 start? mask 后单元被强制指向 /dev/null,任何启动尝试都会失败,这正是关闭 swap 的预期效果。
关闭 swap 的风险? 物理内存耗尽时进程会被 OOM Killer 直接杀死,无交换空间缓冲。请确保内存余量充足。
只是 mask 屏蔽 swap 单元而不注释 fstab? 如果没有注释 fstab 文件中对于 swap 分区的挂载,只是使用 systemctl 屏蔽了所有 swap 单元,swap 分区仍可用 swapon 打开;注释 fstab 文件的同时使用 systemctl 屏蔽所有 swap 单元,swapon 命令将不会再拉起 swap 分区。

文档适用环境:银河麒麟高级服务器操作系统。操作前请做好备份,生产环境建议先在测试机验证。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐