Warum speichert Linux CPU-Temperaturen in so vielen Dateien?

10

Ich habe einen Laptop (Thinkpad) mit 2 CPU. Derzeit kann ich die CPU-Temperaturen aus den folgenden Dateien mit cat (1) lesen:

cat /sys/class/thermal/thermal_zone0/temp
cat /sys/class/thermal/thermal_zone1/temp

cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input
cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input

cat /sys/devices/LNXSYSTM:00/LNXCPU:00/thermal_cooling/subsystem/thermal_zone1/temp
cat /sys/devices/LNXSYSTM:00/LNXCPU:01/thermal_cooling/subsystem/thermal_zone0/temp

Meine Frage ist, warum der Kernel diese Informationen an so vielen verschiedenen Orten speichert und welche die "Standard" -Datei ist, um die Temperatur einer CPU zu lesen?

Geschieht dies aufgrund von systemd (ich verwende Arch Linux) oder nicht systemd Linux-Distributionen wie Slackware, die einen anderen Ansatz verfolgen?

Yaku
quelle

Antworten:

12

Eigentlich wird die Temperatur nirgendwo gespeichert . /sysist ein speicherinternes Dateisystem , und das Lesen von Dateien in /sysruft Code im Kernel auf, der Werte im laufenden Betrieb berechnet.

Die verschiedenen Verzeichnisse entsprechen unterschiedlichen Methoden, mit denen die Hardware Temperaturen melden kann. Den temp*_inputDateien ist eine Zuordnung zugeordnet temp*_label, die angibt, welche Temperatur der Komponente gemeldet wird.

Die Positionen unter /sysvariieren in der Regel von Kernelversion zu Kernelversion (nicht von Distribution zu Distribution). Das ist eine Schwierigkeit, mit der Autoren von Programmen, die Daten einlesen /sys, leben müssen ( Beispiel ).

Gilles 'SO - hör auf böse zu sein'
quelle
Danke, das war genau mein Problem. (Ich benutze i3 und i3status und muss von Zeit zu Zeit den CPU-Temperaturpfad ändern.) Da habe ich beschlossen, ein kleines Programm zu schreiben, um genau dies zu tun.
yaku
7

Erstens /sys/classist eine bequeme Möglichkeit, Dinge in zu finden /sys. Sie werden feststellen, dass alles im Inneren tatsächlich ein Symlink ist. Ich bin mir ziemlich sicher, dass Ihre erste Strophe mit Ihrer dritten Strophe verknüpft ist.

Die 2. Zeilengruppe ist der Kernel, der die Temperatur direkt von der CPU / dem Chipsatz liest. Die 3. Zeilengruppe ist der Kernel, der den Wert vom BIOS über ACPI abruft. Während sie auf Ihrem System möglicherweise dieselbe Antwort geben, müssen sie dies nicht tun (z. B. könnte das BIOS andere Sensoren verwenden, einige zusammen mitteln oder eine kartenspezifische Anpassung vornehmen).

Schließlich hat jede Strophe zwei unterschiedliche Messwerte, da es wahrscheinlich zwei Thermometer gibt. Zumindest ermöglicht die API der Hardware dies.

derobert
quelle
Danke für deine Antwort. Das macht die Dinge klarer. Auf einem anderen Laptop mit zwei Kernen könnten die Pfade jedoch unterschiedlich sein, oder? (Könnte es zum Beispiel /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp0_input /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input sein?)
Yaku
@yaku Ja, die Pfade können variieren. Beispielsweise könnte ein Laptop eine Kühlzone für (z. B.) die Festplatte oder die Northbridge oder was auch immer haben.
Derobert
3

Schauen Sie sich die * _label-Dateien an, um zu sehen, was gemeldet wird - hier ist mein i5:

$ grep "" /sys/devices/platform/coretemp.?/hwmon/hwmon?/temp?_label
/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_label:Physical id 0
/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_label:Core 0
/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_label:Core 1

(grep "" wird nur als "Katze mit Dateinamen" verwendet)

Hier ist also eine Gesamttemperatur der CPU plus eine Temperatur pro Kern.

Auf einem größeren System mit mehreren CPUs werden möglicherweise Dutzende von Einträgen angezeigt.

jm73
quelle