cobranail 发表于 2004-12-10 21:09:36

在FC3里使用suspend to ram

在FC3里使用suspend to ram

从kernel2.6开始,内核增强了对acpi的支持,现在可以在台式机上使用suspend to ram(str/bios s3)
在fc2里,当启动acpid之后,可以直接用机箱上的power键关机,acpid检测到power信号之后,会执行相应的程序。
在FC3里,对acpi的支持更进了一步(主要是kernel的进步),现在终于可以使用str功能了。
先来看看acpid是如何工作的。
首先要在kernel和bios里打开acpi的支持和str/std支持。fc3的标准内核是支持acpi的。
执行cat /sys/power/state,就可以看到目前内核支持的acpi状态,这个是在我的机器上运行的结果。

$ cat /sys/power/state
standby mem disk

可以看到我的机器支持3种acpi状态,standby(等待),men(str),disk(std),其中standby就是标准状态。
我们下面要做的主要是来实现str。

在acpi支持没有问题的情况下,acpid会通过acpi-listen进程来检测acpi设备的动作,在台式机上,acpi设备一般只有机箱上的 power按钮和键盘上的power/sleep/wakeup按钮,目前的kernel的acpi只支持机箱上的电源按钮。对于键盘acpi,可以通过 x或者桌面环境来支持。

当acpi-listen检测的acpi信号之后,会到/etc/acpi/events/里查找这个信号所对应的命令。对应规则写在/etc/acpi/events/目录里的文件里。在FC3里,这个目录里会有一个叫作sample.conf的文件,可以打开它看看:

# This is a sample ACPID configuration

event=button/power.*   这行定义检测到的信号
action=/sbin/shutdown -h now   这行定义检测到上面的信号后执行的命令


来修改一下。
在/etc/rc.local的最后里加上两行:
touch /tmp/NSLEEP    #这个表示上次关机不是str
touch /tmp/POWERON#这个表示现在正处于运行状态

再到/sbin/里创建一个叫做acpipower.sh的可执行脚本的文件,在里面写上:
#!/bin/sh
if [ -e /tmp/POWERON ];then
if [ -e /tmp/NSLEEP ];then
   rm -f /tmp/NSLEEP;rm -f /tmp/POWERON;echo -n "mem" > /sys/power/state
fi
else
touch /tmp/POWERON;touch /tmp/NSLEEP
fi


最后再修改/etc/acpi/events/sample.conf,
把action=/sbin/shutdown -h now改为:action=/sbin/acpipower.sh

reboot,现在可以试试看了。


发现的问题:
usb设备在wakeup后,有时会失去响应,也许还要作些其他的工作才可以
拨号的网络连接不会自动恢复,必须要重新拨号


std也可以用同样的办法实现,不过std会用到swap,而我的swap太分散,没法用了
std在恢复的时候,需要将resume参数传递给内核

更多的信息参考:
acpi.sourceforge.net
页: [1]
查看完整版本: 在FC3里使用suspend to ram