1. 电源管理

如果你有一台相对较新的 x86 笔记本电脑,它很可能支持高级电源管理 (APM) 或高级配置和电源接口 (ACPI)。ACPI 是两种技术中较新的一种,它将电源管理置于操作系统的控制之下,从而实现比 BIOS 控制的 APM 更智能的电源管理。这对于电池供电的笔记本电脑尤其有用。你的机器一次只能有一个电源管理接口控制,因此决定哪种方法最适合你的情况非常重要。

1.1. 高级电源管理 (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)。

你将需要从 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 守护程序实际上由三个主要程序组成

如果你正在寻找一种简单、开箱即用的笔记本电脑电源管理方法,那么 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

1.2. 高级配置和电源接口 (ACPI)

高级配置和电源接口 (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

1.3. APM 与 ACPI:选择哪个?

目前有两种相互竞争的标准来提供电源管理:APM 和 ACPI。两者不能同时使用,那么哪一个最适合你的情况呢?如果你有一个相对较新 ( >2.4.20) 的内核,并且不害怕内核构建和修补源代码,你会发现 ACPI 的灵活性有很多好处。如果你只是想启用通用电源管理,或者正在使用较旧的机器,请选择 APM。两种方法都不会停止空闲硬盘的旋转;请改用 hdparm 来实现。无论哪种方式,你系统的 BIOS 都必须正确支持你想要使用的电源管理方案;如果你的系统不完全支持任何一种标准,某些电源管理选项可能会导致你的系统崩溃和/或数据丢失。你已被警告!

即使你没有在 x86 笔记本电脑上启用电源管理,Linux 也会始终在不需要执行任何操作时向你的处理器发出 HLT 指令 [1]。许多 Microsoft Windows CPU 散热程序都使用此技术。这会导致降低 CPU 的功耗。请注意,系统在收到 HLT 指令时不会关机;它只是停止执行指令,直到有中断发生。

通常,在不属于这些类别的服务器或工作站上启用任何类型的电源管理都没有优势。

1.4. SMP、超线程、IA64 和 NUMA

一些 SMP 系统制造商可能省略了用于 SMP 配置的 pre-ACPI 表。在这种情况下,需要 ACPI。

如果你有一个支持 超线程 的较新系统,你将需要启用 ACPI(当然,还有 SMP)。如果没有它,你的 Linux 系统可能无法发现和初始化所有虚拟处理器。

IA64 机器也需要 ACPI。此外,NUMA 服务器也开始需要它来进行正确的初始化。

注释

[1]

source/arch/i386/kernel/process.c