# Trim (Befehl)

Unter dem Begriff Trim wird in der Informatik eine Reihe von ähnlichen Zugriffsbefehlen auf Schnittstellen für den Datentransfer von Datenspeichern verstanden, die ungenutzte Datenblöcke auf einem Datenspeicher als frei markieren. Die Bezeichnung hat durch SATA-TRIM Bekanntheit erlangt, obwohl auch andere Begriffe genutzt werden, etwa Discard bei Linux und LVM oder Delete Notification (übersetzt in etwa „Löschbenachrichtigung“) bei Microsofts fsutil von Windows ab Vista/Server 2003.
Implementierungen sind, neben dem TRIM-Befehl bei ATA/ATAPI und SATA, UNMAP bei SCSI, ERASE bei MMC/SD und Deallocate bei NVMe.
Auf Ebene der Datenspeicherung bedeutet Trim die Möglichkeit für einen dritten Zustand: neben binären Daten, also Nullen und Einsen, bedeutet Trim (bzw. Deallocate, DeleteNotify, Discard, Erase, Punch, Unmap), dass keine Daten vorhanden bzw. in Verwendung sind. Der entsprechenden Datenblock ist damit „uninitialisiert“ oder „gelöscht“.

## Grundlage

Klassische Datenspeicher wie Festplattenlaufwerke beinhalten an einer bestimmten Bit-Position in einem bestimmten Datenblock immer entweder eine 0 oder eine 1. Bei Festplatten ist das auch dem physikalischen Aufbau geschuldet, da das Medium an einer bestimmten Stelle entweder magnetisiert bzw. ausgerichtet ist, was einer binären Eins entspricht, oder eben nicht, binär eine Null. Daten lassen sich dabei beliebig oft schreiben.
Bei Datenspeicher, der auf Flash-Speicher basiert und physikalisch aus einem oder mehreren nichtflüchtigen meist NAND-Flash-Bausteinen aufgebaut ist, sind die Speicherzellen immer in Blöcken zusammengefasst, die meist wiederum abermals in Gruppen zusammengefasst werden. Bei SSDs werden diese Gruppen u. U. mit englisch blocks, Blöcke, und Gruppen von Blöcken mit pages, Seiten, bezeichnet, wobei eine Blockgruppe (eine page) vom Betriebssystem als physikalische Blockgröße wahrgenommen wird. Eine wesentliche Eigenschaft von Flash-Speicher ist jedoch, dass die Anzahl möglicher Löschzyklen begrenzt ist. Zudem können Blöcke nicht einfach überschrieben werden, sondern müssen jeweils vor einem erneuten Schreiben gelöscht werden. Durch das Zusammenfassen in Gruppen (pages, für das Betriebssystem jeweils so viele Blöcke, wie in die Blockgröße passen) muss zudem immer eine ganze solche Gruppe an Blöcken (eine page) auf einmal gelöscht werden: Verändert sich auch nur ein Bit in einer solchen zusammengesetzten Blockgruppe (page), so müsste die gesamte Gruppe von Blöcken gelöscht und erneut geschrieben werden, was letztlich auf Kosten der Lebenszeit des Flash-Speichers geht.
Durch diese veränderten Gegebenheiten wurden u. a. bei SSDs im Controller Techniken zum Wear-Leveling implementiert, die unnötiges Löschen einzelner Gruppen zusammengefasster Blöcke verhindern und zu häufiges Neuschreiben minimieren sollen. Neben Over-Provisioning und Garbage Collection führt der Controller auch Buch darüber, welche Blöcke bzw. Gruppen von Blöcken (pages) schon benutzt wurden, wie oft sie bereits gelöscht bzw. beschrieben wurden, und welche Blockgruppen gerade unbenutzt sind. Um nun die Nutzung möglichst gleichmäßig auf alle Blöcke zu verteilen, wird beim Verändern von z. B. nur einem einzigen Bit nicht die originale page gelöscht und neu geschrieben, sondern diese in einer vom Controller geführten Liste einfach als unbenutzt markiert und deren Daten stattdessen in eine andere, noch weniger oft benutzte (oder ganz frische) page kopiert, die fortan deren Platz einnimmt. Ebenso werden pages, die defekte Blöcke enthalten, markiert und fortan nicht mehr verwendet, andere zusätzliche pages (Over-Provisioning) nehmen dann deren Platz ein.
Aus Sicht der Systeme, die diese Datenspeicher nutzen, kaschiert der Controller jedoch all diese Techniken – so kann ein Betriebssystem in gewohnter Weise auf einen Datenblock zugreifen, ohne die internen Mechanismen zu kennen und ohne zu wissen, welche tatsächlichen physikalischen Blöcke gerade verwendet werden. Allerdings kennt nur das Betriebssystem bzw. dessen virtuelles Dateisystem den Status einzelner logischer Blöcke wirklich, denn beim Löschen von Daten werden die zugehörigen Blöcke normalerweise nicht überschrieben, sondern nur im Dateisystem als frei markiert (dies ist soweit exakt der gleiche Vorgang wie beim Löschen der Daten auf einer herkömmlichen Festplatte). Die Daten verbleiben somit auf dem Datenspeicher – eine Unterscheidung zwischen benutzten und verwaisten (unbenutzten) Datenblöcken ist für den Controller einer SSD damit sehr schwierig. Um dem Controller die Arbeit beim Wear-Leveling zu erleichtern, wurde daher ein Zugriffsbefehl festgelegt – bei ATA/SATA mit „TRIM“ bezeichnet –, mit dem ein System dem Controller mitteilen kann, wenn ein Block nicht mehr in Verwendung ist. Dies ermöglicht dem Controller, Flash-Speicherzellen bei Bedarf zu löschen (u. a. Garbage Collection), und erhöht so die Effizienz und Lebensdauer von Flash-basierten Datenspeichern. Längerfristig werden so die Speicherzellen geschont und die Zugriffszeit beim Schreiben stabilisiert.
Ein großer Nachteil von TRIM besteht in der Tatsache, dass eine Datenwiederherstellung nach einem Löschvorgang auch mit forensischen Mitteln meist nicht mehr möglich ist. Wenn Daten von einer SSD gelöscht werden, wird der Speichercontroller durch den TRIM-Befehl angewiesenen, die zugehörigen Pages zu löschen. Der TRIM Befehl ist irreversibel; sobald die Pages durch den Controller gelöscht worden sind, ist eine Datenwiederherstellung nicht mehr möglich.

