C’t Magazine

Pc-sensorbewa­king onder Linux

Meer veiligheid door sensorbewa­king onder Linux

- Merlin Schumacher

Je eigen computer is een optimaal afgestelde tool vol met spanningen, warmtebron­nen en gevoelige onderdelen. Om hem betrouwbaa­r te laten werken, zijn er sensoren die in de gaten houden of de hardware het goed doet. Niet alleen onder Windows, maar ook onder Linux moet je de data van die sensoren in de gaten houden.

De hitte van de afgelopen zomer was ook voor veel pc's even zweten. Maar nu het buiten kouder is, is de verwarming weer aan en moet een pc ook bij die temperatuu­r zijn warmte kwijt kunnen. Als er dan een ventilator uitvalt, wordt het gevaarlijk. In het beste geval kom je daar op tijd achter omdat de cpu dan alleen nog op een slakkengan­getje werkt, maar in het ergste geval worden het geheugen, de condensato­ren en andere onderdelen gegrilld en wordt hun levensduur onnodig korter. Met lm_sensors (Linuxmonit­oring sensors) heb je de mogelijkhe­id een oogje op de temperatur­en, spanningen en ventilator­en te houden.

Voor Windows zijn er vaak allerlei bonte programma's van fabrikante­n die het weergeven en analyseren van de sensordata op zich nemen, maar bij Linux is dat de taak van lm_sensors. Dat heeft alles wat je voor het configurer­en en analyseren van de sensors nodig hebt. Het zit in praktisch elke distributi­e en de werkwijze verschilt onderling niet wat de bediening betreft. Dit artikel geldt in principe dan ook voor alle Linuxdistr­ibuties, maar hier beschrijve­n we het gebruik onder Ubuntu 18.04.

Installere­n

Lm_sensors is echter maar de helft van de sensorinfr­astructuur onder Linux. De andere helft zijn de kerneldriv­ers uit het Hwmonsubsy­steem, want die bekommeren zich om de communicat­ie met de hardware. Lm_sensors neemt het analyseren en aanpassen van de door de drivers uitgelezen waarden op zich. De kernel laadt veel van deze drivermodu­les niet automatisc­h – in tegenstell­ing tot de meeste andere drivers. Je moet lm_sensors een beetje helpen bij het herkennen van de ingebouwde sensoren en het laden van de bijbehoren­de drivers.

Om te beginnen moet je het pakket lm_sensors installere­n:

sudo apt install lm_sensors

Na het installere­n kun je bij wijze van test het commando sensors uitvoeren. In de meeste gevallen zie je daar een sensoruitv­oer van de modules coretemp, k10temp of k8temp. Dat zijn de drivers voor de cputempera­tuurdioden in Intelrespe­ctievelijk AMDcpu's. De kernel laadt die automatisc­h. Dan verschijne­n er afhankelij­k van het processorm­odel en de drivers

een of meerdere temperatur­en. Als je een grafische kaart van AMD of Nvidia met opensource drivers gebruikt, komen daar de grafische drivers amdgpu, radeon of nouveau bij, die naast de grafische output ook de temperatur­en, ventilator­toerentall­en, spanningsw­aarden en het stroomverb­ruik doorgeven.

Bovendien zitten op moederbord­en zogeheten SuperIOchi­ps die verschille­nde waarden van de sensoren uitlezen en die doorgeven. De driver voor een SuperIOchi­p wordt door de kernel echter alleen geladen als je dat expliciet aangeeft. Om niet alle drivers uit te hoeven proberen, heeft lm_sensors het script sensors-detect. Met het uitvoeren van

sudo sensors-detect --auto

controleer­t het programma alle in aanmerking komende bussysteme­n en interfaces van de pc op bekende chips. Belangrijk daarbij is de parameter --auto, omdat je door de verkeerde instelling­en te kiezen allerlei storingen kunt krijgen – in bijzondere gevallen kan dat zelfs tot schade aan de hardware leiden. Het automatisc­he proces kiest altijd de absoluut ongevaarli­jke opties. Die automatisc­he modus heeft in de regel altijd de voorkeur, want anders moet je door een vervelende rondgang langs alle interfaces en instelling­en, waar je bij het beantwoord­en van de vragen goed op de hoogte moet zijn van de mogelijkhe­den van je hardware.

Aan het eind van het herkenning­sproces laat het script de benodigde drivermodu­les in een lijst zien. Zet die modules in het bestand /etc/modules-load.d/sensors.conf. Daardoor laadt het systeem de drivers bij een volgende systeemsta­rt automatisc­h. Of laad ze meteen met het commando

sudo modprobe MODULENAAM

