风扇转速控制
风扇控制可以为您的系统带来多种好处,例如在低 CPU 负载时完全停止风扇运行,从而使系统工作更安静并节省电力。
概述[编辑 | 编辑源代码]
有多种适用于台式机和笔记本电脑的风扇控制解决方案。根据您的需求:
- Fancontrol(lm-sensors)——一个用 Bash 编写的脚本,用于配置风扇速度。最适合那些通过 sysfs(5) 提供风扇控制的台式机和笔记本电脑。
- NBFC(笔记本风扇控制)——一个跨平台的笔记本电脑风扇控制解决方案,用 C# 编写,在 Mono 运行时下工作。最适合最新型号,不受 Fancontrol 支持的笔记本电脑。
- NBFC-Linux——一个用 C 语言编写的轻量级 NBFC 实现。它不依赖于 Mono 框架,可以作为 nbfc-linuxAUR 或 nbfc-linux-gitAUR 安装。
- Dell 笔记本电脑——一些 Dell 笔记本电脑的替代风扇控制守护进程。
- 联想 ThinkPad 笔记本电脑——一些联想 ThinkPad 笔记本电脑的风扇配置。
- 联想 Legion 笔记本电脑——一些联想 Legion 笔记本电脑的风扇速度配置和其他设置。
- ASUS 笔记本电脑——为一些 ASUS 笔记本电脑配置 Fancontrol 或手动控制。
- AMDGPU sysfs 风扇控制——控制 AMDGPU 内核驱动提供的显卡风扇控制。
- fan2go-gitAUR——一个独立于设备路径的 Fancontrol 替代品。
- MControlCenter——用于 MSI 笔记本电脑的风扇控制应用程序。
- fw-ectool-gitAUR——Framework Laptop 的风扇配置。
- CoolerControlAUR——一个带有 GUI 的风扇控制守护进程,适用于
sysfs
和 liquidctl包 设备。
Fancontrol(lm-sensors)[编辑 | 编辑源代码]
fancontrol
是 lm_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
配置[编辑 | 编辑源代码]
传感器正确配置后,使用 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 中设备路径改变。
hwmon0/device/temp1_input
变为 hwmon0/temp1_input
)。检查 fancontrol.service
的单元状态以找出哪个路径是问题所在,并相应地更正您的配置文件。运行 Fancontrol[编辑 | 编辑源代码]
尝试运行 fancontrol
:
# fancontrol
一个正确配置的设置将不会输出错误,并将接管系统风扇的控制。用户在执行此命令后不久应该能听到系统风扇开始运转。也可以通过启动/启用 fancontrol.service
来运行 fancontrol
。
对于非官方的图形用户界面,可以安装 fancontrol-guiAUR 或 fancontrol-kcmAUR。
Fancontrol 在挂起并唤醒后停止工作[编辑 | 编辑源代码]
不幸的是,fancontrol
在挂起后无法正常工作。根据已报告 bug,您将不得不在挂起后重新启动 fancontrol
。这可以通过 Systemd 钩子自动实现。
NBFC(笔记本风扇控制)[编辑 | 编辑源代码]
NBFC 是一个跨平台的笔记本电脑风扇控制解决方案。它配备了一个强大的配置系统,可以调整以适应许多不同的笔记本电脑型号,包括一些最新的型号。
安装[编辑 | 编辑源代码]
NBFC 可以通过 nbfcAUR 或 nbfc-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
选项)。
- 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 摄氏度时以低速启动风扇,在 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:
i8kmon
,或者在测试这个程序时让 CPU 保持空闲。启用 BIOS 风扇控制:
# dell-bios-fan-control 1
禁用 BIOS 风扇控制:
# dell-bios-fan-control 0
BIOS 风扇控制可以通过启动/启用 dell-bios-fan-control.service
自动禁用。
联想 ThinkPad 笔记本电脑[编辑 | 编辑源代码]
一些风扇控制守护进程包括 simpfand-gitAUR 和 thinkfanAUR(推荐)。
安装[编辑 | 编辑源代码]
安装 thinkfanAUR 或 thinkfan-gitAUR。可选但推荐安装 lm_sensors包。如果需要,可以使用 thinkfan-uiAUR 提供图形界面。然后查看以下文件:
# pacman -Ql thinkfan
请注意,thinkfanAUR 包安装了 /usr/lib/modprobe.d/thinkpad_acpi.conf
,其中包含以下内核模块参数:
options thinkpad_acpi fan_control=1
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
并不等同于 disengaged
。7
是最大调节速度(对应 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#风扇控制找到完整的 /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 笔记本电脑上同时控制两个风扇。它在最新的型号上不起作用。
安装使用 DKMS 的 asus-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
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周期的分配,并通过在脚本顶部提供抽象化的配置字段来设置滞后性。
出于安全考虑,脚本在关机时会再次将风扇控制设置为自动。这可能会导致风扇加速旋转,可以通过在 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 增加到 8
、16
或 32
。效果可能因人而异。
/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
路径是否发生了变化,并使用变量 DEVNAME
和 DEVPATH
来确定这种变化。如果您的 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
验证检查。您也可以在配置文件中忽略变量 DEVNAME
和 DEVPATH
。之后,将其他变量中的所有 hwmon
路径替换为其绝对路径。为了更方便,以 root 权限重新运行 pwmconfig
以刷新 hwmon
设备。配置文件中的 hwmon
路径现在应该指向正确的绝对路径。对于每个 hwmon
路径,运行以下命令(其中 N
是 hwmon
路径的枚举):
$ 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
应该可以正常工作。