## Implementierung und Nutzung

Bei modernen Betriebssystemen für Computersysteme wie PCs und Server, aber auch z. B. Smartphones und Tablets, gibt es eine Unterscheidung prinzipiell unterschiedlicher Trim-Implementierungen:
* Non-deterministic TRIM
* Deterministic Read After Trim (DRAT)
* Deterministic read Zero After Trim (DZAT, oder auch RZAT)
Non-deterministisches Trim bedeutet, dass nach einem Trim-Befehl ein erneutes Lesen der jeweiligen Blocknummer (vgl. Logical Block Addressing, kurz LBA) unbestimmte Daten liefert. Dies können Daten von anderen Blöcken, und zudem bei jedem Leseversuch unterschiedliche Daten, sein. Deterministisches Trim hingegen liefert verlässlich dieselben Daten, allerdings ist es von der jeweiligen Implementierung abhängig. Bei Deterministic Read After Trim (DRAT) etwa ist grundsätzlich unklar, ob die zuvor in eine bestimmte Blocknummer geschriebenen Daten damit wieder auslesbar sind – wie es etwa bei anderen Datenspeichern, z. B. Festplatten, der Fall ist, oder Daten einer andern zufälligen logischen Blockaddresse (LBA). Festgelegt ist dabei nur, dass es, bis die Blöcke wieder physisch überschrieben wurden und in Benutzung sind, immer dieselben Daten bleiben. Mit Deterministic Read Zero After Trim gibt der Controller beim Zugriff auf einen getrimmten Block immer Nullen zurück, auch dann, wenn der Block physikalisch noch gar nicht gelöscht wurde.

### ATA TRIM

Der TRIM-Befehl für die ATA- und SATA-Schnittstelle wurde erstmals im Data Set Management Commands Proposal for ATA8-ACS2 vorgeschlagen (wobei ACS für „ATA/ATAPI Command Set“ steht; Version 2 Revision 0 ist vom 21. April 2007). „Trim“ ist dabei ein data set attribute (deutsch: Attribut) des „Data Set Management“-Befehls.

