tee:/proc/acpi/ibm/fan:无效参数

tee:/proc/acpi/ibm/fan:无效参数

以 root 身份运行

root@myself:~# echo disable | sudo tee /proc/acpi/ibm/fan; sleep 5; echo enable | sudo tee /proc/acpi/ibm/fan

但我明白

disable
tee: /proc/acpi/ibm/fan: Invalid argument
enable
tee: /proc/acpi/ibm/fan: Invalid argument

当我以 root 身份运行时,怎么可能呢?

我需要做什么才能让它工作?

答案1

问题不在于您的tee命令 - 尽管由于您已经在 root shell 中,您可以使用简单的重定向echo disable > /proc/acpi/ibm/fan(并且当然可以删除sudo)。

尽管“Linux 中的一切都是文件”,但实际情况是,“文件”/proc实际上是运行内核的接口,并且其行为与常规文件完全相同 - 如果我们使用,strace我们可以看到错误实际上并非来自tee,而是来自对打开文件描述符的底层write调用(我将语法从管道更改为此处的字符串,以确保我们正在跟踪而不是teeecho

root@t400s:~# strace tee /proc/acpi/ibm/fan <<< 'disabled'
execve("/usr/bin/tee", ["tee", "/proc/acpi/ibm/fan"], [/* 23 vars */]) = 0
.
.
.                              = 0
openat(AT_FDCWD, "/proc/acpi/ibm/fan", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
read(0, "disabled\n", 8192)             = 9
write(1, "disabled\n", 9disabled
)               = 9
write(3, "disabled\n", 9)               = -1 EINVAL (Invalid argument)
write(2, "tee: ", 5tee: )                    = 5
write(2, "/proc/acpi/ibm/fan", 18/proc/acpi/ibm/fan)      = 18
.
.
.
+++ exited with 1 +++
root@t400s:~# 

该参数无效的原因是默认情况下,模块thinkpad_acpi不启用风扇控制 - 如果您cat该文件,您可能会看到如下几行:

$ cat /proc/acpi/ibm/fan
status:     enabled
speed:      1838
level:      auto

为了启用风扇控制,您需要在加载期间向模块传递一个选项,您可以使用配置文件来执行此操作:

$ cat /etc/modprobe.d/thinkpad_acpi.conf 
options thinkpad_acpi fan_control=1

您可以在文本编辑器中创建,也可以使用

echo 'options thinkpad_acpi fan_control=1' | sudo tee -a /etc/modprobe.d/thinkpad_acpi.conf

(这只是一个普通文件,所以tee这次没有问题)。然后您将需要重新启动 - 不幸的是,似乎无法动态删除并重新加载模块thinkpad_acpi

重新启动以使用新选项重新加载模块后,您应该看到它现在列出了一些附加fan_control命令:

$ cat /proc/acpi/ibm/fan
status:     enabled
speed:      3737
level:      auto
commands:   level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands:   enable, disable
commands:   watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))

现在您应该能够启用/禁用/修改风扇参数,可以通过/proc/acpi/ibm/fan直接使用命令(例如)写入tee,或使用thinkfan链接中描述的实用程序。

有关更多背景信息/proc,请参阅当我运行命令 cat /proc/cpuinfo 时会发生什么?

相关内容