简明 openSUSE 笔记本电池管理教程

简明 openSUSE 笔记本电池管理教程

  • 本文基于 openSUSE Tumbleweed 20201014,因 TLP 版本不同,不适用于 Leap 15.2*

引言

如果你是第一次在笔记本上安装 openSUSE ,它的表现可能偏离你的预期。不止一人表示 Linux 比 Windows 更加节省资源,但对于你来说,电池使用时间比起 Windows 大幅下降可不是节省资源的表现。在你决定回到 Windows 前,先冷静一下,你只是忘记告诉内核 “你该省电” 这个事实而已。

这确实算是个坏消息:本文的核心部分将在命令行下完成。不过别担心,配置完成后这些工具将会自动运行。然后你就可以忘掉这茬,享受与 Android 等嵌入式设备同源且智能的省电策略,直到你重新安装系统或者换新笔记本为止。

准备

我们需要两个工具:TLP 与 PowerTOP。在大多数情况下,openSUSE 已经在你的设备上安装了他们,作为 laptop 软件包模组的一部分。如果的确没有安装,使用如下命令行可以简单地安装他们。

sudo zypper in powertop tlp

配置

让我们先禁用电源管理程序:

sudo systemctl disable powertop
sudo systemctl disable tlp
sudo systemctl stop powertop
sudo systemctl stop tlp

