Fedora: Lüftergeschwindigkeit einer NVIDIA-Grafikkarte
Verfasst: Sa Jan 19, 2013 9:43 pm
Hallo!
Falls jemand von euch eine NVIDIA-Grafikkarte besitzt, und diese aber nicht mit den proprietären Treibern "nvidia" betreibt, sondern mit dem freien Treiber "nouveau", wird derjenige wahrscheinlich ein Problem feststellen: die Lüftergeschwindigkeit ist zu hoch, die Grafikkarte zu laut.
So war das auch bei mir: ich bin vollends mit der Leistung des nouveau-Treibers zufrieden, die Lüftergeschwindigkeit war aber ein killer. Deswegen habe ich mir früher den proprietären Treiber installiert. Nicht so unter Fedora 18!!
Im neuen Kernel kann man nämlich die Lüftergeschwindigkeit manuell regulieren. Bevor ihr das tut, solltet ihr einige Warnhinweise beachten:
ACHTUNG: Hiermit könnt ihr eure Grafikkarte durchschmoren!
Ich übernehme keine Haftung für jegliche Hardware, die dadurch kaputt wird!
Ihr Arbeitet hier mit ziemlich experimentellem Kernel-Code, der euch ziemlich rohen Zugriff auf eure Hardware erlaubt. Solltet ihr versehentlich (z.B. durch einen Tippfehler) eine zu langsame Lüftergeschwindigkeit wählen, kann es bei hoher Grafikkartenauslastung dazu führen dass diese überhitzt und permanenten Schaden trägt. Bevor ihr das macht, überlegt euch bitte zweimal ob dieses Risiko eingehen wollt. Wenn ja, dann passt bitte ganz genau auf, welche Werte ihr eurem System übergebt.
Es empfiehlt sich das Paket "lm_sensors" zu installieren, und die Temperatur der Grafikkarte ab- und zu mit dem Befehl "sensors" zu überprüfen.
---
Wollt ihr Trotzdem das Problem in den Griff bekommen, habe ich hier eine kleine Anleitung um Ruhe in euer Zimmer zu bringen. Die Grobe vorgehensweise ist dabei:
1. Im Kernel erlauben, dass parameter des Treibers verändert werden
2. Ein Skript schreiben, dass die Parameter automatisch verändert
3. Dem System mitteilen das Skript zu starten
1) Um überhaupt Irgendetwas verändern zu können, müsst ihr dem Kernel den Parameter "nouveau.perflvl_wr=7777" übergeben. Keine sorge, das müsst ihr nicht manuell machen.
Öffnet die Datei /etc/default/grub, und sucht die Zeile die mit "GRUB_CMDLINE_LINUX" beginnt. Dort fügt ihr NACH dem letzten Parameter, aber VOR dem schließenden Anführungszeichen ein Leerzeichen und nouveau.perflvl_wr=7777 ein. Achtet dabei, dass keine der anderen Parameter verändert werden. Beim mir sieht die Zeile nun so aus:
Jetzt müsst ihr die Grub-Konfigurationsdateien aktualisieren. Das geht mit folgendem Kommando (als Root):
Nach einem Reboot solltet ihr die Lüftergeschindigkeit verändern können.
2) nouveau hat drei Modi um die Lüftergeschwindigkeit zu regeln:
1: Manuelle Kontrolle
2: Automatische Kontrolle
Schön wäre es natürlich, wenn man das ganze automatisch Regeln kann, dies hat bei meiner 9600GT (Chipsatz NV94) allerdings nicht funktioniert, weswegen ich auf Manuell zurückgreifen musste.
Um die Manuelle steuerung einzuschalten, muss man nun (natürlich als Root) in das /sys/ Dateisystem den Wert "1" schreiben:
Somit ist die manuelle Steuerung scharf - ab jetzt muss man aufpassen.
Die Lüftergeschwindkeit kann man regeln, indem man einen Wert zwischen 0 und 100 in die Datei /sys/class/drm/card0/device/pwm1 schreibt. Standardmäßig ist dieser auf 100 gesetzt. Ihr könnt nun vorsichtig versuchen die Geschwindigkeit zu drosseln. Für mich hat ein Wert von 30 gut funktioniert:
Probiert das nun für eure Karte aus. Dabei solltet ihr zwischendurch die Temperatur mit dem "sensors"-Befehl überprüfen:
Ich hoffe, 61°C ist noch im Akzeptablen bereich.
Damit ihr diese Befehle nicht jedes mal eingeben müsst, schreiben wir ein kleines Bash skript:
silence-nouveau.sh
Dieses Skript dreht die Geschwindigkeit runter, wenn man es ohne Argument oder mit "on", "yes" oder "1" aufruft, und es dreht die Geschwindigkeit wieder rauf, wenn man es mit "off", "0" oder "no" aufruft. Speichert es als "silence-nouveau.sh" ab, und legt es nach /usr/local/bin/.
Probiert dieses skript ein paar Mal aus, überprüft die Temperatur. Wenn alles in Ordnung ist, können wir mit dem nächsten Schritt fortfahren.
3) Jetzt müssen wir systemd sagen, dass es unser Skript beim hochfahren Starten soll. Das tun wir, indem wir eine Unit dafür erstellen. Die sieht so aus:
silence-nouveau.service
Was das tut: "oneshot" bedeutet, dass unser Skript beendet werden muss, bevor der "Dienst" (der ja gar keiner ist) als hochgefahren betrachtet werden kann.
RemainAfterExit heißt, dass unser "Dienst" noch aktiv ist, nachdem seine ausführbare Datei (also unser Skript) beendet ist.
ExecStart und ExecStop sind die Befehle, die ausgeführt werden um unseren "Dienst" zu starten/stoppen.
WantedBy gibt an, für welches Target der Dienst gestartet wird. Ich weiß nicht genau, was "basic.target" bedeutet, aber ich nehme an, dass es das Grundsystem ist. Sprich: unser Dienst wird gestartet wenn das Grundsystem hochgefahren wird - und das ist genau was wir wollen.
Mehr Informationen zu dieser Datei gibts mit "man 5 systemd.service".
Speichert diese Datei unter /etc/systemd/system/silence-nouveau.service ab.
Um den Dienst nun zu aktivieren, müsst ihr folgende befehle eingeben:
So, und das wars schon. Nicht vergessen auf die Temperatur zu achten!
Falls jemand von euch eine NVIDIA-Grafikkarte besitzt, und diese aber nicht mit den proprietären Treibern "nvidia" betreibt, sondern mit dem freien Treiber "nouveau", wird derjenige wahrscheinlich ein Problem feststellen: die Lüftergeschwindigkeit ist zu hoch, die Grafikkarte zu laut.
So war das auch bei mir: ich bin vollends mit der Leistung des nouveau-Treibers zufrieden, die Lüftergeschwindigkeit war aber ein killer. Deswegen habe ich mir früher den proprietären Treiber installiert. Nicht so unter Fedora 18!!
Im neuen Kernel kann man nämlich die Lüftergeschwindigkeit manuell regulieren. Bevor ihr das tut, solltet ihr einige Warnhinweise beachten:
ACHTUNG: Hiermit könnt ihr eure Grafikkarte durchschmoren!
Ich übernehme keine Haftung für jegliche Hardware, die dadurch kaputt wird!
Ihr Arbeitet hier mit ziemlich experimentellem Kernel-Code, der euch ziemlich rohen Zugriff auf eure Hardware erlaubt. Solltet ihr versehentlich (z.B. durch einen Tippfehler) eine zu langsame Lüftergeschwindigkeit wählen, kann es bei hoher Grafikkartenauslastung dazu führen dass diese überhitzt und permanenten Schaden trägt. Bevor ihr das macht, überlegt euch bitte zweimal ob dieses Risiko eingehen wollt. Wenn ja, dann passt bitte ganz genau auf, welche Werte ihr eurem System übergebt.
Es empfiehlt sich das Paket "lm_sensors" zu installieren, und die Temperatur der Grafikkarte ab- und zu mit dem Befehl "sensors" zu überprüfen.
---
Wollt ihr Trotzdem das Problem in den Griff bekommen, habe ich hier eine kleine Anleitung um Ruhe in euer Zimmer zu bringen. Die Grobe vorgehensweise ist dabei:
1. Im Kernel erlauben, dass parameter des Treibers verändert werden
2. Ein Skript schreiben, dass die Parameter automatisch verändert
3. Dem System mitteilen das Skript zu starten
1) Um überhaupt Irgendetwas verändern zu können, müsst ihr dem Kernel den Parameter "nouveau.perflvl_wr=7777" übergeben. Keine sorge, das müsst ihr nicht manuell machen.
Öffnet die Datei /etc/default/grub, und sucht die Zeile die mit "GRUB_CMDLINE_LINUX" beginnt. Dort fügt ihr NACH dem letzten Parameter, aber VOR dem schließenden Anführungszeichen ein Leerzeichen und nouveau.perflvl_wr=7777 ein. Achtet dabei, dass keine der anderen Parameter verändert werden. Beim mir sieht die Zeile nun so aus:
Code: Alles auswählen
GRUB_CMDLINE_LINUX="rd.md=0 rd.lvm=0 rd.dm=0 $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param || :) rd.luks=0 vconsole.keymap=de rhgb quiet nouveau.perflvl_wr=7777"
Code: Alles auswählen
grub2-mkconfig -o /boot/grub2/grub.cfg
2) nouveau hat drei Modi um die Lüftergeschwindigkeit zu regeln:
0: Keine besondere Kontrolle (volle Geschwindigkeit)http://www.mjmwired.net/kernel/Documentation/hwmon/sysfs-interface#250 hat geschrieben: pwm[1-*]_enable
Fan speed control method:
0: no fan speed control (i.e. fan at full speed)
1: manual fan speed control enabled (using pwm[1-*])
2+: automatic fan speed control enabled
Check individual chip documentation files for automatic mode
details.
RW
1: Manuelle Kontrolle
2: Automatische Kontrolle
Schön wäre es natürlich, wenn man das ganze automatisch Regeln kann, dies hat bei meiner 9600GT (Chipsatz NV94) allerdings nicht funktioniert, weswegen ich auf Manuell zurückgreifen musste.
Um die Manuelle steuerung einzuschalten, muss man nun (natürlich als Root) in das /sys/ Dateisystem den Wert "1" schreiben:
Code: Alles auswählen
echo 1 > /sys/class/drm/card0/device/pwm1_enable
Die Lüftergeschwindkeit kann man regeln, indem man einen Wert zwischen 0 und 100 in die Datei /sys/class/drm/card0/device/pwm1 schreibt. Standardmäßig ist dieser auf 100 gesetzt. Ihr könnt nun vorsichtig versuchen die Geschwindigkeit zu drosseln. Für mich hat ein Wert von 30 gut funktioniert:
Code: Alles auswählen
echo 30 > /sys/class/drm/card0/device/pwm1
Code: Alles auswählen
# sensors
nouveau-pci-0400
Adapter: PCI adapter
temp1: +61.0°C (high = +95.0°C, crit = +105.0°C)
Damit ihr diese Befehle nicht jedes mal eingeben müsst, schreiben wir ein kleines Bash skript:
silence-nouveau.sh
Code: Alles auswählen
#!/bin/bash
shopt -s nocasematch
case $1 in
off|0|no)
echo 100 > /sys/class/drm/card0/device/pwm1
echo 0 > /sys/class/drm/card0/device/pwm1_enable
RET=$?
;;
on|1|yes|"")
echo 1 > /sys/class/drm/card0/device/pwm1_enable &&
echo 30 > /sys/class/drm/card0/device/pwm1
RET=$?
;;
*)
RET=1
esac
shopt -u nocasematch
exit $RET
Dieses Skript dreht die Geschwindigkeit runter, wenn man es ohne Argument oder mit "on", "yes" oder "1" aufruft, und es dreht die Geschwindigkeit wieder rauf, wenn man es mit "off", "0" oder "no" aufruft. Speichert es als "silence-nouveau.sh" ab, und legt es nach /usr/local/bin/.
Probiert dieses skript ein paar Mal aus, überprüft die Temperatur. Wenn alles in Ordnung ist, können wir mit dem nächsten Schritt fortfahren.
3) Jetzt müssen wir systemd sagen, dass es unser Skript beim hochfahren Starten soll. Das tun wir, indem wir eine Unit dafür erstellen. Die sieht so aus:
silence-nouveau.service
Code: Alles auswählen
[Unit]
Description=Silence my nouveau-controlled NVIDIA graphics card fan
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/silence-nouveau.sh
ExecStop=/usr/local/bin/silence-nouveau.sh 0
[Install]
WantedBy=basic.target
RemainAfterExit heißt, dass unser "Dienst" noch aktiv ist, nachdem seine ausführbare Datei (also unser Skript) beendet ist.
ExecStart und ExecStop sind die Befehle, die ausgeführt werden um unseren "Dienst" zu starten/stoppen.
WantedBy gibt an, für welches Target der Dienst gestartet wird. Ich weiß nicht genau, was "basic.target" bedeutet, aber ich nehme an, dass es das Grundsystem ist. Sprich: unser Dienst wird gestartet wenn das Grundsystem hochgefahren wird - und das ist genau was wir wollen.
Mehr Informationen zu dieser Datei gibts mit "man 5 systemd.service".
Speichert diese Datei unter /etc/systemd/system/silence-nouveau.service ab.
Um den Dienst nun zu aktivieren, müsst ihr folgende befehle eingeben:
Code: Alles auswählen
systemctl daemon-reload # lese Konfigurationsdateien von systemd neu ein
systemctl start silence-nouveau.service # Fährt euer Lüfter herunter?
systemctl stop silence-nouveau.service # Fährt euer Lüfter herauf?
systemctl enable silence-nouveau.service # Den Dienst einbinden. Ab jetzt wird er jedes mal gestartet.