Wenn der CPU-Lüfter viel zu spät anspringt oder ein Gehäusequirl ständig mit Volllast vor sich hin röhrt, sollten Sie zu Fan2go greifen. Der Hintergrunddienst sorgt für eine maßgeschneiderte Kühlung.
In den meisten Computern sorgen Lüfter für ein angenehmes Klima. Wie schnell die kleinen Fächer rotieren, bestimmt das System normalerweise selbstständig. Beginnt der Prozessor zu schwitzen, drehen die Lüfter schneller, dreht die CPU Däumchen, schalten sie ab. Das funktioniert normalerweise recht zuverlässig, allerdings nicht immer. So rotieren bei einem selbst zusammengebauten PC schon einmal die Gehäuselüfter dauerhaft mit voller Kraft, während Prozessorlüfter in Notebooks mitunter erst dann aufdrehen, wenn sich der heiß gelaufene Prozessor bereits sicherheitshalber gedrosselt hat. In solchen Fällen nehmen Sie über Fan2go [1] die Lüftersteuerung kurzerhand selbst in die Hand.
Allerdings gibt es dabei einen kleinen Haken: In der Regel sind die im BIOS beziehungsweise der UEFI-Firmware hinterlegten Geschwindigkeiten auf das System und den Prozessor optimiert. Das gilt insbesondere für Notebooks, die über eine ausgeklügelte Wärmeabfuhr verfügen. Drosseln Sie den aus Ihrer Sicht zu lauten Prozessorlüfter, könnte die CPU dadurch heiß laufen und ihre Leistung begrenzen. Bei zu großer Hitze drohen sogar irreparable Hardwareschäden. Sie sollten Fan2go deshalb ausschließlich wohlüberlegt und aus guten Gründen einsetzen. Das ist beispielsweise der Fall, wenn Ihr System den Gehäuselüfter nicht korrekt erkennt und ihn dauerhaft mit voller Geschwindigkeit betreibt.
Kickstart
Um die Lüfter unter Kontrolle zu bringen, laden Sie von der Github-Seite [2] des Projekts das Programm fan2go-linux-amd64 herunter. Benennen Sie es in fan2go um und kennzeichnen Sie es als ausführbar, etwa mit dem Kommando chmod +x ./fan2go. Das war bereits alles: Eine Installation ist nicht notwendig, Sie können das Programm direkt benutzen.
Rufen Sie jetzt mit ./fan2go help die Hilfe des Programms auf. Sollte Fan2go eine nicht vorhandene libsensors.so.5 bemängeln, fehlt auf Ihrem System die entsprechende Bibliothek. Mit ihrer Hilfe liest Fan2go die Temperatursensoren und die Umdrehungszahlen der Lüfter aus. Die Libsensors gehört zum Paket lm-sensors, das die meisten Distributionen automatisch installieren [3]. Konsultieren Sie im Zweifelsfall die Softwareverwaltung der verwendeten Distribution.
Fan2go benötigt die Bibliotheksversion Libsensors5. Sollte wie etwa im Fall von OpenSuse Tumbleweed nur die Libsensors4 verfügbar sein, müssen Sie Fan2go selbst übersetzen. Installieren Sie dazu über die Softwareverwaltung den Go-Compiler, Make und die Entwicklerdateien von Libsensors. Unter OpenSuse steckt alles Notwendige in den Paketen go, make und libsensors4-devel. Schnappen Sie sich dann von der Fan2go-Github-Seite das Quellcodearchiv und entpacken Sie es. Wechseln Sie im Terminal in das dabei neu entstandene Verzeichnis und rufen Sie make build auf. Das fertige Programm fan2go finden Sie anschließend im Unterverzeichnis bin/.
Lüfterinventur
In einem ersten Schritt verschaffen Sie sich mit dem Befehl ./fan2go detect einen Überblick über die verfügbaren Sensoren und Lüfter. Lassen Sie sich dabei von der scheinbar kryptischen Ausgabe nicht abschrecken: Hinter jedem > liefert Fan2go zunächst den Namen eines Chips oder Controllers, eingerückt darunter erscheinen alle daran angeschlossenen Sensoren und Lüfter.
In Abbildung 1 gibt es beispielsweise einen Controller namens thinkpad-isa-0. Welche Lüfter er kontrolliert, steht eingerückt in der Tabelle unter Fans. Jede Zeile entspricht dabei einem Lüfter, von denen wiederum jeder eine eindeutige Nummer erhält. Über diesen Index können Sie die Lüfter später gezielt ansprechen. Neben den Lüftern offerieren die meisten Controller auch noch Sensoren, die in der Tabelle neben Sensors stehen. Ihre aktuellen Werte lesen Sie unter Value ab.

