SDB:休眠到磁盘

跳转到:导航搜索
Icon-obsolete.png
本文或章节指的是版本 '11.3',现在已经过时!
请参阅本文的讨论页面以获取更多信息。
本文涵盖 s2disk,即用户空间挂起系统

在 openSUSE 上测试

推荐文章


背景

有两种方法可以进行挂起至磁盘

  • “旧”内核空间方法,基本上是将“disk”回显到/sys/power/state
  • “新”用户空间方法,由以下命令处理s2diskresume这些命令是“suspend”软件包的一部分。

本文重点介绍用户空间方法。


技术信息

s2disk 程序为了挂起机器,会执行以下操作

  • 告诉内核创建当前系统状态的快照
  • 从内核读取快照数据并将其写入磁盘
  • 关闭机器

resume 程序基本上执行相同的操作,但顺序相反

  • 在基本的系统启动后,在(!)挂载任何分区之前,resume 会从 initrd 运行
  • 它从磁盘读取快照数据并将其写入内核
  • 它告诉内核恢复快照
  • 内核返回到挂起之前的状态

上述工作流程中的某些内容被简化了(“创建快照”涉及相当多的魔术,并且“从磁盘读取/写入磁盘”实际上可能涉及转换,例如压缩和加密。


使用 s2disk

在 openSUSE 版本中,除非您确切知道自己在做什么,否则不建议直接调用 s2disk,仅用于调试目的。作为普通用户,只需单击 kpowersave 或 gnome-power-manager 中的“挂起至磁盘”或“休眠”,或使用powersave命令行工具。较低级别的挂起处理由 SDB:Pm-utils 处理,如果您需要调试内容,可以调用pm-hibernate以 root 身份从 shell 运行以调用 s2disk。这将检查一些先决条件并在/var/lib/s2disk.conf中创建一个配置文件,然后使用此配置文件调用 s2disk。如果pm-hibernate没有挂起您的机器,但似乎什么也没做,请查看/var/log/pm-suspend.log并检查是否有指示挂起准备期间出现问题(未找到交换分区?)或来自 s2disk 的错误消息。


配置

Pm-utils 的 pm-hibernate 创建/var/lib/s2disk.conf从自动检测到的内容(例如恢复设备和镜像大小)然后添加在/etc/suspend.conf中配置的参数,因此您可以始终覆盖自动检测。注意:更改 suspend.conf 中的内容可能会导致挂起失败,因此请小心。suspend.conf 文件已注释,因此阅读注释可能已经让您了解了如何使用它。

启动画面

挂起和恢复期间的启动画面看起来不错。但是,如果您看不到正在发生什么,则很难调试故障。添加

splash = n

/etc/suspend.conf以禁用挂起期间的启动画面。在恢复期间,启动画面使用遵循全局系统设置,因此请在 grub 配置中设置“splash=verbose”,或在早期启动期间按 Esc 键以禁用恢复期间的启动画面。

压缩

由于在大多数半现代 CPU 上压缩镜像始终是一种优势,至少可以缩短加载时间,因此默认情况下启用压缩。如果您想禁用压缩以进行测试或怀疑存在问题,则添加

compress = n

/etc/suspend.conf.

加密

加密功能允许加密写入交换分区的数据,以便没有人可以在不输入密码的情况下恢复机器。要设置加密,首先需要创建公钥

root@stoetzler:~# suspend-keygen
libgcrypt version: 1.4.0
Key bits (between 1024 and 4096 inclusive) [1024]:
Generating 1024-bit RSA keys.  Please wait.
Testing the private key.  Please wait.
Passphrase please (must be non-empty):
Confirm passphrase:
File name [suspend.key]:
root@stoetzler:~# cp suspend.key /etc/suspend.key

不要忘记密码 ;),然后将以下内容添加到/etc/suspend.conf:

encrypt = y

注意:目前(2008-06),initrd 中未加载任何键盘映射,因此在恢复期间您将拥有美国键盘。请确保您知道如何在美式键盘上输入密码!

关机方法

将镜像写入磁盘后,有两种方法可以关闭机器

  • 通过 ACPI BIOS(称为“平台模式”)
  • 普通关机(就像系统关机一样)

通常建议通过 ACPI BIOS 走(在某些机器上这是必要的,否则在恢复后系统的各个部分可能会发生故障,例如热管理)。有些机器对此存在问题,例如在关机后立即启动。可以使用

shutdown method = shutdown

选择模式。有三种方法可供选择:“platform”、“shutdown”和“reboot”,后者仅用于调试:机器重新启动并立即恢复。

