Post

HP Victus(光影精灵 10)在 Ubuntu 下的风扇控制修复

记录光影精灵 10 在 Ubuntu 下使用 omen-fan-control 恢复风扇转速读取、PWM 手动控制、自动曲线与 GUI 的完整过程。

HP Victus(光影精灵 10)在 Ubuntu 下的风扇控制修复

安装 Ubuntu 后,我的 HP Victus(光影精灵 10)出现了风扇无法正常控制的问题。经过排查,最终通过开源项目 omen-fan-control 恢复了风扇转速读取、PWM 手动控制、自动曲线与 GUI。

这篇文章整理了本次排查中真正有效的步骤,方便以后重装 Ubuntu 或升级内核后快速恢复。

修改内核驱动和散热控制逻辑存在风险。首次操作应先使用临时安装,确认转速读取、PWM 控制和温度均正常后,再进行永久安装。项目本身也明确声明不对硬件损坏或系统不稳定负责。

已验证环境

本次实际跑通的环境如下:

项目信息
机型Victus by HP Gaming Laptop 16-r0xxx
中文型号光影精灵 10
Product SKU8C5U0PA#AB2
主板8BC2
BIOSF.26
Ubuntu26.04
Kernel7.0.0-28-generic

最终验证结果:

功能结果
fan1 / fan2 转速读取正常
PWM 手动控制正常
Auto 模式正常
Manual 模式正常
Max 模式正常
Curve 模式正常
GUI正常

omen-fan-control 面向 HP OMEN、OMEN Max 与 Victus Linux 用户,通过修改版 hp-wmi 驱动暴露 PWM 接口,并提供 CLI、GUI、风扇曲线和后台服务。具体能力与最新安装方法应以项目 README为准。

安装前检查

查看机器信息

先确认机型、主板、BIOS 和当前内核:

1
2
3
4
5
echo "机型:$(cat /sys/class/dmi/id/product_name)"
echo "SKU:$(cat /sys/class/dmi/id/product_sku)"
echo "主板:$(cat /sys/class/dmi/id/board_name)"
echo "BIOS:$(cat /sys/class/dmi/id/bios_version)"
echo "内核:$(uname -r)"

在我的机器上,关键输出为:

1
2
3
4
机型:Victus by HP Gaming Laptop 16-r0xxx
SKU:8C5U0PA#AB2
主板:8BC2
BIOS:F.26

加载并检查 hp_wmi 驱动:

1
2
sudo modprobe hp_wmi
lsmod | grep hp_wmi

如果输出中存在 hp_wmi,说明驱动已经加载。

先检查原生驱动是否已经支持

Linux 内核仍在更新相关支持。以后重装 Ubuntu 或升级内核时,应先检查原生 hp_wmi 是否已经提供所需接口,不要直接安装补丁驱动。

1
2
3
find /sys/devices/platform/hp-wmi -type f \
  \( -name 'fan*_input' -o -name 'pwm1' -o -name 'pwm1_enable' \) \
  -print 2>/dev/null

理想情况下应同时存在:

1
2
3
4
fan1_input
fan2_input
pwm1
pwm1_enable

如果四个接口已经齐全,可以先跳到后文的“日常使用”进行测试;如果缺少 pwm1 或其他关键接口,再考虑安装 omen-fan-control 的补丁驱动。

安装 omen-fan-control

安装依赖

1
2
3
4
5
6
7
8
9
10
sudo apt update

sudo apt install -y \
  git \
  dkms \
  build-essential \
  linux-headers-$(uname -r) \
  python3-click \
  python3-pyqt6 \
  mokutil

项目需要当前内核对应的 headers、编译工具、Click 和 PyQt6。某些 Debian/Ubuntu 内核还需要额外的 common headers 或 kbuild 软件包;如果编译提示缺少内核构建文件,应按照项目 README 的 Dependencies 部分补齐与当前内核匹配的软件包。

下载项目

我将项目放在 ~/下载/

