Ich weiß, dass das Betriebssystem auf der Festplatte als Erstes auf den Superblock zugreift.
Aber was dann?
Antwort1
Das Betriebssystem verlässt sich auf den Kernel, der wiederum Treiber für verschiedene Dateisysteme zum Lesen/Schreiben verwendet. Die Handhabung von Dateien wird durch die Treiber und Systemaufrufe über Schnittstellen abstrahiert, sodass Sie beim Schreiben open("file.txt")
nicht wissen müssen, wie die Datei auf der Festplatte gespeichert ist usw. Es gibt eine große Auswahl an Dateisystemen, jedes mit seiner eigenen Art, Dinge zu handhaben. Hier ist ein allgemeiner Ausschnitt des ext-Systems.
Beispiel von Ext.
- Blöcke: Die Festplatte ist unterteilt inBlöckedes zusammenhängenden Raumes.
- Gruppen blockieren: Blöcke werden in Gruppen unterteilt.
- Inode: Ein strukturierter Satz von Informationen zu einem Eintrag wie einer Datei, einem Verzeichnis usw.
- Verzeichnis: Eine Liste von Inodes <–> Namen
JedeGruppe blockierenhat eine Tabelle mit Inode-Strukturen, die zur Gruppe gehören.
Kernlayout:
Padding 1024 bytes
Super-Block 1 block *
Block Group Descriptor Table many blocks *
Reserved many blocks
Data Block Bitmap 1 block *
inode Bitmap 1 block *
inode Table many blocks *
Data Blocks many more blocks *
Superblockenthält Informationen wie:
- Gesamtzahl der Inodes
- Gesamtzahl der Blöcke
- Anzahl der Blöcke in einer Gruppe
- Anzahl der Inodes in einer Gruppe
Zusätzlich zur Speicherung in Blockgruppe 0 werden redundante Kopien als Backups (für den Fall einer Beschädigung) an anderer Stelle gespeichert.
Blockgruppendeskriptortabelleist direkt nach demSuper BlockDarin heißt es unter anderem:
- Anzahl derGruppen blockierenin der Trennwand
- Deskriptor für jedesGruppe blockieren
Dabei enthält jeder Deskriptor Informationen darüber, wo sich die Datenstrukturen für diesenGruppe blockierenbefindet sich.
Gruppe blockierenhält unter anderem fest:
- Blockadresse, an der die Inode-Tabelle beginnt
- Anzahl der Verzeichnisse in der Gruppe
Bitmapsenthält Informationen zur Verwendung. 0
Für unbenutzt und 1
für verwendet.
Inode(Indexknoten)
Eine Inode-Strukturnichthalten:
- Name
- Dateidaten
Ein Inode enthält Informationen wie:
- Typ, Berechtigungen, Benutzer, Daten, … Zeiger auf DATA
DATEN für eine Datei werden in Blöcken gespeichert. Ein Inode enthält Informationen darüber, welche Blöcke die Datei belegt. Dies geschieht durch Zeiger im Inode. Es gibt mehr als einenTypvon Zeigern. Wenn wir einen Zeiger auf Daten PTR so aufrufen:
[PTR] Mit DATA zu blockierende Adresse
- 12 - Direkte Zeiger:
- [PTR] Mit DATA zu blockierende Adresse
- 1 - Einfach indirekter Zeiger:
- [S_PTR] Zu blockierende Adresse mit Liste der PTR
- 1 - Doppelt indirekter Zeiger:
- [D_PTR] Zu blockierende Adresse mit Liste von S_PTR
- 1 - Dreifach indirekter Zeiger:
- [T_PTR] Zu blockierende Adresse mit Liste von D_PTR
Anzahl der Zeiger in einemBlockist abhängig vonBlock Größe.
Ein Verzeichnis ist ein Inode. Seine Daten enthalten Informationen über Dateien. Jeder Eintrag verknüpft einen Namen und einen Inode. Jedes Verzeichnis hat auch .
für sich selbst , die ..
effektiv auf das übergeordnete Verzeichnis verweisen. Diese können nicht gelöscht werden.
Das Stammverzeichnis hat immer Inode 2 auf ext. Tun stat /
oder cd /; stat .
sehen. Es ist ..
Links zu.
Wenn eine Datei erstellt wird, wird sie automatisch zu ihrem entsprechenden Verzeichnis hinzugefügt.
Inode-Nummern sind Indizes. Sie sind geordnete Indizes in der Inode-Tabelle zu einer Inode-Struktur. Da Inode-Strukturen eine feste Größe haben, kann man berechnen, wo sich eine Inode-Struktur befindet.
Da der Superblock eineInodes pro GruppeMan kann die Blockgruppe finden durch:
block_group = (inode - 1) / inodes_per_group;
Und danach finden Sie den Index:
inode_index = (inode - 1) % inodes_per_group;
Lesen Sie die Struktur und die Links zu den Daten. Lesen Sie die Daten.
debugfs
Man kann es verwenden debugfs
, um verschiedene Informationen über das Dateisystem zu extrahieren.
Stellen Sie sicher, dass Sie das Flag nicht verwenden, -w
wenn Ihnen die Daten wichtig sind.
Erstellen Sie optional eine kleine Probe zum Spielen.
truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test
Geben Sie ?
die Liste der Befehle ein.
debugfs: stats
(minimiert)
Inode count: 256
Block count: 2048
Reserved block count: 102
Free blocks: 953
Free inodes: 240
First block: 1
Block size: 1024
Fragment size: 1024
Group descriptor size: 64
Blocks per group: 8192
Inodes per group: 256
Inode blocks per group: 32
First inode: 11
Inode size: 128
Directories: 5
Group 0: block bitmap at 18, inode bitmap at 34, inode table at 50
953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
[Checksum 0x055a]
...
debugfs: imap hello.txt
Inode 12 is part of block group 0
located at block 51, offset 0x0180
Weitere Beispiele: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html