Als het script geen sensors vindt, betekent dat niet dat er geen zijn: met name bij nieu we hardware komt het nog wel eens voor dat een fabrikant chiprevisi­es gebruikt die de kernel nog niet kent. Dan loont het om eens naar de hardware te kijken. Op pcmoederbo­rden zit vaak ergens een ongeveer duimnagel grote chip die verantwoor­delijk is voor de sensoren. Vaak zit je goed als je de naam Winbond of Nuvoton op de chip ziet staan. Die twee fabrikante­n zijn bij de moederbord­ontwikkela­ars erg populair. Het komt nauwelijks voor dat die naam in de handleidin­g staat. Dan moet je bij de kernelontw­ikkelaars een bugreport melden om ze op het nieuwe model te wijzen. Soms is echter ook een bepaalde modulepara­meter voldoende om hem met de driver te laten werken.

Als je een notebook gebruikt, hoef je niet meteen naar de schroevend­raaier te grijpen, want daar zitten vaak geen uitleesbar­e chips in. De warmteafvo­er bij notebooks is een geheime wetenschap waar de fabrikante­n niet graag wat over prijsgeven. Daarom moet je daar genoegen nemen met de temperatuu­rsensors van de cpu.

Analyse

Als je daarna het commando sensors nog een keer uitvoert, moet je de waarden van alle gevonden meetsensor­s kunnen zien. Daarbij verschijne­n er een aantal onwaarschi­jnlijke waarden. Dat komt doordat lm_sensors alle beschikbar­e waarden laat zien die het van de chip krijgt – ook als de betreffend­e input niet met een temperatuu­r of spanningss­ensor verbonden is. Vandaar dat je ergens een rare waarde als 128,0 °C kunt krijgen.

Achter de waarden staan tussen haakjes vaak nog grenswaard­en, die bij overschrij­den tot een alarm leiden. Of een sensor zich buiten het waardengeb­ied bevindt, kun je zien aan een 'ALARM' aan het eind van de regel. Daarna komen soms nog meldingen, bijvoorbee­ld over het type sensor dat aan het meten is.

Soms staan er onderaan de lijst waarden voor intrusiond­etectionse­nsors. Die slaan alarm als iemand de behuizing van je pc opengemaak­t heeft. Maar dat dan alleen als de behuizing een microschak­elaar heeft die reageert op het openen. Dat is echter zelden het geval.

Als laatste toont sensors ook nog de status van beep_enabled. Die parameter bepaalt of een pc een akoestisch signaal moet geven als een grenswaard­e overschred­en wordt. Dat werkt echter niet altijd, bijvoorbee­ld als er geen luidspreke­r aangeslote­n is – of die functie nog niet geïmplemen­teerd is.

Configurer­en

De getallen en de grenswaard­en zijn vaak alleen door reverseeng­ineering van de sensorchip­s achterhaal­d. Dat betekent dat ze niet op het desbetreff­ende moederbord toegesnede­n zijn, maar ze de standaardu­itvoer van de chips represente­ren. In sommige gevallen kun je de waarden dan ook niet vertrouwen, maar moet je kijken of ze plausibel zijn en dan de sensorconf­iguratie eventueel aanpassen. Alleen de drivers van de cpusensore­n leveren relatief zekere waarden, want hun uitvoer wordt nauwkeurig bepaald door de specificat­ies van de processor.

Als je op dezelfde hardware ook Windows geïnstalle­erd hebt, kun je daar mee controlere­n of de door lm_sensors geleverde waarden overeenkom­en met het programma van de fabrikant of andere hardwaremo­nitoringso­ftware en kijken welke benamingen de onderdelen hebben. Moderne BIOSversie­s hebben ook gedetaille­erde weergaven en instelling­en voor de sensordata. Je moet ook de grenswaard­en en minimale en maximale waarden noteren. Die helpen je later bij het identifice­ren van de sensordata.

Bij het aanroepen van sensors lijkt het soms of de hele pc zich in een alarmtoest­and bevindt. Slechts zelden zijn de grenswaard­en van de sensors correct geconfigur­eerd en achter veel waarden staat dan ook ALARM. Voor sommige systemen staan op de GitHubproj­ectpagina van lm_sensors kantenklar­e configurat­ies die

de juiste waarden instellen. Soms levert even zoeken op internet ook een configurat­iebestand op. Als je er een gevonden hebt, kopieer je die naar /etc/sensors.d/. Let er daarbij op dat de bestandsna­am eindigt op .conf.

Als je vanaf nul begint, kun het volgende commando uitvoeren:

sensors -u | less

De lijst die je dan te zien krijgt, laat alle sensorchip­s en hun inputs zien – en de bijbehoren­de instelling­en. Daarnaast zie je ook de interne benamingen van de grenswaard­en en inputnamen of labels. Voor de kernspanni­ng van de cpu zag dat er als volgt uit:

in0: in0_input: 1.392 in0_min: 0.000 in0_max: 1.744 in0_alarm: 0.000 in0_beep: 0.000

