休眠恢复在 linux 内核 4.9.0、Debian 9 上失败

Eng*_*r77 10 debian hibernate initramfs fstab linux-kernel

我最近将内核从 3.16.4 (Debian jessie) 升级到 4.9.0 (Debian stretch)。一切都很好,直到我尝试“休眠”(暂停到磁盘)。

当我在 LXDE 中使用 Hibernate 选项时,它似乎处于休眠状态。我能听到磁盘主轴滴答作响和写入数据的声音。但是从休眠状态恢复时就会出现问题。内核成功地从交换中恢复了映像,但随后冻结并重新启动,所有这些工作都丢失了。我在互联网上的任何地方都找不到答案。人们只是在解决一些关于未设置 /etc/initramfs-tools/conf.d/resume 或设置内核参数或在 /etc/fstab 中输入错误的错误。我有这些正确的。更正 /etc/initramfs-tools/conf.d/resume 中的 UUID,更正 fstab 并且不设置 resume kernel 参数。

  • 我将扩展分区之外的交换分区移动到主分区。UUID 已保存并应用于新的交换。

  • 系统到达“正在恢复映像 100%”,然后到达“暂停控制台”,然后它会断电并正常启动,所有工作都丢失了。

  • 尝试干净安装,但没有运气。

  • 仅在 i386(32 位 x86)上发生,amd64(64 位 x86)不会受到影响。

磁盘分区表布局:

NAME   FSTYPE LABEL    UUID                                 MOUNTPOINT
sda                                                         
??sda1 ext4   HDD      <ROOT-UUID> /
??sda2 swap   HDD-SWAP <SW-UUID> [SWAP]
sr0
Run Code Online (Sandbox Code Playgroud)

sda2 在升级之前是合乎逻辑的(resides-inside-extended)。

表:

UUID=<ROOT-UUID> / ext4 errors=remount-ro 0 1
UUID=<SW-UUID> none swap sw 0 0
Run Code Online (Sandbox Code Playgroud)

/etc/initramfs-tools/conf.d/resume

RESUME=UUID=<SW-UUID>
Run Code Online (Sandbox Code Playgroud)

内核命令行

BOOT_IMAGE=/boot/vmlinuz-4.9.0-3-686-pae root=UUID=<ROOT-UUID> ro quiet
Run Code Online (Sandbox Code Playgroud)

系统信息:

Computer: Compaq CQ60-120ec
Swap Size: 3.5GiB
Processor: AMD Athlon X2 64 QL-66
GPU: Nvidia Geforce 8200M G
Memory: 2G DDR2 667MHz
Desktop Environment: LXDE
Debian Version: 9 (stretch)
Kernel version: 4.9.0-3
Graphics Driver: nvidia legacy 304xxx
Run Code Online (Sandbox Code Playgroud)

(我知道处理器是 64 位的,但它最初带有 32 位操作系统,所以我认为它是 32 位,直到我检查了 /proc/cpuinfo)

And*_*ndi 6

该问题是由于x86-32上的hibernate 和kASLR之间的冲突造成的。这可以通过使用nokaslr内核引导选项禁用 kASLR 来解决。x86-64不受影响。

对于 Grub,这可以通过编辑 /etc/default/grub 并将nokaslr添加到引导选项来完成,例如: GRUB_CMDLINE_LINUX_DEFAULT="quiet nokaslr "

然后运行update-grub来更新配置并重新启动以尝试一下。


我遇到了完全相同的问题,似乎只有 PAE 内核受到该问题的影响。没有 PAE 的相同内核可以正常工作。

我的解决方法是安装 linux-image-686 并卸载 linux-image-686-pae 和 linux-image-4.9.0-4-686-pae。由于升级,确切的内核版本可能会随着时间的推移而改变,但基本上当前运行的 PAE 内核需要替换为没有 PAE 的内核。

它实际上与 CPU 的 PAE 支持无关,因为我的 CPU 根据 /proc/cpuinfo 支持 PAE。但无论如何,PAE 在旧笔记本上用处不大。

它也与内核 4.9 PAE 无关,因为同样的问题发生在来自 Debian backports 的内核 4.13 PAE。