Inhaltsverzeichnis
Zusammenfassung
Behalten Sie für FLASH-Speicher (z.B. USB-Sticks, SD-Karten, SATA-FLASH) das Datenträger-Layout bei Auslieferungszustand bei.
Vermeiden Sie nach Möglichkeit, derartige Datenträger neu zu formatieren oder gar zu partitionieren.
Wie man FLASH-Speicher zerstört
… und wie man dies vermeidet
Beim hier vorliegenden Text handelt es sich im Wesentlichen um eine Übersetzung von /1/.
Zerstörung
Um ein Gerät mit Flash-Speicher zu zerstören, brauchen Sie es nur mit einem der üblichen Tools wie fdisk, mkfs oder dd zu bearbeiten. Die Chancen stehen ausgezeichnet, dass dabei ein ungünstiges Datenträger-Layout eingestellt wird. Dies äußert sich in langsameren Zugriffen auf das Gerät und einem schnelleren Verschleiß.
Der gleiche Effekt kann auch mit Windows-Tools aus dem MS OEM Preinstallation Kit und möglicherweise auch mit anderen Windows-Programmen erzielt werden. Unter Windows ist es allerdings schwieriger, da derartige Low-Level-Tools nicht Bestandteil der normalen Windows-Installation sind.
Warum dies passiert
Okay, jetzt wird es kompliziert…
Arbeitsweise von NAND FLASH
FLASH-basierender Massenspeicher erscheint nach außen hin wie eine Festplatte, dies ist aber allenfalls eine funktionierende Simulation.
FLASH-basierter Speicher nutzt eine Technologie namens NAND-FLASH. Derartiger Speicher ist les- und schreibbar, allerdings ist der Zugriff komplizierter als bei Festplatten.
- Die kleinste ansprechbare Einheit beim Lesen/Schreiben ist eine „Page“, nicht ein Sektor. FLASH-Speicher aus den Jahren 2007-2008 verwenden eine Page-Größe von 2K mit Übergang zu 4K um 2009 bzw. 16K um 2011.
- Eine Page kann nicht einfach überschrieben werden, sie muss zuvor gelöscht werden (andernfalls wäre der neue Inahlt eine Verknüpfung von altem Inhalt und neu geschriebenen Daten).
- Es kann aber nicht eine einzelne Page gelöscht bzw. geschrieben werden, Löschen und Schreiben ist nur für „Erase Blocks“ - also ganze Folgen fortlaufender Pages - möglich. Ein typischer Wert sind 64 aufeinanderfolgende Pages, bzw. eine Erase-Block-Größe von 128 oder 256kB.
- Nach dem Löschen des Erase-Blocks können die Pages nicht in beliebiger Reihenfolge geschrieben werden sondern nur in sequentieller Reihenfolge beginnend mit der ersten Page.
- Blöcke verschleißen im Lauf der Zeit. Nach einer gewissen Anzahl von Löschzyklen wird ein Block permanent unbrauchbar und kann nicht mehr zur Datenspeicherung benutzt werden. Pages können auch fehlerhaft werden, wenn auf benachbarte Pages zugegriffen wird oder auch bei Lesezugriffen.
NAND FLASH unterscheidet sich fundamental von Festplatten. Da die IT-Branche aber seit Jahrzehnten Festplatten benutzt, gab es einen großen Druck, FLASH-Speicher wie Festplatten anzusprechen. FLASH-Speicher „verstecken“ das FLASH-Verhalten. Ein Microcontroller sorgt dafür, dass sich der FLASH-Speicher nach außen wie eine Festplatte verhält. Die Software wird häufig als „Flash Translation Layer“ (FTL) oder „Flash Abstraction Layer“ bezeichnet. Die bei Festplatten häufig vorkommende Operation, einen 512-Bytes-Sektor zu speichern, kann bei FLASH-Speichern mehrere Operationen erfordern, die mit weit mehr als 512 Bytes im FLASH hantieren. Um den Verschleiß zu reduzieren, muss die FTL-Software Daten zwischenspeichern, um die Anzahl der Löschzyklen zu reduzieren.
Eine weitere Aufgabe der FTL ist es, Erase-Blöcke, die bereits oft geschrieben wurden, auszusortieren (d.h. diese Erase-Blöcke werden nicht mehr zum weiteren Abspeichern benutzt, die Datenträger-Kapazität verringert sich).
Egal wie gut die FTL-Software ist, bestimmte Zugriffsmuster erfordern Mehrarbeit „im Innern“. Wenn das Partitions- und Dateisystemlayout solche schlechten Zugriffsmuster vermehrt auftreten lässt, leiden die Performance und Zuverlässigkeit des NAND-FLASHES darunter. Im Gegenzug sorgt ein günstiges Layout für höhere Performance und geringeren Verschleiß.
Ein Beispiel für ein schlechtes Zugriffsmuster ist das Schreiben zweier aufeinanderfolgender Sektoren, von denen einer am Ende eines Erase-Blockes liegt und der andere am Beginn eines neuen Erase-Blocks. Dieser Zugriff erfordert mehr interne Operationen als das Schreiben zweier aufeinanderfolgender Sektoren innerhalb derselben NAND-Page.
Partitions- und Dateisystem-Layout
Datenträger sind typischerweise partitioniert. Der erste Sektor enthält die Partitionstabelle mit den Angaben zur Anzahl der Partitionen sowie zu Beginn und Größe der Partitionen. Innerhalb einer Partition befindet sich ein Dateisystem - Datenstrukturen, die es ermöglichen, Dateien und Verzeichnisse mit bestimmten Namen zu erzeugen, zu ändern oder zu löschen. Die unterschiedlichen Dateisystemtypen (z.B. FAT, ext2, NTFS u.a.) verwenden hierfür unterschiedliche Datenstrukturen. Unabhängig von den Unterschieden gibt es auch Gemeinsamkeiten zwischen den Dateisystemtypen:
- Signature - Die meisten Dateisystem schreiben eine Kennung mit dem Dateisystemtyp an eine markante Stelle innerhalb der Partition sowie Parameter wie Größe und Speicherort bestimmter Datenstrukturen. Typischerweise steht diese Signatur am Partitionsanfang. Für Unix- und Linux-Dateisysteme beispielsweise steht der „Super-Block“ in Sektor 2 der Partition. Für FAT und NTFS steht der „BIOS Parameter Block“ (BPB) in Sektor 0 der Partition.
- Allokations-Daten (allocation data) - Die meisten Dateisysteme notieren, welche Sektoren bereits benutzt werden und welche noch ungenutzt sind. Für FAT-Dateisysteme folgt die „File Allocation Table“ auf den BPB, mit evtl. ein paar ungenutzten Sektoren dazwischen. Für ext2 und Nachfolger sowie NTFS sind diese Zuordnungstabellen in der Partition verteilt. Dies ist für Festplatten sinnvoll, um Suchlaufzeiten zu verringern und auch für FLASH-Speicher hilfreich, da der „hot spot“-Effekt des ständigen Schreibens an dieselbe Stelle vermindert wird.
- Speicher-Cluster (storage clusters) - Aus Performance-Gründen und auch um die Allokations-Daten nicht zu stark wachsen zu lassen, verwenden Dateisysteme meist Speichereinheiten größer als einen Sektor. Für FAT und NTFS heißt diese Einheit „Cluster“. FAT-Cluster sind meist 16 kB (32 Sektoren) oder 32 kB (64 Sektoren) groß, NTFS benutzt meist 4 kB. Für ext2 und Nachfolger sind 1 kB, 2 kB und 4 kB übliche Größen für den „filesystem block“.
Auf Allokationsdaten und Speicher-Cluster wird häufig zugegriffen, daher sollten diese Operationen effizient erfolgen.
- Wenn die Allokationsdaten an einer NAND-FLASH Page-Grenze beginnen, sinkt die Wahrscheinlichkeit, dass ein Schreibzugriff auf Allokationsdaten sich über zwei Pages erstreckt.
- Wenn die Clustergröße ein Zweierpotenz-Vielfaches der NAND-FLASH Page-Größe ist und der erste Cluster an einer Erase-Block-Grenze liegt, vereinfacht dies auch das Schreiben der Speicher-Cluster.
- Da der Verschleiß durch Löschzyklen beim Überschreiben von Daten immer ganze Erase-Blöcke betrifft, sollten Nur-Lese-Daten - insbesondere Partitionstabelle und Signature (BPB bzw. super block) - nicht gemeinsam mit Schreib-Lese-Daten in einem Erase-Block untergebracht werden.
Original-Formatierung
Die Hersteller von FLASH-Speichern kennen die Details ihrer Speicher (insbesondere Page-Größe und Erase-Block-Größe), die Details des verwendeten Dateisystems (meist FAT16 oder FAT32) und die Charakteristik der eingesetzten FTL-Software. Mit diesen Informationen - über die ein Endnutzer normalerweise nicht verfügt - können sie ein Layout wählen, das die nötigen internen Operationen weitgehend erleichtert und minimiert.
Hier ein Beispiel: Auf einer 2-GB-SD-Karte mit FAT16-Dateisystem befindet sich die Partitionstabelle in Sektor 0. Die Sektoren 1-254 bleiben ungenutzt, die erste Partition beginnt in Sektor 255. Damit liegt der BPB (die Signatur) gemeinsam mit der Partitionstabelle - also Konfigurationsdaten, die im Normalfall nur gelesen werden - in einem Erase-Block, der nie beschrieben wird. Dies verringert das Risiko eines kompletten Datenverlustes durch Verschleiß dieser kritischen Sektoren. Die Allokations-Daten (FAT, file allocation table) beginnen in Sektor 256. Für FAT und Wurzelverzeichnis werden zusammen 512 Sektoren verwendet, bis einschließlich Sektor 767. Der verbleibende Platz von Sektor 768 bis zum Ende des Datenträgers wird für die Cluster-Daten benutzt. Die Clustergröße ist 64 Sektoren (32 kB). Somit sind unsere oben aufgestellten Kriterien erfüllt. Der FAT-Bereich - ein „hot spot“ bei FAT-Dateisystemen - benutzt keinen Erase-Block gemeinsam mit den Clusterdaten. Dies vereinfacht es für die FTL, die FAT bei Verschleiß umzulagern.
Eine 4-GB-SD-Karte eines anderen Herstellers benutzt ein anderes Layout. An die Partitionstabelle in Sektor 0 schließen sich 8191 unbenutzte Sektoren an. Die Partition beginnt bei Sektor 8192 (4 MB). Die Cluster-Daten beginnen bei Sektor 16384 (8 MB). Auch hier sind die Bereiche an Erase-Block-Grenzen ausgerichtet und gut voneinander getrennt.
Manuelles Formatieren
Wenn Sie ein Programm wie fdisk benutzen, ist es unwahrscheinlich, dass Sie günstige Partitionsgrenzen ziehen, wenn Sie nicht die o.g. Regeln befolgen. Aus historischen Gründen (physischer Aufbau altertümlicher Festplatten, Programmiermodell altertümlicher IDE-Controller, ältere BIOS-APIs) verwendet fdisk standardmäßig ein Modell mit Zylindern (C, cylinders), wobei jeder Zylinder einer Speicherkapazität von Kopfanzahl (H, heads) mal Sektoren (S, sectors per track) aufweist. Aus noch mysteriöseren Gründen ist das Maximum für H 255 und das Maximum für S 63. Daher umfasst ein Zylinder i.d.R. 255*63=16065 Sektoren. Diese Anzahl führt immer zu einer schlechten Ausrichtung. Daher gilt: Wenn Sie mit fdisk arbeiten und Partitionen an Zylinder-Grenzen ausrichten, haben Sie verloren. Stellen Sie die von fdisk benutzte Einheit auf Sektoren um (Option -u oder Kommando „u“). Beachten Sie, dass die Zählung der Sektoren bei 0 beginnt.
Wenn Sie die erste Partition in Sektor 1 beginnen lassen, haben Sie ebenfalls verloren. Schreiboperationen, bei denen mehrere Sektoren geschrieben werden, sind nun mit wesentlich größerer Wahrscheinlichkeit auf mehrere Pages bzw. Erase-Blocks aufgesplittet. Außerdem ist Ihre Partitionstabelle Verschleiß ausgesetzt, da der Erase-Block mit der Partitionstabelle ständig gelöscht und neu geschrieben wird, wenn auf Datenstrukturen am Beginn der Partition zugegriffen wird.
Andere häufig genutzte Startpunkte sind die Sektoren 16, 32 und 63. Keine dieser Einstellungen ist für FLASH-Speicher geeignet, da Sie wirklich Partitionstabelle und häufig geschriebene Daten so voneinander trennen wollen, dass sie in unterschiedlichen Erase-Blöcken liegen.
Der zweite Satz von Herausforderungen liegt im mkfs-Kommando zum Anlegen von Dateisystemen. Sie müssen sicherstellen, dass wichtige Datenstrukturen korrekt ausgerichtet sind und die richtigen Größen haben. Die Standardeinstellungen sind nicht für FLASH-Speicher optimiert, daher müssen Sie sie ändern. Dazu müssen Sie zunächst einmal die Interna des verwendeten Dateisystems kennen, um die Offsets der Datenstrukturen innerhalb der Partition geeignet festlegen zu können. Für ext2 und Nachfolger wählt mkfs standardmäßig eine Clustergröße von 1 kB aus, was kein Vielfaches von 2 kB ist. Damit splittet jedes Schreiben eines Dateisystemblockes schon mal eine Flash-Page und bei schlechter Ausrichtung sogar zwei Flash-Pages.
Beim Anlegen von FAT-Dateisystemen treten grundsätzlich dieselben Probleme mit anderen Details auf. Sie müssen sich mit der Größe der FAT und des Wurzelverzeichnisses beschäftigen und die Cluster-Größe und die Anzahl ungenutzter Sektoren festlegen.
Wie Sie gewinnen
Sie sehen, um die Datenstrukturen gut auszurichten, sind eine Menge Dinge zu berücksichtigen, sowohl die Partitionstabelle, die Partitionierung und das Dateisystem. Um die Probleme einzeln anzugehen, können Sie zunächst einmal jede Partition an einer Erase-Block-Grenze beginnen lassen. Dann erzeugen Sie ein Dateisystemlayout, bei dem die Datenstrukturen ebenfalls an Erase-Block-Grenzen ausgerichtet sind.
Am besten sollten Sie das Formatieren von FLASH-Speicher ganz vermeiden.
Mitunter ist ein Neuformatieren unvermeidbar, um beispielsweise einen MBR (Master Boot Record) im ersten Sektor unterzubringen. Da der erste Sektor auch die Partitionstabelle enthält, brauchen Sie Software, die den MBR schreibt ohne die Partitionstabelle zu beschädigen.
Sie können hier beispielsweise „syslinux“ verwenden - es schreibt einen MBR und behält dabei die Partitionstabelle bei.
Meist ist es aber nicht mit dem Einbringen des MBR in den ersten Sektor getan. Viele Bootloader benötigen weiteren Code, der auch irgendwo untergebracht werden muss. Ein gängiger Platz hierfür ist der Beginn einer Partition. Den Platzbedarf müssen Sie beim Anlegen eines Dateisystemes mit berücksichtigen.
Zusammenfassung:
- Behalten Sie nach Möglichkeit Partitionierung und Formatierung des Auslieferungszustandes bei.
- Wenn Sie ein Image vorbereiten, dass Sie mit dd auf den Datenträger spielen wollen, verwenden Sie die o.a. Techniken.