ArchLinux 电源管理:acpid + cpufreq + pm-utils

如果没有安装桌面环境(如 gnome,ked,xfce 等)的话,电源管理就必须自己动手解决。我的环境为 ArchLinux + Awesome 。

一,为什么要电源管理

电源管理的作用主要包括两个方面:

1,节约能源。

2,更好的利用硬件设备

所以,并不是所有电脑都需要电源管理,你可以完全忽略它。但对于笔记本来说,它还是必不可少的。

二,所需要的工具

1,acpid

acpid 用来捕捉和投递 acpi 事件,并执行相应的动作。

这些 acpi 事件包括:

1), 按下电源按钮。
2), 按下睡眠/休眠按钮。
3), 合上笔记本。
4), 插上/拔出 AC 电源适配器。

安装 acpid:

pacman -S acpid

将 acpid 加入 /etc/rc.conf 文件中的 DAEMONS 项:

DAEMONS=( ... acpid  ... )

说明,如果你是用了 hal 的话,并且 hal 已经加入了 DAEMONS ,那么便不需要这一步了。因为 hal 为自动检测 acpid 并启动它。

2,cpufreq

cpufreq 用来调节 cpu 的频率。

安装 cpufreq:

pacman -S cpufrequtils

加载相应的驱动:

查看所有驱动:

ls /lib/modules/*/kernel/arch/*/kernel/cpu/cpufreq

对于 intel 的 cpu,一般来说,需要加载 acpi-cpufreq 这个驱动:

modprobe acpi-cpufreq

对于较老的 intel cpu 可能会出现如下错误:

FATAL: Error inserting acpi_cpufreq ([...]/acpi-cpufreq.ko): No such device

这种情况下,可以用speedstep-centrino、p4-clockmod 或者 speedstep-ich 来代替 acpi-cpufreq 。

对于 AMD cpu:

modprobe powernow-k{6,7,8}
# 这三个驱动并不需要全部加载,如果某个加载失败,加载其他的即可。
# 我机器的 cpu 是 AMD Athlon TK-55,我需要加载的驱动是 powernow-k8

最后,将可用的驱动加入到 /etc/rc.conf 文件中的 MODULES 项。

MODULES=( ... powernow-k8 ... )

使用 cpufreq:

这里只是 cpufreq 的一部分,此部分后面会用到,更完整的 cpufreq 使用方法,请参见其主页。

cpufreq 可以一下面几种模式工作:
1), performance
此模式 cpu 以最大时钟频率运行,默认为此模式。
2), ondemand
根据系统负载动态调节 cpu 时钟频率。
3), conservative
和 ondemand 类似,但是更保守(以比较温和的方式改变时钟频率)。
4), powersave
此模式 cpu 以最小模式运行。
5), userspace
手动调节 cpu 时钟频率。

使用如下命令来设置其工作在哪一种模式:

cpufreq-set -g ondemand

3,pm-utils

pm-utils 是一个全新的电源挂起和电源状态设置框架。用 pm-utils 来实现睡眠和休眠操作。

安装 pm-utils:

# pacman -S pm-utils

配置休眠功能:

如果要启用休眠功能,编辑 /boot/grub/menu.lst 文件,将 resume=/path/to/swap/drive 加入到内核选项中:

# (0) Arch Linux
title  Arch Linux
root   (hd0,5)
kernel /vmlinuz26 root=/dev/sda5 resume=/dev/sda7 ro
initrd /kernel26.img

0

这样,进入休眠状态后,计算机会把内存中的所有信息保存到 swap 分区。当然,你的 swap 要有足够的空间。

使用 pm-utils:

待机(睡眠):

pm-suspend

休眠:

pm-hibernate

这两个命令都需要 root 权限。

4,亮度调节

准确的说,这并不是一个工具,要调节屏幕亮度,除了可以使用 Fn + 相应按键外,可以通过一下方法来实现:

1),查看挡位:

cat /proc/acpi/video/.../brightness
#在我的机器上是这个路径:/proc/acpi/video/VGA1/LCDD/brightness

输出如下:

levels:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
current: 15

levels 表示有多少个挡位,current 为当前挡位。

2),设置亮度:

echo -n 8 > /proc/acpi/video/VGA1/LCDD/brightness
# 将亮度调暗一半

写入这个文件需要 root 权限,所以,通常情况下,你需要这样:

su -c 'echo -n 8 > /proc/acpi/video/VGA1/LCDD/brightness'

三,配置 acpid

1,捕捉事件标签

每一个 acpi 事件,都对应一个标签。例如,我的机器上,按下睡眠按钮所对应的标签为 SLPB 。但是,不同的机器,这个标签是不一样的。要查看自己机器的 acpi 标签,可以在终端中运行(需 root 权限):

tail -f /var/log/messages.log
#打开 messages.log 文件,并实时读取文件末尾。

此时,执行你需要捕捉的 acpi 事件,观察终端。如,当按下电源键时:

Jun  1 16:21:46 HC-ASUS laptop-mode: enabled, not active
Jun  1 16:21:48 HC-ASUS logger: ACPI action undefined: AC0
Jun  1 16:21:48 HC-ASUS logger: ACPI group/action undefined: hotkey / ATKD
Jun  1 16:21:48 HC-ASUS logger: ACPI group/action undefined: processor / CPU0
Jun  1 16:21:48 HC-ASUS logger: ACPI group/action undefined: processor / CPU1
Jun  1 16:21:48 HC-ASUS laptop-mode: Laptop mode 
Jun  1 16:21:48 HC-ASUS laptop-mode: enabled, 
Jun  1 16:21:48 HC-ASUS laptop-mode: not active [unchanged]
Jun  1 16:22:52 HC-ASUS logger: ACPI group/action undefined: hotkey / ATKD
Jun  1 16:33:14 HC-ASUS logger: PowerButton pressed: PWRF

这里,按下电源按钮所对应的标签就为:PWRF 。查看其他 acpi 事件标签的方法类似。

2,定义事件动作

当 acpid 捕捉到 acpi 事件时,会传入文件 /etc/acpi/events/anything 里定义的脚本来处理。默认情况下,该文件为一下内容:

event=.*
action=/etc/acpi/handler.sh %e

也就是说,默认情况下,所有的事件都会传入 /etc/acpi/handler.sh 这个脚本来处理。参数 %e 是可选的,它的作用是将整个内核事件日志传给指定的程序。

/etc/acpi/handler.sh 是一个条件结构的脚本,根据不同的事件标签,执行不同的动作。
在电源按钮部分,其内容是:

button/power)
    #echo "PowerButton pressed!">/dev/tty5
    case "$2" in
        PWRF)   
    	    logger "PowerButton pressed: $2" 
    	    ;;
        *)      logger "ACPI action undefined: $2" ;;
    esac
        ;;

如果希望在按下电源后执行关机操作,那么就加入关机命令 halt ,睡眠则加入 pm-suspend ,休眠 pm-hibernate 。

button/power)
    #echo "PowerButton pressed!">/dev/tty5
    case "$2" in
        PWRF)   
    	    logger "PowerButton pressed: $2" 
            halt
            #pm-suspend
            #pm-hibernate
    	    ;;
        *)      logger "ACPI action undefined: $2" ;;
    esac
        ;;

在 handler.sh 中,已经包含了合上笔记本,AC 适配器,电池的事件,可以自行使用 cpufreq,pm-utils,以及改变亮度的方法来自由的配置 handler.sh 。

handler.sh 的具体配置,等到下一次再写吧。

ArchLinux 电源管理:acpid + cpufreq + pm-utils》上有4条评论

发表评论

电子邮件地址不会被公开。