如何使风扇控制正常工作?

我知道有一个叫做fancontrol的东西,它可以让你控制系统通风的速度。由于我的笔记本很容易发热,我想让风扇转得快一点。我找到的所有教程和资料都是针对旧版本的Ubuntu,似乎已经不再适用。
有人能向我解释一下,或者给我一个关于如何在Ubuntu上使其工作的好链接吗?如果有其他具有相同效果的方法也可以。

关于硬件的更多信息可能会有所帮助,比如笔记本电脑的品牌、型号/编号以及BIOS类型/版本。 - filescraps
@filescraps Dell Latitude D620:http://paste.ubuntu.com/699801/ - RobinJ
5@RobinJ - 你是否进行了常规的过热问题检查 - 检查灰尘/堵塞情况 - 同时查看处理器散热器。将您的 BIOS 更新到最新版本。您是否尝试在 grub 中添加 "acpi_osi=Linux"?您是否使用了任何额外的启动选项?总之,我的观点是 - 过热问题通常与灰尘和 ACPI 相关 - 您不应该需要手动控制风扇。 - fossfreedom
嗯,当风扇达到大约65°C时,它才开始加速运转,但似乎那时已经太晚了,因为一旦温度开始上升,它不会很快降至75°C以下。这是一台笔记本电脑,我对硬件不够自信,不敢拆开来修理。acpi_osi=Linux 是什么作用?没有额外的启动选项,只是默认的GRUB。 - RobinJ
acpi_osi有时在硬件问题上起作用 - 只是让内核替代ACPI(电源管理)问题,而不是由BIOS控制。最好更新BIOS。在我的东芝笔记本上 - CPU可以通过底部的可拆卸面板获得。它是一个蜂窝设计,经常会积满灰尘 - 一旦你做过一次,就很容易 :) - 只需移除CPU+散热器并吹掉积累的灰尘...给你个参考 - 风扇经常启动。一旦我清洁了散热器 - 温度很少超过50度,风扇在正常工作时从不启动。 - fossfreedom
给出 ls -la /proc/acpi 的输出! - antivirtel
@B.Roland http://paste.ubuntu.com/701488/ - RobinJ
1@RobinJ - 别忘了网站的风格是将相关信息添加到你的问题中,而不是埋在评论中。 - fossfreedom
@RobinJ 不幸的是,关于风扇的事情我一无所知;我有一台带有风扇控制功能的 IBM T42 :S - antivirtel
@RobinJ - 试着使用以下附加的启动选项来启动,看看它们是否有帮助?"acpi.power_nocheck=1" 和 "acpi_osi=linux" - fossfreedom
请查看i8kutils,它应该适用于戴尔Latitude D620。 - elmicha
我把我的笔记本带走了,因为它还在保修期内。这对我来说似乎是更安全的解决方案。谢谢大家的帮助! - RobinJ
@fossfreedom,我想了解你所说的“常规检查”是指什么。 - Ziggy
5个回答

你很可能能够通过本答案中提供的方法解决其他程序覆盖i8kctl风扇命令的问题。为了完整起见,我将包括一些关于戴尔笔记本电脑风扇控制的常规说明,并提供i8kutils的完整指令。

可能不起作用的方法

控制笔记本电脑风扇的两种常见且直接的方法是通过ACPI和PWM引脚,然而,不幸的是:

  • 戴尔笔记本电脑缺乏ACPI风扇控制功能 (*1)

    • 因此,尝试使用ACPI启动参数等方法将失败
  • 据我所知,戴尔Latitude系列笔记本电脑缺乏可控制的PWM风扇 (*2)

    • 因此,fancontrol/pwmconfig程序将无法使用

使用i8kutils

然而,有一个名为i8kutils的软件包,它是用来通过SMM BIOS控制戴尔Inspiron笔记本电脑上的风扇的。一些用户还报告在他们的戴尔Laitude笔记本电脑上也成功使用(我就是其中之一,在戴尔Latitude E7440上)- 然而,通常需要一种技巧来摆脱干扰的BIOS风扇控制。根据以前的评论,您也遭受了这个问题。
安装i8kutils
$ sudo apt-get install i8kutils

试一下:
$ i8kfan 2 2     # set to max speed
$ i8kfan 0 0     # set to 0 speed

...然后听一下看它是否有效。

禁用BIOS风扇控制

