出自 Arch Linux 中文维基

風扇控制可以為您的系統帶來多種好處,例如在低 CPU 負載時完全停止風扇運行,從而使系統工作更安靜並節省電力。

警告: 在高系統負載時配置或完全停止風扇可能會導致硬體永久損壞,或者至少導致熱限制。

概述

本文或本章節的語言、語法或風格需要改進。參考:幫助:風格

原因:筆記應該與介紹合併,如果工具有各自部分的話,應該留在相應的部分,其餘的應該放在底部的一個「大雜燴」部分。(帶適當的標題?)(在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 應該可以正常工作。