Wie greift das Betriebssystem auf die auf der Festplatte gespeicherten Dateien zu?

Wie greift das Betriebssystem auf die auf der Festplatte gespeicherten Dateien zu?

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.

  1. Blöcke: Die Festplatte ist unterteilt inBlöckedes zusammenhängenden Raumes.
  2. Gruppen blockieren: Blöcke werden in Gruppen unterteilt.
  3. Inode: Ein strukturierter Satz von Informationen zu einem Eintrag wie einer Datei, einem Verzeichnis usw.
  4. 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. 0Für unbenutzt und 1fü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.


Verzeichnis

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, -wwenn 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

verwandte Informationen