如果它有效,但是有其他东西在设定的速度上反击(许多戴尔Latitude笔记本用户报告),这是由于预定的SMM会话设置了风扇速度。幸运的是,有一种方法可以通过写入SMM寄存器来禁用BIOS风扇控制

警告:请参阅smm.c顶部的警告。此方法将写入SMM寄存器。然而,我没有看到任何用户报告称这会引起麻烦。此外,所有尝试此操作的报告都表明成功禁用了BIOS风扇控制。

i8kutils包含一个名为smm的程序源代码,但i8kutils软件包不包括已编译的二进制文件。我们要做的是下载i8kutils的源代码,编译smm程序,并使用适当的参数运行它,以通过写入SMM寄存器来禁用BIOS风扇控制。

下载构建所需的软件包:

$ sudo apt-get build-dep i8kutils

下载 i8kutils 源代码,解压并进入目录(确切的名称取决于 i8k 版本):
$ apt-get source i8kutils
$ tar xvf i8kutils_1.33.tar.gz
$ cd i8kutils-1.33/

编译 smm:
如果在32位系统上: $ make (上面将执行gcc -g -O2 -Wall -I. -o smm smm.c。)
如果在64位系统上: $ gcc -g -O2 -Wall -I. -o smm -m32 smm.c
运行smm命令并使用参数30a3来禁用SMM风扇控制。
$ sudo ./smm 30a3

现在,BIOS风扇控制应该被禁用了。试着使用i8kctl设置速度,听一下风扇声音,确保速度持续稳定。

注意:这是一个会在重启和关机后仍然生效的设置。你可以通过$ sudo ./smm 31a3重新启用BIOS风扇控制。


*1:我曾经在官方来源上看到过这个信息,但现在找不到了。如果你想验证你的硬件是否缺少它,请按照这里的说明操作:https://wiki.ubuntu.com/DebuggingACPI
*2:要验证这一点,请运行pwmconfig:sudo apt-get install fancontrolsudo pwm-config会告诉你是否存在支持PWM的风扇。

关于smm的注意事项

smm已不再包含在最新的i8kutils中。如果你的发行版已经升级到最新版本,你将需要手动获取旧版本。版本1.41包含smm,而1.43不再包含它。
从1.42开始,smm仅作为一个内核模块提供。
你可以在i8kutils launchpad page上获取1.41版本。

