Da hat sich ein kleiner Testfehler eingeschlichen.
Da hast Du vollkommen recht ... die Prüfsumme habe ich hier unterschlagen, daß sie bereits beim Entpacken des Images durch Freetz entfernt wird, war mir nicht bewußt und daß die /var/install von AVM die tatsächlich noch abtestet, genauso wenig (die habe ich eben schon sehr lange nicht mehr in Aktion erlebt
). Ich bin etwas irritiert, wozu dieser Mechanismus am Ende dienen soll - als Integritätsprüfung ist er für mich doppelt gemoppelt.
Warum? (halb OT)
Bereits mit "firmwarecfg" wird ja die Struktur des tar-Files analysiert und nur die relevanten Teile in die Prüfung einbezogen, ein Fehler beim Download würde (m.E.) bereits dort zu einem Fehler führen, wenn ich da nicht ebenfalls Tests durcheinander geworfen habe. AVM erstellt die /var/signature auf der Basis eines "ganz normalen" tar-Archivs (ob unter Einschluß der leeren 1024 Byte am Ende oder nicht, lassen wir mal offen) und hängt dann diese Prüfsummendatei einfach noch an das Archiv korrekt an (also ab der Position des vorherigen Ende-Headers) mit dem 512-Byte-Header eines tar-Members, einer (ausgepackten) Länge von oktal 200 (128 Byte) und dem eigentlichen Dateiinhalt, aufgefüllt auf die Blocklänge eines tar-Files. Je nachdem, wie sie dort das Auffüllen dann ausführen:
https://www.gnu.org/software/tar/manual/html_node/Standard.html schrieb:
Physically, an archive consists of a series of file entries terminated by an end-of-archive entry, which consists of two 512 blocks of zero bytes.
, bringt das Auspacken auf der Box das berüchtigte "tar: short read" für den letzten Header oder auch nicht, dieser Fehler bringt auch - je nach Busybox-Version - unterschiedliche Exit-Codes. Träte jetzt ein Übertragungsfehler auf, würde schon die Signaturprüfung fehlschlagen, denn die beiden enthaltenen "image"-Files stehen natürlich schon vor der Signatur im äußeren "image"-File. Sollte ein Fehler beim Auspacken auftreten ("no space left" o.ä.), führt das zu einem Fehler bei dieser Operation. Wo da noch eine Verfälschung des Inhalts der "filesystem.image" auftreten sollte, sehe ich (schon wieder) nicht. Meines Erachtens werden auch die Prüfsummen schon lange nicht mehr für die Integritätsprüfung im Bootloader herangezogen (die CHECK-Kommandos im FTP arbeiten ja auch nicht mehr für NAND-Flash und auch bei den NOR-Modellen ist mit der Zusammenlegung von Kernel und FS-Image ja zumindest die "Einzelfallprüfung" nicht mehr möglich, abgesehen davon, daß da m.W. auch nicht auf die "erase size" korrigiert wird), bei der Methode der Übertragung der Dateien ins yaffs2-FS macht das auch keinen Sinn mehr, die (alte TI-)Prüfsumme wird ja gar nicht mitkopiert. Soviel als "Ausflug" zur Signatur-Bildung von AVM ... und meiner eigenen Meinung zu den TI-Prüfsummen und deren Verwendung.
Wobei ich eigentlich beim (hexadezimalen) Ansehen einer Image-Datei sogar die Signatur der Prüfsumme zu sehen glaubte am Ende (die ist ja sehr leicht zu identifizieren anhand der Abweichung von lauter Nullen beim Padding), aber da habe ich dann nicht auf die Offsets geachtet und habe wohl auch nicht das Freetz-Buildsystem ursprünglich verwendet, wie im Beitrag als Beispiel dann später beschrieben (damit das ein Leser 1:1 nachvollziehen kann). Langer Rede kurzer Sinn ... die
Signatur TI-Prüfsumme habe ich nicht berücksichtigt und für mich ist sie auch ein ziemlich unnützes Relikt einer früheren Architektur.
Aber ich sehe auch keine Abhängigkeit beim Mount von einem Vielfachen einer Blockgröße von 256 - bei keiner der bisher von mir verwendeten Methoden - und auch unter "historischen Aspekten" erschienen mir 256 Byte ziemlich unwahrscheinlich. Das geht bei der Sektorgröße der früheren Festplatten von 512 Byte schon los - hier könnte ich mir tatsächlich so ein Erfordernis erklären. Aber es besteht wohl nicht, wie u.a. die Arbeitsweise des
hier erklärten Skripts zeigt, denn dort wird auch (in Abhängigkeit von den vorhandenen Utilities auf der FRITZ!Box) entweder mit "losetup" und Offset gemountet (ob da am Ende das loop-Device irgendwelches Padding macht, weiß ich nicht, wäre aber natürlich theoretisch möglich, warum aber dann wieder auf 256 Byte? mit einem solchen kurzen read() dürfte kein Dateisystem
auf Blockebene zugreifen) oder auch mit dd (und ohne Padding) abgeschnitten. Anschließend wird in beiden Fällen gemountet und es hat m.W. bisher immer funktioniert.
Ich bleibe auch dabei, daß bei einer Annahme von Padding-Notwendigkeiten beim Lesen durch eine Dateisystem-Inkarnation ein Vielfaches von 256 nach wie vor nicht logisch wäre ... egal ob über ein loop-Device oder direkt von einem Block-Device gelesen wird, sollten das immer (Low-Level-)Zugriffe mit einem Vielfachen der Blocklänge des Dateisystems sein (oder zumindest der (ehemaligen) Sektorgröße einer HDD) und selbst wenn sich hinter dem letzten vom Dateisystem noch benutzten Block irgendwie "garbage" befindet, sollte da niemals eine Leseoperation stattfinden. So ein (ext2-)Filesystem
muß ja auch in der "physikalischen Form" nicht den gesamten Datenträger (also die HDD-Partition) ausnutzen, da
darf am Ende ungenutzter Platz verbleiben, auf den das Dateisystem nie zugreift und insofern hast Du es richtig verstanden, daß ich tatsächlich für ein solches Dateisystem (das nicht nur ein "virtuelles" in Image-Form ist, wie das SquashFS, wo jedes Byte zählt und eine "Hardware-Speicherung" nicht der primäre Verwendungszweck ist/war) die Behauptung aufstelle, daß der Code zur Verwaltung des Filesystems immer in Vielfachen der Blockgröße (oder zumindest der historischen Sektorgröße) lesen müßte und damit die 8 Byte von der Prüfsumme (die im Superblock ja nicht berücksichtigt sind) nie gelesen werden sollten. Nachdem das Mount-Kommando selbst und auch das loop-Device sich offensichtlich auch nicht daran stören, bleibt dieses 256-Byte-Padding für mich nach wie vor unklar ... ab 512 wäre das wieder etwas anderes, da müßte man dann ggf. im Code suchen.
Wird der (letzte) unvollständige Block von mount irgendwie ignoriert (Vermutung), so könnten schon die Daten verloren gehen... theoretisch...
Ich kann den Gedankengang nachvollziehen (und ich habe auch nicht in irgendwelchem Code gesucht, das möchte ich betonen - insofern ist das schon etwas spekulativ und nur empirisch überprüft mit dem o.a. "extract"-Skript und auch mit "modfs") ... aber m.E. macht es ja gar nichts, wenn "mount" den letzten Block tatsächlich ignorieren sollte, denn der ist ja gar kein Bestandteil des Dateisystems und wird nur hinten angeflascht. Solange der damit entstehende verkürzte zusätzliche Block nicht im Superblock hinzugefügt wird (und in den ggf. noch verteilt gespeicherten Kopien), sollte/darf das Dateisystem dort eigentlich nicht zugreifen wollen, so daß es m.E. keine Rolle spielen dürfte, wie sich "mount" selbst an dieser Stelle verhält (oder auch losetup bzw. das loop-Device, was ja aber von AVM gar nicht genutzt wird). Solange "mount" nicht direkt beim Einbinden abstürzt (was es offensichtlich nicht tut), sollte niemals auf den "chksum"-Block zugegriffen werden vom Filesystem-Treiber.
Das schließt allerdings (weil es eben reine Theorie ist) nicht aus, daß es doch vollkommen anders sein könnte ... daher hat für mich persönlich hier der direkte Test die entscheidende Aussage und der hat (für mich auf meiner beschränkten Test-Plattform 7490) bisher noch nie ein Problem mit dieser Prüfsumme ergeben. Da wäre es dann ohnehin für mich logischer, die 8 Byte am Ende auch noch abzuschneiden ... dann ist das Filesystem wieder in vollem Umfang "original".