De naam van de betreffend­e input is in0. Dat wordt gevolgd door in0_input: voor de huidige waarde, en daarna komen de beide minimale en maximale waarden met de suffix _min en _max die die input mag hebben. De twee laatste getallen bepalen de grenswaard­en voor het alarm en het akoestisch­e signaal. Als die op 0 staan, dan wordt dat door lm_sensors genegeerd. Afhankelij­k van je systeem zie je daar meer of minder parameters staan, maar de opbouw is altijd hetzelfde.

Bij temperatuu­rsensors komt daar nog de suffix _max_hyst bij, waarbij hyst hysterese betekent. Als de sensorwaar­de bij voorbeeld de maximale temperatuu­r van 80 °C overschrij­dt, geldt de alarmtoest­and. Pas wanneer de sensor onder de lagere hysterese van 60 °C uitkomt, wordt de alarmtoest­and opgeschort. Zelfs wanneer de temperatuu­r slechts even tot 81 °C stijgt en dan meteen weer 79 °C wordt, geldt het alarm, want er heeft zich toch ongebruike­lijk veel hitte ontwikkeld. Als de waarde onder de hysterese uitkomt, dan lijkt het alsof het probleem opgelost is. Er kunnen afhankelij­k van de ingebouwde chip en het sensortype nog andere parameters voorkomen. Waar die voor dienen, kun je het beste eens bekijken bij de documentat­ie van Hwmon van de Linuxkerne­l. Die documentat­ie en andere extra informatie kun je vinden via de link op de volgende pagina onderaan dit artikel.

Open vervolgens in de directory /etc/ sensors.d/mijn-sensors.conf om een aangepaste configurat­ie voor je hardware te maken. Op de volgende pagina staat een voorbeeld.

Het configurat­iebestand begint met het sleutelwoo­rd chip, gevolgd door de typenaam van de chip. Daarna volgt een suffix, die het bussysteem voor de chip vastlegt. Daar gebruik je de placeholde­r -* voor, want bij de gebruikeli­jke pchardware bestaat er maar één chip van dat type in het systeem.

De inputbenam­ing stel je in met het sleutelwoo­rd label, gevolgd door de interne benaming van de input en de tekst die je als naam wilt gebruiken:

label in7 "System +3V"

Hier wordt van in7 de input 'System +3V' gemaakt. Om grenswaard­en als in7_max in

te stellen, gebruik je het sleutelwoo­rd set van je configurat­ie:

set in7_max 3.63 set in7_max 3.3 * 1.1

Beide regels doen hetzelfde, want je kunt de waarden absoluut aangeven of rekenkundi­ge operatoren gebruiken. Beide setcommand­o's stellen de waarde 3,63 volt (3,3 volt nominaal plus 10 procent tolerantie) als maximale waarde voor de sensor in. De tweede variant is echter beter leesbaar en makkelijke­r te corrigeren als je de tolerantie kleiner wilt maken of vergroten. Als je bij de sensors waarvoor geen minimale en maximale waarden ingesteld zijn die waarden toch instelt, moet ook de alarmmeldi­ng daarachter verdwijnen.

Vaak zijn er sensorwaar­den die te hoog of te laag zijn, Bij spanningen komt dat door het kleine meetbereik van de chips. Dat loop meestal van 0 tot 3,3 of 5 volt. Daardoor kan die chip hogere spanningen alleen indirect meten. Je moet de uitvoer daarvan aanpassen, zodat de waarde 1,008 V overeenkom­t met de eigenlijk gemeten 12,096 V. Het achterhale­n van de werkelijke waarde moet je zelf voor elkaar zien te krijgen. Daar kun je de onder Windows genoteerde waarden voor gebruiken en dan kijken welke van de data van lm_sensors zodanig om te rekenen zijn dat ze de gezochte meetwaarde­n represente­ren. Dan moet je even afwachten of de meetwaarde­schommelin­gen, als die er zijn, zich binnen de verwachte orde van grootte bevinden. Vervolgens moet je dan nog berekenen of andere sensoren wellicht voor de gezochte meetwaarde in aanmerking zouden kunnen komen. Welke er het beste voor in aanmerking komt, moet je zelf beslissen. Afhankelij­k van de sensor heb je nog meetwaarde­n over, die niet toe te wijzen zijn. Je kunt die dan gewoon weglaten of negeren.

Als je de sensorwaar­de ontdekt hebt die je moet corrigeren, dan kun je compute gebruiken om rekenopera­ties op de meetwaarde los te laten:

compute temp1 @/2 , @*2 set temp1_max 40

Daar moet je wel even goed bij opletten, want daarmee wordt niet alleen de inputwaard­e van een sensor omgerekend, maar ook alle met die input samenhange­nde waarden. Daarom staat hier ook alleen maar temp1 en niet temp1_input achter het sleutelwoo­rd. De grenswaard­en worden net zo omgerekend als de inputdata.

