Inhaltsverzeichnis

FreeBSD - Power-Management

FreeBSD 4

APM und ACPI

Die APM- und ACPI-Module schliessen sich gegenseitig aus! Es kann also entweder das APM-Modul oder das ACPI-Modul geladen werden. Das bedeutet, es kann nur einen geben…

Advanced Power Management (APM)

Im eigenen Kernel muss APM durch einen Eintrag wie folgt aktiviert werden:

Intel:

	device        apm0

VIA: (VIA VT82C586B,596,686A and VT8233 SMBus controllers)

	device        viapm

Der Standard-Kernel (GENERIC) kennt APM, es muss aber erst aktiviert werden. In der GENERIC-Datei ist der APM-Eintrag deaktiviert (device apm0 at nexus? disable flags 0x20).

Das APM wird mit dem Standeard-Kernel (ohne einen eigenen zu bauen) in der Datei "/boot/kernel.conf" mit dem Eintrag:

	enable apm0

sowie in der Datei "/etc/rc.conf" mit dem Eintrag:

	apm_enable="YES"

aktiviert.

Jetzt lässt sich der Rechner mit

# /sbin/halt -p

ausschalten

oder mit

# apm -z

in den Suspend-Modus versetzen. Siehe "man apm"

Advanced Configuration and Power Interface (ACPI)

Konfiguration

Es wird dringend emfohlen, die ACPI-Unterstützung nicht in den Kernel einzukompilieren. (Normalerweise bevorzuge ich immer das einkompilieren!) Also laden wir das Modul "acpi.ko". Das hinzuladen des Modul's im laufenden Betrieb ist gefährlich, da dies sogar manchmal fatale Folgen haben kann. Also laden wir es mit dem Kernel zusammen durch den "loader":

# vi /boot/loader.conf.local
acpi_load="YES"

Alternativ kann man auch bei jedem Rechnerstart im Loader-Menü mit dem Menüpunkt "2" starten, der lädt das ACPI-Modul auch…

Aber wer sitzt schon beim Startvorgang IMMER vor der Kiste? ;-)

APM sollte abgeschaltet sein, und auch nicht im Kernel mit einkompiliert sein.

# vi /etc/rc.conf
apm_enable="NO"
apmd_enable="NO"

Ob das ACPI-Modul geladen ist, findet man mit "dmesg" raus.

z.B. so:

# dmesg | grep -i acpi
	Preloaded elf module "/boot/kernel/acpi.ko" at 0xc08791f4.
	acpi0:  on motherboard
	acpi0: Power Button (fixed)
	Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
	acpi_timer0: <24-bit timer at 3.579545MHz> port 0x1008-0x100b on acpi0
	acpi_cpu0:  port 0x530-0x537 on acpi0
	acpi_tz0:  port 0x530-0x537 on acpi0
	...

Jetzt funktioniert zum Beispiel "halt -p", der Rechner sollte mit diesem Kommando nicht nur runter fahren sondern auch den Strom abschalten.

Weitere Einstellungen können, als root, auf der Kommandozeile mit "acpiconf" vorgenommen werden.

Dieses Kommando zeigt die vom System unterstützten ACPI-Funktionen an:

# sysctl -a | grep hw.acpi.
	hw.acpi.supported_sleep_state: S3 S4 S5 
	hw.acpi.power_button_state: S5
	hw.acpi.sleep_button_state: S1
	hw.acpi.lid_switch_state: S1
	hw.acpi.standby_state: S1
	hw.acpi.suspend_state: S3
	hw.acpi.sleep_delay: 5
	hw.acpi.s4bios: 0
	hw.acpi.verbose: 0
	hw.acpi.disable_on_poweroff: 1
	hw.acpi.reset_video: 1
	hw.acpi.cpu.cx_supported: C1/0 C2/90
	hw.acpi.cpu.cx_lowest: 0
	hw.acpi.cpu.cx_history: 38027/0 0/0
	hw.acpi.thermal.min_runtime: 0
	hw.acpi.thermal.polling_rate: 30
	hw.acpi.thermal.tz0.temperature: 3182
	hw.acpi.thermal.tz0.active: -1
	hw.acpi.thermal.tz0.thermal_flags: 0
	hw.acpi.thermal.tz0._PSV: -1
	hw.acpi.thermal.tz0._HOT: -1
	hw.acpi.thermal.tz0._CRT: -1
	hw.acpi.thermal.tz0._ACx: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
	hw.acpi.acline: 1
	hw.acpi.battery.life: 98
	hw.acpi.battery.time: -1
	hw.acpi.battery.state: 0
	hw.acpi.battery.units: 1
	hw.acpi.battery.info_expire: 5

FreeBSD 9

Möglicherweise funktioniert dieses Vorgehen auch schon bei FreeBSD 8.2 oder älter…

Taktfrequenz skalieren

# sysctl dev.cpu | fgrep freq_levels
# sysctl dev.cpu | fgrep cx
# sysctl debug.cpufreq
### "-a" -> AC
### "-b" -> Batterie
#
# mögliche Werte für "-a" und "-b":
# minimum    - immer auf niedrigste Leistung
# adaptive   - gleichmäßige Anpassung an die Lastverhältnisse
# hiadaptive - schaltet bei Bedarf sehr schnell hoch
# maximum    - immer auf volle Leistung
#
# powerd_flags="-a hiadaptive -b adaptive" # Standardeinstellung/Grundeinstellung
# powerd_flags="-a adaptive"
# powerd_flags="-a maximum -b adaptive -i 85 -r 60 -p 100"
# powerd_flags="-a adaptive -b adaptive -i 90 -r 50 -p 100"

Beispiel:

# echo 'powerd_enable="YES"' >> /etc/rc.conf
# echo 'powerd_flags="-a adaptive -b adaptive"' >> /etc/rc.conf
# /etc/rc.d/powerd start

aber eigentlich reichen schon diese Einstellungen, "powerd_flags" braucht man nicht zu verändern:

# echo 'powerd_enable="YES"' >> /etc/rc.conf
# /etc/rc.d/powerd start

CPU-Temperatur

Es gibt die Möglichkeit, den Temperaturfühler auf dem Mainboard zu verwenden, allerdings hat nicht jedes Board einen. Deshalb zeige ich hier, wie man den Temperaturfühler in der CPU nutzen kann.

Intel-CPU:

# echo 'coretemp_load="YES"' >> /etc/rc.config
# kldload coretemp

AMD-CPU:

# echo 'amdtemp_load="YES"' >> /etc/rc.config
# kldload amdtemp

CPU-Temperatur anzeigen:

# sysctl hw.acpi.thermal | grep temperature

Abfragescript

#!/bin/sh

speed="$(sysctl dev.cpu.0.freq | cut -f2 -d":")"
possibles="$(sysctl dev.cpu.0.freq_levels | cut -f2 -d":" | sed "s/\/[-0-9]*/MHz/g")"

echo ""
echo "aktueller Taktgeschwindigkeit: ${speed}MHz
echo "mögliche Werte: ${possibles}"
echo ""
sysctl hw.acpi.thermal | grep temperature