Lüfter auf Höchstgeschwindigkeit nach Ruhezustand oder Bereitschaft

Nach dem Update auf Linux Mint 16 wurde ich mit einem neuen Problem konfrontiert. Nach einem Hibernate bzw. Standby liefen die Lüfter auf höchster Geschwindigkeit, unabhängig von der Prozessorlast.

Ein ausgiebige Recherche ergab, dass es sich höchstwahrscheinlich um einen Bug in der ACPI-Implementierung handelt (Kernel Bug 58301). Um nicht mehrere Wochen auf einen Fix im Kernel warten zu müssen, schrieb ich mir ein Skript, das beim Aufwecken den Lüfter abdreht. Bei Bedarf werden diese danach automatisch wieder eingeschaltet:

#!/bin/sh
#
# Reset fan speeds after resume, otherwise they blow at maximum speed
#
# Used as work-around for ACPI kernel bug 58301
# https://bugzilla.kernel.org/show_bug.cgi?id=58301
#
# The idea for this fix was taken from
# http://ubuntuforums.org/showthread.php?t=1761370
#
# Author: franz@qnipp.com
#
# To be saved as /etc/pm/sleep.d/11_fan_3.11.0

case "$1" in
  thaw|resume)
    for i in /sys/class/thermal/cooling_device* ; do
      type=`cat $i/type`
      if [ "$type" = "Fan" ] ; then
        echo 0 > $i/cur_state
      fi
    done
    ;;
esac

Im Zuge der Fehlersuche fand ich ein paar interessante „Dateien“, die einen Einblick in das System geben und Experimente mit den Lüftern und den Temperaturen erlauben.

  • Verzeichnisse /sys/class/thermal/cooling_device*: Pro „Kühlgerät“ gibt es hier ein eigenes Verzeichnis, wo der Zustand abgefragt, aber auch gesetzt werden kann.
    • Den Typ des Kühlgeräts erfährt man in der Datei type, es gibt:
      • Fan: Das sind die Lüfter. In meinem Notebook sind die einzelnen Stufen des Lüfters in mehrere Geräte aufgeteilt.
      • Processor: Um die erzeugte Wärmeenergie zu begrenzen, kann auch die Leistung des Prozessors reduziert werden. Damit kann man auch simulieren, wie sich das System mit einem gaaanz laaangsaaamen Prozessor anfühlt.
      • LCD: In meinem Fall ist das die Beleuchtung des LCD-Displays, die hier abgefragt und verstellt werden kann.
    • Den aktuellen Zustand des Kühlgerät erfährt man in cur_state, das auch mittels
      echo -n "Wert" > cur_state
      geschrieben werden kann. Der Wert 0 schaltet die Kühlwirkung (also z. B. den Lüfter) aus, der Maximalwert ist in der Datei max_state festgelegt.
  • Verzeichnisse /sys/class/thermal/thermal_zone*: Für jeden Messpunkt existiert ein Verzeichnis, wo die Regeln festgelegt sind, bei welcher Temperatur welche Kühlgeräte zu aktivieren sind.
    • Die aktuelle Temperatur kann aus der Datei temp ausgelesen werden. In meinem Fall muss die Zahl durch 1.000 dividiert werden, um die Temperatur in °C zu erhalten.
    • Mithilfe emul_temp kann eine bestimmte Temperatur simuliert werden. Achtung! Die Überhitzung von Komponenten kann zu Beschädigungen führen, wenn hier eine tiefere als die aktuelle Temperatur angegeben wird.
    • In meinem System (HP ProBook 4510s) ist thermal_zone2 die CPU, thermal_zone5 eine „virtuelle“ Temperatur, die die Drehzahl des Lüfters in Prozent angibt.
  • Verzeichnisse /sys/devices/system/cpu/cpu*/cpufreq: Für jeden CPU-Kern gibt es ein Verzeichnis, wo die Frequenz ausgelesen bzw. gestellt werden kann.
    • Die Datei scaling_governer enthält die aktuelle Leistungseinstellung, z. B. ondemand. Die verfügbaren Einstellungen können aus scaling_available_governors ausgelesen werden.
    • cpuinfo_cur_freq enthält die aktuelle Frequenz in kHz.
    • scaling_setspeed kann zum händischen Setzen der Frequenz verwendet werden. Damit das funktioniert, muss allerdings vorher der scaling_governor auf userspace gesetzt werden.

Viel Spaß beim Experimentieren!

Über Franz Knipp

Geboren 1975, erster eigener Computer 1984, erste eigene Webseite 1995, erster Blog 1999 in Spanien. Seit 2000 Programmierer und Projektleiter. Inzwischen verheiratet und dreifacher Vater. 2011 Gründung eines Software-Unternehmens. Aktuell Obmann der Waldorfinitiative Sonnenland und Landessprecher der Open Source Expert Group Burgenland.
Dieser Beitrag wurde unter Technik abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

1 Response to Lüfter auf Höchstgeschwindigkeit nach Ruhezustand oder Bereitschaft

  1. Franz Knipp sagt:

    Zwei Hinweise:

    1. Die Datei /etc/pm/sleep.d/11_fan_3.11.0 muss ausführbar sein (chmod 755 /etc/pm/sleep.d/11_fan_3.11.0).
    2. Der Bugfix funktioniert auch bei Linux Mint 17.2, basierend auf Ubuntu 14.04 LTS.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

+ sixundforty = sixundfifty