休眠后启动另一个操作系统(解决方法)

默认情况下,在恢复时您不会看到 GRUB 菜单中的任何选择,而是直接开始恢复挂起系统。这是为了保护您的数据免受可能的人为错误(您的系统内存保存在交换分区上,如果在恢复之前重用此分区,您将丢失所有数据)。另一个重要一点:休眠过程不关心任何已挂载的分区!所有已挂载的分区将保持挂载状态!因此,如果您在另一个操作系统中重用+修改其中一个分区,您可能会完全破坏其数据……

但是,如果您像我一样,每年/每月/每周需要加载一次 Windoze,那么在 20 分钟后重新启动所有应用程序会很痛苦……

因此,这里有一个解决方法,可以在开机时恢复 GRUB 菜单。

休眠过程在挂起之前会以一种方式更新您的 GRUB 设置,即在您开机时直接进入恢复,而不是让您有任何其他选择……

解决方法:只需禁用此最后一步(让 GRUB 保持原样)。(与其按照以下描述编辑 '99Zgrub' 文件,不如备份然后删除此文件。)

您需要以 'root' 用户身份打开

/usr/lib/pm-utils/sleep.d/99Zgrub

文件,转到文件的末尾,并在 'prepare-grub' 和 'grub-once-restore' 前面加上注释。

在 openSUSE 中,您会看到

###### main()

if [ "$1" = hibernate ] || [ "$1" = suspend -a "$2" = suspend_hybrid ]; then
                prepare-grub
fi
if [ "$1" = thaw ] || [ "$1" = resume -a "$2" = suspend_hybrid ]; then
                grub-once-restore
fi

只需注释掉 'prepare-grub' 和 'grub-once-restore',例如

###### main()

case $1 in
        hibernate)
###                prepare-grub
                ;;
        thaw)
###                grub-once-restore
                ;;
esac

卸载所有“外部”分区!
然后挂起至磁盘并享受吧 :-)

调试

如果您想在恢复后查看一些统计信息(例如,比较各种选项组合的读取/写入速度),您可以指示resume在加载镜像后等待几秒钟,然后再恢复快照。将以下内容添加到/etc/suspend.conf:

resume pause = 10

等待 10 秒。您应该禁用恢复期间的启动画面(在 grub 配置中),否则您将无法看到数字。可以通过按“Enter”键中止等待。


某些文件系统上的问题

如果 grub 位于 reiserfs 分区上,则恢复速度非常慢,请参阅 Bug #538795。看起来 grub 必须在内存中重放日志,然后才能加载内核和 initrd,这需要一些时间。显而易见的解决方法是创建一个单独的 /boot 分区,将其格式化为 ext2,并将 grub 移动到该分区(当然,还有 /boot/* 的其余部分)

可能其他日志文件系统(例如 ext3 或 xfs)也存在此问题。有人可以尝试一下并报告 ;-)


较旧的 ThinkPad 笔记本上的问题

据报道,某些较旧的 ThinkPad 笔记本在恢复期间会冻结。根据 Bug #450256,这会影响至少一些型号,例如 X31 或 T41,并且与称为ACPI 硬件签名的功能有关,该功能已添加到最近的内核中。根据讨论,问题是由 BIOS 中的错误引起的。有两种方法可以克服此问题


虚拟机中的问题

挂起至磁盘配置为使用磁盘的路径 ID 而不是 UUID。如果更改了根磁盘驱动器类型(虚拟机)或其他硬件更改(添加/更改 PCI-E 控制器),这可能会导致系统无法启动。这是因为交换分区是通过其驱动器路径而不是 UUID 定义的。

这将在启动期间无限期地挂起,并显示与搜索磁盘设备相关的信息。

要解决此问题,您可以在启动期间通过编辑 grub 菜单条目来启动系统

noresume

要永久解决此问题,您需要编辑 /etc/default/grub

hint: on transactional server or kubic you need to first run
# transactional-update shell

# vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0,115200 resume=/dev/disk/by-path/pci-0000:00:07.0-part3 splash=silent quiet showopts"

您可以删除“resume=...”或使用正确的系统交换分区位置(推荐使用 /dev/disk/by-uuid)对其进行更改。

编辑后,您必须运行

# grub2-mkconfig

hint:  if you are on transactional server, after running this now you need to reboot.

待办事项

目前,pm-utils 设置和我们的 initrd 代码不允许挂起至/从交换文件,仅允许挂起至交换分区。需要实现并记录这一点。


参见


外部链接