SDB:休眠到磁盘
请参阅本文的页面以获取更多信息。
背景
有两种方法可以进行挂起至磁盘
- “旧”内核空间方法,基本上是将“disk”回显到/sys/power/state
- “新”用户空间方法,由以下命令处理s2disk和resume这些命令是“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 中的错误引起的。有两种方法可以克服此问题
- 将 BIOS 更新到较新版本.
- 通过添加acpi_sleep=s4_nohwsig作为内核参数来关闭硬件签名。
虚拟机中的问题
挂起至磁盘配置为使用磁盘的路径 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 代码不允许挂起至/从交换文件,仅允许挂起至交换分区。需要实现并记录这一点。
参见
外部链接
- Linux 挂起项目 在 Sourceforge 上