Inhaltsverzeichnis

Kurzübersicht zu Datenträgern und Partitionen

Datenträger

Magnetische Festplatten, Blockgröße und LBA-Adressierung

schematische Darstellung eines Datenträgerblocks auf einer Magnetspeicherfestplatte Datenträger zur persistenten Speicherung von Informationen sind heutzutage zumeist herkömmliche Festplatten mit magnetischen Scheiben oder NAND-Flash-Speicher wie z. B. SSDs, USB-Sticks oder Speicherkarten. Während die Speicherbereiche Festplatten früher entsprechend ihrer Geometrie in Cylinders, Heads und Sectors aufgeteilt wurde, wird heutzutage die sogenannte Logical Block Address (LBA) zur Adressierung der Speicherblöcke auf Datenträgern verwendet. Angaben in der alten CHS-Notation haben heutzutage zumeist keine praktische Relevanz mehr und sollten in der Regel ignoriert werden, weil sie oft irrelevante oder irreführende Informationen liefern.

Bei der vorherrschenden LBA-Adressierung werden die Datenträgerblöcke unabhängig von ihrer tatsächlichen physischen Lage einfach mit einer logischen Adresse bei 0 beginnend durchnummeriert. Eine LBA kann, je nach Standard und Verwendung, z. B. 28, 32 oder 48 Bit lang sein. Jede Adresse bezeichnet dabei einen bestimmten Block auf dem Datenträger. Datenträgerblöcke besitzen grundsätzlich eine einheitliche Größe von 512 Byte. Allerdings setzt sich bei moderneren Speichermedien zunehmend eine Blockgröße von 4096 Byte durch.

NAND-Flash-Speichermedien

Moderne Festplatten wie SSDs basieren auf NAND-Flash-Speicher. Für die folgenden Erläuterungen wird von der einfachsten Form, nämlich zweidimensionalem Flash-Speicher mit Single Level Cells (SLC) ausgegangen. Bei SLC-Speicher kann eine einzelne Speicherzelle nur die Werte 1 oder 0 aufnehmen, nämlich wenn die Speicherzelle voll geladen oder leer ist. Modernere Speicherchips arbeiten mit Speicherzellen, die verschiedene Ladungszustände annehmen können und dadurch auch mehr als nur 1 Bit pro Zelle speichern können.

Außerdem werden in neueren Speicherchips die Speicherstrukturen dreidimensional aufgebaut. Zum besseren Grundverständnis wird hier aber eine vereinfachte Darstellung der herkömmlichen zweidimensionalen Anordnung verwendet.

Siehe hierzu auch dieses Video zur Funktionsweise von Flash-Speicher-Zellen auf YouTube (1:43).


Struktur von Flash-Speicher

Schematische Darstellung eines NAHD-Speicherblockes mit Cells und Pages

schematische Darstellung eines Schreibvorganges bei NAND-Flash-Speicher


Lebensdauer und Wear Leveling

Das Lesen aus Flash-Speicher stellt für die Speicherzellen keine nennenswerte Belastung dar. Allerdings geht der Schreibvorgang mit einer tatsächlichen physischen Belastung der Speicherzellen einher, was zu einer schrittweisen Abnutzung der Zellen führt. Ist diese zu weit fortgeschritten, kann sie ihre Ladung nicht mehr vollständig halten und es kommt zu Fehlern. Dabei sind SLCs weniger anfällig, denn auch eine zu 70% gefüllte Zelle kann noch als 1 gewertet werden. Bei MLC, TLC oder QLC-Speicher kommt es schneller zu einer Fehlinterpretation. SLC-Speicher hat eine Lebenserwartung von ca. 100.000 Schreibzyklen. Bei den anderen Zelltypen fällt dieser Wert z. T. deutlich niedriger aus.

Damit nicht bereits nach kurzer Zeit stark beanspruchte Bereiche von Flash-Speichermedien kaputtgehen, sorgt die Firmware auf dem Controller-Chip dafür, dass die Schreibzyklen gleichmäßig über den gesamten vorhandenen Speicherbereich verteilt werden. Die Komponente der Firmware, die dafür zuständig ist, bezeichnet man auch als Flash Translation Layer (FTL). Die FTL ist dafür zuständig, einer Anfrage, die auf eine bestimmte LBA-Adresse lesend oder schreibend zugreifen soll, den Zugriff auf den richtigen Abschnitt des Flash-Speichers zu ermöglichen. Über die Lebensdauer eines Flash-Speichermediums wechselt also immer wieder die Zuordnung einer bestimmten LBA-Adresse zu dem gerade damit verknüpften Speicherbereich. Für das Betriebssystem ist diese Zuordnung transparent. Dieses Verfahren, das zur gleichmäßigen Abnutzung alles Speicherbereiche führen soll, bezeichnet man als Wear Leveling.

