Por que o Linux armazena temperaturas da CPU em tantos arquivos?

10

Eu tenho um laptop (thinkpad) com 2 cpus. Atualmente, eu posso ler as temperaturas da CPU nos arquivos abaixo com cat (1):

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

Minha pergunta é por que o kernel armazena essas informações em tantos lugares diferentes e qual é o arquivo "padrão" para ler a temperatura de uma CPU?

Isso está acontecendo devido a distribuições systemd (eu estou usando o Arch Linux) ou Linux não systemd, como o Slackware, ter uma abordagem diferente?

yaku
fonte

Respostas:

12

Na verdade, a temperatura não é armazenada em nenhum lugar. /sysé um sistema de arquivos na memória e a leitura de arquivos /sysinvoca código no kernel que calcula valores em tempo real.

Os diferentes diretórios correspondem a diferentes maneiras pelas quais o hardware pode relatar temperaturas. Os temp*_inputarquivos têm um associado temp*_labelque identifica a temperatura de qual componente é relatada.

Os locais abaixo /systendem a variar de versão do kernel para versão do kernel (não de distribuição para distribuição). Essa é uma dificuldade com a qual os autores de programas que lêem dados /sysprecisam conviver ( exemplo ).

Gilles 'SO- parar de ser mau'
fonte
Obrigado, esse foi o meu problema exato (eu uso o i3 e o i3status e, de tempos em tempos, tenho que alterar o caminho da temperatura da CPU). Foi quando decidi escrever um pequeno programa para fazer exatamente isso.
yaku
7

Primeiro, /sys/classé uma maneira conveniente de encontrar coisas /sys. Você encontrará tudo o que há dentro, na verdade, é um link simbólico; Tenho certeza de que sua primeira estrofe está vinculada à sua terceira estrofe.

A segunda estrofe é o kernel que lê a temperatura diretamente do CPU / chipset. A terceira estrofe é o kernel que obtém o valor do BIOS via ACPI. Enquanto no sistema eles podem dar a mesma resposta, eles não precisam (por exemplo, o BIOS pode estar usando sensores diferentes, calculando a média de alguns juntos ou aplicando algum ajuste específico da placa).

Finalmente, cada estrofe tem duas leituras diferentes, porque provavelmente existem dois termômetros. Ou pelo menos, a API do hardware permite isso.

derobert
fonte
Obrigado pela sua resposta. Isso torna as coisas mais claras. No entanto, em um laptop diferente com dois núcleos, os caminhos podem ser diferentes, certo? (Poderia ser /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp0_input /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input, por exemplo?).
usar o seguinte
@yaku Sim, os caminhos podem variar. Por exemplo, um laptop pode ter uma zona de refrigeração para (por exemplo) o disco rígido, a ponte norte ou o que for.
derobert
3

Dê uma olhada nos arquivos * _label para ver o que está sendo relatado - eis o meu 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 "" é usado apenas como "gato com nomes de arquivos")

Então, aqui está uma temperatura total da CPU, mais uma temperatura por núcleo.

Em um sistema maior, com várias CPUs, você pode ver dezenas de entradas.

jm73
fonte