Abbildung 1: Der Befehl ./fan2go detect liefert alle erkannten Lüfter, der Parameter --no-color entfärbt die Ausgabe.
Anhand der kryptischen Bezeichnungen müssen Sie jetzt herausfinden, an welchem Controller der zu regelnde Lüfter hängt. In Abbildung 1 besitzt das System nur einen einzigen Lüfter, was die Zuordnung drastisch vereinfacht. Hilfe bietet auch die Spalte RPM, in der Sie die aktuelle Umdrehungsgeschwindigkeit ablesen können. Momentan sehr schnell drehende und somit laute Lüfter machen sich in der Spalte mit hohen Werten bemerkbar, gerade nicht rotierende Exemplare verraten sich durch eine 0. Der Lüfter aus Abbildung 1 dreht sich folglich momentan nicht. Wenn Sie unsicher sind, suchen Sie im Internet nach der Bezeichnung der Controller. Gehäuselüfter hängen beispielsweise oft an einem Chip des Herstellers Nuvoton, deren Bezeichnung in der Ausgabe mit nct beginnt (wie etwa nct6775 in Abbildung 2).

Abbildung 2: Hier hängen mehrere Lüfter am Nuvoton-Controller nct6791, drei davon drehen derzeit nicht.
Weitere Hinweise liefert das Label, das allerdings einer kleinen Erklärung bedarf: Fan2go nutzt die vom Linux-Kernel angebotene Schnittstelle hwmon. Sie hält die aktuelle Einstellung des Lüfters mit dem Index 1 und dem Label hwmon4 in der Datei /sys/class/hwmon/hwmon4/pwm1 fest. Auslesen können Sie den Wert per Cat (Listing 1, erste Zeile).
Analog kommen Sie an die Werte der anderen Lüfter: Ersetzen Sie im Pfad hwmon4 durch das Label und die 1 durch den Index des Lüfters. In jedem Fall erhalten Sie eine Zahl zwischen 0 und 255. Dieser PWM-Wert gibt an, wie schnell der Lüfter derzeit rotiert: Bei einer 0 steht der Lüfter still, beim Wert 255 dreht er mit seiner höchsten Geschwindigkeit. Die dabei erreichte tatsächliche Umdrehungsgeschwindigkeit hängt vom Lüfter und vom Controller ab.
Listing 1
Lüfterdrehzahlen
$ cat /sys/class/hwmon/hwmon4/pwm1 $ sudo echo "255" > /sys/class/hwmon/hwmon4/pwm1 $ cat /sys/class/hwmon/hwmon4/pwm1_enable $ sudo echo "1" > /sys/class/hwmon/hwmon4/pwm1_enable
Hörtest
Um nun herauszufinden, um welchen Lüfter es sich in Ihrem Rechner handelt, setzen Sie seine Geschwindigkeit hoch. Dazu schreiben Sie mit Root-Rechten einen entsprechend hohen Wert in die Datei (Listing 1, Zeile 2). Damit dreht der Lüfter schneller und übertönt somit hoffentlich hörbar seine Kollegen.
Diese manuelle Änderung gelingt allerdings nur, wenn der Befehl aus Zeile 3 eine 1 ausgibt. Auch hier steht hwmon4 wieder für das Label und 1 für den Index aus der Fan2go-Ausgabe. Gibt der Befehl nicht 1 aus, hat der Rechner die Kontrolle über den Lüfter. Das ändert der Befehl aus Zeile 4.
In einigen Fällen weigert sich der Kernel, die Kontrolle abzugeben. Dann lässt sich der Lüfter nicht über Fan2go ansteuern. Sobald Sie den gesuchten Lüfter ausgemacht haben, stellen Sie mit den genannten Befehlen die ursprünglichen Einstellungen wieder her.
Nachlader
Vermissen Sie in der Ausgabe von Fan2go einen oder mehrere Lüfter, fehlt meist ein passender Treiber für den zugehörigen Controller. Rufen Sie in einem solchen Fall sudo sensors-detect auf. Das Werkzeug gehört zwar zu Lm-sensors, einige Distributionen lagern dessen Programme aber in ein eigenes Paket aus. Sollte Sensors-detect bei Ihnen nicht vorinstalliert sein, suchen Sie über die Softwareverwaltung nach dem Paket sensors oder lm-sensors.
Sensors-detect versucht alle im System enthaltenen Sensoren und Lüfter sowie die zugehörigen Controller zu erkennen. Die dazu von ihm gestellten Fragen können Sie durchweg mit der Eingabe yes beantworten. Eine Ausnahme ist die letzte Frage: Kurz vor dem Ende des Tests bietet Ihnen Sensors-detect an, eine Konfigurationsdatei zu schreiben. Schlagen Sie das besser aus, da das Werkzeug ansonsten in die Einstellungen des Systems eingreift.
Auf dem Bildschirm zeigt Sensors-detect jetzt wie in Abbildung 3 mehrere Driver an. Diese müssen Sie jeweils mit Root-Rechten und Modprobe laden. In Abbildung 3 betrifft das unter anderem den Treiber nct6775, den sudo modprobe nct6775 aktiviert. Kontrollieren Sie anschließend per ./fan2go detect, ob weitere Lüfter in der Liste auftauchen. Sofern das der Fall ist, müssen Sie die gerade manuell aktivierten Treibermodule beim Systemstart laden lassen. Wie das funktioniert, hängt von der verwendeten Distribution ab. Im Zweifelsfall lassen Sie einfach Sensors-detect die Konfigurationsdatei schreiben.