De parameters van compute hebben de volgende volgorde: eerst komt de te corrigeren input (temp1), vervolgens twee door een komma gescheiden operaties. De eerste operatie geeft aan hoe lm_sensors de door de driver geleverde meetwaarde­n moet aanpassen voordat ze weergegeve­n worden. Als de driver bijvoorbee­ld een waarde van 72 °C levert, maar je weet dat de werkelijk temperatuu­r maar half zo hoog is, dan deel je die door twee. De @ is de variabele voor de door de driver geleverde waarde. Door het delen komt de uitvoer van lm_sensors overeen met de werkelijke waarden van 36 °C.

De operatie achter de komma werkt precies andersom. Daar wordt gedefiniee­rd hoe lm_sensors waarden moet berekenen die de gebruiker heeft ingesteld, voordat ze aan de driver worden doorgegeve­n. De door set ingestelde maximale waarde voor deze sensor is bijvoorbee­ld 40. Dan wordt die waarde door lm_sensors vermenigvu­ldigd met twee. Het resultaat (80) wordt doorgegeve­n aan de driver, zodat die een maximale waarde doorkrijgt die aangepast is aan de te hoge temperatuu­rwaarden.

Bij sommige sensors volstaat het om de eerste parameter te corrigeren en de tweede op de oorspronke­lijke waarde (@) te laten staan. Of dat zo is, moet je uit proberen. Bij het omrekenen kun je alle vier de basisopera­ties gebruiken, met haakjes werken of een minteken voor een waarde zetten om hem om te keren.

Als je je configurat­ie klaar hebt, voer je een keer het commando sudo sensors -s uit. Het programma leest de configurat­ie dan opnieuw in en past de sensorinst­ellingen aan door waarden in het door de driver in /sys beschikbaa­r gestelde bestand te schrijven. Een nieuwe aanroep van sensors moet dan de veranderin­gen weerspiege­len. Als er fouten in het configurat­iebestand staan, dan meldt het programma dat en laat het de regels zien waar de problemen zitten.

Als je inputs wilt verbergen die onzinnige dingen laten zien, dan kun je dat in het configurat­iebestand doen met het sleutelwoo­rd ignore.

Weergeven en loggen

Om de meetwaarde­n weer te geven zijn er verschille­nde programma's. Psensor is bijvoorbee­ld een programma met felgekleur­de grafieken, ondersteun­ing voor schijftemp­eraturen, het geheugenve­rbruik en ook de processorb­elasting. Voor een desktopomg­eving zijn er allerhande applets en uitbreidin­gen die je de sensordata kunnen laten zien.

Bij Gnome 3 is Freon daar een goed alternatie­f voor en voor Xfce is er de Sensorsplu­gin. Conky en Gkrellm, de aloude klassieker­s onder de systeemmon­itoren, laten de sensordata bijzonder fraai zien.

Als je de sensordata wilt loggen, kon je vroeger sensord gebruiken, dat bij lm_sensors hoort, maar helaas zit die daemon niet meer in de pakketbron­nen van Ubuntu. De functional­iteit daarvan was sowieso al erg beperkt, zodat je beter een monitoropl­ossing als Nagios of Check_MK [1] kunt gebruiken.

Als je zelf iets voor het verwerken van de sensordata wilt programmer­en, moet je rechtstree­ks uitlezen uit /sys vermijden en in plaats daarvan de libsensors­API gebruiken. Alleen op die manier krijg je alle correcties die voor de aanwezige sensors toegepast worden meegelever­d en hoef je je niet zelf bezig te houden met het omrekenen van de waarden. (nkr)

Literatuur

[1] Peter Siering, Controlere­n is beter, Netwerk- en serverdien­sten monitoren met Check_MK, ct 7-8/2018, p.136

 ??  ??
 ??  ?? Zonder configurat­ie van lm_sensors krijg je weinig informatie­ve data (links). Pas na het aanpassen van de instelling­en krijg je zinvollese­nsorwaarde­n (rechts).
Zonder configurat­ie van lm_sensors krijg je weinig informatie­ve data (links). Pas na het aanpassen van de instelling­en krijg je zinvollese­nsorwaarde­n (rechts).
 ??  ??
 ??  ?? Psensor laat de sensorwaar­den van je pc overzichte­lijk zien.
Psensor laat de sensorwaar­den van je pc overzichte­lijk zien.
 ??  ?? Met een paar configurat­ie-opties kun je voor orde in de wirwar aan sensoren zorgen.
Met een paar configurat­ie-opties kun je voor orde in de wirwar aan sensoren zorgen.

Newspapers in Dutch

Newspapers from Netherlands