Lüfter des Raspberry Pi 5 Kühlers selbst steuern: So geht es

Als Video ansehen
Bereitgestellt über YouTube

Lüfter des Raspberry Pi 5 Kühlers selbst steuern: So geht es

Seit Linux 6.1.71 lässt sich der Lüfter des offiziellen Raspberry Pi Kühlers selbst steuern. Und zwar, ohne auf manuelles PWM zurückgreifen zu müssen. Denn der angepasste Kernel des Raspberry Pi OS erlaubt es durch eine Aktualisierung, die Stufen anzupassen. Was du dafür brauchst und wie es funktioniert, zeigt dieser Beitrag – Schritt für Schritt.

Bisher konnte der Lüfter nur sehr eingeschränkt kontrolliert werden

Der Lüfter des offiziellen Raspberry Pi 5 Kühlers wird erst ab 50°C Prozessortemperatur aktiv und läuft in vier verschiedenen Stufen, beginnend ab 30% Geschwindigkeit. Im Beitrag zur Montage des Kühlers listet sie der Abschnitt So wird der Lüfter automatisch geregelt auf. Der folgende Abschnitt zeigt, welche Möglichkeiten es bislang gab, um diese zu beeinflussen.

Nachdem aus der Community nach Möglichkeiten zur Anpassung gefragt wurde, habe ich mich auf die Suche gemacht. Doch die waren ernüchternd: Man kann die Stufen zwar manuell setzen. Doch nach wenigen Sekunden setzt sie die automatische Steuerung wieder auf die Standard-Werte. Dauerhaft konnte der Lüfter lediglich entweder komplett abgeschaltet oder auf konstant 100% betrieben werden. Beides kaum alltagstauglich für jemanden, der die Stufen an die eigenen Bedürfnisse anpassen möchte.

Eine Änderung im angepassten Kernel schafft Abhilfe: Das brauchst du

Es wurde daher als Vorschlag zur Ergänzung im Linux-Kernel des Raspberry Pi eingereicht.1 Eine solche Funktion war zu diesem Zeitpunkt bereits in Arbeit, sodass Pull-Request #5822 schnell seinen Weg in den Kernel fand.2 Die Änderungen wurden in Version 6.1.71 veröffentlicht.3

Während ich diesen Beitrag schreibe, ist die Änderung recht frisch: Der Pull-Request wurde erst am 04.01.2024 erstellt. Die Tests sind abgeschlossen und er wurde als stabile Kernel-Aktualisierung per APT verteilt. Allerdings werden die offiziellen Abbilder nur alle paar Monate aktualisiert. Im Imager kann man sehen, dass die Abbilder derzeit auf dem Stand vom 05.12.2023 sind.

Dementsprechend ist dort noch ein etwas älterer Kernel 6.1.63 vom November 2023 enthalten, den wir über die Paketverwaltung auf derzeit 6.1.73 aktualisieren können:

$ uname -a
Linux pi5 6.1.0-rpi7-rpi-2712 #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24) aarch64 GNU/Linux

$ apt update
$ apt list --upgradable 2>/dev/null | grep linux-image
linux-image-rpi-2712/stable 1:6.1.73-1+rpt1 arm64 [upgradable from: 1:6.1.63-1+rpt1]
linux-image-rpi-v8/stable 1:6.1.73-1+rpt1 arm64 [upgradable from: 1:6.1.63-1+rpt1]
$ sudo apt upgrade

Neuere Versionen sind ebenfalls möglich. Wichtig ist, dass wir mindestens 6.1.71 oder neuer installieren. Ansonsten werden die Parameter aus dem nächsten Abschnitt schlicht ignoriert und der Lüfter regelt sich nach den Standard-Einstellungen. Da der Kernel beim Start geladen wird, ist anschließend ein Neustart (z.B. mit sudo reboot notwendig). Nun sollte uns uname einen neueren geladenen Kernel melden:

$ uname -a
Linux pi5 6.1.0-rpi8-rpi-2712 #1 SMP PREEMPT Debian 1:6.1.73-1+rpt1 (2024-01-25) aarch64 GNU/Linux

Tipp für Vim

Die config.txt des Raspberry Pi OS ist im Ini-Format aufgebaut. Der vim Texteditor unterstützt Syntax-Hervorhebung für das Format. Allerdings erkennt er das Format anhand der Dateiendung. Da das Raspberry Pi OS stattdessen die Erweiterung für Textdateien verwendet, wird sie selbst dann nicht erkannt, wenn die Syntax-Hervorhebung mit :syntax on aktiviert wurde.

