风扇转速控制 - Arch Linux 中文维基

跳转到内容

# 风扇转速控制

来自 Arch Linux 中文维基

相关文章

- lm_sensors
CPU 电压下探（英语：Undervolting CPU）
- CPU 调频

翻译状态：

- 本文（或部分内容）译自 Fan speed control，最近一次同步于 2024-06-07，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

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

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

## 概述

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

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

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

- 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（英语：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

注意：如果输出没有显示 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 中设备路径改变。

提示：使用 `MAXPWM` 和 `MINPWM` 选项来限制风扇速度范围。详情请参阅 fancontrol(8)。
注意：温度和风扇传感器路径也可能改变（通常在内核更新时）（例如 `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 自 2020 年 3 月 29 日以来就未被维护。新用户配置仍然可以手动创建，然而自那时以来没有添加过预定义配置。存在一些分支添加了新配置，例如 nbfc-revive。

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` 选项）。

- 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 摄氏度时以低速启动风扇，在 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-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

注意：新的 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` 并不等同于 `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#风扇控制（英语：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 笔记本电脑上同时控制两个风扇。它在最新的型号上不起作用。

安装使用 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

警告：由于驱动程序的错误，重置风扇速度到自动可能不起作用，作为解决方法，可能需要重新启动驱动程序。
注意：在 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 增加到 `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` 应该可以正常工作。

分类：​

- CPU
- 使用“模板:风格”标记的页面或章节

风扇转速控制
添加话题