schematische Darstellung von dynamischem Wear Leveling Wenn eine Datei geändert werden soll, deren Inhalt sich in bereits stärker abgenutzten Speicherzellen befindet, dann wird der neue Inhalt nicht mehr an die selbe Stelle geschrieben wie der alte, sondern es werden stattdessen weniger abgenutzte Speicherzellen verwendet. Die LBA-Adresse bleibt dabei gleich. Dieses Variante des Wear Leveling, bei der jeweils dann, wenn gerade etwas neu geschrieben werden soll, einem neuen Bereich zugeordnet wird, nennt sich dynamisches Wear Leveling.

schematische Darstellung von statischem Wear Leveling Dem gegenüber steht das statische Wear Leveling. Dieses kommt dann zum tragen, wenn bestimmte Inhalte auf dem Datenträger über lange Zeit unangetastet bleiben, also statisch sind. Das können z. B. große Video-Dateien, Archive, etc. sein, welche so gut wie nie verändert werden. Wird der Abnutzungsgrad der ständig veränderten und der statisch belegten Zellen zu groß, so werden die statischen Inhalte trotzdem in stärker abgenutzte Zellen verschoben. Auf diese Weise stehen die noch besser erhaltenen Zellen wieder für dynamische Schreibvorgänge zur Verfügung.

Wear Leveling kann auch noch mit Spare-Seicher kombiniert werden. Das bedeutet, dass Flash-Speichermedien mit mehr tatsächlichem Speicherplatz hergestellt und ausgeliefert werden, als sie nominal besitzen. Der überzählige Speicher, sogenannter Spare-Speicher (Ersatz-Speicher), kann verwendet werden um defekte Speicherbereiche zu ersetzen. Auch dieser Speicher kann in das Wear Leveling mit einbezogen werden.

Dieser besondere Umgang mit dem vorhandenen Speicherplatz führt dazu, dass Flash-Speichermedien fast bis zum Ende ihrer Lebensdauer ihre komplette Speichergröße zur Verfügung stellen können. Allerdings bedeutet dies auch, dass solche Speichermedien dazu neigen, innerhalb kürzester Zeit vollständig kaputtzugehen, wenn erst einmal die ersten Bereiche damit angefangen haben. Schließlich sind alle Speicherzellen ungefähr gleich stark abgenutzt.


Partitionen

Abstraktionsebenen auf einem Datenträger Betrachtet man die Speicherung von Daten auf einem Datenträger, dann ergeben sich verschiedene Abstraktionseben. In dem Schaubild auf der rechten Seite ist ganz unten der Datenträger selbst dargestellt, so wie wir ihn mit LBA-Adressierung und Datenträgerblöcken als Festplatte oder Flash-Laufwerk kennengelernt haben. Auf der nächsten Ebene sind die Partitionen dargestellt, auf die in diesem Abschnitt näher eingegangen werden soll. Innerhalb einer Partition kann später eine Formatierung durchgeführt werden, so dass ein Dateisystem entsteht. Ein Dateisystem ist dann in der Lage Dateien und Verzeichnisse darzustellen, Metadaten wie Zeitstempel oder Benutzerrechte für die Dateien zu verwalten, etc.

MBR-Partitionierung

schematische Darstellung der Struktur eines MBR Im ersten 512-Byte-Block eines partitionierten Datenträgers findet man in der Regel den Master Boot Record (MBR). Dabei handelt es sich um eine festgelegte Datenstruktur, welche nach dem rechts abgebildeten Schema aufgebaut ist.

  1. 440 Byte für den Bootloader; Dabei handelt es sich um Byte-Code, der vom Prozessor gelesen und ausgeführt werden kann, damit von diesem Datenträger gebootet werden kann.
  2. 4 Byte für die Datenträgersignatur zur Identifizierung eines Datenträgers
  3. 2 Nullbytes, ungenutzt
  4. 64 Byte für die Partitionstabelle; Die Partitionstabelle besteht aus 4 Einträgen zu je 16 Byte
  5. 2 Byte MBR-Signatur, immer 0x55aa

