系统挂起(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。