жҲ‘е®һйҷ…дёҠдҪҝз”ЁдәҶACPIеҸӮж•°acpi_osi='!Windows 2012'жқҘжҺ§еҲ¶жҲ‘зҡ„жҲҙе°”Inspiron 15R 5520зҡ„йЈҺжүҮпјҢеӣ дёәж— и®әжё©еәҰеҰӮдҪ•пјҢе®ғ们жҖ»жҳҜд»ҘжңҖеӨ§йҖҹеәҰж—ӢиҪ¬гҖӮ - user311982
这应该是正确的答案。它信息充分且非常相关! - ppr
很棒的答案。还可以在这里找到:链接 - malat
1非常感谢,尝试了其他所有方法都无效之后,这个方法对我有效。当我尝试编译smm时,缺少了sys/cdefs.h文件,但是sudo apt-get install g++-multilib命令解决了这个问题(参考链接:http://askubuntu.com/questions/470796/fatal-error-sys-cdefs-h-no-such-file-or-directory)。 - Philip Daniels
我可能会有点晚,但是,把它放在最大速度上有什么不利之处吗? - Zerquix18

lm-sensors 这个软件包 安装 lm-sensors 可能是你在寻找的。

而且就像你建议的一样,fancontrol 安装 fancontrol

请确保你要通过软件控制的所有风扇都有4针连接器。

"支持PWM的风扇通常连接到4针连接器(引脚分布:地线、+12V、感应、控制)。"来源

当我运行pwmconfig(fancontrol的一部分)时,我得到以下消息:

/usr/sbin/pwmconfig:未安装任何支持PWM的传感器模块 它将指导您是否具有兼容的硬件。

这里有一些与生成的配置文件一起使用的脚本。 我假设你可以在这里设置一个更高的值。
label fan1 "Side Fan"
set fan1_min 1000
label fan2 "PSU Fan"
set fan2_min 1000
label fan5 "CPU Fan"
set fan5_min 1000

但正如我所说的,我无法亲自测试这个,因为我的硬件不支持它,我可以通过BIOS控制我的风扇,但只能调到3档。我使用它来保持我的风扇慢速和安静。

1/usr/sbin/pwmconfig:没有安装支持PWM的传感器模块 还有其他方法吗? - RobinJ
通常需要首先运行sensors-detect,并加载它所建议的模块以获取温度和风扇速度读数,然后可以使用pwmconfig来进行操作。 - psusi
@RobinJ,看起来你的芯片没有被识别或支持。 - psusi
我将授予您赏金,因为这是最具信息量的答案,可以帮助大多数其他人。 - RobinJ

i8kutils可以用来控制我的Dell Vostro 3350笔记本电脑的风扇。
仅适用于Dell笔记本电脑: $ sudo apt-get install i8kutils $ i8kfan 1 2 # 将左侧风扇设置为低速(1);将右侧风扇设置为高速(2)。

只是似乎BIOS中的某些东西总是在几秒钟后将其恢复到先前的值:P 无论如何,虽然有点晚了,但这仍然是最有帮助的答案。 - RobinJ
它在我的Alienware m14x上运行良好。但是,它仍然无法将冷却器设置为最大速度,这仍然导致笔记本电脑的温度较高。这比在Windows系统下明显更热。 - iLemming
BIOS将其重置,因此我添加了一个每2分钟运行一次的cronjob:crontab -e*/2 * * * * /usr/bin/i8kfan 1 1。目前运行得非常完美。 - goksel

好的,也许这不是你想要的答案,但我的过热问题在我用吸尘器清理通风口时得到了解决。如果你在低CPU频率下遇到过热问题,这个方法可能值得一试。请注意可能会有小零件被吸入。如果你幸运的话,这个方法可能能解决你的过热问题。

我将赏金授予上面的答案,因为它是最具信息量的,但我的问题似乎与硬件有关,所以你的回答最接近解决方案。但由于我对于操纵笔记本电脑的硬件不够自信,所以我只是将它送到商店修理,因为它还在保修期内。 - RobinJ
我刚刚尝试了一下,结果很好。谢谢!我的风扇开始变得更响了,而且由于过热,我确实遇到了一两次关机。希望这个问题现在已经解决了。风扇现在正常地根据CPU的使用情况进行开关循环,这非常好(之前它一直开着)。 - Cymen
@Cymen 只要确保吸尘器是防静电的,以确保安全。我使用压缩气罐清洁通风口,你也可以选择这种方法作为替代方案。 - user311982

我有一台Dell Latitude e4200,以下方法对我有效,因为BIOS覆盖了i8kfan的设置。我的电脑初始温度为105华氏度,在使用这些步骤(风扇设置=2)大约10分钟后,CPU/核心温度降至96华氏度。这个过程已经被其他人发布过了:
第一步:下载并安装i8ktutils。
# sudo apt-get install i8kutils

第二步。覆盖BIOS以防止其中断自定义风扇设置。下载源代码并编译一个程序(SMM)来完成此操作。
# sudo apt-get build-dep i8kutils

然后:
# apt-get source i8kutils

第三步。提取源代码并进入目录:
# tar xvf i8kutils_1.33.tar.gz

然后:
# cd i8kutils-1.33/

第四步。编译SMM。
For 32-bit systems:

# make SMM

(Output: # gcc -g -O2 -Wall -I. -o smm smm.c.)

For 64-bit systems

# make SMM:

(Output: # gcc -g -O2 -Wall -I. -o smm -m32 smm.c)

第五步。使用参数执行SMM。
# sudo ./smm 30a3

第六步。设置风扇速度:
# i8kfan 2 2 (Listen as this will set fans to maximum speed)

# i8kfan 1 1 (This will set fans to slow speed)

现在BIOS风扇控制不应该覆盖风扇设置。即使系统重新启动,此设置也将保持不变。如果出于某种原因要将控制权交还给BIOS,请执行以下步骤:
# sudo ./smm 31a3.

还有一种方法可以使用lm_sensors来检查温度。
http://www.cyberciti.biz/faq/howto-linux-get-sensors-information/

1尝试在Ubuntu 14.04上使用最新版本的i8kutils-1.41,出现了以下错误信息:"在文件/usr/include/stdio.h:27:0中包含, 来自smm.c:27: /usr/include/features.h:374:25: 致命错误:sys/cdefs.h:没有那个文件或目录"。然而,这个问题可以通过以下方法解决:http://askubuntu.com/questions/470796/fatal-error-sys-cdefs-h-no-such-file-or-directory - k-den