风扇转速控制

来自 Arch Linux 中文维基
(重定向自Fan speed control

风扇控制可以为您的系统带来多种好处,例如在低 CPU 负载时完全停止风扇运行,从而使系统工作更安静并节省电力。

警告: 在高系统负载时配置或完全停止风扇可能会导致硬件永久损坏,或者至少导致热限制。

概述[编辑 | 编辑源代码]

本文或本章节的语言、语法或风格需要改进。参考:Help:Style

原因:笔记应该与介绍合并,如果工具有各自部分的话,应该留在相应的部分,其余的应该放在底部的一个“大杂烩”部分。(带适当的标题?)(在Talk:风扇转速控制讨论)
注意: 笔记本电脑用户应该了解他们的硬件中的冷却系统是如何工作的。一些笔记本电脑有一个风扇同时为 CPU 和 GPU 散热。一些笔记本电脑有 CPU 和 GPU 各一个风扇,但第一个风扇同时为 CPU 和 GPU 散热,而另一个只冷却 CPU。在某些情况下,由于散热架构不兼容(例如,一个风扇同时用于 GPU 和 CPU),您将无法使用 Fancontrol 脚本。这里有更多关于这个话题的信息。

有多种适用于台式机和笔记本电脑的风扇控制解决方案。根据您的需求:

  • Fancontrol(lm-sensors) — 一个用 Bash 编写的脚本,用于配置风扇速度。最适合那些通过 sysfs(5) 提供风扇控制的台式机和笔记本电脑。
  • fan2go-gitAUR — 一个独立于设备路径的 Fancontrol 替代品。
  • MControlCenter — 用于 MSI 笔记本电脑的风扇控制应用程序。
  • CoolerControlAUR — 一个带有 GUI 的风扇控制守护进程,适用于 sysfsliquidctl 设备。

Fancontrol(lm-sensors)[编辑 | 编辑源代码]

fancontrollm_sensors 的一部分,可以用来控制 CPU/机箱风扇的速度。

传感器驱动[编辑 | 编辑源代码]

许多较新主板的传感器仍然未受到 Kernel 内建驱动的支持,检查此表 lm-sensors devices 来确认驱动支持情况。

lm-sensors[编辑 | 编辑源代码]

首先需要执行以下命令:

# sensors-detect

这将检测出所有存在的传感器,并且它们将被用于 fancontrol。之后,运行以下命令以检查是否正确检测到了传感器:

$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0:      +29.0°C  (high = +76.0°C, crit = +100.0°C)
...


it8718-isa-0290
Adapter: ISA adapter
Vcc:         +1.14 V  (min =  +0.00 V, max =  +4.08 V)
VTT:         +2.08 V  (min =  +0.00 V, max =  +4.08 V)
+3.3V:       +3.33 V  (min =  +0.00 V, max =  +4.08 V)
NB Vcore:    +0.03 V  (min =  +0.00 V, max =  +4.08 V)
VDRAM:       +2.13 V  (min =  +0.00 V, max =  +4.08 V)
fan1:        690 RPM  (min =   10 RPM)
temp1:       +37.5°C  (low  = +129.5°C, high = +129.5°C)  sensor = thermistor
temp2:       +25.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermal diode
注意: 如果输出没有显示 CPU 风扇的 RPM(每分钟转数)值,可能需要 #提高传感器的 fan divisor。正常情况下,显示风扇转速且高于 0。

配置[编辑 | 编辑源代码]

传感器正确配置后,使用 pwmconfig(8) 来测试和配置风扇速度控制。按照指南操作应该会创建 /etc/fancontrol,一个自定义的配置文件。在指南中,如果你直接按回车而不输入任何内容,默认答案会放在括号内。输入 y 表示是,n 表示否。

# pwmconfig
注意: 一些用户在他们的配置文件中使用 /sys/class/hwmon/ 路径时可能会遇到问题。hwmon 类设备的符号链接指向绝对路径,并且被用来将所有的 hwmon 传感器集中到一个目录下,以便于访问。有时,hwmon 设备的顺序在重启后会改变,导致 fancontrol 停止工作。有关如何解决这个问题的更多信息,请参阅 #/etc/fancontrol 中设备路径改变

提示与技巧[编辑 | 编辑源代码]

有些用户在以 root 权限运行 pwmconfig 后可能想要手动调整配置文件,通常是为了修复某些问题。有关手动调整 /etc/fancontrol 配置文件,请参见 fancontrol(8) 查看变量定义。

用户可能会像上面在 #Fancontrol(lm-sensors) 所提到的那样遇到 hwmon 路径问题。有关更多信息,请参见 #/etc/fancontrol 中设备路径改变

提示:使用 MAXPWMMINPWM 选项来限制风扇速度范围。详情请参阅 fancontrol(8)
注意: 温度和风扇传感器路径也可能改变(通常在内核更新时)(例如 hwmon0/device/temp1_input 变为 hwmon0/temp1_input)。检查 fancontrol.service单元状态以找出哪个路径是问题所在,并相应地更正您的配置文件。

运行 Fancontrol[编辑 | 编辑源代码]

尝试运行 fancontrol

 # fancontrol

一个正确配置的设置将不会输出错误,并将接管系统风扇的控制。用户在执行此命令后不久应该能听到系统风扇开始运转。也可以通过启动/启用 fancontrol.service 来运行 fancontrol

对于非官方的图形用户界面,可以安装 fancontrol-guiAURfancontrol-kcmAUR

Fancontrol 在挂起并唤醒后停止工作[编辑 | 编辑源代码]

不幸的是,fancontrol 在挂起后无法正常工作。根据已报告 bug,您将不得不在挂起后重新启动 fancontrol。这可以通过 Systemd 钩子自动实现。

NBFC(笔记本风扇控制)[编辑 | 编辑源代码]

注意: NBFC 自 2020 年 3 月 29 日以来就未被维护。新用户配置仍然可以手动创建,然而自那时以来没有添加过预定义配置。存在一些分支添加了新配置,例如 nbfc-revive

NBFC 是一个跨平台的笔记本电脑风扇控制解决方案。它配备了一个强大的配置系统,可以调整以适应许多不同的笔记本电脑型号,包括一些最新的型号。

安装[编辑 | 编辑源代码]

NBFC 可以通过 nbfcAURnbfc-gitAUR 安装。同时,启动/启用 nbfc.service

配置[编辑 | 编辑源代码]

NBFC 提供了预制的配置文件。您可以在 /opt/nbfc/Configs/ 目录中找到它们。应用这些配置文件时,请使用没有文件扩展名的确切配置文件名(例如,some profile.xml 变为 "some profile")。

检查 NBFC 是否有任何推荐设置:

$ nbfc config -r

如果您至少有一个型号,请尝试应用此配置文件,并查看风扇速度是如何被控制的。例如:

$ nbfc config -a "Asus Zenbook UX430UA"
注意: 如果您遇到错误 File Descriptor does not support writing,请删除 StagWare.Plugins.ECSysLinux.dll[1]重启nbfc.service
# mv /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll.old

如果上述解决方案没有帮助,尝试将 ec_sys.write_support=1 添加到内核参数

如果您没有找到推荐的模型,请前往 NBFC Git 仓库或在/opt/nbfc/Configs/查看是否有来自同一制造商的类似模型可用。例如,在华硕 Zenbook UX430UQ上,配置华硕 Zenbook UX430UA 运行并不理想(风扇始终完全停止),但华硕 Zenbook UX410UQ 运行得非常好。

运行 nbfc 以查看所有选项。有关配置的更多信息可在上游维基上找到。

Dell 笔记本电脑[编辑 | 编辑源代码]

i8kutils 是一个守护进程,用于根据 CPU 温度配置某些戴尔 Inspiron 和 Latitude 笔记本电脑的风扇速度。它使用由 i8k 驱动程序提供的 /proc/i8k 接口(dell_smm_hwmon 的别名)。结果会根据不同的笔记本电脑型号而有所不同。

如果 fancontrol 在您的系统上无法工作,请使用 ignore_dmi=1 内核模块参数 来加载 dell_smm_hwmon

警告: i8kutils BIOS 系统调用在某些系统上会暂时停止内核(在戴尔 9560 上已确认),这可能导致像音频中断这样的副作用,参见 https://bugzilla.kernel.org/show_bug.cgi?id=201097

安装[编辑 | 编辑源代码]

i8kutilsAUR 是控制风扇速度的主要包。此外,您可能还想安装以下软件包:

  • acpi — 使用 i8kmon 必须安装。
  • tcl — 必须安装以便将 i8kmon 作为后台服务运行(使用 --daemon 选项)。
  • tk — 必须与 tcl 一起安装,以便作为 X11 桌面小程序运行。

配置[编辑 | 编辑源代码]

风扇改变转速的温度点可以在配置文件 /etc/i8kutils/i8kmon.conf 中进行调整。只支持三种风扇速度(高、低和关闭)。查找类似于以下的部分:

set config(0)  {{0 0}  -1  55  -1  55}
set config(1)  {{1 1}  45  75  45  75}
set config(2)  {{2 2}  65 128  65 128}

这个示例在 CPU 温度达到 55 摄氏度时以低速启动风扇,在 75 摄氏度时切换到高速。一旦温度下降到 65 摄氏度,风扇将切换回低速,并在 45 摄氏度时完全关闭。

提示:如果在运行带详细输出选项的 i8kmon 时注意到状态变化(输出示例:# (57>=55), state=1, low=45, high=75)但左右风扇报告状态为 0,可能需要考虑在配置文件中将第一个状态的速度值从默认的 1000 更改为 2000 或更高。

作为服务安装[编辑 | 编辑源代码]

i8kmon 可以通过启动/启用 i8kmon.service 自动启动。

BIOS 覆盖风扇控制[编辑 | 编辑源代码]

一些较新的笔记本电脑拥有 BIOS 风扇控制,这将覆盖操作系统级别的风扇控制。要测试是否是这种情况,请在命令行中以详细模式运行 i8kmon,确保 CPU 处于空闲状态,然后观察风扇是否相应地关闭或降低转速。

如果 BIOS 风扇控制确实存在,你可以尝试使用 dell-bios-fan-control-gitAUR

警告: 关闭 BIOS 风扇控制可能会导致硬件损坏。确保你事先正确设置了 i8kmon,或者在测试这个程序时让 CPU 保持空闲。

启用 BIOS 风扇控制:

# dell-bios-fan-control 1

禁用 BIOS 风扇控制:

# dell-bios-fan-control 0

BIOS 风扇控制可以通过启动/启用 dell-bios-fan-control.service 自动禁用。

联想 ThinkPad 笔记本电脑[编辑 | 编辑源代码]

一些风扇控制守护进程包括 simpfand-gitAURthinkfanAUR(推荐)。

安装[编辑 | 编辑源代码]

安装 thinkfanAURthinkfan-gitAUR。可选但推荐安装 lm_sensors。如果需要,可以使用 thinkfan-uiAUR 提供图形界面。然后查看以下文件:

# pacman -Ql thinkfan

请注意,thinkfanAUR 包安装了 /usr/lib/modprobe.d/thinkpad_acpi.conf,其中包含以下内核模块参数

options thinkpad_acpi fan_control=1
注意: 新的 Thinkpad 型号可能需要额外的 experimental=1 内核模块参数。因此,检查风扇功能非常重要。

所以风扇控制默认是启用的。

现在,加载模块:

# modprobe thinkpad_acpi
# cat /proc/acpi/ibm/fan

你应该看到风扇级别默认是 "auto",但你可以通过向同一文件回显一个级别命令来手动控制风扇速度:

# echo level 1 > /proc/acpi/ibm/fan
风扇级别
级别 效果
0 关闭
2 低速
4 中速
7 最高速
auto 默认 - 自动,风扇转速由 BIOS 控制
full-speed 在监控下的最大风扇速度
disengaged 甚至更快的速度,控制器不监控风扇速度

thinkfan 守护进程将自动执行这些操作。

7 并不等同于 disengaged7 是最大调节速度(对应 full-speed)。而 disengaged 是最大非调节速度。详情请见 ThinkWiki

最后,启用 thinkfan.service

要配置温度阈值,你需要将示例配置文件(/usr/share/doc/thinkfan/examples/thinkfan.yaml)复制到 /etc/thinkfan.conf,并根据个人喜好进行修改。此文件指定了要读取哪些传感器,以及使用哪个接口来控制风扇。有些系统有 /proc/acpi/ibm/fan/proc/acpi/ibm/thermal 可用;在其他系统上,你可能需要指定类似:

hwmon: /sys/devices/virtual/thermal/thermal_zone0/temp

来使用通用的 hwmon 传感器,而不是特定于 thinkpad 的传感器。

配置示例可以在 Gentoo:风扇转速控制/thinkfan#配置(en) 中找到。

运行[编辑 | 编辑源代码]

你可以首先手动以 root 身份运行 thinkfan 来测试你的配置:

# thinkfan -n

并观察它对其他正在运行的程序的负载水平的反应。

当你正确配置后,启动/启用 thinkfan.service


联想 Legion 笔记本电脑[编辑 | 编辑源代码]

工具 Lenovo Legion Linux 允许更改存储在嵌入式控制器中的风扇曲线。它由一个必须编译和加载的内核模块组成。目前没有现成的软件包,而是需要从源代码编译和安装。

然后,可以通过 hwmon 接口设置风扇曲线。这可以使用提供的脚本或 Python GUI 来完成。

ASUS 笔记本电脑[编辑 | 编辑源代码]

本主题将介绍华硕笔记本电脑上用于 Fancontrol(lm-sensors)的驱动程序配置。

内核模块[编辑 | 编辑源代码]

在配置文件中,我们将使用完整的 sysfs 文件路径(例如 /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1)。这是因为重启后 hwmon1 可能会变成其他任何数字。由于 Fancontrol (lm-sensors) 是用 Bash 编写的,所以在配置文件中使用这些路径是完全可以接受的。你可以在 ASUS N550JV#风扇控制英语ASUS N550JV#Fan control找到完整的 /etc/fancontrol 配置文件示例。

asus-nb-wmi[编辑 | 编辑源代码]

asus-nb-wmi 是一个内核模块,包含在 Linux 内核中,并且在华硕笔记本电脑上会自动加载。它只允许控制单个风扇,如果有第二个风扇,你将无法对其进行控制。请注意,将此模块加入黑名单将阻止键盘背光工作。

以下是控制风扇的命令。检查你是否可以控制你的风扇:

# echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1           # 风扇全速 (值: 255)
# echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1             # 风扇停止 (值: 0)
# echo 2 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable      # 将风扇模式改为自动
# echo 1 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable      # 将风扇模式改为手动
# echo 0 > /sys/devices/platform/asus-asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable # 将风扇模式改为全速

如果以上命令能够修改风扇速度,那么继续进行 #使用 pwmconfig 生成配置文件

asus_fan[编辑 | 编辑源代码]

asus_fan 是一个内核模块,它允许在一些旧的 ASUS 笔记本电脑上同时控制两个风扇。它在最新的型号上不起作用。

安装使用 DKMSasus-fan-dkms-gitAUR 内核模块, 提供 asus_fan

# modprobe asus_fan

检查你是否能够控制两个风扇:

# echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1          # CPU 风扇全速 (值: 255)
# echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1            # CPU 风扇停止 (值: 0)
# echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2          # GPU 风扇全速 (值: 255)
# echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2            # GPU 风扇停止 (值: 0)
# echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable     # 将 CPU 风扇模式改为自动
# echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable     # 将 CPU 风扇模式改为手动
# echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable     # 将 GPU 风扇模式改为自动
# echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable     # 将 GPU 风扇模式改为手动
# cat /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/temp1_input          # 显示 GPU 温度 (当 GPU 被禁用/未使用时总是为 0)

如果一切正常工作,你可以在启动时加载内核模块以自动化这一步骤。

使用 pwmconfig 生成配置文件[编辑 | 编辑源代码]

如果在用 pwmconfig 生成配置文件时出现错误 没有工作的风扇传感器,所有读数都是 0,请首先打开一个控制台并执行:

# watch -n 1 "echo 2 > /sys/devices/platform/'kernel_module'/hwmon/hwmon[[:print:]]*/pwm1_enable"

如果你使用的是 asus_fan 内核模块并且有第二个风扇,在第二个控制台:

# watch -n 1 "echo 2 > /sys/devices/platform/'kernel_module'/hwmon/hwmon[[:print:]]*/pwm2_enable"

最后,在第三个控制台:

# pwmconfig

一旦你完成并且配置文件生成后,你应该停止第一个和第二个控制台。继续进行 #Fancontrol(lm-sensors)。生成配置文件后,你可能需要手动将 PWM 值替换为完整的 sysfs 路径,因为 hwmon 数字值在重启后可能会改变。

使用 EC 寄存器的替代方法[编辑 | 编辑源代码]

如果上述方法对您不起作用,另一种方法是直接向嵌入式控制器(EC)中的特定寄存器写入数据。使用 EC-Probe 工具,您可以将风扇模式设置为三种风扇速度模式之一,前提是您的型号在 Windows 中提供了这样的功能。

在 ASUS FX504GD 型号中,将风扇速度设置为三种模式之一使用这些寄存器值:

# ec_probe write 0x5e 0x80 # 静音模式
# ec_probe write 0x5e 0x40 # 平衡模式
# ec_probe write 0x5e 0xC0 # 性能模式

在这里,我们向负责设置风扇速度模式的寄存器 0x5e 写入数据。

如果这些值对您不起作用,请在 Windows 中以监视模式运行 ec-probe 工具,并尝试识别在切换风扇速度模式时哪个 EC 寄存器的值发生了变化。

设置热限制策略[编辑 | 编辑源代码]

除了使用 asus-nb-wmi 手动控制风扇速度外,还可以设置热限制策略,以实现更激进或更保守的风扇控制策略。可能的数值包括 0(默认),1(超增压),和 2(静音)。

# echo 数值 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/throttle_thermal_policy

某些 TUF 系列笔记本电脑上的风扇控制模式[编辑 | 编辑源代码]

在某些华硕 TUF 系列笔记本电脑上,可以使用 Fn+F5 更改性能和风扇控制模式。可以通过运行以下命令来查看当前模式:

$ cat /sys/devices/platform/asus-nb-wmi/fan_boost_mode

当您使用 Fn+F5 时,可以观察到值的变化。0 表示“普通模式”,1 表示“性能模式”,2 很可能是“静音模式”。[2] 也可以作为 root 将这些值写入 fan_boost_mode 文件,以获得预期效果。

这已在华硕 TUF FX504GE 和 ASUS TUF FX504GD 型号上进行了测试,并发现有效。

您可以使用 tuf-fan-boost-notification-gitAUR 在每次风扇速度模式更改时获得通知。

AMDGPU sysfs 风扇控制[编辑 | 编辑源代码]

AMDGPU 内核驱动通过 sysfs 中的 hwmon 提供显卡风扇控制。

手动控制配置[编辑 | 编辑源代码]

要从自动切换到手动风扇控制,运行以下命令:

# echo "1" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable

设置风扇速度,例如50%(100%是255个PWM周期,因此通过将所需风扇速度的百分比乘以2.55来计算):

# echo "128" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1

要重置为自动风扇控制,运行以下命令:

# echo "2" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable
警告: 由于驱动程序的错误,重置风扇速度到自动可能不起作用,作为解决方法,可能需要重新启动驱动程序。
注意: 在 RDNA3 GPU 上,由于固件限制,无法手动调整风扇速度,然而,截至 2023 年 8 月 9 日,正在开发用于调整风扇曲线的接口。[3]

amdgpu-fan[编辑 | 编辑源代码]

amdgpu-fanAUR 软件包是一个用 Python 编写的自动化风扇控制器,适用于启用 AMDGPU 的显卡。它使用“速度矩阵”来匹配 GPU 温度与风扇频率,例如:

speed_matrix:  # -[温度(*C), 速度(0-100%)]
- [0, 0]
- [40, 30]
- [60, 50]
- [80, 100]

通过启动/启用 amdgpu-fan.service 来启动风扇控制服务。

amdfand-bin[编辑 | 编辑源代码]

amdfand-binAUR 软件包是 amdgpu-fanAUR 的原生替代品。通过启动/启用 amdfand.service 来启动风扇控制服务。

对于这个工具,还有图形界面客户端可用:amdguid-glow-binAUR(Xorg)和 amdguid-wayland-binAUR(Wayland)。在启动客户端之前,您需要启用/启动 amdgui-helper.service

fancurve 脚本[编辑 | 编辑源代码]

不仅风扇控制通过 sysfs 中的 hwmon 提供,GPU 温度读取也同样可用:

# cat /sys/class/drm/card0/device/hwmon/hwmon0/temp1_input

这将输出 GPU 温度,单位为摄氏度,后跟三个零,例如 33000 代表 33°C。

由 grmat 编写的 bash 脚本 amdgpu-fancontrol 提供了一个完全自动的风扇控制,它使用了上述的 sysfs hwmon 功能。它还允许用户方便地调整风扇曲线的温度/PWM周期的分配,并通过在脚本顶部提供抽象化的配置字段来设置滞后性。

提示:为了正确工作,脚本至少需要定义三个温度/PWM周期的分配。

出于安全考虑,脚本在关机时会再次将风扇控制设置为自动。这可能会导致风扇加速旋转,可以通过在 function reset_on_fail 部分设置 set_fanmode 1 来解决这个问题,但这会牺牲一定的安全性。

设置 fancurve 脚本[编辑 | 编辑源代码]

要启动脚本,建议通过 systemd 初始化系统来进行。这样,脚本的详细输出可以通过 journalctl/systemctl status 来读取。为此,GitHub 仓库中已经包含了一个 .service 单元文件。

在休眠后,可能还需要通过 root-resume.service 重新启动脚本,以使其能够自动正常工作:

/etc/systemd/system/root-resume.service
[Unit]
Description=本地系统恢复动作
After=suspend.target

[Service]
Type=simple
ExecStart=/usr/bin/systemctl restart amdgpu-fancontrol.service

[Install]
WantedBy=suspend.target

问题解决[编辑 | 编辑源代码]

提高传感器的 fan divisor[编辑 | 编辑源代码]

如果 sensors 没有输出 CPU 风扇的 RPM(每分钟转数),可能需要更改 fan divisor(风扇除数)。

sensors 输出的第一行是主板用于读取温度和电压的芯片组名称。

/etc/sensors.d/ 中创建一个文件:

/etc/sensors.d/fan-speed-control.conf
chip "coretemp-isa-*"
set fanX_div 4

coretemp-isa- 替换为芯片组的名称,将 X 替换为要更改的 CPU 风扇编号。

保存文件,并以 root 用户运行:

# sensors -s

这将重新加载配置文件。

再次运行 sensors,并检查是否有 RPM 读数。如果没有,请将 fan divisor 增加到 81632。效果可能因人而异。

/etc/fancontrol 中设备路径改变[编辑 | 编辑源代码]

位于 /sys/class/hwmon/ 中的枚举 "hwmon" 符号链接的顺序可能会变化,因为内核模块每次启动时加载的顺序并不一致。这可能会导致 fancontrol 无法正常工作。错误提示是“Configuration appears to be outdated, please run pwmconfig again”。[上游 bug]

解决方案[编辑 | 编辑源代码]

/etc/conf.d/lm_sensors 中,有两个数组列出了执行 sensors-detect 时检测到的所有模块。这些模块将由 fancontrol 加载。如果文件不存在,请以 root 身份运行 sensors-detect 并接受默认设置。打开(或创建)/etc/modules-load.d/modules.conf。从 /etc/conf.d/lm_sensors/ 中的两个变量获取所有列出的模块,并将它们放入 /etc/modules-load.d/modules.conf 文件中,每行一个模块。这样指定应该可以为模块定义一个加载顺序,这应该可以使 hwmon 路径保持在它们的位置,并且在每次启动时不会改变顺序。如果这不起作用,我强烈推荐寻找另一个程序来控制您的风扇。如果您找不到任何程序,那么您可以尝试使用下面的替代解决方案。

替代解决方案:绝对路径[编辑 | 编辑源代码]

fancontrol 中使用绝对文件路径默认情况下是不起作用的,因为它的辅助脚本 pwmconfig 被编程为只使用 hwmon 路径来获取文件。它这样做的方式是检测其配置文件 /etc/fancontrol 中提供的 hwmon 路径是否发生了变化,并使用变量 DEVNAMEDEVPATH 来确定这种变化。如果您的 hwmon 路径不断变化,这将阻止 fancontrol 运行,无论您做什么。然而,人们可以绕过这个问题。打开 /usr/bin/fancontrol,并注释掉脚本的这部分:


if ! ValidateDevices "$DEVPATH" "$DEVNAME"
 then
     echo "Configuration appears to be outdated, please run pwmconfig again" >&2
     exit 1
 fi
注意:
  • 这样做可能会使 fancontrol 写入您在配置文件中给出的文件,无论文件是什么。如果您提供了错误的路径,这可能会损坏文件。确保您使用的是文件的正确路径。
  • 另外要注意的是,在执行此解决方法时,再次使用 pwmconfig 创建脚本将覆盖您配置的所有绝对路径。因此,如果需要,最好手动将旧路径更改为新路径,而不是使用 pwmconfig

注释掉这部分应该可以有效地忽略 hwmon 验证检查。您也可以在配置文件中忽略变量 DEVNAMEDEVPATH。之后,将其他变量中的所有 hwmon 路径替换为其绝对路径。为了更方便,以 root 权限重新运行 pwmconfig 以刷新 hwmon 设备。配置文件中的 hwmon 路径现在应该指向正确的绝对路径。对于每个 hwmon 路径,运行以下命令(其中 Nhwmon 路径的枚举):

$ readlink -f /sys/class/hwmon/hwmonN/device

这将为您提供设备的绝对路径。

例如,/etc/fancontrol 文件列出 FCTEMPS 如下:

FCTEMPS=hwmon2/pwm1=hwmon3/temp1_input

执行 readlink -f /sys/class/hwmon/hwmon3/device 可以输出例如 /sys/devices/platform/coretemp.0/cd 进入此目录。如果您看到一个 /hwmon/hwmonN/ 目录,您必须在您的 fancontrol 配置文件中这样做,以替换 hwmonN 路径。根据前面的例子:

# 更改
FCTEMPS=hwmon2/pwm1=hwmon3/temp1_input
# 为
FCTEMPS=hwmon2/pwm1=/sys/devices/platform/coretemp.0/hwmon/[[:print:]]*/temp1_input

基本上,您必须将 hwmon 路径替换为绝对路径,并与 /hwmon/[[:print:]]*/ 连接,以便 bash 能够捕获随机枚举的 hwmon 名称。

如果您没有看到 /hwmon/hwmonN/ 目录,那么您就不必担心这个问题。这意味着温度文件位于设备目录的根目录中。只需将 hwmonN/ 替换为绝对文件路径。例如:

# 更改
FCTEMPS=hwmon2/pwm1=hwmon3/temp1_input
# 为
FCTEMPS=hwmon2/pwm1=/sys/devices/platform/coretemp.0/temp1_input

在替换了所有路径之后,fancontrol 应该可以正常工作。