如何在Linux中控制ThinkPad的风扇速度

这是一篇转载文章: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. 启用风扇控制

    1
    
    echo 'options thinkpad_acpi fan_control=1' | sudo tee /lib/modprobe.d/thinkpad_acpi.conf
    
  2. 安装 thinkfan 软件包

    1
    
    sudo apt install thinkfan
    
  3. 创建新的 thinkfan 配置文件

    1
    
    sudo touch /etc/thinkfan.conf
    
  4. 将以下行放入 /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]
    
  5. 配置 thinkfan 以使用新创建的文件

    1
    
    echo 'THINKFAN_ARGS="-c /etc/thinkfan.conf"' | sudo tee -a /etc/default/thinkfan
    
  6. 启用thinkfan服务

    1
    
    sudo systemctl enable thinkfan
    
  7. 重新启动

    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 有了更好的理解。

如果您能够想出您更喜欢的风扇速度设置,请在下面的评论部分告诉我您的配置。

updatedupdated2024-02-162024-02-16