Forum: PC-Programmierung Ext4: einige Fragen


von Tobias P. (hubertus)


Lesenswert?

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.

von guest (Gast)


Lesenswert?

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

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

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?

von Udo (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.