web-dev-qa-db-fra.com

tee: / proc / acpi / ibm / fan: argument incorrect

En tant que root, je cours

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

mais je reçois

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

Comment est-ce possible, quand je cours en tant que root?

Que dois-je faire pour que cela fonctionne?

1
rapt

Le problème ne vient pas de votre commande tee - bien que puisque vous êtes déjà dans un shell racine, vous auriez pu utiliser une simple redirection echo disable > /proc/acpi/ibm/fan (et vous auriez certainement supprimé la Sudo).

Bien que "tout dans Linux soit un fichier", la réalité est que les "fichiers" dans /proc sont réellement des interfaces avec le noyau en cours d'exécution et ne le font pas se comporte exactement comme des fichiers normaux. Si nous utilisons strace, nous pouvons voir que l'erreur ne provient pas vraiment de tee, mais de l'appel write sous-jacent au descripteur de fichier ouvert ( J'ai changé la syntaxe d'un tube à une chaîne ici pour m'assurer que nous traçons le tee pas le 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:~# 

La raison pour laquelle l'argument n'est pas valide est que, par défaut, le module thinkpad_acpi n'active pas le contrôle du ventilateur. Si vous cat le fichier, vous ne verrez probablement que quelques lignes, comme suit:

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

Pour activer le contrôle des ventilateurs, vous devez transmettre une option au module pendant le chargement, ce que vous pouvez utiliser à l'aide d'un fichier de configuration:

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

que vous pouvez créer dans un éditeur de texte ou en utilisant

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

(Ceci est juste un fichier normal, donc pas de problème avec tee cette fois). Ensuite, vous devrez redémarrer. Malheureusement, il ne semble pas possible de retirer et de recharger le module thinkpad_acpi à la volée.

Après avoir redémarré le module avec sa nouvelle option, vous devriez voir qu'il répertorie maintenant quelques commandes supplémentaires 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))

Maintenant vous devriez pouvoir activer/désactiver/modifier les paramètres du ventilateur, soit en écrivant directement sur /proc/acpi/ibm/fan à l'aide d'une commande telle que votre tee, ou à l'aide de l'utilitaire thinkfan décrit dans votre lien.

Pour plus d'informations sur /proc, voir Que se passe-t-il lorsque j'exécute la commande cat/proc/cpuinfo?

5
steeldriver