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.
Tobias P. schrieb: > a) wie finde ich heraus, wie viele Sektoren es pro Block gibt? Indem Du die Blockgröße durch die Sektorgröße teilst? Wie groß ein Block ist steht im Superblock (Offsett 0x18). Btw. Den Link kennst Du? https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout
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?
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.