PandaBoard - Superblock last write time ... is in the future

warning: fread(): Length parameter must be greater than 0 in /var/www/elchs-kramkiste.de/lapurd/includes/common.inc(1695) : eval()'d code on line 19.

Auf einem PandaBoard (PB), dessen Betriebssystem ("Linaro 12.01") ich von einem 4 GByte-Image auf eine SDHC-Karte mit 16 GByte installiert hatte, stieß ich bereits kurz danach bei einem apt-get dist-upgrade, bei dem auch ein neuer Kernel mitsamt Header installiert werden musste, auf Probleme. Mangels Speicherplatz auf der SD-Karte wurde das Update fehlerhaft beendet. Ursache war, dass die "rootfs"-Partition des Linaro-Linux nur knapp über 3 GByte groß war und dort nicht mehr (nur temporär erforderlicher) genug Platz für das Update vorhanden war.

Abhilfe sollte ein Vergrößern der "rootfs"-Partition auf ca. 14 GByte per resizefs (hier in Form von GParted) bringen. Also die SD-Karte am Arbeits-PC angeschlossen und entsprechend bearbeitet. Die Karte wieder zurück in das PandaBoard, dieses gebootet und...

Das PB hängte sich beim Booten immer wieder an der selben Stelle auf:

[   14.041229] gatehwspinlock_enter failed! status = 0xffffffed
[   14.053497] Registered user-space process for DEV_SYS_ERROR event in SysM3
[   14.053527] Registered user-space process for DEV_WATCHDOG_ERROR event in SysM3
[   14.063110] Registered user-space process for DEV_SYS_ERROR event in AppM3
[   14.063140] Registered user-space process for DEV_WATCHDOG_ERROR event in AppM3
[   16.057769] (stc): st_tty_close

Die Zahlen / Werte in den eckigen Klammern sind hier nicht von Interesse.

Weiter oben in der Konsolen-Ausgabe des Bootvorgangs (in minicom beobachtet) stand:

fsck from util-linux 2.19.1
rootfs: Superblock last write time (Thu Feb 16 20:28:10 2012,
        now = Thu Jan 26 20:14:41 2012) is in the future.

Noch weiter oben in den Konsolen-Ausgaben von minicom stand:

rootfs: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
        (i.e., without -a or -p options)
mountall: fsck / [1086] terminated with status 4
mountall: Filesystem has errors: /
Errors were found while checking the disk drive for /.
Press F to attempt to fix the errors, I to ignore, S to skip mounting, or M for manual recovery
[   12.706604] Timer failed to reset
[   12.747528] ipc_proc_sync_start failed: status [0xffffffff]

Ich hatte aber keine Chance, dies per "F", "I", "S" oder "M"-Taste zu beheben, da diese Meldung einfach durchlief (also keine Wartezeit).

Ursache: Offenbar sind durch das Vergrößern der "rootfs"-Partition die Superblocks auf der SD-Karte neu geschrieben worden. Da die ursprünglichen Superblocks damit nicht mehr dem Erstellungsdatum laut Image-Datei entsprachen, kam es zu diesen Meldungen und das System konnte nicht mehr starten. Da das PB keine RTC (Real-Time-Clock) besitzt, in der die (aktuelle) Uhrzeit gespeichert und auch im Ausschalt-Zustand weiter gezählt wird, wird als Zeit für die Dateisystem-Checks das Erstellungsdatum der Image-Dateien genommen. Werden danach die Superblocks verändert bzw. neu geschrieben, liegen die also ab sofort in einer (für den Check des Dateisystems nicht gültigen) "Zukunft".

Lösung / Abhilfe: Es gibt die Möglichkeit, die "Superblocks" neu zu schreiben (siehe auch Hinweis in der letzten obigen Systemmeldung). Dies sollte von einem PC-System erfolgen, welches nicht unbedingt ihrem Arbeits-PC entspricht, denn für die Durchführung der Lösung muss das Systemdatum verändert werden. In früheren Zeiten habe ich auch auf anderen Produktiv-Linux-Systemen schon Probleme deshalb gehabt. Also habe ich an einem Test-PC (Debian 5.04, es sollte aber auch ein Live-System a la Knoppix gehen) die aktuelle Systemzeit per


# date -s 20120125

geändert. Die Rückgabe lautete:

Mi 25. Jan 00:00:00 CET 2012

Damit lag das "aktuelle" Systemdatum vor dem Erstellen des Linaro-Images (die Uhrzeit ist hier nicht relevant, es sei denn, Sie wählen das Datum gleich dem Tag der Image-Erstellung). Damit werden auch neu geschriebene Superblocks zu einer für das jeweilige System geltenden Zeit geschrieben, die vor der (aus dem Dateisystem gelesenen) Systemzeit liegt.

Nun steckte ich die SD-Karte per USB-Adapter an den Test-PC und setzte folgenden Befehl ab:


# fsck -a /dev/sdc2

Wichtig ist der Parameter "-a". Das Gerät "/dev/sdc2" hängt von Ihrem System ab (Stichwort "dmesg"! ;) )

Die Rückgabe lautete:

fsck 1.41.3 (12-Oct-2008)
rootfs: Der Zeitpunkt des letzten Einhängens von SuperBlock liegt in der ZukunftREPARIERT.
rootfs: Der Zeitpunkt des letzten Schreibens von SuperBlock liegt in der Zukunft.  REPARIERT.
rootfs enthält ein fehlerhaftes Dateisystem, Prüfung erzwungen.
rootfs: 184586/903168 Dateien (0.2% nicht zusammenhängend), 644397/3663616 Blöcke

Damit schien der Zweck erfüllt und nach einem abschließenden


# sync

mit dem alle Änderungen endgültig auf die Datenträger geschrieben werden, habe ich die SD-Karte wieder in das PandaBoard gesteckt und ...

Es (also das PandaBoard) bootete so, wie es sollte! Ganz ohne "Hänger".

Zum Abschluss sollten Sie allerdings nicht vergessen, das Systemdatum und die Uhrzeit des Test-PC wieder auf gültige (also aktuelle) Werte zurück zu setzen, denn sonst werden beim Reboot bzw. Ausschalten die Werte der RTC ihres Test-PCs auf die eingestellten Werte gesetzt, also z.B. per:


date -s "02/19 22:09"

für den 19. Februar des aktuellen Jahres, 22 Uhr und 9 Minuten (Zeitzone bzw. Winter- / Sommerzeit beachten). Die Werte müssen Sie natürlich den aktuellen Gegebenheiten anpassen.

Bei einem Live-System von CD / DVD ist dies evtl. nicht erforderlich. Es kann aber durchaus sein, dass auch ein Live-System beim Shutdown die Softwarezeit in die Hardware-Uhr (CMOS / RTC) des PCs schreibt. Also prüfen.

Hinweis: Falls auf ihrem Test-PC das Datum und / oder die Uhrzeit (auch bei einer großen "Drift", also Abweichung) per "NTP" abgeglichen wird, sollten Sie für die Dauer der Superblock-Operationen die Verbindung zum Netzwerk trennen (notfalls einfach per abziehen des Netzwerkkabels).