LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 700|回复: 9

关于电源开关

[复制链接]
发表于 2003-12-13 15:44:03 | 显示全部楼层 |阅读模式
在 win2k 下,只按一下电源开关就会进入关机的程序,过一会儿就会自动关掉电源。而 Linux 下会直接关掉电源(后果是下次开机时漫长的 fsck )。我已试过改动高级电源设置,但没有结果。
需要怎么设置才能实现类似 win2k 下按开关关机的流程呢?
发表于 2003-12-13 19:01:59 | 显示全部楼层
请不要把windows的思想带过来。如果你按照windows的思路来用linux,将会好麻烦。。
直接
#shutdown -h now
或者是
#halt
不是好方便吗?
Linux是一个安全的系统。普通用户没有关机的权限。
发表于 2003-12-13 20:09:05 | 显示全部楼层
呵呵......你的qmd强的
发表于 2003-12-13 20:09:37 | 显示全部楼层
我头一次装9.2时,按下电源健可以执行关机程序!
可这几次刻了盘重装后(不知道是不是版本的事),按下电源键就断电了!!
我也正想问这个问题呢!!
希望高手解答!
发表于 2003-12-13 20:19:22 | 显示全部楼层
呵呵....我课的盘竟然坏了几张。。。恐怖
 楼主| 发表于 2003-12-14 02:37:23 | 显示全部楼层
最初由 Firebird 发表
请不要把windows的思想带过来。如果你按照windows的思路来用linux,将会好麻烦。。
直接
#shutdown -h now
或者是
#halt
不是好方便吗?
Linux是一个安全的系统。普通用户没有关机的权限。


想做一个不带显示器、键盘和鼠标的服务器。

另:能否应付各种意外甚至违规的操作,也代表了系统的健壮性水平。
 楼主| 发表于 2003-12-14 02:50:52 | 显示全部楼层
开拓一下思路吧: win 是怎么实现这个功能的?是否 ATX 电源会发一个信号到操作系统? Linux 是哪个进程负责监视这个信号?

现在正在找 ATX 的电源规范。哪位有?
发表于 2003-12-14 09:58:48 | 显示全部楼层
最初由 ardin 发表
想做一个不带显示器、键盘和鼠标的服务器。

另:能否应付各种意外甚至违规的操作,也代表了系统的健壮性水平。


呵呵。。。兄弟的思想开阔。刚开始没想到这一点。
发表于 2003-12-14 11:21:59 | 显示全部楼层
最初由 ardin 发表
想做一个不带显示器、键盘和鼠标的服务器。

另:能否应付各种意外甚至违规的操作,也代表了系统的健壮性水平。


呵呵,我怎么没有想到呢?
google上没找到吗?;)
 楼主| 发表于 2003-12-16 03:52:00 | 显示全部楼层
找到一篇文章:

http://www-900.ibm.com/developer ... ed/l-rb/index.shtml
4.apm驱动本身的关机过程

apm使用其注册的设备的ioctl接口完成apm的操作,在apm.c的do_ioctl函数中可以看见处理的分支。这里只有suspend和standby的代码,所以我们不能通过ioctl这种方法使用apm关机。

当用户按下POWER开关的时候,如果有apm模块,那么关机流程是由apm来处理的。apm驱动在初始化的时候启动了一个apm内核线程:apm_mainloop,系统会在这里检测到POWEROFF按键消息并且将其命名为APM_SYS_SUSPEND,以区别apm -s设置的APM_USER_SUSPEND模式。紧接着进入了apm_event_handler函数,又从apm_event_handler函数进入了check_events函数,处理函数对应的case分支上。系统同样使用了suspend函数进行关机,不过由于其它参数的原因,suspend最后调用的是关机的流程。

5.解决问题实例

1)按POWER键时某些主板死机

经查只有某些特定的驱动装载之后才会出现这样的情况,并且当使用关机系统调用sys_reboot的时候没有这样的问题。分析apm的处理流程,怀疑是在关机前驱动程序没有正确处理apm发出的询问消息造成的。由于部分驱动程序没有源代码,决定hack掉apm.c的关机部分,让两种方式的关机走同样的流程。于是把apm.c的check_events函数中对APM_SYS_SUSPEND部分改写为如下代码:


        ret = exec_usermodehelper(poweroff_helper_path, argv, envp);
        if (ret) {
                printk(KERN_ERR
                        "apm.c: failed to exec %s , errno = %d\\n",
                        poweroff_helper_path, errno);
        }
        break;



定义了一个用户态应用程序poweroff_helper_path,当POWEROFF键按下的时候系统运行这个kernel_helper程序。我们再写一个通过sys_reboot系统调用关机的程序,放在指定的位置下。死机的问题就解决了。

------是否意味着需要编译核心,好把 apm 挂上?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表