这是一篇转载文章:https://blog.monosoul.dev/2021/10/17/how-to-control-thinkpad-p14s-fan-speed-in-linux/
笔者的电脑为thinkpad P14s gen2,系统为ubuntu 21.10
而我的电脑是thinkpad x1 carbon gen10,系统为ubuntu 22.04
从目前观察来看,我的电脑按照笔者的方法是生效了的。关于休眠方式,我的电脑已经改成了休眠,也就是s3状态,而作者采用的是 s2idle ,我发现改成了s3以后虽然没什么问题,可却发现每次合上盖子再打开都要重新经历一遍系统的启动,很是麻烦,因此我打算再重新改成s2idle。
最近我买了一台新的工作笔记本电脑——联想 ThinkPad P14s(第 2 代)。我更喜欢在我的工作机器上运行 Linux,这并不排除。在使用它时,我注意到风扇速度有时会无缘无故地过高,从而产生不良噪音。以下是如何在 Linux 中使用一个不错的工具控制 ThinkPad P14s 的风扇速度——thinkfan。
下面描述的步骤对 Ubuntu 21.10 有效,但对于任何其他发行版可能没有太大区别。
作者 Andrei Nevedomskii|发布时间:2021 年 10 月 17 日|写了30个评论
所需时间:5分钟
以下是设置所有内容的方法
-
启用风扇控制
1
echo 'options thinkpad_acpi fan_control=1' | sudo tee /lib/modprobe.d/thinkpad_acpi.conf
-
安装 thinkfan 软件包
1
sudo apt install thinkfan
-
创建新的 thinkfan 配置文件
1
sudo touch /etc/thinkfan.conf
-
将以下行放入 /etc/thinkfan.conf 中
1
sensors: # GPU - tpacpi: /proc/acpi/ibm/thermal indices: [1] # CPU - hwmon: /sys/class/hwmon name: coretemp indices: [2, 3, 4, 5] # Chassis - hwmon: /sys/class/hwmon name: thinkpad indices: [3, 5, 6, 7] # SSD - hwmon: /sys/class/hwmon name: nvme indices: [1, 2, 3] correction: [-5, 0, 0] # MB - hwmon: /sys/class/hwmon name: acpitz indices: [1]fans: - tpacpi: /proc/acpi/ibm/fanlevels: - [0, 0, 37] - [1, 35, 42] - [2, 40, 45] - [3, 43, 47] - [4, 45, 52] - [5, 50, 57] - [6, 55, 72] - [7, 70, 82] - ["level full-speed", 77, 32767]
-
配置 thinkfan 以使用新创建的文件
1
echo 'THINKFAN_ARGS="-c /etc/thinkfan.conf"' | sudo tee -a /etc/default/thinkfan
-
启用thinkfan服务
1
sudo systemctl enable thinkfan
-
重新启动
1
sudo reboot
通过这种配置,风扇将保持在相当安静的水平,同时仍然允许您在膝盖上使用ThinkPad。🙂
配置深入探究
如果您对上述所有配置选项的确切功能感兴趣,欢迎阅读此深入探讨部分。
传感器部分
配置文件的传感器部分描述了 thinkfan 将用于监视温度的所有热传感器。
!️ 重要提示:!️避免使用 nvml 选项(从专有的 nVidia GPU 驱动程序读取温度)。
使用 nvml 可防止 GPU 切换到挂起电源状态,从而导致电池耗尽和高温。
这是我们在那里所拥有的:
-
HWMON – 指定通用温度传感器。我们用它来监控CPU、SSD、WLAN和其他设备的温度。A 你可以看到,我们在配置文件中有多个具有不同名称的 hwmon 条目,它们是这样的:
-
TPACPI (#GPU) – 这个传感器阵列代表的温度与下面的传感器(机箱的)几乎相同,但略有不同:即使设备离线(例如 GPU),传感器也不会丢失。相反,此类传感器在此处显示负值。这就是我们使用指数为 1 的传感器来测量 GPU 温度的目的。 从技术上讲,thinkfan 应该支持可以删除/暂停的设备,但有一个错误阻止它在守护进程模式下正常工作。
-
coretemp (#CPU) – 测量 CPU 温度。我的 ThinkPad P14s 有 4 个物理内核,因此有 5 个传感器可用:整个包装 1 个传感器 + 每个内核 1 个传感器。由于每个内核都有传感器,因此使用封装传感器也感觉是多余的,因此我们使用此选项忽略它:请注意,
我们跳过索引为 1 的传感器。
indices: [2, 3, 4, 5]
-
thinkpad (#Chassis) – 测量 CPU、GPU 和机箱温度。在我的情况下,索引为 8 的传感器不可用,索引为 4 的传感器始终返回 0,因此我排除了它们。传感器 1 和 2 分别报告 CPU 和 GPU 温度,由于我已经有其他传感器来监控 CPU 和 GPU,所以我也排除了它们。在所有排除项之后,这是我们在配置中的内容:
indices: [3, 5, 6, 7]
-
NVMe – 测量 SSD 温度。有 3 个传感器可用,其中第一个是复合传感器。我注意到,在轻度互联网浏览期间,该传感器的温度通常高于 CPU 温度(我想是因为浏览器使用缓存),而在重负载期间,CPU 温度更高。因此,我决定将这个传感器的温度校正 -5 度,以防止风扇在不需要的时候旋转。因此,我们使用所有可用的传感器:并将第一个传感器的温度校正 -5 度:
indices: [1, 2, 3]
correction: [-5, 0, 0]
-
acpitz – 测量主板温度(或者至少这是我期望它测量的,而不是 100% 确定的)。只有 1 个我们按原样使用的传感器。
-
风扇部分
ThinkPad P14s 只有一个风扇,因此在该部分中没有太多配置。它只有 1 个条目:
tpacpi: /proc/acpi/ibm/fan
它指定用于控制风扇的接口的路径。顺便说一句,请确保您完成了 TL 的第一步;DR部分,以便能够控制风扇速度。
“级别”部分
在本节中,我们将配置风扇速度和温度级别以启用此风扇速度。Thinkfan 有 2 种风扇速度配置模式——简单而详细。
在简单模式下,thinkfan 将使用所有传感器的最高温度来确定风扇速度,而在详细模式下,您可以根据每个传感器配置风扇速度。
我在这里使用简单模式,因为 ThinkPad P14s 是一个相对较小的设备,一个组件加热会导致整个设备的加热,因此使用所有传感器的最高温度效果很好。
此部分的每个条目都是一个由 3 个值组成的数组,其中:
- 第一项 – 是要使用的风扇速度级别;
- 第二项 – 是 thinkfan 应将风扇速度降至上一个水平的温度;
- 第三项 – 是 ThinkFan 应将风扇速度提高到下一个水平的温度。
让我们以几个条目为例,以更好地理解那里发生的事情:
- [1, 35, 42]- [2, 40, 45]
当温度达到 42°C 时,thinkfan 会将风扇速度更改为 2 级。一旦温度降至 40 度,thinkfan 会将风扇速度更改为 1 级。
在斜坡上升和下降之间有一点重叠,使速度变化更平滑一些。
检查可用的风扇速度
要检查笔记本电脑可以使用的风扇速度,可以运行以下命令:
cat /proc/acpi/ibm/fanCode language: Bash (bash)
输出应如下所示:
status: enabled
speed: 3370
level: 4
commands: level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands: enable, disable
commands: watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))Code language: Gradle (gradle)
奖金
如果您还使用带有 Intel CPU 的 ThinkPad P14s (Gen 2),您可能已经注意到它不支持 S3 睡眠状态。从技术上讲,您可以在 BIOS 中打开它,但我发现它运行不佳。例如,笔记本电脑唤醒后触摸屏无法正常工作。因此,我决定坚持使用默认的 S2idle(默认用于 Windows 10 和 Linux)。
除了睡眠状态的省电问题(我们不会在本文中讨论这些问题)之外,还有另一个相当烦人的问题:风扇在您关闭笔记本电脑盖并进入睡眠状态后不会关闭电源。
幸运的是,如果您已经安装了 thinkfan,它也可以帮助您解决这个问题!
除了 systemd 单元,thinkfan 还提供了一些额外的单元:thinkfan.service
thinkfan-sleep.service
– 在系统进入睡眠状态时执行;thinkfan-wakeup.service
– 在系统从睡眠中唤醒时执行。
我们将使用这些单元在系统进入睡眠状态时禁用风扇,并在系统唤醒时启用风扇。
thinkfan-sleep.服务
首先,让我们改变.thinkfan-sleep.service
sudo nano /lib/systemd/system/thinkfan-sleep.serviceCode language: Bash (bash)
您应该在服务块的末尾放置一个新行:
ExecStart=/usr/bin/bash -c '/usr/bin/echo disable > /proc/acpi/ibm/fan'
因此,该文件将如下所示:
[Unit]
Description=Notify thinkfan of imminent sleep
Before=sleep.target
[Service]
Type=oneshot
ExecStart=/usr/bin/pkill -x -winch thinkfan
# Hack: Since the signal handler races with the sleep, we need to delay a bit
ExecStart=/usr/bin/sleep 1
ExecStart=/usr/bin/bash -c '/usr/bin/echo disable > /proc/acpi/ibm/fan'
[Install]
WantedBy=sleep.targetCode language: Properties (properties)
thinkfan-wakeup.服务
现在,让我们改变.thinkfan-wakeup.service
sudo nano /lib/systemd/system/thinkfan-wakeup.serviceCode language: Bash (bash)
您应该在 之后但在 之前将新行放入 Service 块中:Type=oneshot``ExecStart=...
ExecStart=/usr/bin/bash -c '/usr/bin/echo enable > /proc/acpi/ibm/fan'
因此,该文件将如下所示:
[Unit]
Description=Reload thinkfan after waking up from suspend
After=sysinit.target
After=suspend.target
After=suspend-then-hibernate.target
After=hybrid-sleep.target
After=hibernate.target
[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/echo enable > /proc/acpi/ibm/fan'
ExecStart=/usr/bin/pkill -x -usr2 thinkfan
[Install]
WantedBy=sleep.targetCode language: Properties (properties)
应用更改
现在要应用更改,请运行:
sudo systemctl daemon-reloadCode language: Bash (bash)
你很好。现在,每当您的笔记本电脑进入睡眠状态时,即使在 s2idle 状态下,风扇也会关闭。
总结
由于 Linux 的灵活性,无论出厂设置如何,我们都可以随心所欲地控制风扇速度。
我希望这不会太难,并且您对如何设置 thinkfan 有了更好的理解。
如果您能够想出您更喜欢的风扇速度设置,请在下面的评论部分告诉我您的配置。