acpid+pm-utils唤醒问题
时间:2009-12-27
来源:互联网
参照wiki文档安装acpid+pm-utils,创建/etc/acpi/events/power定义Power按钮按下后调用pm-suspend挂起系统:
#cat /etc/acpi/events/power
event=button/power.*
action=/usr/sbin/pm-suspend
写好后启动acpid,报告acpid: can't open /proc/acpi/event: No such file or directory。想起acpid用的是已经过时的/proc/acpi/event事件接口,编译内核时被我去掉了。
没办法,谁让acpid的netlink事件接口还没搞定(08年作者就说他还在努力),只能先加上迁就一下acpid。
改好内核用kexec重启,进入系统后按下电源键测试acpi事件和待机是否正常。硬盘劈里啪啦响过一阵后扬声器发出欢快的滴滴声,证明笔记本已经安然入睡了。关键时刻终于到来,究竟系统能否正常唤醒?无奈午休时间已到,只好怀着忐忑心情边吃饭边看完了最近流行的2012,更加坚定了我为节能减排作贡献的决心。
作者: lifc 发布时间: 2009-12-27
然而现实终究是残酷的,再次按下电源键之后系统滴的一声点亮了LCD的背灯,但屏幕上始终灰蒙蒙一片没有任何字符出现……
时间一秒一秒的流逝,最初的期望和信心也一点点化做了失望在内心中流淌。就在快要失去信心拔掉电源时左上角终于跳出了闪烁的光标,vga寄存器中光标发生器部分成功恢复,说明内核其实还没死……
经过漫长的等待(起码有一分钟)终于看到熟悉的控制台。本以为我们的故事就要在这里终止,谁知道死而复生的系统居然不能上网了。ifconfig检查网卡状态,怎么少了eth0?赶紧ifconfig -a再看一次,原来它还在那儿,只是没睡醒罢了。
作者: lifc 发布时间: 2009-12-27
ifconfig eth0 up之后傻了眼,系统死了???过了大概一分钟终于再次死而复生,原来刚才休眠唤醒就是执行到ifconfig eth0 up挂起的。想起之前用archboot光盘远程安装时遇到过同样问题,立马dmesg看kernel怎么说,不出所料果然和安装时的错误一样:
e100 0000:00:12.0: firmware: requesting e100/d101s_ucode.bin
e100: eth0: e100_request_firmware: Failed to load firmware "e100/d101s_ucode.bin": -2
pci 0000:00:14.0: PME# disabled
do_drive_get_GTF: Run _GTF error: status = 0x5
作者: lifc 发布时间: 2009-12-27
pacman -Ql udev看了一下包结构,负责固件加载的firmware.sh放在/lib/udev下,二话不说进去修改这个文件,增加一些桩子方便调试。
重启系统保存正常加载固件信息,休眠再唤醒系统经过1分23秒等待进入系统,对比两次的加载过程:调用环境变量一样,只是唤醒后访问/sys/devices/pci0000:00/0000:00:12.0/firmware/0000:00:12.0/loading失败。
再改一次脚本,把前后两次的/sys/devices/pci0000:00/0000:00:12.0目录内容保存下来分析,原来唤醒后少了firmware这个目录,难怪firmware.sh没办法完成加载。
作者: lifc 发布时间: 2009-12-27
初步分析方案有几个:
1、将网卡固件编译进入内核,不用动态加载。应该可行,用gentoo这样做没有问题。
2、休眠之前停止网络服务、撤掉内核模块,唤醒后重新加载驱动模块初、始化网络服务。有效性待验证。
3、研究一下内核请求固件的流程,找到根本原因。麻烦一点应该还可行,也最彻底。
4、换不用固件的8139 mini pci网卡。需要拆老婆电脑不容易批准。
作者: lifc 发布时间: 2009-12-27
内核配置中设置FIRMWARE_IN_KERNEL=y打开核心包含固件功能,然后设置EXTRA_FIRMWARE="e100/d101s_ucode.bin"告知内核编译脚本将e100/d101s_ucode.bin编入核心,再设置 EXTRA_FIRMWARE_DIR="/lib/firmware"标明二进制固件存放位置,前提是已经执行过make modules_install或者安装过firmware包,/lib/firmware目录存在上述固件。
作者: lifc 发布时间: 2009-12-27
这个问题是因为kernel是GPL的,因此不应该在里面放私有版权的固件,所以现在陆续分离出来了,不过一些程序员在驱动代码修改分离时,出了些bug,就这样了。只要有用户反馈,相信新的kernel就都解决了。
作者: 没本 发布时间: 2009-12-27
作者: lifc 发布时间: 2009-12-27
#!/bin/bash
. /usr/lib/pm-utils/functions
case "$1" in
hibernate|suspend)
/etc/rc.d/network stop
rmmod e100
;;
thaw|resume)
modprobe e100
/etc/rc.d/network start
;;
*)
;;
esac
exit 0
这样每次休眠之前停止全部网络服务并卸载模块,唤醒之后再加载模块(和固件)并重新启用网络服务。这里要说一下,pm-utils本来已经提供了两个与之相关的脚本pm-utils /usr/lib/pm-utils/sleep.d/{11netcfg,55NetworkManager},但前者需要依赖11netcfg后者通过dbus发送通告消息给总线监听者,我这里都没有安装所以就不提了。另外pm-utils可以通过设置SUSPEND_MODULES="e100"这种方法来自动卸载模块,只是因为需要同时关闭、激活网络服务所以就直接写到上面的脚本:rmmod e100/modprobe e100。
作者: lifc 发布时间: 2009-12-27
作者: lifc
接着刚才的话题说。第一种方法自己测试了一下没有问题,幸运的是对于e100这种网卡(至少手头这块)第二种方法(2、休眠之前停止网络服务、撤掉内核模块,唤醒后重新加载驱动模块初、始化网络服务)也是可行的。我的方法是在/etc/pm/sleep.d下创建一个50network脚本,具体内容如下:
#!/bin/bash . /usr/lib/pm-utils/functions case "$1" in hibernate|suspend) /etc/rc.d/network stop rmmod e100 ;; thaw|resume) modprobe e100 /etc/rc.d/network start ;; *) ;; esac exit 0 这样每次休眠之前停止全部网络服务并卸载模块,唤醒之后再加载模块(和固件)并重新启用网络服务。这里要说一下,pm-utils本来已经提供了两个与之相关的脚本pm-utils /usr/lib/pm-utils/sleep.d/{11netcfg,55NetworkManager},但前者需要依赖11netcfg后者通过dbus发送通告消息给总线监听者,我这里都没有安装所以就不提了。另外pm-utils可以通过设置SUSPEND_MODULES="e100"这种方法来自动卸载模块,只是因为需要同时关闭、激活网络服务所以就直接写到上面的脚本:rmmod e100/modprobe e100。 |
作者: Alerander 发布时间: 2009-12-28
作者: lifc 发布时间: 2009-12-28
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28