Abbildung 3: Das kleine Tool Sensors-detect liefert alle Kernel-Module, die sich um die im System verbauten Sensoren und Lüfter kümmern.
Sollten immer noch Lüfter fehlen, starten Sie das System neu und ergänzen am Bootprompt den Parameter acpi_enforce_resources=lax. Wie Sie ihn hinzufügen, hängt erneut von der verwendeten Distribution ab. In der Regel drücken Sie im Bootmenü [E]+, hängen den Parameter am Ende der mit linux oder linuxefi beginnenden Zeile an und starten das System mit [F10]. Dann rufen Sie erneut Sensors-detect zu Hilfe. Wenn auch das den Lüfter nicht zutage fördert, lässt er sich eventuell über eine Gerätedatei ansteuern. Wenn Sie den Namen der Datei nicht kennen, hilft möglicherweise eine Internet-Recherche zum verwendeten Mainboard-Modell.
Externe Steuermänner
Unter anderem bei Nvidia-Grafikkarten steuert ein Programm des entsprechenden Hardwareherstellers die Lüfter. Im Fall des proprietären Nvidia-Grafikkartentreibers empfiehlt sich etwa nvidia-settings als erster Ansprechpartner. Fan2go kann diese Werkzeuge ebenfalls einspannen und nutzen. Dazu müssen Sie allerdings wissen, wie Sie mit dem Programm die Geschwindigkeit des Lüfters auslesen und setzen.
Mit solchen Werkzeugen handeln Sie sich zudem zwei Probleme ein: Um die Lüfter steuern zu können, benötigt Fan2go Root-Rechte. In der Folge läuft auch das zusätzlich eingespannte Programm Nvidia-settings mit weitreichenden Befugnissen. Um die damit einhergehenden Sicherheitsprobleme zumindest ein wenig einzudämmen, startet Fan2go ausschließlich Programme mit der UID 0. Zudem ruft Fan2go das fragliche Tool in recht hoher Frequenz auf. Insbesondere Nvidia-settings weckt dann sehr häufig die Grafikkarte auf, was wiederum den Strombedarf erhöht.
Vorstellungsrunde
Sobald Sie den Lüfter identifiziert haben, erstellen Sie eine Konfigurationsdatei namens fan2go.yaml. Sie sollte sich im gleichen Verzeichnis befinden wie Fan2go. Wie die Endung andeutet, handelt es sich um eine Textdatei im YAML-Format. In ihr hinterlegen Sie die Einstellungen in mehreren Abschnitten. Zunächst definieren Sie im Abschnitt fans:, welche Lüfter Fan2go steuern soll. Listing 2 zeigt dazu ein Beispiel, das Sie wie auch die folgenden Listings als Vorlage verwenden können. Achten Sie beim Abtippen auf die korrekten Einrückungen.
Listing 2 gibt dem Lüfter hinter - id: zunächst einen Namen. Er taucht unter anderem später in den Ausgaben von Fan2go auf. Im Beispiel soll der Prozessorlüfter geregelt werden, weshalb sich cpu_fan als ID anbietet. Da der Lüfter in der Ausgabe von fan2go detect erscheint, steuert ihn Fan2go über die Hwmon-Schnittstelle – das verrät die dritte Zeile. Hinter platform: folgt der Name des Controllers, an dem der Lüfter hängt, hinter index: seine Index-Nummer. Beide Angaben entnehmen Sie der Ausgabe von fan2go detect. Schließlich weist neverStop: true das Werkzeug noch an, den Lüfter ständig laufen zu lassen.
Listing 2
Steuerung per Hwmon
fans:
- id: cpu_fan
hwmon:
platform: thinkpad-isa-0
index: 1
neverStop: true
Müssen Sie den Lüfter über eine Gerätedatei ansprechen, dann tauschen Sie den Abschnitt hwmon: (die Zeilen 3 bis 5) gegen folgende zwei Zeilen aus:
file: path: /dev/myfan
Dabei steht /dev/myfan für den Namen der Gerätedatei, in die Fan2go den PWM-Wert zur Geschwindigkeitssteuerung schreibt.
Sofern ein Programm den Lüfter steuert, müssen Sie wie in Listing 3 die entsprechenden Kommandos hinterlegen. Hinter setPwm: folgt der Befehl, mit dem Fan2go die Lüftergeschwindigkeit setzt. exec: liefert den Pfad zum Programm oder Shell-Skript, hinter args: stehen in den eckigen Klammern jeweils durch Kommas getrennt die zu übergebenden Parameter in Anführungszeichen. Dabei können Sie den Platzhalter %pwm% verwenden. Ihn ersetzt Fan2go beim Aufruf des Programms durch den PWM-Wert zur Geschwindigkeitssteuerung. Analog geben Sie hinter getPwm: das Kommando an, mit dem Fan2go den aktuellen PWM-Wert auslesen kann, und hinter getRpm: den Befehl, mit dem Fan2go die Umdrehungsgeschwindigkeit abfragt.
Listing 3
Steuerung via Nvidia-settings
fans:
- id: gpu_fan
cmd:
setPwm:
exec: /usr/bin/nvidia-settings
args: [ "-a", "[gpu:0]/GPUFanControlState=1", "-a", "[fan]/GPUTargetFanSpeed=%pwm%" ]
getPwm:
exec: /usr/bin/nvidia-settings
args: [ "-q", "[fan]/GPUCurrentFanSpeed", "-t" ]
getRpm:
exec: /usr/bin/nvidia-settings
args: [ "-q", "[fan]/GPUCurrentFanSpeedRPM", "-t" ]
Thermostat
Wenn es im System heißer wird, sollen die Lüfter schneller drehen und so die Wärme flotter aus dem Gehäuse schaufeln. Sie müssen daher als Nächstes festlegen, an welchen Temperatursensoren sich Fan2go orientieren soll. Dabei hilft wieder die Ausgabe von fan2go detect. Suchen Sie dort den oder die zum Lüfter passenden Sensoren. Auch hier müssen Sie sich wohl oder übel an den mehr oder wenigen kryptischen Bezeichnungen orientieren.
Unter coretemp aufgeführte Sensoren messen in der Regel die Temperatur der Prozessorkerne, acpitz-acpi-0 bezeichnet Temperaturfühler irgendwo auf dem Mainboard. Letztere sitzen meist in der Nähe von Komponenten, die viel Wärme entwickeln. Auf Intel-Systemen finden Sie noch einen Chip, dessen Name mit pch beginnt (in Abbildung 1 pch_cannonlake-virtual-0). Dabei handelt es sich um den Platform Controller Hub, der unter anderem USB- und SATA-Schnittstellen bereitstellt. Um den Prozessorlüfter zu regulieren, ist es beim System aus Abbildung 1 sicher sinnvoll, sich am Temperatursensor mit dem Index 1 am Controller coretemp-isa-0 zu orientieren. Im Zweifel müssen Sie die bei Ihrem System vorhandenen Bezeichnungen bei Google nachschlagen.
Den ausgesuchten Sensor hinterlegen Sie in der Konfigurationsdatei fan2go.yaml in einem weiteren Abschnitt sensors:. Listing 4 zeigt dafür ein Beispiel. Hinter - id: vergeben Sie wieder einen Namen für den Sensor; im Listing wurde cpu_package gewählt. Der Zugriff auf den Sensor erfolgt wie beim Lüfter über die Hwmon-Schnittstelle. platform: gibt erneut den Controller an, index: den entsprechenden Index.
Listing 4
Sensor (Beispiel)
sensors:
- id: cpu_package
hwmon:
platform: coretemp-isa-0
index: 1
Sollte sich der Sensor nicht über die Hwmon-Schnittstelle auslesen lassen, sondern nur über eine Gerätedatei, ersetzen Sie die letzten drei Zeilen aus Listing 4 durch folgende Sequenz:
file: path: /dev/mysensor
Dabei steht /dev/mysensor für den Pfad zur entsprechenden Datei. Darin erwartet Fan2go den aktuellen Messwert in Milligrad. Sie können auch ein Skript oder ein Programm regelmäßig einen Temperaturwert ermitteln lassen und ihn dann in eine Textdatei schreiben. Geben Sie in diesem Fall anstelle von /dev/mysensor den Pfad zur entsprechenden Textdatei an.
Springende Kurven
Wie sich der Lüfter bei welcher Temperatur verhält, legen Sie in der fan2go.yaml im Abschnitt curves: mithilfe einer Temperaturkurve fest. In unserem Beispiel soll der Prozessorlüfter stoppen, sobald die Temperatur des Prozessors unter 40 Grad sinkt. Ab 50 Grad soll er mit halber Kraft drehen und ab 70 Grad schließlich mit maximaler Geschwindigkeit rotieren.
Die Umsetzung zeigt Listing 5: Zunächst erhält die Temperaturkurve wieder eine ID, um sie später einfacher verwenden zu können. Im Listing heißt sie cpu_curve. Die Rotationsgeschwindigkeit steigt mit der Temperatur. Dieses Verhalten zeigt linear: an. Im Listing soll sich Fan2go dabei am sensor: mit der ID cpu_package orientieren. Anschließend folgt unter steps: eine Auflistung der kritischen Temperaturen und der zugehörigen Lüftergeschwindigkeiten. Vor dem Doppelpunkt steht jeweils der Sensorwert und somit in der Regel die Temperatur in Grad (nicht Milligrad). Hinter dem Doppelpunkt folgt der PWM-Wert. Sie können übrigens beliebig viele weitere Werte und somit Zwischenstufen hinzufügen.
Listing 5
Lineare Temperaturkurve
curves:
- id: cpu_curve
linear:
sensor: cpu_package
steps:
- 40: 0
- 50: 128
- 70: 255
Abschließend müssen Sie Fan2go noch mitteilen, dass diese Temperaturkurve für den Prozessorlüfter alias cpu_fan gilt. Dazu ergänzen Sie im Abschnitt fans: unter der id: cpu_fan noch die Angabe curve: cpu_curve, also:
neverStop: true curve: cpu_curve
Abschließend notieren Sie ganz am Ende der fan2go.yaml noch in einer eigenen Zeile dbPath: "./fan2go.db". In dieser Datei merkt sich Fan2go während seiner Arbeit einige Messwerte.
Testlauf
Die fertige Konfigurationsdatei prüfen Sie mit dem Kommando ./fan2go config validate auf Fehler. Sofern das Werkzeug keine Einwände hat, starten Sie Fan2go anschließend über den Befehl sudo ./fan2go mit Root-Rechten. Testen Sie jetzt am besten mit vielen rechenintensiven Programmen, ob sich der Lüfter wie gewünscht verhält. Für alle neu angelegten Lüfter misst Fan2go die Geschwindigkeit. Die zugehörigen Messwerte liefert es Ihnen als Diagramm, wenn Sie es in einem zweiten Terminal mit ./fan2go curve aufrufen (Abbildung 4).