1
2
3
cd ~/下载
git clone https://github.com/arfelious/omen-fan-control.git
cd omen-fan-control

确认源码中仍包含 8BC2

项目会继续更新,所以每次重新下载后都建议检查一次:

1
grep -n "8BC2" -C 10 hp-wmi.c

本次使用的源码中可以看到:

1
2
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BC2") },
.driver_data = (void *)&omen_v1_thermal_params,

当前仓库的 hp-wmi.c 仍包含这项映射。不过,项目 README 的 Tested Hardware 列表没有明确列出 8BC2,因此本文只能说明这台具体机器实测可用,不能视作项目对所有 8BC2 机器的官方保证。

如果未来版本中找不到 8BC2,不要盲目安装,应重新确认项目的机型支持情况。

临时安装与验证

准备初始配置

本次安装曾遇到两条提示:

1
2
WARNING: Your board '8BC2' is not in the known compatible list.
Error: Please calibrate or set Manual Max RPM in Options.

虽然驱动源码中包含 8BC2,项目当时的已验证白名单并未包含它。为继续临时测试,先创建配置:

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/omen-fan-control

sudo tee /etc/omen-fan-control/config.json > /dev/null <<'EOF'
{
    "bypass_patch_warning": true,
    "fan_max": 6000
}
EOF

检查文件内容:

1
cat /etc/omen-fan-control/config.json

其中 6000 只是用于第一次安装时通过最大转速检查的初始值;这台机器之后实际校准得到约 6100 RPM

bypass_patch_warning 会绕过项目的兼容性警告。只有在确认源码映射、了解风险并准备使用临时驱动测试时才应启用。

首次只安装临时驱动

不要一开始就永久替换驱动。先执行:

1
2
cd ~/下载/omen-fan-control
sudo python3 omen_cli.py install-patch temporary

本次成功时输出:

1
2
Installing temporary driver...
Temporary driver installed successfully.

临时安装只对当前启动周期有效,重启后恢复,适合首次验证。项目也同时提供 temporarypermanent 两种驱动安装方式

检查驱动接口

检查 PWM 接口:

1
find /sys/devices/platform/hp-wmi -name "pwm*"

本次成功后得到:

1
2
/sys/devices/platform/hp-wmi/hwmon/hwmon6/pwm1_enable
/sys/devices/platform/hp-wmi/hwmon/hwmon6/pwm1

再检查转速接口:

1
find /sys/devices/platform/hp-wmi -name "fan*_input"

应当看到:

1
2
fan1_input
fan2_input

hwmon6 中的数字可能在每次启动后变化,不要在脚本中把它写死。真正需要确认的是下面四个接口:

1
2
3
4
fan1_input
fan2_input
pwm1
pwm1_enable

查看状态并校准

1
2
cd ~/下载/omen-fan-control
sudo python3 omen_cli.py status

本次临时驱动正常工作时显示:

1
2
3
4
Driver Install: Temporary (Session)
Driver Mode:    Max
Fan Speed:      6100 RPM
CPU Temp:       47°C

底层曾读取到:

1
2
fan1 = 5800 RPM
fan2 = 6100 RPM

确认驱动正常后进行最大转速校准:

1
sudo python3 omen_cli.py calibrate

程序会询问:

1
This will spin fans at max speed for calibration. Continue? [y/N]:

输入 y 后,本机最终得到:

1
Calibration finished. Max RPM: 6100

也就是说,这台机器本次实测最大风扇转速约为 6100 RPM

测试手动控制

先从 50% 开始:

1
2
sudo python3 omen_cli.py fan-control --mode manual --value 50%
sudo python3 omen_cli.py status

确认风扇声音、RPM 与 CPU 温度均有合理变化后,再尝试其他模式:

1
2
3
4
5
6
7
8
# 手动 70%
sudo python3 omen_cli.py fan-control --mode manual --value 70%

# 最大转速
sudo python3 omen_cli.py fan-control --mode max

