風扇轉速控制 - 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
- 使用「模板:風格」標記的頁面或章節

風扇轉速控制
新增話題