Wer dennoch zur besseren Übersicht nicht darauf verzichten möchte, kann sie händisch aktivieren:

:set syntax=dosini

Allerdings merkt sich der Editor dies nur bis zum Beenden. Wer die Datei öfters bearbeitet, möchte obigen Befehl sicher nicht jedes mal eingeben müssen. Alternativ können wir per Modeline in der ersten Zeile einen Kommentar (Raute in diesem Falle) einfügen und darüber Konfigurationsanweisungen setzen, die vim nur für diese eine Datei berücksichtigen soll. Die Firmware des Raspberry Pi OS wird ihn als Kommentar ignorieren

# vim: syntax=dosini

So kontrollierst du die Lüfter-Stufen selbst

Die neuen Parameter kannst du in der Datei /boot/firmware/config.txt setzen.4 Sie lag ehemals /boot/config.txt bis einschließlich Bullseye5. Als Übergangslösung existierte eine Verknüpfung, die kürzlich entfernt wurde.6 Da der Raspberry Pi 5 Bookworm aufwärts unterstützt, gilt dort nur noch der neue Pfad. Am Ende fügst du in die Gruppe [all] folgenden Block ein:

[all]
dtparam=fan_temp0=30000
#dtparam=fan_temp0=50000
dtparam=fan_temp0_hyst=5000
dtparam=fan_temp0_speed=200
#dtparam=fan_temp0_speed=75

dtparam=fan_temp1=60000
dtparam=fan_temp1_hyst=5000
dtparam=fan_temp1_speed=125

dtparam=fan_temp2=67500
dtparam=fan_temp2_hyst=5000
dtparam=fan_temp2_speed=175

dtparam=fan_temp3=75000
dtparam=fan_temp3_hyst=5000
dtparam=fan_temp3_speed=250

Das Beispiel lässt den Lüfter zwischen 30 und 60 Grad (erste Stufe) auf nahezu Vollast drehen. Alles ab Stufe 2 (>60°C) entspricht dem Standard. Dies ist für die alltägliche Nutzung natürlich unsinnig und dient nur als ersten Funktionstest: Bei Zimmertemperatur wird der Raspberry Pi in diesem Bereich liegen. Starten wir ihn nun neu, sollte der Lüfter dauerhaft so hoch drehen, damit er deutlich hörbar wird – statt abgeschaltet zu sein, wie es unter 50°C standardmäßig der Fall ist.

Die gesetzten dtparam Zeilen stehen für Device Tree.7 Hinter dem Gerätebaum steckt kein botanisches Projekt, sondern eine Datenstruktur: Er beschreibt die verbundene Hardware für den Kernel. Das Konzept ist bei ARM und weiteren Architekturen mit eher geringerer Verbreitung gängig. X86-Computer nutzen dafür Protokolle wie ACPI. Für den Raspberry Pi bedeutet das: Wir können darüber verschiedene Parameter der Hardware beeinflussen.8 Durch das Update wurden uns eine ganze Reihe davon neu zur Verfügung gestellt:

  • fan_tempX bezieht die jeweilige Einstellung als Präfix auf eine bestimmte Temperaturgruppe. Wie im Montagebeitrag zum Kühler bereits aufgelistet, gibt es insgesamt vier Stufen. In der IT beginnt man meist von 0 an zu zählen: fan_temp0 definiert daher Stufe 1, fan_temp1 die Stufe 2 usw.
  • Der erste Wert fan_temp0=30000 setzt den Grenzwert, ab dem diese Stufe aktiv wird. Sie ist in Milli-Celsius angegeben, d.H. um Faktor 1000 multipliziert: 30000 / 1000 = 30 °C. Der Standardwert lautet 50°C, ihn habe ich in der Zeile darunter mit einer Raute # auskommentiert. Würdest du hier z.B. 35000 angeben, schaltet sich der Lüfter in der ersten Stufe (0) ab 35°C ein.
  • dtparam=fan_temp0_hyst=5000 bezieht sich durch das Präfix fan_temp_0 auf die erste Stufe (0). Mit hyst ist Hysterese gemeint. Temperatur-Hysterese ist die Differenz zwischen Ein- und Ausschalttemperatur. Sie ist ebenfalls in Milli-Celsius angegeben und steht standardmäßig auf 5°C. Der Grenzwert muss mindestens um diesen Wert unterschritten werden, damit die vorherige Stufe greift – bei der ersten Stufe bedeutet das: Lüfter aus. So soll verhindert werden, dass der Lüfter ständig ein- und ausgeschaltet wird, weil die schwankende Temperatur nur 1 oder 2 Grad über dem Grenzwert liegt. Und kurz danach wieder abgeschaltet, da sie durch den Lüfter nun natürlich wieder sinkt. Das schadet dem Motor, außerdem nervt es in den höheren Stufen auch den Nutzer.
  • dtparam=fan_temp0_speed=200 legt die Geschwindigkeit auf der PWM-Skala von 0 bis 255 fest, wobei 255 für volle Leistung steht. Als Faustformel kann man den Wert durch 2,5 teilen und erhält die prozentuale Leistung: 200 entspricht somit etwa 80%, daher ist der Lüfter deutlich hörbar. Der ebenfalls auskommentierte Standardwert sieht 75 vor, also 30%.

