
openEuler 22.03/24.03 系统 swap 分区永久关闭3种方法对比与实战排错在 openEuler 系统的日常运维中swap 分区的管理是一个看似简单却暗藏玄机的操作。特别是对于 22.03 和 24.03 版本许多管理员发现仅仅注释掉 /etc/fstab 中的 swap 条目后重启系统后 swap 分区依然会自动挂载。这种现象背后隐藏着 openEuler 系统特有的初始化机制需要我们从多个层面深入理解才能彻底解决。1. 为什么 openEuler 需要特殊处理 swap 关闭在传统的 Linux 发行版中关闭 swap 分区通常只需要两个步骤执行swapoff -a命令立即关闭所有 swap 分区注释或删除 /etc/fstab 中对应的 swap 挂载条目然而在 openEuler 系统中特别是 22.03 和 24.03 版本这种常规方法往往会失效。其根本原因在于 openEuler 的系统初始化流程中swap 的激活可能发生在多个阶段initramfs 阶段某些 openEuler 版本会在 initramfs 阶段预先激活 swapsystemd 服务systemd-swap 服务可能独立于 fstab 管理 swap内核参数内核启动参数可能包含 resumeUUID 设置以下是一个典型的失败案例检查流程# 检查当前 swap 状态 free -h # 输出显示 swap 仍在使用中 # 检查 fstab 是否已注释 grep swap /etc/fstab # 确认 swap 行已被注释 # 检查 systemd 相关服务 systemctl list-units | grep swap # 可能发现 active 的 swap 服务 # 检查内核参数 cat /proc/cmdline # 可能发现 resume 参数指向 swap 分区2. 方法一通过 rc.local 实现关闭传统方案这是最直接但也最暴力的解决方案适合需要快速解决问题且系统较为简单的场景。操作步骤确保 /etc/rc.local 文件存在且可执行touch /etc/rc.local chmod x /etc/rc.local编辑 /etc/rc.local 文件在exit 0前添加/sbin/swapoff -a启用 rc-local 服务systemctl enable rc-local systemctl start rc-local优缺点对比优点缺点实现简单直接属于补丁式解决方案不依赖特定初始化系统可能与其他初始化流程冲突适用于各种 openEuler 版本不是最优雅的 systemd 集成方式提示在 openEuler 24.03 中可能需要先创建 /etc/rc.d/rc.local 的软链接到 /etc/rc.local3. 方法二通过 systemd 服务配置推荐方案这是更符合现代 Linux 系统管理理念的方案特别适合使用 systemd 的 openEuler 系统。完整配置流程创建自定义 swap 服务单元文件cat /etc/systemd/system/disable-swap.service EOF [Unit] DescriptionDisable all swap devices Aftersystemd-remount-fs.service Beforesysinit.target [Service] Typeoneshot ExecStart/sbin/swapoff -a RemainAfterExityes [Install] WantedBybasic.target EOF重新加载 systemd 配置并启用服务systemctl daemon-reload systemctl enable disable-swap.service systemctl start disable-swap.service屏蔽默认的 swap 激活服务systemctl mask dev-sdX.swap # 替换 sdX 为实际的 swap 设备关键原理说明Aftersystemd-remount-fs.service确保在文件系统挂载后执行Beforesysinit.target确保在系统初始化早期阶段运行RemainAfterExityes使服务状态持续生效验证服务状态systemctl status disable-swap.service # 应显示 active (exited)4. 方法三通过内核参数彻底禁用最彻底方案这是最底层的解决方案直接从内核启动参数入手适合需要完全禁用 swap 的生产环境。配置步骤首先确定当前 swap 设备的 UUIDblkid | grep swap编辑 /etc/default/grub 文件在 GRUB_CMDLINE_LINUX 参数中添加noswap resume noresume重新生成 grub 配置grub2-mkconfig -o /boot/grub2/grub.cfg # 对于 UEFI 系统 grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg同步更新 dracut 配置echo omit_dracutmodules resume /etc/dracut.conf.d/omit-resume.conf dracut -f各参数作用解析参数作用noswap完全禁用 swap 功能resume清空休眠恢复设备设置noresume禁止系统尝试从休眠恢复方案对比表方案持久性复杂度适用范围系统影响rc.local高低所有版本可能启动顺序问题systemd 服务高中22.03符合 systemd 规范内核参数最高高生产环境彻底禁用 swap 功能5. 实战排错指南即使按照上述方法操作在实际环境中仍可能遇到各种意外情况。以下是几种常见问题及解决方法问题1重启后 swap 仍然自动激活检查流程# 检查所有可能的 swap 激活途径 journalctl -b | grep swap ls -l /etc/systemd/system/*.swap dmesg | grep swap解决方案# 彻底清除所有 swap 相关配置 systemctl list-units --all | grep swap | awk {print $1} | xargs -n1 systemctl mask问题2系统日志报错无法挂载 swap典型错误Failed to activate swap /dev/sda2解决方法# 清除 swap 签名 wipefs -a /dev/sda2 # 更新 initramfs dracut -f问题3性能监控与验证验证 swap 是否真正关闭# 实时监控 swap 活动 watch -n1 cat /proc/meminfo | grep Swap建立长期监控# 创建定期检查脚本 cat /usr/local/bin/check_swap.sh EOF #!/bin/bash SWAP_USED$(free | awk /Swap/{print $3}) [ $SWAP_USED -eq 0 ] || { echo 警告检测到 swap 使用 exit 1 } EOF chmod x /usr/local/bin/check_swap.sh6. 深入理解为什么 openEuler 对 swap 处理不同openEuler 作为企业级操作系统在 swap 管理上有其特殊设计考量安全性增强默认配置更倾向于保持 swap 可用防止内存耗尽导致系统崩溃企业级特性支持内存热插拔等高级功能需要 swap 作为缓冲兼容性考虑需要兼顾传统服务器和云原生两种场景从技术实现角度看openEuler 的 swap 管理涉及多个组件协同--------------------- | 内核参数 | | (resume, noswap) | -------------------- | ----------v---------- | initramfs | | (早期用户空间) | -------------------- | ----------v---------- | systemd | | (systemd-swap服务) | -------------------- | ----------v---------- | /etc/fstab | | (传统挂载点) | ---------------------这种多层设计虽然增加了复杂性但也提供了更灵活的配置空间。理解这个架构才能在各种场景下游刃有余地管理 swap。