关于电源管理:待机(Suspend,STR,挂起)/休眠(Hibernation,STD)问题的再讨

2019-07-14 01:59发布

  关于电源管理(Power Management)中挂起和休眠方面论坛上有一些帖子了,不过对于挂起和休眠的实现好像还不是非常的清晰,主要是各个机型的差异较大,尤其是使用笔记本电脑(laptop, notebook)的朋友在这方面的问题比较多。我在这里写一些讨论,很多问题还没有解决,希望能够抛砖引玉。

  首先我解释一下这里所说的挂起和休眠的含义,有的帖子中这些概念经常和屏幕保护中的“挂起”搞混淆了:

  待机

  计算机将目前的运行状态等数据存放在内存,关闭硬盘、外设等设备,进入等待状态。此时内存仍然需要电力维持其数据,但整机耗电很少。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。一般笔记本在电池无故障且充满的情况下可以支持这种挂起数小时甚至数天(依具体机型有差别)。

  其他名称:Suspend, STR(Suspend To RAM), 挂起, 挂起到内存

  休眠

  计算机将目前的运行状态等数据存放在硬盘上某个文件或者某个特定的区域,关闭硬盘、外设等设备,进入关机状态。此时计算机完全关闭,不耗电。恢复时计算机从休眠文件/分区中读出数据,回到休眠前的状态,恢复速度较慢。但由于这种方法完全耗电又能保存工作状态,往往被笔记本用户用来作为关机的替代方式。

  其他名称:Hibernation, STD(Suspend To Disk), 挂起到硬盘, 休眠到硬盘

  下文统称上述两者为挂起。

  目前各个型号的笔记本电脑都提供了休眠和挂起功能,挂起和休眠首先需要BIOS对其提供支持,其次一般也需要操作系统提供支持(有例外,后详)。笔记本电脑往往在键盘上提供这两种挂起方式的快捷键,如 Fn+F4 为STR,Fn+F12 为STD。

  -------------------------------

  在 STR 方面,各机型和操作系统较为相近; 在 STD 方面一般有下面两种方式:

  一种是直接通过 BIOS 和独立于操作系统的专门程序加以管理,例如 IBM 的很多 ThinkPad 机型,配合 IBM 提供的一种休眠管理软件 PS2 来实现,我的 ThinkPad X21 机器买来的时候就是默认安装有这种管理程序的。它和操作系统无关,直接和 BIOS 通讯来实现休眠,其方法是在硬盘上建立一个于内存大小相当的特殊隐藏分区,将休眠时的数据直接写在这个分区中。进入休眠时可以看到 IBM 的 LOGO 和提示。优点是休眠和恢复都比较快,缺点一是需要占用专门的硬盘空间,二是如果装有多个操作系统,恢复时没有操作系统的选择,必须进入休眠之前的哪一个操作系统。

  关于这种方式的详细使用可以参考 BTWorm 的回贴:

  http://www.linuxsir.com/bbs/showthr...5%C4#post157551

  另一种方式是操作系统来的电源管理程序来管理的,使用 Microsoft Windows ME / 2000 / XP 的用户可能注意到在关机菜单中有一种关闭方式就是休眠,以 Windows XP 为例,如果在电源管理中打开了休眠支持,Windows 将会在引导分区(还是系统盘分区?不记得了,因为我的都是在 C: )建立一个 hiberfil.sys 的文件,大小与内存容量相同。休眠时数据将写入这个文件,同时屏幕上会出现 Windows XP 的 LOGO(如果你没有修改系统文件的话)同时有一个 Windows 的进度条指示正在写入休眠文件。这个过程大约持续十几秒,然后进入休眠状态。恢复时比较灵活,由于是操作系统管理休眠文件,所以启动操作系统之前仍然会出现引导管理程序,例如我的 Grub,此时如果可以不选择休眠之前的操作系统,而进入另一个操作系统工作。此外,如果选择 Windows,那么它引导时会找到这个休眠文件,如果按 F8 还有机会选择是需要恢复还是删除恢复数据进入系统。第二种方式可能会比第一种进入休眠稍慢,而且可能操作系统的支持需要单独配置。但是其好处也是显而易见的,它不需要占用专门的硬盘分区,而且启动的时候有选择操作系统的机会。

  --------------------------------

  现在再来看看 Linux 下对这两种 STD 方式的支持:

  对于第一种 STD 方式,不需要配置 Linux,因为管理程序和分区都与操作系统无关,只要正确安装管理程序和在 BIOS 里进行设置即可。

  对于第二种 STD 方式,首先需要 Linux 的内核支持,有 APM 和 ACPI 两种方式,只可选其一。APM 老一些但也成熟一些,ACPI新一些,支持一些新功能,但也有人对其成熟性持怀疑态度。需要注意的是,如果自己编译内核要加入 ACPI 模块,必须将 Code maturity level options 中的 Prompt for development and/or incomplete code/drivers 打开,否则 ACPI 无效。很多较新的发行版已经在内核里面加入了 ACPI 支持,如我的 Mandrake Linux 9.1 默认安装是内核支持 ACPI 的,并且默认打开了 acpid 服务。

  关于这方面的帖子,我在论坛找到的主要有下面这几个:

  http://www.linuxsir.com/bbs/showthr...;threadid=28919

  http://www.linuxsir.com/bbs/showthr...;threadid=37331

  http://www.linuxsir.com/bbs/showthr...;threadid=36801

  http://www.linuxsir.com/bbs/showthr...;threadid=30892

  我要补充的一点是,Linux 也是可以实现操作系统管理的 STD 的,请看我的试验:

  我发现在 Mandrake 9.1 CD1 上有这个包:suspend-scripts-1.4-1mdk.noarch.rpm,其中有个脚本:/usr/sbin/pmsuspend。我用 root 登录执行它,提示说需要给内核传递参数 resume=/dev/hda9,那个 /dev/hda9 正是我的 swap 分区。我明白了,它是将休眠文件直接写到 swap 分区中的。于是我修改 Grub 的启动菜单 /boot/grub/menu.lst,在启动内核的参数后面加上了 resume=/dev/hda9。保存重启(这个参数就生效了)。

  我从普通用户登录系统,运行了一些程序,开了一些窗口,然后用 root 直接等录到另一个虚拟控制台(从普通用户 su 到 root 不行,我试了),执行 pmsuspend。屏幕上出现了文本:Suspend To Disk,底下还有一个文本进度条。进度条走满之后系统就切断了电源。我重新打开机器,果然又出现了 Grub 菜单,然后我选择休眠之前的那个 Mandrake 9.1,屏幕上又出现 Resume From Disk,下面还是那个文本进度条,过了一会儿系统恢复了,包括休眠之前的所有程序。

  发现的问题:STD 之前我在使用的外设包括指点杆鼠标、USB 外接鼠标(两个鼠标是同时使用的)、PCMCIA 的无线网卡。恢复之后外接的 USB 鼠标失效了,好像没有激活。无线网卡激活了。我想这些是需要配置的,在我的 /etc/sysconfig/suspend-scripts/ 中有一些脚本,另外 /etc/acpi/events/power 好像是一个指定键盘休眠键和电源键动作的配置。这些我还没有研究透,大家有兴趣可以看看。

  -------------------------------

  此外的一些参考

  ACPI HOWTO:http://en.tldp.org/HOWTO/Laptop-HOWTO-6.html#ss6.8

  APM HOWTO:http://en.tldp.org/HOWTO/Laptop-HOWTO-6.html#ss6.7

  SourceForge 项目:

  ACPI - http://sourceforge.net/projects/acpi/

  Sony VAIO 笔记本用的 Gnome-Applet - http://sourceforge.net/projects/vaioba/

  华硕笔记本的各种扩展,包括按键对应、指示灯、ACPI等 - http://sourceforge.net/projects/acpi4asus/

  另一个 Gnome-Applet - http://sourceforge.net/projects/gnome-acpi/

  KDE ACPI 控制小程序:http://sourceforge.net/projects/kacpi/

  ACPI plugin for GKrellM - http://sourceforge.net/projects/gkacpi/

  更多请在 www.sf.net 查找 acpi

  关于电源管理程序的需求:

  http://www.linuxsir.com/bbs/showthr...B%BC#post225036

  http://www.linuxsir.com/bbs/showthr...D%FB#post222020