# 恢复自动控制
sudo python3 omen_cli.py fan-control --mode auto

项目 README 也给出了 Manual、Curve 与 Auto 模式的 CLI 用法

永久安装

只有在临时模式下确认以下项目全部正常后,才进行永久安装:

  • 能读取 fan1fan2 的 RPM;
  • pwm1pwm1_enable 均存在;
  • Manual 和 Auto 模式切换有效;
  • 温度与风扇行为正常。

执行:

1
2
3
cd ~/下载/omen-fan-control
sudo python3 omen_cli.py install-patch permanent
sudo reboot

重启后重新验证:

1
2
3
4
5
cd ~/下载/omen-fan-control

find /sys/devices/platform/hp-wmi -name "pwm*"
sudo python3 omen_cli.py fan-control --mode manual --value 50%
sudo python3 omen_cli.py status

如果重启后仍有 pwm1pwm1_enable,且 50% Manual 能明显改变风扇转速,就说明永久安装已经生效。

日常使用

常用 CLI 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd ~/下载/omen-fan-control

# 查看状态
sudo python3 omen_cli.py status

# 手动转速
sudo python3 omen_cli.py fan-control --mode manual --value 50%
sudo python3 omen_cli.py fan-control --mode manual --value 70%
sudo python3 omen_cli.py fan-control --mode manual --value 80%

# 最大转速
sudo python3 omen_cli.py fan-control --mode max

# 恢复自动控制
sudo python3 omen_cli.py fan-control --mode auto

Curve 自动曲线

启用曲线模式:

1
sudo python3 omen_cli.py fan-control --mode curve

Curve 模式需要后台服务持续根据温度调整风扇,因此还需要安装服务:

1
sudo python3 omen_cli.py service install

如果只使用 Manual、Max 和 Auto,就没有必要专门启用曲线服务。Curve 与后台服务的最新行为可参考项目 Usage 文档

GUI 与应用快捷方式

以 root 权限启动 GUI

项目自带 omen_gui.py,启动方式为:

1
2
cd ~/下载/omen-fan-control
sudo python3 omen_gui.py

本次验证发现,直接执行:

1
python3 omen_gui.py

虽然窗口可以打开,也能读取部分信息,但会提示:

1
Root Privileges Required

此时在 GUI 中修改风扇不会生效,因为写入 pwm1 需要管理员权限。因此应按照项目 README 的 GUI 启动方式,使用 sudo 运行。

创建可直接点击的快捷方式

最终采用的交互方式是:点击应用图标,终端打开,输入 sudo 密码,然后启动 GUI。这种方式简单且可靠。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir -p ~/.local/share/applications

cat > ~/.local/share/applications/omen-fan-control.desktop <<'EOF'
[Desktop Entry]
Version=1.0
Type=Application
Name=OMEN Fan Control
Comment=HP OMEN/Victus Fan Control
Exec=sudo /usr/bin/python3 "/home/kayvong/下载/omen-fan-control/omen_gui.py"
Path=/home/kayvong/下载/omen-fan-control
Icon=utilities-system-monitor
Terminal=true
Categories=Utility;System;
StartupNotify=true
EOF

chmod +x ~/.local/share/applications/omen-fan-control.desktop
update-desktop-database ~/.local/share/applications/ 2>/dev/null || true

之后在 Ubuntu 应用列表中搜索 OMEN Fan Control 即可。

快捷方式中的 /home/kayvong/下载/omen-fan-control 是我的实际路径。其他用户需要替换为自己的用户名与项目目录。

不要将 Exec 改成普通用户运行的 Python 命令。那样通常只能打开 GUI,无法真正写入 PWM 控制接口。

常见问题

提示 pwm1 not found

如果出现:

1
Manual mode requires the kernel driver patch (pwm1 not found).

检查:

1
find /sys/devices/platform/hp-wmi -name "pwm*"

Manual 模式要求 pwm1pwm1_enable 同时存在。如果只有 pwm1_enable,说明当前驱动接口并不完整。

