SDB:挂起到 RAM

跳转至: 导航, 搜索
s2ram 程序的目的是使尽可能多的机器能够挂起到 RAM。
注意,不推荐继续使用这里的 s2ram 白名单,它们已经不再被维护了。不要再给维护者发送更多格式的机器细节了。你应该使用一个带有 KMS 驱动的内核来使挂起继续工作。如果还是不能工作的话,发一个与 Linux 内核有关的 bug 吧。


如果你已经找到了你的机器的选项,你也许可以直接看 SDB:Pm-utils

背景

s2ram 程序是由 suspend 软件包提供的

挂起到 RAM 在很多机器上已经可用了——恢复之后机器能醒,键盘也能用,硬盘也继续转着,但是要使图像也恢复、背光也正常的话,你需要耍一些“小把戏”。 有几种迂回之路:

  • 给内核传递 acpi_sleep=s3_bios 参数
  • 给内核传递acpi_sleep=s3_mode 参数
  • 给内核传统 acpi_sleep=s3_bios,s3_mode 参数
  • vbetool 在恢复之后从用户空间加电自检显卡
  • vbetool 在挂起之前获取显卡数字,然后在恢复之后设置相同的显卡数字。
  • vbetool 在挂起之前保存 VBE 状态,然后在恢复之后恢复 VBE 状态。
  • 在挂起之前保存显卡的 PCI 设置空间,然后在恢复之后恢复。

从 2.6.16 内核开始,在运行的时候就可以在 /proc/sys/kernel/acpi_video_flags 设置 acpi_sleep 参数了(无需重启),设置为 “1” 代表 s3_bios,“2” 代表 s3_mode,“3” 代表两者都有。 关于这些的更多信息可以在内核的源码(通常位于 /usr/src/linux)里的 Documentation/power/video.txt 文件找到。

有些机器在使用 framebuffer 控制台的时候不会恢复。新出的一些 Dell 和 HP 的电脑很多就属于这一类。 你可以在启动管理器中给内核传递一个 vga=0 的参数,以禁用 framebuffer。grub 的设置文件通常位于 /boot/grub/menu.lst。 如果你的机器只能在不开 framebuffer 的时候工作,请在报告中告诉我们这点。

