PHP/RPi: 64 bit int-String auf 32bit-Hardware berechnen
Moin.
Kleines Problem:
Ich hab einen alten Raspberry Pi (einer der ersten, noch mit Wheezy), 32 bit, PHP5, keine GMP-Erweiterung. Updates gibts nicht mehr, da die ganzen online repos schon weg sind. Eine Änderung dieser Hardware sind technisch und wirtschaftlich bedingt nicht möglich oder sinnvoll. An diesem Pi hängen 14 (Archiv-)Festplatten, die über SSH ein/aus geschaltet werden können. Es ist also nur die Platte aktiv, deren Daten ich brauche. Über smartctl les ich von den Platten u.a. die Temperatur, Power On Hours etc. ein und lass mir das Ganze auf ner einfachen php-Seite anzeigen.
Das alles funktioniert jetzt schon seit 8 Jahren.
Hab jetzt aber schon 2 neue Festplatten dabei, wo der Wert für die Betriebsstunden unmöglich gross erscheint, z.B. 196889890783256. Da dieser Wert bis zu diesm Zeitpunkt ein String ist, kommt PHP noch damit klar, muss ja nichts gerechnet werden.
Rechne ich das dann mit dem Windows Calc nach Hex um, kommt 0xB31200000018 raus. Diese 0x....18 wären dann 24 Stunden, das geht sich bei der neuen Platte auch sehr genau hin.
Idee: Ich mach von diesem Wert einfach ein $val = $val & 0xFFFFFFFF, also hol mir nur die untersten 32 bit.
Problem: Ich krieg da dann 0x7FFFFFFF raus, da PHP auf dem 32bit-Pi eben mit diesem riesigen Wert nicht klarkommt.
Den Wert von smartctl direkt als hex kriegen geht scheinbar leider nicht, zumindest hab ich keine Option dazu gefunden.
Wie könnte man jetzt auf einem 32bit-System von diesem 64bit-String nur die unteren 32bit behalten und den Rest verwerfen?
24bit würden auch noch reichen.
MfG
Stefan
Liste der Anhänge anzeigen (Anzahl: 1)
Nene das ist kein Fehler.
Es sind aktuell 14 Platten, und von denen haben das nur die 2 2TB von Seagate; auch alles unterschiedliche Modelle, also kein Serienfehler.
Alle anderen (Toshiba, Maxtor, WD) haben das Phänomen nicht. Hab auch vorher die Platte mal in Windows mit Speedfan ausgelesen, der liest den gleichen "Mist", nur eben brav als Hex. Aber der sieht den Wert auch unendlich hoch und die Festplatte damit als "uralt".
-A filtert die Ausgabe, so dass nur die Smart-Werte in der Tabelle ausgegeben werden.
Der Header fehlt dabei (also keine Disk-s/n, Modell, Firmware, etc.)
-a beinhaltet -A und noch bisschen was anderes (Health check, Capabilities, Fehlerausgaben, falls Fehler vorhanden)
Aber der Tipp mit dem Link war genial! Die Ausgabe in Minuten, Halbe Stunden etc. versagt halt zwar total, weil der gelesene Wert einfach Mist ist, ABER:
Ich kann die Ausgabe des Wertes als hex erzwingen mit "-v 9,hex48"; was komischerweise in meiner manpage nicht drinsteht.
Da heissts nur "Note that the printed output of smartctl displays numerical values in base 10 (decimal).", also kein Wort davon, dass das hex auch könnte.
Wundert mich etwas, da der Beitrag ja deutlich älter ist, als "meine" Version von smartctl.
Da hol ich mir dann einfach mit substr die hinteren 8 "Ziffern", hexdec, und fertig.
Jetzt schauen die Ausgaben nach was aus. Oben mit den noch fehlerhaften Werten, unten die richtigen Werte über Hex:
Anhang 35617
DAS war der perfekte Tip! Merci!
Der Wert mit den 36013 Stunden stimmt übrigens, die Platte hat schon einiges hinter sich.
MfG
Stefan