Pm-utils

跳转至: 导航, 搜索
pm-utils 是挂起和节能系统的框架。HAL 经常用它来执行许多与驱动缺陷、挂起异常等问题的修复工作。


基本功能

把钩子放到 Pm-utils 的目录里可以很容易地扩展它。这个工作可以由系统管理员来做,或者这些钩子可能是一些软件包安装的,特别是那些在挂起和电源状态改变的时候需要“特别照顾”的软件包。

概念是相当简单的:

  • 主脚本 pm-action(由符号链接 pm-suspendpm-hibernatepm-suspend-hybrid 调用)按字母顺序,执行那些“钩子”,传递参数 suspend(挂起到 RAM)或 hibernate(挂起到磁盘)给脚本并执行它们。
  • 当所有的钩子全部执行完了之后,就使机器进入睡眠状态。在机器醒来之后,所有的钩子会带着参数 resume(从 RAM 恢复)或thaw(从磁盘恢复)反向执行一遍。
  • 钩子可以做很多事情,比如准备启动管理器、停止蓝牙子系统或者把主要模块卸载掉。

pm-suspend 和 pm-hibernate 都是由 HAL 来调用的,可以由桌面小程序 gnome-power-manager 或者 kpowersave 等来调用。

也可以以此把机器设为“性能优先”或者“省电优先”模式,只要额外传递一个 truefalse 参数给 pm-powersave 就好了。

挂起过程的钩子文件位于

  • /usr/lib/pm-utils/sleep.d(由发行版或软件包提供的钩子)
  • /etc/pm/sleep.d(由系统管理员添加的钩子)

电源状态的钩子位于

  • /usr/lib/pm-utils/power.d(由发行版或软件包提供的钩子)
  • /etc/pm/power.d(由系统管理员添加的钩子)

/etc/pm/ 里的钩子优先级是比 /usr/lib/pm-utils/ 里的高的,所以系统管理员可以超驰发行版的默认设置。


配置

主配置文件是 /usr/lib/pm-utils/defaults。你不应该编辑这个文件,因为软件包升级之后它会被覆盖,恢复成默认的设置。你应该把你的配置文件放在 /etc/pm/config.d/ 里。 你可以只建一个简单的文本文件,里面有如下内容

SUSPEND_MODULES="button uhci_hcd"

保存为 modules 或者 config 文件,放在 /etc/pm/config.d 里,然后它就可以超驰系统级的配置文件了。

配置文件里的变量

挂起前需要卸载的模块的列表

SUSPEND_MODULES="button" # 挂起前需要卸载的模块的列表

SUSE 特有的变量

HIBERNATE_METHOD={userspace,kernel} # 选择挂起到磁盘的模式,默认是 userspace。
S2RAM_OPTS="" # 传递给 s2ram 的参数。查看 挂起到 RAM 页面获取更多信息。

创建你自己的钩子

如果你想在挂起或休眠的过程中执行一些操作的话,你可以把你自己的钩子放在 /etc/pm/sleep.d 目录中。这个目录里的钩子将会在挂起的时候以字母序被执行(这就是为什么他们是都是以两个数字开头的——为了控制顺序)并且在恢复的时候以反序再执行一遍。

注意: 所有的这些钩子都是以 root 来运行的,这意思着当你创建临时文件的时候要小心,比如检查一下 PATH 变量是否正确之类的,以免引起安全问题。

这个有一个没啥用的展示性钩子,用来把一些提示性的语句写到你的日志文件里:

#!/bin/bash
case $1 in
    hibernate)
        echo "Hey guy, we are going to suspend to disk!"
        ;;
    suspend)
        echo "Oh, this time we're doing a suspend to RAM. Cool!"
        ;;
    thaw)
        echo "oh, suspend to disk is over, we are resuming..."
        ;;
    resume)
        echo "hey, the suspend to RAM seems to be over..."
        ;;
    *)  echo "somebody is calling me totally wrong."
        ;;
esac

把这个保存成 /etc/pm/sleep.d/66dummy 里,并且 chmod +x /etc/pm/sleep.d/66dummy 然后它就会在挂起和恢复的时候输出一些没用的文字了……


一些提示和技巧 / 常见问题

人工触发挂起

如果你想为了侦错而人工触发挂起的话,是用不着 HAL 和其他的框架工具的,只要用 root 调用 pm-suspend 或者 pm-hibernate 就好了。

注意: 这个只是用来侦错用的,你在做这些的时候最好明白你在干嘛。

在那些不包括在 s2ram 白名单里的机器上使用挂起到 RAM

如果你想强制挂起到 RAM,你需要把 -f 加到 /etc/pm/config.d/ 里配置文件的 S2RAM_OPTS 变量里,可以参考一下 配置。你也需要把其他你需要的选项也写进去,比如这样:

S2RAM_OPTS="-f -a 3"

如果你的机器不受支持,你可以把你的机器按 s2ram 页面所述报上去,这样你以后就不需要这样强制执行了。

禁用一个钩子

如果你有钩子不想运行或者你觉得运行了甚至是有害的,那么我们很期待你的 Bug 报告。 但是,你可以很容易地通过在 /etc/pm/sleep.d/ 里创建与钩子同名的空文件的方法来禁用一个钩子。比如你要禁用掉 /usr/lib/pm-utils/sleep.d/45pcmcia 这个钩子,你可以这样:

touch /etc/pm/sleep.d/45pcmcia

别在这个傀儡钩子上设置可执行属性。

重启鼠标

在有些笔记本电脑上,挂起过程基本成功,但是鼠标会挂掉,有一种解决方法是通过 /etc/pm/hooks 里的钩子强制重新初始化 PS/2 驱动(这里是 i8042),参见 创建你自己的钩子

#!/bin/sh  
echo -n "i8042" > /sys/bus/platform/drivers/i8042/unbind
echo -n "i8042" > /sys/bus/platform/drivers/i8042/bind

看起来啥也没发生 / 日志文件在哪里

如果通过桌面小程序调用的时候,啥也没发生的话,那么可以 试试从 root 终端里手工调用 pm-suspendpm-hibernate。也许你可以从输出信息里看到问题所在。 挂起脚本的日志记录在 日志文件 /var/log/pm-suspend.log 里。


问题排查

如果挂起或者休眠工作不正常,你可能需要从 /var/log/pm-suspend.log 里找问题,比如有哪些钩子运行了,它们的输出又是什么。


参见


外部链接