### SCSI UNMAP

Der Trim-Befehl von SCSI heißt UNMAP und ist in Punkt 4.7.3.4 der SCSI Block Commands 3 T10 Specification festgelegt.

### MMC/SD ERASE

Für die Multimedia Card und die SD-Karte gibt es den ERASE-Befehl, der eine non-deterministische Trim-Operation ausführt. Mit der JEDEC-Spezifikation eMMC v4.4 von 2009 (eMMC steht für Embedded MultiMedia Card) wurden zusätzliche deterministische Trim-Befehle in Form von Secure Erase und Secure Trim aufgenommen.

### NVMe Deallocate

Bei NVM Express (kurz NVMe) heißt der Trim-Befehl Deallocate.

### Thin Provisioning

Diese Funktion kann auch dann genutzt werden, wenn keine echte Hardware im Spiel ist: Unter Linux kann der Device Mapper diese Löschinformation des Dateisystems ebenfalls verwerten. Dort geht es darum, (typischerweise überbelegten) Speicherplatz zu sparen. Ein weiteres Beispiel ist der Logical Volume Manager (LVM), wo bei englisch thinly provisioned LVMs (dt. in etwa dünn besetzte LVMs) mit der Trim-Funktion nicht mehr benutzte Speicherblöcke am logischen Volume freigegeben werden und so eine potentielle Überbuchung bei der Abbildung von logischen Speichereinheiten auf physikalische Speicherblöcke am Speichermedium im laufenden Betrieb möglich ist.

## Unterstützung

Betriebssysteme müssen eine grundsätzliche Trim-Unterstützung vorsehen und diese Fähigkeit muss auch für die verwendeten Dateisysteme implementiert sein. Ob jeweils der TRIM-Befehl bei ATA/SATA, der UNMAP-Befehl bei SCSI, die ERASE- und TRIM-Befehle bei MMC/SD oder der Deallocate-Befehl bei NVMe implementiert ist, hängt ebenfalls vom Betriebssystem bzw. dessen Gerätetreibern ab.
| Betriebssystem | Unterstützt seit | Quelle |
| Windows 7 | Finale Veröffentlichung – Oktober 2009 | |
| Windows Server 2008 R2 | Finale Veröffentlichung – Oktober 2009 | |
| Linux 2.6.33 | Februar 2010 | |
| OpenSolaris | Juli 2010 | |
| FreeBSD 8.1 (nur für Low-Level Löschen) FreeBSD 8.2 (volle Unterstützung in UFS) | Juli 2010 29. Januar 2011 | [17][18] [19] |
| Mac OS X Snow Leopard 10.6.7 (nur MacBook Pro 2011) Mac OS X Snow Leopard 10.6.8 bzw. Lion (nur Apple-SSDs) OS X Yosemite 10.10.4 (volle Unterstützung, ggf. mit trimforce) | Verfügbarkeit – 24. Februar 2011 Veröffentlichung – 23. Juni 2011 Veröffentlichung – 30. Juni 2015 | |
| Android 4.3 | Veröffentlichung – Juli 2013 | |
Betriebssysteme haben eine interne Logik, die verschiedenen Trim-Befehle automatisch bei unterstützenden Laufwerken zu senden, meist ist die Funktion jedoch auch manuell einstellbar. ATA-TRIM wurde für das Betriebssystem Linux ab Kernelversion 2.6.33 eingeführt, Windows 7 verfügt ebenfalls über entsprechende Befehle. Für macOS steht ab Version 10.6.8 eine Implementierung dieses intelligenten Speichermanagements zur allgemeinen Verfügung, allerdings nur für SSDs, die von Apple vorinstalliert geliefert wurden. Es existieren Drittanbieter-Lösungen, mit denen TRIM auch für nachträglich installierte SSDs aktiviert werden kann. Seit OS X 10.10.4 liefert Apple eine eigene Lösung, das sog. „trimforce“, mit dem im Terminal Trim auch für Dritthersteller-SSDs aktiviert werden kann.