以 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
调用(我将语法从管道更改为此处的字符串,以确保我们正在跟踪而不是tee
)echo
:
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 时会发生什么?