Wird das Speichergerät von einem Dateisystem als (sehr großes) Byte-Array „gesehen“?

12

Ich möchte wissen, wie ein Dateisystem auf ein Speichergerät schreibt und von diesem liest.

Ich denke das funktioniert so:

Ein Dateisystem greift nicht direkt auf das Speichergerät zu, sondern das Speichergerät wird (vom Gerätetreiber des Speichergeräts) dem Dateisystem als (sehr großes) Byte-Array präsentiert.

Wenn das Dateisystem beispielsweise auf eine Festplatte zugreifen möchte, greift es einfach auf das Byte-Array zu, das die Festplatte darstellt.

Auf diese Weise kann ein Dateisystem mit jedem Typ von Speichergerät (herkömmliche Festplatte, SSD, USB-Flash-Laufwerk usw.) zusammenarbeiten, und nur der Gerätetreiber für das Speichergerät wird geändert.

Dieses Bild zeigt, was ich gerade erklärt habe:

Bildbeschreibung hier eingeben

Habe ich recht in meinem Verständnis?

joseph_m
quelle

Antworten:

15

Unter Linux (und 1980er Jahre Ära Unixes), ein Speichergerät (sehr oft eine Festplattenpartition auf einiger Festplatte , oder auf einem SSD ) ist ein Blockgerät (siehe diese ) , so ist eine [Sub-] Folge von Blöcken (das ist die Grundeinheit der physischen E / A). Die physische Blockgröße hängt von der Hardware ab (alte IDE-Festplatten hatten eine Blockgröße von 512 Byte, neue große SATA- Festplatten haben eine Blockgröße von 4 KB, lesen Sie die Wikipage Advanced Format ) und wann Sie ein Dateisystem erstellen ( mkfssiehe z. B. mke2fs) (8)) Sie können eine logische Blockgröße angeben, die ein Vielfaches (häufig eine kleine Zweierpotenz, einschließlich 1) dieser physischen Blockgröße ist. Lesen Sie auch über die Adressierung logischer Blöcke .

In der Vergangenheit (denken Sie an Sun3-Workstations der neunziger Jahre) bestand die Platte aus Zylindern mit Köpfen, die in Sektoren organisiert waren ( siehe CHS- Wikipage), wobei ein Sektor einen Block enthielt. Diese bleiben bis heute erhalten, sind jedoch ein künstliches Artefakt, das vom Festplatten-Controller (der Schaltung auf der Festplatte selbst) bereitgestellt wird. In einigen Betriebssystemen hat der Blockgerätetreiber E / A-Anforderungen neu geplant und angeordnet, um die Bewegung des Plattenkopfs und die Latenz bei der Drehung zu minimieren .

Auf diese Weise kann ein Dateisystem mit jedem Typ von Speichergerät (herkömmliche Festplatte, SSD, USB-Flash-Laufwerk usw.) zusammenarbeiten, und nur der Gerätetreiber für das Speichergerät wird geändert.

Ja, aber das Böse liegt im Detail (z. B. Informationen zu TRIM und Write Amplification , speziell für SSDs). Und die Details sind wichtig, so dass die tatsächliche Implementierung weniger einfach als Ihre Figur ist. Lesen Sie mehr über Dateisysteme (und denken Sie an Cluster- und Remote-Dateisysteme, einschließlich SMB und NFS ; lesen Sie auch über Logical Volume Manager ).

Lesen Sie Betriebssysteme: Drei einfache Teile (und sein Persistenzteil ).

Beachten Sie, dass Block-Geräte in FreeBSD nicht mehr vorhanden sind (und tatsächlich eine gemeinsame Abstraktion für Zeichen- und Block-Geräte bieten). Ich vermute, dass auch unter Windows das Betriebssystem über Partitionen, Blockgröße usw. Bescheid weiß (aber Sie sollten dies überprüfen).

Basile Starynkevitch
quelle
Windows verarbeitet auch Partitionen auf Datenträgern, und jede Partition verwendet möglicherweise ein anderes Dateisystem (möglicherweise FAT-32 auf einer und NTFS auf einer anderen). Das Dateisystem kann auf die Partitionen auf Blockebene zugreifen, oder die Blöcke können zu "Clustern" zusammengefasst werden. Auf jeder Partition wird die Clustergröße festgelegt.
Simon B
Ich wusste das irgendwie, weil MSDOS es meistens tat.
Basile Starynkevitch
Tatsächlich verwendet FreeBSD immer noch das, was Sie "Block Devices" nennen. Es gibt keine andere Möglichkeit, auf eine Festplatte zuzugreifen, als auf ein großes Array von Blöcken. Sie werden in FreeBSD nur als Character / Raw-Geräte bezeichnet. Sie greifen immer noch als große Anzahl von Blöcken auf das Gerät zu. Das einzige, was in FreeBSD fehlt, ist das Caching auf Geräteebene, das nicht benötigt wird, da das Dateisystem bereits das Caching bereitstellt.
juhist
3

Alles, was Basile Starynkevitch sagt, ist richtig. Ich werde ein bisschen mehr hinzufügen. Tatsächlich waren Plattenlaufwerke "Block" -Laufwerke, aber Blockgeräte (und viele andere Geräte) wurden in zwei Formen angeboten: "roh" und "gekocht". Raw-Geräte konnten nur in Blöcken adressiert werden, die ein Vielfaches ihrer nativen Speicherblockgröße aufwiesen. Ein Raw-Disk-Gerät kann also nur einen oder mehrere Blöcke gleichzeitig lesen oder schreiben, nicht nur ein oder zwei Bytes. Gekochte Geräte fügten eine Schicht hinzu, die solche kleineren Operationen sowie verschiedene andere Merkmale ermöglichen würde.

Dateisysteme arbeiteten mit Raw-Geräten und sahen sie daher nicht als großes Array von Bytes, sondern als großes Array von Blöcken, wie BS erklärte.

Topher
quelle