Fedora 桌面休眠修复记录


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

image-20250802130104740

问题现象

一开始 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 的三个典型坑:

  1. BIOS/ACPI 唤醒导致"假休眠"
  2. 某些 USB 设备、网络设备可能唤醒系统
  3. 解决:禁用不必要的唤醒设备

  4. 内核版本不一致导致镜像签名不匹配

  5. 旧内核创建的休眠镜像,新内核无法恢复
  6. 解决:删除旧内核,清理 swap,确保内核版本一致

  7. BLS 配置导致 resume 参数丢失

  8. Fedora 43 使用 BLS,可能不从 /etc/default/grub 读取参数
  9. 解决:在 dracut 配置中直接写入 resume 参数

解决完这三点之后,Fedora 的休眠就变得稳定可靠。

现在这台机器终于能像 macOS 一样按下休眠后——风扇停、电源灭、再开机直接回到原工作状态。