如果上面说的方法都没用,一定要检查一下你的机器是在恢复过程中彻底挂了还是只是显卡挂了。可以试试启动一个最小系统(init=/bin/bash,运行 s2ram -f,在恢复之后,如果屏幕不亮,就试试键盘上的大小写锁定键是否正常(正常情况下 Caps Lock 灯会有反应)。如果正常的话,可能只是显卡安装的问题,如果没反应的话,可能是 BIOS 的问题或者是 Linux 内核的问题。


为啥用 s2ram?

  • 用 vbetool 来保存 VBE 状态并不简单:在挂起前你得把当前的显卡状态保存到一个临时文件中,然后在恢复之后再把它弄回来。这些步骤当然可以用脚本来完成,但是用一个二进制程序来完成更容易一些。
  • 你需要知道你的机器是否需要一个迂回之路,以及它需要什么。s2ram 包含了一个带有大量机器和对应的解决方案的数据库,如果你的机器支持,挂起就很方便:直接调用 s2ram 就行了。

使用 s2ram

安装之,然后只要调用

s2ram

如果你的机器在白名单里,它就会挂起到硬盘了。但是要小心,在挂起前有些坏掉的驱动要卸载掉,然后再恢复之后再重新装上。 如果你只是想知道你的机器是否被支持或是有解决方案,只要调用

s2ram -n

s2ram 也被整合到了最新版本的 powersaved 里了:如果 suspend 软件包已经安装了,那么 powersaved 在启动的时候就用 s2ram -n 来检查一下机器是否能使用挂起到 RAM 功能,然后再根据结果决定“挂起按钮”是否启用。


问题排查

我的机器不在白名单里,怎么办?

看看有没有迂回之路,把下面这个命令的输出结果发给我们:

s2ram -i

迂回之路可以在 s2ram 命令行中激活:

marek@mantisha:~> /usr/sbin/s2ram -h
Usage: s2ram [options]
  -h, --help            this text.
  -V, --version                         version information
  -n, --test            test if the machine is in the database.
  -i, --identify        prints a string that identifies the machine.
  --nofbsuspend         do not suspend the framebuffer (debugging only!).
  --force               force suspending, even on unknown machines.

The following options are only available with --force:
  --vbe_save            save VBE state before suspending and restore after resume.
  --vbe_post            VBE POST the graphics card after resume.
  --vbe_mode            get VBE mode before suspend and set it after resume.
  --radeontool          turn off the backlight on radeons before suspending.
  --pci_save            save the PCI config space for the VGA card.
  --acpi_sleep <acpi_sleep>     set the acpi_sleep parameter before suspend
                        1=s3_bios, 2=s3_mode, 3=both

这些选项的已经解释得很清楚了。注意在所有未知的机器上,都需要用 -f 选项,然后再添加合适的迂回之路。选项 -a 需要一个额外的从 1 到 3 的数字参数,代表 s3_bios、s3_mode 或两者都有。

最好的检查未知机器的方法应该是在启动的时候用 init=/bin/bash 启动到一个最小的系统环境,然后输入:

mount /proc
mount /sys
s2ram -f

如果第一种方法已经成功了并且一切都正常,请把 s2ram -i 的输出发给我们,不要忘记即使在文字模式里,s2ram -f 也已经足够了(参见 #如何联系_s2ram_的作者)。如果没有的话,可以试一下以下的变体:

  • s2ram -f -a 3
  • s2ram -f -a 2
  • s2ram -f -a 1
  • s2ram -f -p -m
  • s2ram -f -p -s
  • s2ram -f -m
  • s2ram -f -s
  • s2ram -f -p
  • s2ram -f -a 1 -m
  • s2ram -f -a 1 -s

如果上面的组合都不行的话,加个 -v 参数再试一下。

注意:把 -a 参数和 vbetool 的参数(-p, -m, -s)混在一起用一般来说是最后一次挣扎,这其实没多大意思。但是最新的 64 位版 ThinkPad 倒是个例外,在 64 位状态下的时候它必须要用 -a 1 -m 才行。

运气好的话,上面的这些命令应该能让你的机器活过来(并且背光灯恢复)。 一旦你找到某个命令可用了,请把这个命令与 s2ram -i 的输出一起发给我们。如果你发现好几条命令在你的机器上都管用,那么应该优先使用内核模式(-a)而不是用户空间模式(-p, -m, -s)。

如果你发现某个命令可行,在发送给 s2ram 的开发者之前,请先验证一下它是否在以下情况都能运行:

  • 在控制台里执行 s2ram
  • 在 X 里执行 s2ram

在使用 -p 和 -m 选项之后,控制台上的文字内容可能会消失,如果用 framebuffer 控制台的话,切换一下控制台就可以解决这个问题。虽然用 -s 也可以解决问题,但是能用 -m 还是尽量用 -m。

注意:你真的应该在最小系统的文字模式控制台里尝试这些。在那里能用的报告要比在 X 里能用的报告有用得多。在你运行电源管理守护进程的时候也不会有副作用比如一恢复就立刻关机。

如果你发现了某个选项对你最有用并且你想立刻就使用 s2ram,可以看一下 SDB:Pm-utils#配置

一切安好,但是我机器的背光灯在挂起的时候一直亮着

如果你的机器装有 Radeon 显卡并且在挂起的时候背光灯一直不灭,可以在你的命令后面加一个 -r 参数。这是 ThinkPad '30 系列(T30, X31, R32 等)上的已知问题。 如果你的机器没装 Radeon 显卡的话,这个选项是没意义的。

我的机器在白名单里,但是不管用,咋办?

白名单里有一些通配符的,有可能他们在写通配符的时候不小心把没有测试过的机器也包括进去了。 这种情况和“我的机器不在白名单里”是一个样的:试出你机器能用的选项,然后把它和 s2ram -i 的输出一起发给我们,这样我们就可以有针对性地更新白名单。


如何联系 s2ram 的作者

一言以概之:别。请读一下本页顶部的框框:s2ram 已经被抛弃了,不会再有新的机器加入到白名单里了,改用 HAL / upower / pm-utils 的白名单吧!


啥也不装地测试

很多机器可以啥也不装地测试的,只要用 Live 媒体即可。


有用的技巧

These are just the "Tips and Tricks" that i found out when trying to get machines to suspend to RAM. Use with caution ;-) 这些只是我在试图让机器挂起到 RAM 的时候发现的一些小技巧,小心使用 ;-)

