风扇速度控制

来自 ArchWiki
(重定向自 Fancontrol

风扇控制可以为您的系统带来各种好处,例如更安静的工作系统以及通过在低 CPU 负载时完全停止风扇来节省电能。

警告: 在高系统负载下配置或完全停止风扇可能会导致硬件永久损坏,或者最多只是热节流。

概览

此文章或章节需要语言、wiki 语法或风格方面的改进。请参阅 Help:Style 以供参考。

原因: 该注释应与引言合并,工具应留在各自的章节(如果有),而其余的应放在底部的“包罗万象”章节中(标题合适吗?)。(在 Talk:Fan speed control 中讨论)
注意: 笔记本电脑用户应了解其硬件中的散热系统的工作方式。有些笔记本电脑只有一个风扇用于 CPU 和 GPU,同时为两者散热。有些笔记本电脑有两个风扇分别用于 CPU 和 GPU,但第一个风扇同时为 CPU 和 GPU 散热,而另一个风扇仅为 CPU 散热。在某些情况下,由于不兼容的散热架构(例如,一个风扇用于 GPU 和 CPU),您将无法使用 Fancontrol 脚本。有关此主题的更多信息,请参阅 [1]

对于台式机和笔记本电脑,有多种可行的风扇控制解决方案。取决于您的需求

Fancontrol (lm-sensors)

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

较新的主板可能尚未获得 Linux 内核的支持。查看 lm-sensors 设备(存档) 表,查看是否有适用于此类主板的实验性驱动程序。

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 值,则可能需要#增加传感器的风扇分频器。如果风扇速度显示且高于 0,则表示正常。

配置

传感器正确配置后,使用 pwmconfig(8) 测试和配置风扇速度控制。按照指南操作应创建 /etc/fancontrol,这是一个自定义配置文件。在指南中,如果您在不键入任何内容的情况下按 Enter 键,则括号中的是默认答案。输入 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 也可以通过启动/启用 fancontrol.service 运行。

对于非官方 GUI,安装 fancontrol-guiAURfancontrol-kcmAUR[损坏的链接:未找到软件包]

Fancontrol 在挂起-唤醒循环后停止工作

不幸的是,fancontrol 在挂起后无法工作。根据 已提交的错误,您必须在挂起后重启 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 [2]重启 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 查看所有选项。有关配置的更多信息,请访问 上游 wiki

戴尔笔记本电脑

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

如果 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 桌面小程序运行。
  • dell-bios-fan-control-gitAUR — 如果您的 BIOS 覆盖了风扇控制,则推荐使用。

配置

风扇改变速度的温度点可以在配置文件 /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 °C 时以低速启动风扇,并在 75 °C 时切换到高速。一旦温度降至 65 °C,风扇将切换回低速,并在 45 °C 时完全关闭。

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

作为服务安装

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

BIOS 覆盖风扇控制

一些较新的笔记本电脑具有 BIOS 风扇控制功能,它会覆盖操作系统级别的风扇控制。要测试是否是这种情况,请在命令行中以 verbose 模式运行 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。如果需要 GUI,可以使用 thinkfan-uiAUR。然后查看以下文件

# pacman -Ql thinkfan

请注意,thinkfan 软件包安装了 /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 最高速度
自动 默认 - 自动,风扇转速由 BIOS 控制
全速 / 脱离 最大风扇速度;此处控制器不监控风扇速度

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

“7”与“脱离”不同。“7”是最大调节速度(对应于“全速”)。脱离是最大非调节速度。有关更多详细信息,请参阅 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:Fan speed control/thinkfan#Configuration 中找到。

运行

您可以首先手动运行 thinkfan(以 root 身份)来测试您的配置

# thinkfan -n

并查看它对您正在运行的其他程序的负载级别的反应。

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

Lenovo Legions 笔记本电脑

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

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

ASUS 笔记本电脑

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

内核模块

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

asus-nb-wmi

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

以下是控制它的命令。检查您是否可以控制风扇

# echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1           # Full fan speed (Value: 255)
# echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1             # Fan is stopped (Value: 0)
# echo 2 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable      # Change fan mode to automatic
# echo 1 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable      # Change fan mode to manual
# echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable      # Change fan mode to full speed

如果您可以使用上述命令修改风扇速度,请继续 #使用 pwmconfig 生成配置文件

asus_fan

asus_fan 是一个内核模块,它允许控制某些较旧的 ASUS 笔记本电脑上的两个风扇。它不适用于最新的型号。

安装 DKMS asus-fan-dkms-gitAUR 内核模块,提供 asus_fan

# modprobe asus_fan

检查您是否可以控制两个风扇

# echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1          # Full CPU fan speed (Value: 255)
# echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1            # CPU fan is stopped (Value: 0)
# echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2          # Full GFX fan speed (Value: 255)
# echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2            # GFX fan is stopped (Value: 0)
# echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable     # Change CPU fan mode to automatic
# echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable     # Change CPU fan mode to manual
# echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable     # Change GFX fan mode to automatic
# echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable     # Change GFX fan mode to manual
# cat /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/temp1_input          # Display GFX temperature (will always be 0 when GFX is disabled/unused)

如果一切正常,您可以在启动时加载模块 以自动化此步骤。

使用 pwmconfig 生成配置文件

如果您在使用 pwmconfig 生成配置文件时收到错误 There are no working fan sensors, all readings are 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 # silent mode
# ec_probe write 0x5e 0x40 # balance mode
# ec_probe write 0x5e 0xC0 # performance mode

这里我们写入寄存器 0x5e,它负责设置风扇速度模式。

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

设置散热策略

除了手动控制风扇速度(使用 asus-nb-wmi)之外,还可以设置散热策略以获得或多或少激进的风扇控制策略。可能的值为 0(默认)、1(超频加速)和 2(静音)。

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

某些 TUF 系列笔记本电脑上的风扇控制模式

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

$ cat /sys/devices/platform/asus-nb-wmi/fan_boost_mode
注意: 在某些笔记本电脑上,此设置可能位于 /sys/devices/platform/asus-nb-wmi/throttle_thermal_policy

当您按下 Fn+F5 时,您可以查看值的变化。0 是“正常模式”,1 是“性能模式”,2 很可能是“静音模式”。[3] 也可以将这些值写入 fan_boost_mode 文件中(以 root 身份),并获得所需的效果。

这已在 ASUS TUF FX504GE 和 ASUS TUF FX504GD 型号上进行了测试,发现可以正常工作。

您可以使用 tuf-fan-boost-notification-gitAUR 在每次 FanSpeed 模式更改时获取通知。

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
警告: 由于驱动程序错误,将风扇速度重置为自动可能不起作用,可能需要重启驱动程序作为解决方法。

风扇曲线控制

较新的 AMD 显卡(例如 RDNA3 显卡)由于固件限制而不支持手动风扇控制 [4]。对于这些情况,AMD 提供了 fan_curve sysfs api 用于控制风扇曲线,有关其更多信息,请参阅 [5]

amdgpu-fan

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

speed_matrix:  # -[temp(*C), speed(0-100%)]
- [0, 0]
- [40, 30]
- [60, 50]
- [80, 100]

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

amdfand-bin

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

对于此工具,还有可用的 GUI 客户端: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

这以 °C 为单位输出 GPU 温度 + 三个零,例如 33000 表示 33°C。

bash 脚本 amdgpu-fancontrol (由 grmat 开发) 通过使用所述的 sysfs hwmon 功能,提供全自动风扇控制。它还允许通过在脚本顶部提供抽象的配置字段,方便地调整风扇曲线的温度/PWM 周期分配和迟滞。

提示: 为了正常运行,该脚本至少需要三个已定义的温度/PWM 周期分配。

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

设置风扇曲线脚本

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

可能还需要在休眠后通过 root-resume.service 重启脚本,以使其再次自动正常运行。

/etc/systemd/system/root-resume.service
[Unit]
Description=Local system resume actions
After=suspend.target

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

[Install]
WantedBy=suspend.target

故障排除

增加传感器的风扇分频系数

如果 sensors 没有输出 CPU 风扇转速 (RPM),则可能需要更改风扇分频系数。

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 读数。 如果没有,请将分频系数增加到 8、16 或 32。您的结果可能会有所不同。

设备路径在 /etc/fancontrol 中已更改

位于 /sys/class/hwmon/ 中的枚举 hwmon 符号链接的顺序可能会有所不同,因为内核模块不会在每次启动时以一致的顺序加载。 因此,这可能会导致 fancontrol 无法正常工作。 错误信息是“Configuration appears to be outdated, please run pwmconfig again”(配置似乎已过时,请再次运行 pwmconfig)。 上游错误

解决方案

/etc/conf.d/lm_sensors 中,有两个数组列出了当您执行 sensors-detect 时检测到的所有模块。 这些模块由 fancontrol 加载。 如果该文件不存在,请以 root 身份运行 sensors-detect,接受默认值。 打开(或创建)/etc/modules-load.d/modules.conf。 从 /etc/conf.d/lm_sensors 中的 2 个变量中获取列出的所有模块,并将它们放入 /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 路径。 从之前的示例

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

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

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

# BEFORE
FCTEMPS=hwmon2/pwm1=hwmon3/temp1_input
# AFTER
FCTEMPS=hwmon2/pwm1=/sys/devices/platform/coretemp.0/temp1_input

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