MBR-Partitionstabelle

Beispielhafter Abdruck eines MBR in Hexadezimaldarstellung mit Markierung der Abschnitte Die MBR-Partitionstabelle besteht aus insgesamt 64 Byte und ist in 4 Einträge zu je 16 Byte unterteilt. Somit können bei MBR-Partitionierung maximal 4 primäre Partitionen angelegt werden. Unter Zuhilfenahme einer sogenannten logischen Partition kann eine primäre Partition nochmal weiter unterteilt werden. Dazu wird am Beginn einer primären Partition einfach eine weitere, verschachtelte Partitionstabelle abgelegt um diese Partition nochmal zu unterteilen.

  1. 1 Byte zur Angabe ob die Partition bootbar ist (0x00 = nein, 0x80 = ja)
  2. 3 Byte für die veraltete CHS-Angabe des ersten Sektors
  3. 1 Byte für die Angabe des Partitionstyps (ob z. B. darin ein NTFS- oder FAT32-Dateisystem zu erwarten ist)
  4. 3 Byte für die veraltete CHS-Angabe des letzten Sektors
  5. 4 Byte für die Startadresse (LBA) der Partition
  6. 4 Byte für die Größe (in Blöcken) der Partition

Da man mit 4 Byte nur bis knapp 4,3 Milliarden zählen kann, ergibt sich bei einer Blockgröße von 512 Byte eine maximale Größe für eine Partition von 2 TiB.

Für eine genauere Beschreibung und eine Liste definierter Partitionstypen siehe auch den entsprechenden Abschnitt im Wikipedia-Artikel zum Master Boot Record.

GUID-Partitionierung

schematische Darstellung eines Datenträgers mit GPT Um den Einschränkungen der MBR-Partitionierung zu entgehen, wurde die GUID Partition Table (GPT) entwickelt. Datenträger mit GPT können nahezu beliebig viele Partitionen beinhalten, da die Anzahl der Partitionseinträge in einer GPT in deren Header variabel festgelegt werden kann. Außerdem stehen für die Größenangaben ausreichend viele Stellen zur Verfügung.

Die schematische Darstellung auf der rechten Seite zeigt den Aufbau eines Datenträgers mit GPT-Partitionierung. Dort ist folgendes zu sehen:

  1. im ersten Datenträgerblock (LBA 0) der sogenannte Protective MBR. Hierbei handelt es sich um eine MBR-ähnliche Struktur um abwärtskompatibel mit älteren Systemen zu bleiben, die die GPT nicht interpretieren können. Auf diese Weise wird verhindert, dass ein älteres Partitionierungs-Tool einen bereits GPT-partitionierten Datenträger mit MBR-Partitionierung überschreibt.
  2. im zweiten Datenträgerblock (LBA 1) der primäre GPT-Header. Darin wird beschrieben welcher Teil des Datenträgers für die Partitionierungstabelle belegt ist, wie groß diese ist und wo die Backup-Kopie der GPT zu finden ist.
  3. in den folgenden Datenträgerblöcken (bis LBA 33) insgesamt 128 mögliche Einträge für einzelne Partitionen
  4. ab LBA 34 (= ab 17 kiB) Platz für die eigentlichen Partitionen.
  5. in den letzten Blöcken (hier 33) des Datenträgers die Kopie der Partitionseinträge und des GPT-Headers als Backup

Der GPT-Header

GPT-Header schematisch mit Beispiel Der GPT-Header beinhaltet unter anderem folgende Angaben (vgl. auch schematische Darstellung rechts)


Ein GPT-Partitionseintrag

schematischer Aufbau eines GPT-Eintrages Ein einzelner 128 Byte großer Eintrag für eine Partition folgt dem rechts abgebildeten schematischen Aufbau

  1. 16 Byte für die angabe des Partitionstyps
  2. 16 Byte für die eindeutige GUID der Partition, damit diese vom Betriebssystem wiedererkannt werden kann
  3. 8 Byte für die Startadresse der Partition
  4. 8 Byte für die Endadresse der Partition
  5. 8 Byte für Attributangaben zur Partition
  6. 72 Byte für den Namen der Partition

Ein Beispiel mit den ersten beiden Einträgen aus einer GPT: Beispiel mit Einträgen einer GPT als Hexdump