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 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) bei Linux<ref>Jonathan Corbet: Block layer discard requests. In: LWN.net. 12. August 2008, abgerufen am 19. Mai 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> und LVM oder {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (übersetzt in etwa „Löschbenachrichtigung“) bei Microsofts fsutil von Windows ab Vista/Server 2003.<ref>Fsutil behavior. In: learn.microsoft.com. Microsoft, 31. August 2016, abgerufen am 19. Mai 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)): „DisableDeleteNotify – Disables (1) or enables (0) delete notifications …“</ref>
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 {{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value), Blöcke, und Gruppen von Blöcken mit {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value), Seiten, bezeichnet, wobei eine Blockgruppe (eine {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)) 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 ({{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value), 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 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)) auf einmal gelöscht werden: Verändert sich auch nur ein Bit in einer solchen zusammengesetzten Blockgruppe ({{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)), 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.<ref name="ct_SSD-Grundlagen_2015">Lutz Labs: SSD-Grundlagen – Aufbau und Funktionsweise von Solid-State Disks. In: c’t. Band 24. Heise Zeitschriften Verlag, 30. Oktober 2015, S. 68 f. (online, kostenpflichtig [abgerufen am 18. Mai 2021]).</ref>
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 ({{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)) 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 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) 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) {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) kopiert, die fortan deren Platz einnimmt. Ebenso werden {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value), die defekte Blöcke enthalten, markiert und fortan nicht mehr verwendet, andere zusätzliche {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (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.<ref name="trim-kim-gcce14"></ref>
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<ref>TRIM bei SSD – Datenwiederherstellung nicht möglich. In: 030-datenrettung.de. 28. Juni 2021, abgerufen am 28. Juni 2021.</ref>. 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:<ref name="forensicfocus_2014">Yuri Gubanovis, Oleg Afonin: Recovering Evidence from SSD Drives in 2014: Understanding TRIM, Garbage Collection and Exclusions. In: forensicfocus.com. 23. September 2014, abgerufen am 18. Mai 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>
- {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) TRIM
- {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (DRAT)
- {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (DZAT, oder auch RZAT<ref name="RHEL7_SSD-Deployment-Guidelines" />)
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 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (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 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) 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 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) vorgeschlagen (wobei ACS für „ATA/ATAPI {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)“ steht; Version 2 Revision 0 ist vom 21. April 2007). „Trim“ ist dabei ein {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (deutsch: Attribut) des „{{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)“-Befehls.<ref name="t13_e07154r6">Frank Shu, Nathan Obr: Data Set Management Commands Proposal for ATA8-ACS2, Revision 6. (DOC; 106 KiB) In: t13.org. Microsoft, 12. Dezember 2007, archiviert vom Vorlage:IconExternal am 13. Juni 2010; abgerufen am 18. Mai 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), T13/e07154r6).</ref><ref>Vorteile von TRIM und deren Einsatz mit Ihrem Intel SSD. In: intel.de. Intel, 7. April 2021, abgerufen am 19. Mai 2021: „TRIM ist ein Attribut des ATA Data Set Management Command. Die TRIM-Funktion verbessert die Kompatibilität, Beruhigendigung und Leistung …“</ref>
SCSI UNMAP
Der Trim-Befehl von SCSI heißt UNMAP und ist in Punkt 4.7.3.4 der {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) festgelegt.<ref name="RHEL7_SSD-Deployment-Guidelines">Storage Administration Guide – Chapter 21: Solid-State Disk Deployment Guidelines. RHEL7 Product Documentation. In: access.redhat.com. Red Hat, abgerufen am 18. Mai 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>
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.<ref>Adrian Hunter: [PATCH] mmc: add an ioctl for erasing. In: lkml.iu.edu. 5. Mai 2010, abgerufen am 20. Mai 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), Linux Kernel-Patch): „In addition, eMMCv4.4 also offers: Secure Erase, Trim, Secure Trim“</ref>
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 {{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value) (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.<ref>Thinly-Provisioned Logical Volumes (Thin Volumes). In: access.redhat.com. Red Hat, abgerufen am 20. Februar 2019 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>
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 | <ref>Support and Q&A for Solid-State Drives. In: learn.microsoft.com. Microsoft, 9. Mai 2009, abgerufen am 12. August 2010 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> |
| Windows Server 2008 R2 | Finale Veröffentlichung – Oktober 2009 | <ref>Windows 7 Enhancements for Solid-State Drives. (PDF; 1,5 MB) In: download.microsoft.com. Microsoft, 12. November 2008, abgerufen am 8. Juli 2009 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref><ref>John Savill: Q. What is the TRIM function for solid state disks (SSDs) and why is it important? In: windowsitpro.com. 22. April 2009, archiviert vom Vorlage:IconExternal am 2. Januar 2010; abgerufen am 1. September 2010 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> |
| Linux 2.6.33 | Februar 2010 | <ref>Linux 2.6.33: 12.2. Storage. In: kernelnewbies.org. Abgerufen am 1. September 2010 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> |
| OpenSolaris | Juli 2010 | <ref>Jörg Moellenkamp: SATA TRIM support in OpenSolaris. In: c0t0d0s0.org. 29. Juli 2010, archiviert vom Vorlage:IconExternal am 12. August 2012; abgerufen am 27. Februar 2011 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> |
| FreeBSD 8.1 (nur für Low-Level Löschen) FreeBSD 8.2 (volle Unterstützung in UFS) |
Juli 2010 29. Januar 2011 |
<ref>FreeBSD 8.1-RELEASE Release Notes: Disks and Storage. In: freebsd.org. 24. Juli 2010, abgerufen am 1. September 2010 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref><ref>FreeBSD 9 Brainstorming / Wishlist. In: wiki.freebsd.org. Abgerufen am 1. September 2010 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> <ref>Add kernel side support for BIO_DELETE/TRIM on UFS. In: freebsd.org. Abgerufen am 1. Februar 2011 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> |
| Mac OS X Snow Leopard 10.6.7 (nur MacBook Pro 2011)<ref>AJ: Enable TRIM SSD in Mac OS X 10.6.7. In: osxdaily.com. 27. März 2011, abgerufen am 18. Mai 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> 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 |
<ref>TRIM SSD Support Enabled in Mac OS X 10.6.8 Update. In: osxdaily.com. 27. Juni 2011, abgerufen am 27. Juni 2011 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> |
| Android 4.3 | Veröffentlichung – Juli 2013 | <ref>Johannes Kneussel: Android 4.3 bringt TRIM für alle Nexus-Geräte. In: GIGA. 30. Juli 2013, archiviert vom Vorlage:IconExternal am 4. August 2013; abgerufen am 30. Juli 2013.</ref> |
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<ref>Thorsten Leemhuis: Die Neuerungen von Linux 2.6.33. In: heise.de. 24. Februar 2010, abgerufen am 14. April 2010.</ref> eingeführt, Windows 7<ref>What’s New in NTFS. In: learn.microsoft.com. Microsoft, 1. Februar 2010, abgerufen am 2. Februar 2011 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> 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.<ref>Oskar Groth: Trim Enabler 3.0 Released. In: groths.org. 5. August 2013, archiviert vom Vorlage:IconExternal am 25. August 2013; abgerufen am 14. September 2013 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> 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.<ref>TRIM für Drittanbieter SSDs unter OS X 10.10.4 aktivieren. In: mactechnews.de. 1. Juli 2015, abgerufen am 11. Juli 2015.</ref>
Einzelnachweise
<references />