Intel 显卡

装了 Intel 显卡的机器即使用了 vesafb framebuffer 也通常要用 s2ram -f -a3 才行。如果 s2ram -f -a3 在某些机器上(比如 Dell)不管用,那么 s2ram -f -p -m 一般能行。

新的 Intel 的 Xorg 驱动似乎对 -s (VBE_SAVE)支持有问题,所以最好要用 -m(VBE_MODE)。详见 https://bugzilla.novell.com/show_bug.cgi?id=229603 。简单地说,优先使用 VBE_MODE 而不是 VBE_SAVE。

ATI 显卡

最近我碰到的许多装有 ATI Radeon 显卡的机器完全不能用 framebuffer(试图恢复的时候,就直接卡死在 BIOS 里了,连 Caps Lock 都没用)。这种机器一般要用 vga=0s2ram -f -p -m 或者 s2ram -f -p -s

IBM/Lenovo T60p (2613ETU) with FGLRX seems to suspend/resume properly with X running with S2RAM_OPTS="-f -a 1 -s". Neither the s2ram or hal defaults work properly. 带 FGLRX 的 IBM/Lenovo T60p (2613ETU) 似乎在 X 以 S2RAM_OPTS="-f -a 1 -s" 运行的时候能正常挂起和恢复,s2ram 和 hal 默认情况下都不能正常工作。

nVidia 显卡

当使用开源的 nv 驱动的时候,挂起到 RAM 之后再恢复到 X 通常会失败,因为目前还不知道如何初始化 nVidia 显卡。在执行几个步骤之后,只使用二进制驱动的 nVidia 显卡的机器应该能用 s2ram -f 了。参见 SDB:nVidia_显卡如何挂起

APIC 问题

我发现最近不少机器都要在内核命令行里把 APIC 禁用(noapic),否则不能恢复或者恢复之后很怪异(计时器中断之类的),所以还是要改一下的。但是在最近的内核里没必要了,openSUS 10.2 开始就不用这样做了。

因 VirtualBox 驱动引起的问题

如果 vboxdrv 加载着的话,挂起操作可能会卡死,要解决这个问题的话只要在挂起前把驱动卸载掉就好了(rcvboxdrv stop)。你可以像 这个例子那样在 /etc/pm/sleep.d/ 里放一个脚本来自动执行这个操作。

机器在恢复之后立刻就关机了!

s2ram 基本上是一个“底层”的系统工作。在实际应用中,应该把它把电源管理系统一起使用,比如在你的 acpid 脚本里(这个脚本可以在按电源键之类的时候触发挂起等过程)。如果你正在使用一个带 powersave 的发行版,可以看一下 SDB:Powersave_s2ram 页面。

这个在 2.6.20 内核之后就修复了,因此不需要什么迂回之路了。

重启 PCI 卡

在挂起之后,有一些外部设备(比如外置的无线网卡)可能不会正确激活。

别放弃!

有时,挂起到 RAM 不如我们所想的那么容易,如果你想看看大家是怎么克服困难一路走来的,可以看看[ https://bugzilla.novell.com/show_bug.cgi?id=159688 Bugzilla 上的这个报告]。我太崇拜 Winfried 了 :-) 另外,判断机器是恢复之后是“显示屏不亮”还是“彻底挂掉”也是很重要的,这里有介绍如何判断。


参见


外部链接