Abbildung 4: An der von Fan2go erzeugten Kurve können Sie schnell ablesen, ob sich der Lüfter korrekt verhält.
Auf die gezeigte Weise können Sie noch weitere Lüfter in der Datei fan2go.yaml anmelden. Fügen Sie dazu in den Abschnitten fans:, sensors: und curves: nach demselben Prinzip weitere Einträge hinzu. Diese beginnen jeweils wieder mit - id: und folgen dem beschriebenen Aufbau. Orientieren können Sie sich an der Beispiel-Konfigurationsdatei, die Sie im Quellcodearchiv oder auf Github [4] finden. In jedem Fall sollten Sie vor dem Einsatz wieder mit ./fan2go config validate prüfen, ob die Konfiguration funktioniert.
Im Hintergrund
Haben Sie auf diese Weise alle nervenden Lüfter unter Kontrolle gebracht, können Sie Fan2go beenden und als Hintergrunddienst starten. Dazu kopieren Sie zunächst das Programm nach /usr/bin (Listing 6, erste Zeile). Denken Sie daran, dass Sie Fan2go dort ab sofort selbst aktualisieren müssen. Laden Sie von Github die passende Systemd-Unit [5] herunter und kopieren Sie sie in das von der verwendeten Distribution vorgesehene Verzeichnis, in der Regel /etc/systemd/system/.
Listing 6
Betrieb im Hintergrund
$ sudo cp ./fan2go /usr/bin/fan2go $ sudo systemctl daemon-reload sudo systemctl enable --now fan2go $ fan2go fan --id cpu_fan speed $ fan2go fan --id cpu_fan speed 255
Erstellen Sie mit dem Befehl sudo mkdir /etc/fan2go das Verzeichnis /etc/fan2go/ und entfernen Sie in der Konfigurationsdatei fan2go.yaml die letzte Zeile dbPath: "./fan2go.db". Das Werkzeug speichert dann die Messdaten automatisch in der Datei /etc/fan2go/fan2go.db. Verschieben Sie die Konfigurationsdatei fan2go.yaml in das Verzeichnis /etc/fan2go und aktivieren Sie schließlich Fan2go als Dienst (Listing 6, zweite Zeile).
Während der Dienst läuft, können Sie sich jederzeit die aktuelle Geschwindigkeit eines Lüfters ausgeben lassen. Im Beispiel aus der dritten Zeile des Listings wäre das der PWM-Wert des Lüfters mit der ID cpu_fan. Umgekehrt können Sie auch direkt eine Lüftergeschwindigkeit setzen (Zeile 4).
Neben den vorgestellten Funktionen bietet Fan2go noch einige weitere Möglichkeiten. So lassen sich etwa mehrere Temperaturkurven zu einem komplexen Regelsatz kombinieren. Auf Wunsch liefert Fan2go die aktuellen Daten an die Auswertungssoftware Prometheus. Daneben lässt sich das Werkzeug auch über eine REST-Schnittstelle steuern. Weitere Informationen zum Nutzen dieser Funktionen finden Sie in der übersichtlichen Dokumentation auf der Fan2go-Github-Seite sowie in der ausführlich kommentierten Beispiel-Konfigurationsdatei.
Fazit
Haben Sie erst einmal herausgefunden, hinter welchem Controller und welcher Index-Nummer sich ein Lüfter verbirgt, übernehmen Sie mit Fan2go schnell dessen Steuerung. Die Konfigurationsdatei bleibt dabei äußerst übersichtlich, zudem arbeitet Fan2go zuverlässig im Hintergrund. Falls die festgelegte Geschwindigkeit doch nicht passt, können Sie jederzeit manuell eingreifen. Fan2go ist somit der ideale Helfer, um Lüfter unter Ihre Kontrolle zu bringen. (jlu)
Glossar
-
PWM
-
Pulse-width Modulation. Bei der Pulsweitenmodulation wechselt eine technische Kenngröße zwischen diskreten Werten.
Infos
-
Fan2go herunterladen: https://github.com/markusressel/fan2go/releases
-
Lm-sensors: https://github.com/lm-sensors/lm-sensors
-
Kommentierte
fan2go.yaml: https://github.com/markusressel/fan2go/blob/master/fan2go.yaml -
Fan2go Systemd Service Unit: https://github.com/markusressel/fan2go/blob/master/fan2go.service





