mikrocontroller.net

Forum: PC-Programmierung Ext4: einige Fragen


Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: guest (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Tobias Plüss (hubertus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.