Fedora 桌面休眠修复记录
本文记录在 Fedora KDE 系统上修复休眠(Hibernate)功能的完整过程。问题是系统能够进入休眠,但会立即被唤醒,或者休眠后无法恢复桌面内容。通过排查 ACPI 唤醒设备、修复内核版本不一致、配置 resume 参数等问题,最终实现了稳定的休眠功能。

问题现象
一开始 Fedora KDE 的休眠有问题:
- 电脑能"睡下去",风扇停转
- 但几秒钟后又自动启动
- 恢复后桌面内容都还在(说明休眠成功)
- 但被某个设备或事件立刻唤醒
我想要的功能是:像 Windows 一样能彻底 Hibernate(休眠到磁盘),关机后再开机直接恢复所有工作状态。
一、确认系统支持休眠
首先检查系统是否支持休眠功能:
# 检查系统支持的电源状态
cat /sys/power/state
输出:
freeze mem disk
说明系统支持 "suspend-to-disk"(休眠到磁盘)。
检查 swap 分区
# 查看 swap 分区信息
cat /proc/swaps
显示 /dev/nvme0n1p1,容量 64G,没问题。
检查 resume 参数
# 查看 GRUB 配置中的 resume 参数
cat /etc/default/grub | grep resume
一开始的配置是:
resume=UUID=244ef438-43ef-4383-b98e-4517aa48c984
UUID 也和 swap 一致。
一切看上去正常,但休眠后仍自动重启。
二、禁用自动唤醒设备
检查 ACPI 唤醒源
查出所有可能唤醒系统的设备:
# 查看 ACPI 唤醒设备列表
cat /proc/acpi/wakeup
输出中有 XHC、GPP、GP17 等一堆 enabled 状态的设备。
批量禁用唤醒设备
# 禁用所有唤醒设备(保留电源按钮)
for dev in $(awk '/enabled/ {print $1}' /proc/acpi/wakeup | grep -v PBTN); do
echo $dev | sudo tee /proc/acpi/wakeup
done
这会禁用所有可能导致意外唤醒的设备(但保留电源按钮功能)。
配置休眠模式
创建或编辑 /etc/systemd/sleep.conf:
sudo nano /etc/systemd/sleep.conf
添加以下配置:
[Sleep]
HibernateMode=shutdown
HibernateState=disk
这两步让系统"休眠后彻底断电",终于不再自动唤醒。
但新的问题出现了——开机后不再恢复内容,而是重新启动。
三、分析日志
查看上次启动的日志:
# 查看上次启动的电源管理日志
journalctl -b -1 | grep PM:
输出出现:
PM: Image mismatch: architecture specific data
PM: hibernation: resume failed (-1)
说明 Fedora 找到了休眠镜像,但因"架构数据不匹配"拒绝恢复。
分析: 大概率是我休眠时用的旧内核版本,恢复时换成了新内核,导致休眠镜像和当前内核版本不匹配。
四、确认内核版本
# 查看当前内核版本
uname -r
输出:
6.17.5-300.fc43.x86_64
检查系统中安装的所有内核:
# 列出所有已安装的内核
sudo rpm -qa | grep kernel-core
结果:
kernel-core-6.17.1
kernel-core-6.17.5
确认问题: 休眠镜像是旧内核(6.17.1)写的,新内核(6.17.5)恢复时校验失败。
五、彻底清理旧内核与 swap
执行清理和重建:
# 1. 删除旧内核
sudo dnf remove kernel-core-6.17.1-300.fc43.x86_64
# 2. 关闭 swap
sudo swapoff /dev/nvme0n1p1
# 3. 重新格式化 swap(清除旧的休眠镜像)
sudo mkswap /dev/nvme0n1p1
# 4. 重新启用 swap
sudo swapon /dev/nvme0n1p1
# 5. 重新生成 initramfs(包含所有内核版本)
sudo dracut -f --regenerate-all
# 6. 重新生成 GRUB 配置
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
这一步的作用: - 重新格式化 swap(旧的休眠镜像全清) - dracut 重新生成 initramfs - grub 重新生成配置
此时系统能正常启动,但新的问题是 resume 参数丢失。
六、resume 参数未加载
检查启动参数:
# 查看当前内核启动参数
cat /proc/cmdline
发现只有:
rhgb quiet
没有 resume 参数。
而 /etc/default/grub 里明明写着 resume=UUID=...。
原因: Fedora 43 默认使用 BLS(Boot Loader Specification),有时不从 /etc/default/grub 读取参数。
于是我手动注入 resume 参数到 initramfs。
七、在 dracut 中写入 resume 参数
创建 dracut 配置文件
# 创建配置文件
sudo nano /etc/dracut.conf.d/99-resume.conf
写入以下内容:
add_dracutmodules+=" resume "
kernel_cmdline+=" resume=UUID=cd83fba8-cab7-4a40-8ece-a20d5a563ae2 "
注意:
- 将 UUID 替换为你的实际 swap 分区 UUID
- 可以通过 blkid /dev/nvme0n1p1 查看 swap 的 UUID
重新生成 initramfs
sudo dracut -f --regenerate-all
这一步会在 initramfs 里直接写入 resume 参数,不再依赖 grub。
验证参数加载
重启后再检查:
cat /proc/cmdline
结果终于出现:
... rhgb quiet resume=UUID=cd83fba8-cab7-4a40-8ece-a20d5a563ae2
这表示系统启动时已经加载了 resume 参数。
八、验证休眠恢复
测试休眠功能:
# 执行休眠
sudo systemctl hibernate
结果: - 电脑彻底关机(风扇停转,电源灯熄灭) - 按电源键启动 - 直接回到原桌面 - 浏览器、终端、窗口全部恢复
查看日志确认:
journalctl -b -1 | grep PM:
出现:
PM: Image signature found, resuming
PM: Image restored successfully
完美!
最终结果
Fedora 休眠功能完全修复:
- ✅ 能正确进入 hibernate(休眠到磁盘)
- ✅ 能彻底断电(不再自动唤醒)
- ✅ 开机能恢复所有程序(窗口、状态都保留)
- ✅ 不再假唤醒、不再重新登录
总结关键命令(可复用)
1. 确认支持休眠
# 检查支持的电源状态
cat /sys/power/state
# 查看 swap 分区
cat /proc/swaps
2. 禁用唤醒源
# 查看唤醒设备
cat /proc/acpi/wakeup
# 批量禁用(保留电源按钮)
for dev in $(awk '/enabled/ {print $1}' /proc/acpi/wakeup | grep -v PBTN); do
echo $dev | sudo tee /proc/acpi/wakeup
done
3. 设置休眠模式
# 编辑休眠配置
sudo nano /etc/systemd/sleep.conf
添加:
[Sleep]
HibernateMode=shutdown
HibernateState=disk
4. 清空 swap、重建
# 获取 swap 设备路径(如 /dev/nvme0n1p1)
cat /proc/swaps
# 关闭、格式化、重新启用 swap
sudo swapoff /dev/nvme0n1p1
sudo mkswap /dev/nvme0n1p1
sudo swapon /dev/nvme0n1p1
5. dracut + grub 重建
# 重新生成 initramfs
sudo dracut -f --regenerate-all
# 重新生成 GRUB 配置
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
6. 写入 resume 参数
# 获取 swap UUID
blkid /dev/nvme0n1p1
# 创建 dracut 配置
sudo nano /etc/dracut.conf.d/99-resume.conf
内容:
add_dracutmodules+=" resume "
kernel_cmdline+=" resume=UUID=<你的 swap UUID> "
重新生成:
sudo dracut -f --regenerate-all
7. 验证
# 检查启动参数
cat /proc/cmdline
# 测试休眠
sudo systemctl hibernate
# 查看日志
journalctl -b -1 | grep PM:
备注
这个修复过程其实踩了 Fedora 的三个典型坑:
- BIOS/ACPI 唤醒导致"假休眠"
- 某些 USB 设备、网络设备可能唤醒系统
-
解决:禁用不必要的唤醒设备
-
内核版本不一致导致镜像签名不匹配
- 旧内核创建的休眠镜像,新内核无法恢复
-
解决:删除旧内核,清理 swap,确保内核版本一致
-
BLS 配置导致 resume 参数丢失
- Fedora 43 使用 BLS,可能不从
/etc/default/grub读取参数 - 解决:在 dracut 配置中直接写入 resume 参数
解决完这三点之后,Fedora 的休眠就变得稳定可靠。
现在这台机器终于能像 macOS 一样按下休眠后——风扇停、电源灭、再开机直接回到原工作状态。