如果你有一台相对较新的 x86 笔记本电脑,它很可能支持高级电源管理 (APM) 或高级配置和电源接口 (ACPI)。ACPI 是两种技术中较新的一种,它将电源管理置于操作系统的控制之下,从而实现比 BIOS 控制的 APM 更智能的电源管理。这对于电池供电的笔记本电脑尤其有用。你的机器一次只能有一个电源管理接口控制,因此决定哪种方法最适合你的情况非常重要。
高级电源管理 (APM) 允许你计算机的 BIOS 控制系统的电源管理,而无需操作系统的了解。在 Linux 下使用 APM 的优点是它稳定、受到 Linux 供应商的良好支持,并且拥有可靠的历史。然而,在过去几年中,在这方面没有进行太多开发。
要使用它,你需要在内核中启用 APM
[*] Power Management support <*> Advanced Power Management BIOS support [ ] Ignore USER SUSPEND (NEW) [ ] Enable PM at boot time (NEW) [ ] Make CPU Idle calls when idle (NEW) [ ] Enable console blanking using APM (NEW) [ ] RTC stores time in GMT (NEW) [ ] Allow interrupts during APM BIOS calls (NEW) [ ] Use real mode APM BIOS call to power off (NEW) |
大多数其他的 APM 选项作为针对特定硬件设备已知问题的解决方法而存在,因此你可能只想启用第一个选项 (CONFIG_APM)。
高级电源管理 BIOS 支持 (CONFIG_APM):你需要启用此选项才能使用 APM 执行任何有用的操作。用户空间程序将收到 APM 事件的通知(例如,电池状态更改),并且 /proc/apm 设备将为你提供电池状态信息。
忽略用户挂起 (CONFIG_APM_IGNORE_USER_SUSPEND):这是针对 NEC Versa M 笔记本电脑的解决方法。
在启动时启用 PM (CONFIG_APM_DO_ENABLE):虽然听起来很棒,但大多数机器不需要启用此功能,实际上可能会在启动时挂起某些系统。
空闲时进行 CPU 空闲调用 (CONFIG_APM_CPU_IDLE):在某些机器上,此选项可以提高节能效果。在其他机器上,它会在启动时挂起系统。谨慎使用。
使用 APM 启用控制台消隐 (CONFIG_APM_DISPLAY_BLANK):与其消隐虚拟控制台,不如实际关闭屏幕。这不适用于 X-Windows,实际上可能会导致比解决更多的问题。
RTC 以 GMT 存储时间 (CONFIG_APM_RTC_IS_GMT):如果你想在你的 RTC(实时时钟)中存储 GMT(格林威治标准时间),请在此处选择“是”。
允许在 APM BIOS 调用期间中断 (CONFIG_APM_ALLOW_INTS):这是针对某些 IBM Thinkpad 在挂起时挂起的解决方法。
使用实模式 APM BIOS 调用来关机 (CONFIG_APM_REAL_MODE_POWER_OFF):这是针对许多损坏的 BIOS 的解决方法。如果你的计算机崩溃而不是正常关机,请启用此选项。
你将需要从 http://www.worldvisions.ca/~apenwarr/apmd/ 安装 APM 守护程序,并配置你的系统启动脚本以在启动时激活它
# Start the APM daemon if it exists and if APM is enabled in the kernel if [ -x /usr/sbin/apmd -a -d /proc/apm ]; then if cat /proc/apm 1> /dev/null 2> /dev/null ; then echo "Starting APM daemon: /usr/sbin/apmd" /usr/sbin/apmd fi fi |
APM 守护程序实际上由三个主要程序组成
apmd - 处理电源管理任务
apm - 一个命令行工具,用于打印当前电池状态或挂起计算机
xapm - 一个简单的 X 电池计量器
如果你正在寻找一种简单、开箱即用的笔记本电脑电源管理方法,那么 APM 绝对是首选。
可以将一个简单的脚本添加到你的~/.profile文件,以通知你剩余的电池时间
if [ -f /proc/apm ]; then DUMMY=`cat /proc/apm | cut -d" " -f 7` # Don't display when fully charged if [ "$DUMMY" != "99%" ]; then LEVEL=`cat /proc/apm | sed -e "s/^.*% //"` echo "Battery at $DUMMY ($LEVEL)" fi fi |
高级配置和电源接口 (ACPI) 是 APM 的后继者,它将电源管理的责任从 BIOS 转移到操作系统手中。ACPI Linux 比 APM Linux 更新,在响应电源管理事件方面更灵活,最近得到了更多的开发,因此,它也更容易出现各种错误。
如果你热衷于尖端开发,并且不害怕内核构建和应用针对源代码的补丁,那么 ACPI 值得考虑。
Linux 下的 ACPI 有两个部分:内置于内核本身的 ACPI 驱动程序和 ACPI 守护程序 (ACPID)。ACPID 在其当前版本中非常简单:监视 /proc/acpi/event 并做出响应。即使你不加载守护程序,你仍然可以获得内置于内核的 ACPI 功能的好处,例如处理器散热支持。
你可以使用以下命令确定你正在使用的 ACPI 驱动程序的版本以及支持的挂起状态
bash $ cat /proc/acpi/info version: 20030619 states: S0 S1 S3 S4 S4 S5 |
ACPI 开发正在稳步进行,因此你可能需要考虑 修补 你的内核以应对内核级 ACPI 代码的任何最新更新。下载特定内核的补丁后,你可以使用类似以下的命令对其进行修补
bash$ gunzip acpi-[version-kernel].diff.gz bash# cd /usr/src/linux-[version] bash# patch -Np1 -i ../acpi-[version-kernel].diff |
当然,在此之后你需要重新编译你的内核
[*] ACPI Support [ ] CPU Enumeration Only <*> AC Adapter <*> Battery <*> Button <*> Fan <*> Processor <*> Thermal Zone < > ASUS Laptop Extras < > Toshiba Laptop Extras [*] Debug Statements |
你还需要从 http://sourceforge.net/project/showfiles.php?group_id=33140 安装 ACPID 守护程序,并配置你的系统启动脚本以在启动时激活它
if [ -x /usr/sbin/acpid -a -d /proc/acpi ]; then echo "Starting ACPID Daemon: /usr/sbin/acpid" /usr/sbin/acpid fi |
一点历史...微软是第一个实现 ACPI 的供应商。这既是好事也是坏事。好处是,当你购买系统时,你几乎可以保证它已通过微软的硬件兼容性测试,包括其 ACPI 实现的测试。然而,这些测试的不足之处在于它们不表明符合 ACPI 规范,而是符合微软的 ACPI 实现。当同一台机器与 Linux 一起使用时,某些在 Windows 下未表现出来的错误可能会变得明显。为了防止这个问题,Linux ACPI 驱动程序维护了一个“坏 BIOS”黑名单,其中列出了已知不符合 ACPI 标准的 BIOS,因此,如果你的系统在列表中,将拒绝启用 ACPI。
许多制造商现在正在验证他们的系统是否可以在 Linux 上运行。但是,他们使用带有默认内核的主要 Linux 发行版。这意味着在主要的 Linux 发行版发布 ACPI 内核之前,很难让 OEM 确保他们的系统与启用 ACPI 的 Linux 一起工作。这带来了一个轻微的困境,因为 Linux 发行版希望发布可以在尽可能多的系统上运行的内核,但最近在这方面出现了一些积极的举措。
为了在保持快速可用的同时节省能源,兼容 ACPI 的 PC 可以进入系统睡眠状态。ACPI 规范定义了这五个状态,称为 S 状态。与处理器睡眠状态不同,系统在 S 状态下不执行任何工作。每个状态都引入了更大的节能效果,但需要相应更多的时间来唤醒并开始执行工作。这些状态以 APM 标准(ACPI 的前身)中的系统状态为蓝本。
有关 ACPI 睡眠状态的完整详细信息,请访问 http://acpi.sourceforge.net/documentation/sleep.html。处理器状态在 http://acpi.sourceforge.net/documentation/processor.html 中描述。
有关 ACPI 本身更具体的背景信息,你可以访问 ACPI 网站 http://www.acpi.info
目前有两种相互竞争的标准来提供电源管理:APM 和 ACPI。两者不能同时使用,那么哪一个最适合你的情况呢?如果你有一个相对较新 ( >2.4.20) 的内核,并且不害怕内核构建和修补源代码,你会发现 ACPI 的灵活性有很多好处。如果你只是想启用通用电源管理,或者正在使用较旧的机器,请选择 APM。两种方法都不会停止空闲硬盘的旋转;请改用 hdparm 来实现。无论哪种方式,你系统的 BIOS 都必须正确支持你想要使用的电源管理方案;如果你的系统不完全支持任何一种标准,某些电源管理选项可能会导致你的系统崩溃和/或数据丢失。你已被警告!
即使你没有在 x86 笔记本电脑上启用电源管理,Linux 也会始终在不需要执行任何操作时向你的处理器发出 HLT 指令 [1]。许多 Microsoft Windows CPU 散热程序都使用此技术。这会导致降低 CPU 的功耗。请注意,系统在收到 HLT 指令时不会关机;它只是停止执行指令,直到有中断发生。
通常,在不属于这些类别的服务器或工作站上启用任何类型的电源管理都没有优势。
一些 SMP 系统制造商可能省略了用于 SMP 配置的 pre-ACPI 表。在这种情况下,需要 ACPI。
如果你有一个支持 超线程 的较新系统,你将需要启用 ACPI(当然,还有 SMP)。如果没有它,你的 Linux 系统可能无法发现和初始化所有虚拟处理器。
IA64 机器也需要 ACPI。此外,NUMA 服务器也开始需要它来进行正确的初始化。
[1] | source/arch/i386/kernel/process.c |