Linux系统的休眠与唤醒

系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很大的方便。Linux在2.6系列核心中对电源管理有了较好的支持,下面就谈谈Linux对系统挂起的支持情况。

      Linux对系统挂起的支持

       Linux同时提供了对APM和ACPI的支持,当时两者是不兼容的,同一时刻只能有一种机制工作。由于ACPI的优越性,所以现在Linux将ACPI 设为缺省的电源管理方案。对于一些比较旧的主板,如果其BIOS中ACPI的实现在2000年以前,那么Linux自动启用APM(可以通过核心命令行参 数acpi=force来强制启用ACPI)。如果你下主板BIOS中对ACPI的支持有些问题导致Linux工作不正常,那么还可以使用核心命令行参数 acpi=off来强制禁用ACPI,这样Linux会自动启用APM电源管理。

Linux现在主要支持三种ACPI的节电方式:

S1:Stopgrant,即待机(standby)模式。显示屏自动断电,只是主机通电。这时敲任意键即可恢复原来状态。
S2 S3:STR(Suspend To Ram),即挂起到内存。系统把当前信息储存在内存中,只有内存等几个关键部件通电,这时计算机处在高度节电状态。此时系统不能从键盘唤醒。手工唤醒的方 法只能是按前面板上的电源按钮。唤醒后,计算机从内存中读取信息很快恢复到原来状态。
S4:STD(Suspend To Disk),即挂起到硬盘,也即休眠。计算机自动关机,关机前将当前数据存储在硬盘上,用户下次按开关键开机时计算机将无须启动操作系统,直接从硬盘读取数据,恢复原来状态。

在Linux下查看核心支持ACPI情况的方法如下:

2.4核心下:
# cat /proc/acpi/sleep
S0 S1 S3 S4 S5
2.6核心下:
# cat /sys/power/state
standby mem disk

上面的输出可知,我们系统中核心同时支持三种节电模式。

在/sys/power目录下还有一个文件:disk,文件的内容可以如下:

shutdown: 将系统状态保存到磁盘,让BIOS关闭计算机;

platform: 将系统状态保存到磁盘,让BIOS关闭计算机,并且点亮挂起指示灯;

firmware: 让BIOS自己将系统状态保存,并且关闭计算机,需要BIOS自己有挂起磁盘。大部分工作都由BIOS完成,对操作系统是透明的;




进入这三种节电模式的方法如下:




#echo  standby > /sys/power/state ---->挂起(S1)

#echo mem > /sys/power/state ---->挂起到内存(S3)

#echo shutdown > /sys/power/disk; echo disk > /sys/power/state ---->挂起到磁盘(S4)

#echo platform > /sys/power/disk; echo disk > /sys/power/state







Linux下的磁盘挂起(STD)是通过swsusp机制实现的:将 系统当前状态保存的内存后,再把内存内容写入交换分区(swap)。这里要求交换分区容量最好大于内存容量。系统挂起到磁盘后,下次启动的时候需要向核心 传递命令行参数resume=/dev/hdaX(/dev/hdaX是系统中的交换分区),这样系统就能够很快恢复到关机时的状态。

还有一个非正式的核心补丁可以实现STD:Software Suspend 2。该项目是一个快速发展的项目,设计上教swsusp有一些优势,但是还没有集成到核心正式发布中,实现方式与swsusp基本相同。

虽然Linux提供了系统挂起的机制,但是执行上面的挂起操作不一定 能够成功。一方面,这些操作除了需要BIOS支持以外,还需要外围硬件设备能够兼容,即设备支持节电状态,支持从节电状态或断电状态恢复;另一方面,这些 设备驱动必须能够接收电源管理指令。目前,系统挂起的主要障碍就是那些还不太完善的驱动程序,如USB、显卡、声卡驱动等。

当然,现在Linux核心对系统挂起的支持还有待改进,主要表现在:

    • 不支持SMP系统。
    • 不支持大内存(>4G)。
    • 核心中许多模块需要增加电源管理的支持。
    • 缺少上层配置程序。

不过可以放心,所有的问题内核黑客们都能够解决!

 

1:对于S4(suspend to disk) 可以使用:
代码:
#echo reboot > /sys/power/disk
#echo disk > /sys/power/state

来实现。
2:对于S3(suspend to ram)就目前的资料来看,好像没有方法。
估计可以使用RTC alarm来实现。(如果你找到了方法,可一定要告诉我,因为我也很想知道)。
比如
代码:
#echo `date +%F;date -d '+10 second' +%T` >/proc/acpi/alarm
#echo mem > /sys/power/state

这样可以在进入S3前开始计时的10秒钟后,唤醒计算机。

如果唤醒后不能够正常恢复到系统以前的状态,那说明你的机器,使用echo disk > /sys/power/state
或echo mem > /sys/power/state进入休眠是有问题的。可以考虑其他的休眠工具比如hibernate。

 

参考阅读:

    • http://www.acpi.info :ACPI的官方网站,在上面可以免费获得最新的ACPI规范。
    • http://acpi.sourceforge.net :Linux下支持ACPI项目网站。官方Linux内核中ACPI的版本实际上已经远远落后于最新的版本,因为linux稳定版中对任何新特性的加入都是非常小心谨慎的。你可以从这里下载最新的ACPI补丁。
    • Linux核心源代码目录:Documentation/power/,里面有开发人员写的一些关于电源管理在Linux上实现的文档。
    • http://www.suspend2.net :Software Suspend 2的官方网站,STD的另一个解决方案。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值