如何使 s2ram 工作

2006 Linus Torvalds 2006 Pavel Machek

  1. 查看 suspend.sf.net,那里的 s2ram 程序有一个很长的“已知正常”机器的白名单,以及在每台机器上使用的技巧。

  2. 如果这没有帮助,请尝试阅读 swsusp/S3 技巧S3 恢复时的视频问题。也许问题就像一个损坏的模块那么简单,简单的模块卸载就可以修复它。

  3. 你可以使用 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 的秒数或分钟的低位,但延迟过长会破坏幻数。