Diese drei Einstellungen lassen sich für jede der vier Temperatur-Gruppen anpassen: fan_temp1=40000 senkt beispielsweise die Schwelle von Stufe 2 auf 40°C (standardmäßig 60°C) ab. Eine sinnvollere Konfiguration könnte etwa wie folgt aussehen, wenn man die Grenzwerte reduzieren möchte, um den Pi möglichst kühl zu halten:

[all]
dtparam=fan_temp0=35000
dtparam=fan_temp0_hyst=5000
dtparam=fan_temp0_speed=75

dtparam=fan_temp1=50000
dtparam=fan_temp1_hyst=5000
dtparam=fan_temp1_speed=125

dtparam=fan_temp2=60000
dtparam=fan_temp2_hyst=5000
dtparam=fan_temp2_speed=175

dtparam=fan_temp3=65000
dtparam=fan_temp3_hyst=5000
dtparam=fan_temp3_speed=250

Ich habe die Lüfter-Geschwindigkeiten beibehalten und jeweils nur die Temperaturgrenze herunter gesetzt. Statt bei 50°C aktiviert sich die erste Stufe bereits ab 35°C. Allerdings flüster leise, weil die Geschwindigkeit nur 30% beträgt. Nahezu volle Drehzahl wird bereits ab 65°C erreicht – standardmäßig wartet die Steuerung ansonsten noch 10°C mehr. Gerade bei den hohen Temperaturen ist das sinnvoll: Hardware mag keine Hitze und altert dabei schneller. Insbesondere in wärmeren Umgebungen kann das eine gute Idee sein, damit der Raspberry Pi nicht trotz Kühlung dauerhaft relativ heiß bleibt.

Fazit: Ab sofort regelst du den Lüfter

Der offizielle Kühler ist eine sinnvolle Investition, da der Raspberry Pi 5 relativ schnell recht heiß wird. Bereits für den Vorgänger hätte ich mir das gewünscht, dort gab es nur Drittanbieter-Zubehör. Es ist schön, dass sich dies geändert hat und man sogar den Lüfter per PWM steuern kann. Die Standardwerte der Lüftersteuerung sind für viele sicher ausreichend und in jedem Falle deutlich besser, als ihn ohne Kühlung zu betreiben. Bereits der Kühlkörper ohne aktiven Lüfter hilft dabei.

Einzig die kaum vorhandene offizielle Möglichkeit zum Beeinflussen der Steuerung war ein kleiner Wermutstropfen – dies wurde teils auch von der Community gefordert. Damit ist nun Schluss: Recht Still und Heimlich wurden per Kernel-Update die notwendigen Einstellungen nachgereicht, um die 4×3 Parameter selbst einstellen zu können. So profitieren wir von der Lüftersteuerung. Um den Lüfter per PWM direkt ansprechen zu können,9 müssten wir etwas vergleichbares nämlich selbst entwickeln. Wer möchte, kann das natürlich weiterhin tun. Den Meisten dürfte jedoch bereits damit geholfen sein, wenn sie die (Grenz-) Werte für die vorhandenen Stufen anpassen können. Das geht nun, gute Arbeit!

Quellen

  1. https://github.com/raspberrypi/linux/issues/5820 ↩︎
  2. https://github.com/raspberrypi/linux/pull/5822 ↩︎
  3. https://github.com/raspberrypi/rpi-firmware/commit/23a2c11685ae13d37b89b5b56a522944e7d96317 ↩︎
  4. https://raspberrypi.stackexchange.com/a/145882/73079 ↩︎
  5. https://github.com/raspberrypi/documentation/issues/3089 ↩︎
  6. https://github.com/RPi-Distro/raspberrypi-sys-mods/issues/88 ↩︎
  7. https://www.raspberrypi.com/documentation/computers/config_txt.html#dtparam ↩︎
  8. https://github.com/raspberrypi/firmware/tree/master/boot/overlays ↩︎
  9. https://raspberrypi.stackexchange.com/a/145563/73079 ↩︎

Leave a Reply