Ext4: einige Fragen

OP #4697259
Hallo,

ich versuche, ein ext4-Filesystem mit einem kleinen C-Programm zu lesen. 
Dazu habe ich mal den Superblock gelesen sowie die Group Descriptor 
Table.

Zwei Sachen sind mir aber unklar:

a) wie finde ich heraus, wie viele Sektoren es pro Block gibt?
b) ich wollte mal ins root directory navigieren. Dazu muss ich ja den 
Inode Nr. 2 lesen. Also berechne ich aus der Inodenummer die 
Blockgruppe, innerhalb der der Inode liegt (Gruppe 0), navigiere zur 
Group Descriptor Table und lese den Group Descriptor, dessen Feld 
"bg_inode_table_lo" gibt dann an, wo die Inodentabelle beginnt. Jetzt 
wirds interessant: die Zahl, die hier steht, ist eine logische 
Blocknummer? Wie finde ich nun raus, ab welchem Sektor ich lesen muss, 
um die gewünschte Inodentabelle zu finden? das habe ich noch nicht 
verstanden. Auch ist mir noch nicht klar, wie ich an den Filenamen ran 
komme. Nur den Inode zu lesen, gibt ja anscheinend keinen Namen.
OP
Ja, den Link kenne ich. Ich bin mittlerweile schon etwas weiter und kann 
den Inhalt eines Directory auflisten. Allerdings frage ich mich, wie ich 
zum Vornherein herausfinde, wie viele Directory Entries vorhanden sind? 
über den Link count geht es jedenfalls nicht. Komischerweise habe ich 
festgestellt, dass die Länge des jeweils letzten Directory Entries 
völlig im Kraut ist - da wird in der Regel bis zum Ende des Blocks 
aufgerundet. Weshalb?
Siehe Bild im Anhang. Ich habe die einzelnen Directory Einträge farbig 
markiert. Zuerst kommen der dot und der dotdot Eintrag. Dann die 
Einträge für filea.txt und fileb.txt, welche auch 'normal' sind. Der 
Eintrag für filec.txt ist aber komisch: Er verweist zwar auf einen 
existierenden inode (Nummer 18, oder 0x00000012), er hat aber eine Länge 
von 0x03c0, was 960 Bytes entspricht. Warum muss der so lang sein? wie 
merke ich, wann ich den letzten Eintrag gefunden habe?
Angehängte Dateien:
Gast
Das ext4 Directory ist eine lustige Sache. Es gibt keine Methode, von 
vornherein festzustellen, wieviele Einträge es gibt. Gängige 
Betriebssysteme fackeln diesen Vorgang intern i.d.R. über die Funktionen 
'Read First Dir Entry' und 'Read Next Dir Entry' ab. Und zwar so lange, 
bis 'Read Next Dir Entry' kein Ergebnis mehr liefert.
Die ext4 Directory Entries haben deshalb manchmal seltsame Längen, weil 
sie an Blockgrenzen enden, gleichzeitig aber einen Block bis zum Ende 
ausfüllen müssen - deshalb gibt es für jeden Entry auch zwei 
Längenangaben, nämlich einmal die Länge des Eintrags, und die Länge des 
Textes im Eintrag. Weiterhin gibt es auch leere Einträge mit beliebiger 
Größe, die von gelöschten Dateien stammen können.
Die Inode kann auch Blöcke die auf 0 zeigen liefern, dass heißt aber 
noch lange nicht, dass das Directory hier zu Ende ist. Diese Blöcke kann 
man aber überspringen.
Praktisch muss man eigentlich alle Datenblöcke der Inode der Reihe nach 
abklappern und alle Directory Entries daraus auslesen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.