我个人建议使用 TLP 管理电源,PowerTOP 仅作为监测工具使用,所以以下配置均基于 TLP。TLP 的配置文件存在于两个位置:

  • /etc/tlp.d/*.conf :插入的自定义配置,在 /etc/tlp.d/ 文件夹下的配置文件将按字母顺序读取并应用
  • /etc/tlp.conf :单文件用户配置

你可以自由决定配置文件存放的方式,但我建议使用配置文件夹,将属于不同部分的配置放入不同的文件。

CPU

CPU 的耗电大体符合以下公式:

功率 = 电容率 × 电压的平方 × 频率

功率代表能耗(Power),而电容率(Capacitance),与 CPU 的制程和工艺等相关,在 CPU 出厂时就已经确定下来。那么我们能改变的只有电压与频率,而频率与电压成正相关。所以当 CPU 在很高的频率上运行时,效能很高但耗电量很大。如果我们能在 CPU 运算量不大时,让它降频运行,这样我们就可以减少功率,同时我们可以降低电压,节约能源,并减少发热与风扇噪音。

Linux 下调整 CPU 的模块叫 CPU 调速器(Governor),Android 等基于 Linux 的嵌入式平台都会使用 CPU 调速器达到省电的效果,同样,你也能。

  • 如果你有 Android 平台的 CPU 调速器使用经验,请不要试着直接限制 CPU 的频率,那是在 ARM 平台上才有效的做法,在 X86 平台下对减轻能耗帮助甚微。*

Intel

较新的 Intel CPU 使用 intel_pstate 驱动,只支持两种调速器:

  • powersave :省电模式——内核理应默认运行在此模式下
  • performance :性能模式

具体配置文件如下:

/etc/tlp.d/01-cpu.conf
---------
CPU_SCALING_GOVERNOR_ON_AC=powersave
CPU_SCALING_GOVERNOR_ON_BAT=powersave

在直流电源与电池供电情况下都使用 powersave 调速器。X86 平台的 powersave 调速器不会限制你的最高频率,只是更加谨慎地增加频率,并在负载下降时更加积极的回到低频率。TLP 的开发者并不建议更改为其他调速器。

CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
CPU_ENERGY_PERF_POLICY_ON_BAT=power

以上两项配置决定了 CPU 的能源策略,在电池模式下省电,而在外部电源供电模式下偏向性能。

CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0

使用以上两项配置在电池供电时禁用自动超频,也就是关闭睿频。

SCHED_POWERSAVE_ON_AC=0
SCHED_POWERSAVE_ON_BAT=1

以上两项配置会在电池模式下根据负载自动缩减 CPU 核心数。

AMD 与旧款 Intel

AMD 与旧款 Intel 使用 acpi-cpufreq 驱动,故部分设置与 Intel 不同。这里仅仅贴出配置文件内容,建议阅读 TLP 官方文档以了解配置内容含义。

/etc/tlp.d/01-cpu.conf
---------
CPU_SCALING_GOVERNOR_ON_AC=ondemand
CPU_SCALING_GOVERNOR_ON_BAT=ondemand
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0
SCHED_POWERSAVE_ON_AC=0
SCHED_POWERSAVE_ON_BAT=1

USB 自动挂起设备

TLP 利用内核设置,自动将不使用的 USB 设备挂起以节电。

/etc/tlp.d/02-usb.conf
---------
USB_AUTOSUSPEND=1

ThinkPad 高级电池管理

ThinkPad 可以手动管理电池充电百分比。你需要提前安装 acpi_call 模块。

/etc/tlp.d/03-battery.conf
---------
START_CHARGE_THRESH_BAT0=80
# 开始充电阈值
STOP_CHARGE_THRESH_BAT0=85
# 停止充电阈值

应用

启动 TLP 服务:

sudo systemctl enable tlp

然后你就可以像我说的,忘掉这件事了。

实时监测

powertop 是个很好的实时监测工具,你只需要运行 sudo powertop 就可以获得相对友好的输出。


它可以显示特定进程与设备的耗电量。用 tab 在不同的标签页中切换。你看,我的电脑此刻的耗电速率为 9.94 瓦,甚至不及一个树梅派 4(5 伏 3 安即 15 瓦)。不过 ** 不要 ** 听从 PowerTOP 关于省电的建议,也不要在 systemd 上启用他——TLP 做的比他更好。同时 tlp-stat 命令也会输出有用的信息。

13赞

我的笔记本电池已经完蛋了,正在考虑要不要换一块电池 :rofl:

最好换一块,电池这种高能玩意坏起来可不是闹着玩的 :innocent:

1赞

非常棒的文章!
不过,似乎有两处小错误?
AC 应该是交流供电
还有

真的没写反吗
说错莫打(滑稽)

官方文档就是这样,有performance balance_performance balance_power power,性能从高到低,没打反。AC 是交流,但笔记本插的是直流啊,我所以说的直流。 :joy:

1赞

啊我懂了,这四个是 最佳性能、偏重性能、偏重省电、最佳省电
是那个 power 给我整蒙了 :rofl:
对于 AC,个人还是觉得直接 “电源供电” 更好 :upside_down_face:

已修改为 “外部电源供电”

联想笔记本电脑,在 windows 系统下面可以通过联想管家之类软件设置充电阈值。Linux 系统下面对于联想非 thinkpad 系列。应该如何设置呢?

据官网描述,TLP 目前只支持 ThinkPad。

Battery charge thresholds, discharge and recalibration are currently only supported for IBM/Lenovo ThinkPads

准确的说,现在 TLP 使用natacpi提供电池充电阈值管理功能,而natacpi是内核实现的,只要你的电脑驱动支持natacpi的电池管理,你就可以用,TLP 本身不会去判断你的电脑是不是 ThinkPad。

判断支持与否的方式很简单:

 grep '.*' /sys/class/power_supply/BAT?/*

如果出现类似下面的输出就可以使用 TLP 电池充电阈值管理功能:

/sys/class/power_supply/BAT0/charge_control_end_threshold:85
/sys/class/power_supply/BAT0/charge_control_start_threshold:80
2赞

如果要在 openSUSE Leap 15.2 上使用笔记本电池管理,请问该教程有什么需要改动的地方,或者有什么值得阅读参考的教程或文档吗?

编辑 /etc/default/tlp 就行,里边注释写得挺详细,最好注释掉旧选项,省得翻车改不回来 :rofl:

2赞

建议阅读官方文档:

1赞

我测试了以下,看来我的电脑驱动不支持 natacpi 呀

那就确实没办法。电池管理、风扇调速这种功能都是 ACPI 暴露出来的,要搞 ACPI 就必须有驱动,Dell 与 Thinkpad 都支持 natacpi。

当然如果想自己动手也不是不行。理论上你只需要知道 Windows 上用的是什么 ACPI 调用,然后装上acpi_call内核模块,自己写脚本去修改,echo '<call>' | sudo tee /proc/acpi/call,虽然不一定能用就是了:rofl:

我的也是…

这篇文章或许可以并入 wiki

刚刚看完 systemctl 的简介,然后发现 tlp 是默认禁用的。

Dell Precision 系列移动工作站允许手动在 BIOS 里设置电池充电阈值。

ThinkPad P/T/X 系列在 /etc/default/tlp 里设置电池充电阈值。

START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80

HP 至少在 EliteBook 系列里无论 BIOS 和 tlp 都没法设置电池充电阈值,之前用鼓包过一个电池。

1赞