如何使 s2ram 工作¶
2006 Linus Torvalds 2006 Pavel Machek
查看 suspend.sf.net,那里的 s2ram 程序有一个很长的“已知正常”机器的白名单,以及在每台机器上使用的技巧。
如果这没有帮助,请尝试阅读 swsusp/S3 技巧 和 S3 恢复时的视频问题。也许问题就像一个损坏的模块那么简单,简单的模块卸载就可以修复它。
你可以使用 Linus 的 TRACE_RESUME 基础设施,如下所述。
使用 TRACE_RESUME¶
我一直在努力使我拥有的机器能够 STR,而且几乎总是驱动程序有错误。感谢上帝的挂起/恢复调试 - Chuck 试图禁用的东西。这通常是调试这些事情的_唯一_方法,而且实际上非常强大(但很耗时 - 必须将 TRACE_RESUME() 标记插入到不恢复的设备驱动程序中,然后重新编译和重启)。
无论如何,对于那些感兴趣的人(拥有一台无法启动的机器)来说,调试的方法是
启用 PM_DEBUG 和 PM_TRACE
使用如下脚本
#!/bin/sh sync echo 1 > /sys/power/pm_trace echo mem > /sys/power/state挂起
如果它没有恢复(这通常是问题所在),请按住电源按钮重启,并查看 dmesg 输出中的内容,例如
Magic number: 4:156:725 hash matches drivers/base/power/resume.c:28 hash matches device 0000:01:00.0这意味着最后一个跟踪事件是在尝试恢复设备 0000:01:00.0 之前。然后找出哪个驱动程序正在控制该设备 (lspci 和 /sys/devices/pci* 是你的朋友),看看你是否可以修复它、禁用它或跟踪到它的恢复函数中。
如果没有设备匹配哈希值(或任何匹配项似乎是误报),则罪魁祸首可能是来自可加载内核模块的设备,该模块在检查哈希值之后才加载。您可以使用 sysfs 在加载更多模块后再次检查哈希值与当前设备是否匹配
cat /sys/power/pm_trace_dev_match
例如,上面发生在我 EVO 上的 VGA 设备上,我过去使用 “radeonfb” 运行(它是 ATI Radeon 移动版)。事实证明,“radeonfb” 根本无法恢复该设备 - 它试图设置 PLL,然后就会_挂起_。使用常规 VGA 控制台并让 X 恢复它反而工作正常。
注意¶
pm_trace 使用系统的实时时钟 (RTC) 来保存幻数。原因是 RTC 是恢复操作期间唯一可靠可用的硬件,可以在其中设置一个在重启后仍然存在的值。
pm_trace 与异步挂起不兼容,因此它会关闭异步挂起(这可以解决时间或顺序敏感的错误)。
后果是,在恢复后(即使恢复成功),您的系统时钟将具有与幻数对应的值,而不是正确的日期/时间!因此,建议在使用此跟踪选项时使用像 ntp-date 或 rdate 这样的程序从外部时间源重置正确的日期/时间。
由于时钟一直在滴答作响,因此在恢复失败后迅速重启也是至关重要的。跟踪选项不使用 RTC 的秒数或分钟的低位,但延迟过长会破坏幻数。