如何使 GRUB 在双启动 PC 中从休眠状态恢复

Spa*_*der 6 grub dual-boot hibernate

我有一台运行两种不同的基于 GNU/Linux 的操作系统的笔记本电脑。每个操作系统都有其专用的根分区和主分区,但共享引导和交换分区。它们都工作得很好,除了一个问题:每当我休眠机器并启动时,比如说第二天,我忘记了我休眠了 X 操作系统,我最终弄乱了 FS 日志。现在,我意识到通过共享交换空间,这是一个可能的副作用,但是,我的印象是,一旦我休眠,GRUB 会检测到交换空间正在使用中,并启动进入休眠的操作系统。对我来说情况并非如此,因为我不得不编写一个变通解决方案:

编辑 /etc/default/grub:

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
Run Code Online (Sandbox Code Playgroud)

运行 grub-mkconfig,然后编写一个脚本,在休眠时将 /boot/grub/grub.cfg 的超时从任何更改为 0 (/etc/pm/sleep.d/10-hibernate-script.sh):

#!/bin/sh

 case "$1" in
    hibernate)
    cat /boot/grub/grub.cfg | sed 's/timeout=10/timeout=0/g' > /boot/grub/grub.cfg~
    mv /boot/grub/grub.cfg~ /boot/grub/grub.cfg
    ;;
    thaw)
        cat /boot/grub/grub.cfg | sed 's/timeout=0/timeout=10/g' > /boot/grub/grub.cfg~
        mv /boot/grub/grub.cfg~ /boot/grub/grub.cfg
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

是否有更“本机”的方式来做到这一点,或者这是实现这一目标的最佳方式?

Pet*_*des 1

由于它们都是 Linux,也许您可​​以进行一些设置,以便任一操作系统都可以从任一操作系统保存的映像中恢复?如果休眠映像包含所有内核内存(包括代码),那么哪个内核从中恢复并不重要。我不确定这是如何运作的。

另外,也许如果您的笔记本电脑有 ACPI 休眠支持,Linux 就可以以这种方式休眠。那么希望它总是在开机时恢复,而不是引导到 GRUB?再次,不确定事情是如何运作的。

如果交换分区中有恢复映像,您可能可以将操作系统设置为不使用交换分区。如果它们都以读写方式挂载任何相同的非交换分区,这将无济于事。也许有一个挂载选项可以拒绝日志重播(这会扰乱休眠状态)。


如果这些事情都没有成功,我认为你的解决方案是你能得到的最好的解决方案。我认为 grub 不知道如何查看交换分区并确定它是否正在使用。如果可以,那么也许您可以在 grub 配置中添加一些逻辑,只允许启动 SAVEDEFAULT 条目。(如果不使用 SAVEDEFAULT,grub 不太可能找出哪个操作系统具有休眠映像。)

参考:

  • 当您从休眠状态恢复时,内核的代码将被启动,它会从休眠映像加载一些数据,但不会加载代码。恢复不同安装的内核的唯一方法是它们使用相同的内核(如相同的“vmlinuz”二进制文件)。 (3认同)
  • 确实,升级内核后无法休眠。这有点困难。我认为主要发行版会避免删除当前正在运行的内核(至少 Ubuntu 的内核清除自动化会保留最新的内核和正在运行的内核),因此内核将保留下来,但引导加载程序菜单可能会默认提供最新的内核,这将无法恢复。 (2认同)