Temporary 模式重启后消失

这是正常行为。Temporary 本来就只在当前启动周期生效。完成验证后,需要执行:

1
sudo python3 omen_cli.py install-patch permanent

内核模块签名警告

如果看到:

1
2
hp_wmi: module verification failed:
signature and/or required key missing - tainting kernel

说明系统加载了自行编译的第三方内核模块。如果出现真正的:

1
Key was rejected by service

再检查 Secure Boot 状态:

1
mokutil --sb-state

Secure Boot 可能阻止未被信任的第三方内核模块加载。

8BC2 不在已知兼容列表

这台具体机器已经实测通过:

1
2
3
4
5
8BC2
fan1/fan2          正常
pwm1               正常
Manual             正常
最大转速校准       约 6100 RPM

不过,每次下载新版本仍应检查:

1
grep -n "8BC2" -C 10 hp-wmi.c

不要把一次实测结果当作对所有硬件版本和未来项目版本的保证。

卸载与恢复

进入项目目录:

1
cd ~/下载/omen-fan-control

删除后台服务并恢复原版驱动:

1
2
sudo python3 omen_cli.py service remove
sudo python3 omen_cli.py install-patch restore

这是项目 README 提供的卸载流程

如果创建过应用快捷方式,再删除它:

1
2
rm -f ~/.local/share/applications/omen-fan-control.desktop
update-desktop-database ~/.local/share/applications/ 2>/dev/null || true

重装后的最简恢复流程

如果以后重装 Ubuntu,只想快速恢复,可以按下面的顺序执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 1. 查看主板与原生驱动接口
cat /sys/class/dmi/id/board_name
find /sys/devices/platform/hp-wmi -type f \
  \( -name 'fan*_input' -o -name 'pwm1' -o -name 'pwm1_enable' \) \
  -print 2>/dev/null

# 2. 确实缺少接口时,再安装依赖
sudo apt update
sudo apt install -y \
  git dkms build-essential linux-headers-$(uname -r) \
  python3-click python3-pyqt6 mokutil

# 3. 下载项目
cd ~/下载
git clone https://github.com/arfelious/omen-fan-control.git
cd omen-fan-control

# 4. 确认源码仍包含 8BC2
grep -n "8BC2" -C 10 hp-wmi.c

# 5. 准备初始配置
sudo mkdir -p /etc/omen-fan-control
sudo tee /etc/omen-fan-control/config.json > /dev/null <<'EOF'
{
    "bypass_patch_warning": true,
    "fan_max": 6000
}
EOF

# 6. 先临时安装
sudo python3 omen_cli.py install-patch temporary

# 7. 检查 PWM 接口
find /sys/devices/platform/hp-wmi -name "pwm*"

# 8. 校准并测试 50%
sudo python3 omen_cli.py calibrate
sudo python3 omen_cli.py fan-control --mode manual --value 50%
sudo python3 omen_cli.py status

# 9. 一切正常后永久安装并重启
sudo python3 omen_cli.py install-patch permanent
sudo reboot

重启后再次确认:

1
2
3
4
cd ~/下载/omen-fan-control
find /sys/devices/platform/hp-wmi -name "pwm*"
sudo python3 omen_cli.py fan-control --mode manual --value 50%
sudo python3 omen_cli.py status

只要重启后仍能看到 pwm1pwm1_enable,并且 Manual 50% 能改变风扇转速,基本就恢复完成了。

总结

这次问题的关键不在 GUI,而在于原生 hp_wmi 当时没有暴露完整的 PWM 控制接口。补丁驱动生效后,CLI 与以 root 权限运行的 GUI 都能正常控制风扇。

以后升级 Ubuntu 或 Linux 内核时,第一步永远应该是重新检查原生驱动。如果系统已经直接提供 fan1_inputfan2_inputpwm1pwm1_enable,就可能不再需要替换内核驱动。

参考资料

This post is licensed under CC BY 4.0 by the author.