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 ungenutze 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[1] und LVM oder Delete Notification (übersetzt in etwa „Löschbenachrichtigung“) bei Microsoft fsutil von Windows ab Vista/Server 2003.[2]
Implementierungen sind, neben dem TRIM-Befehl bei ATA/ATAPI und SATA, der UNMAP-Befehl bei SCSI und der Deallocate-Befehl bei NVMe.
Grundlage
Klassische Datenspeicher wie Festplatten 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üssten die gesamte Gruppe von Blöcken gelöscht und erneut geschrieben werden, was letztlich auf Kosten der Lebenszeit des Flash-Speichers geht.[3]
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 (und wie oft) und welche gerade unbenutzt sind. Denn, um die Last 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 stattdessen eine andere, noch weniger oft benutzte (oder ganz frische) page verwendet, 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ächliche physikalischen Blöcke gerade verwendet werden. Allerdings kennt nur das Betriebssystem bzw. dessen virtuelles Dateisystem den Status einzelner Blöcke wirklich, denn beim Löschen werden diese normalerweise nicht überschreiben sondern nur im Dateisystem als frei markiert. 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 „TRIM“ bezeichnet, mit dem ein System dem Controller mitteilen kann, wenn ein Block nicht mehr in Verwendung ist. Dies ermöglicht den im Controller implementierten Techniken, Flash-Speicherzellen bei Bedarf zu löschen und erhöht so die Lebensdauer von Flash-basierten Datenspeichern und längerfristig auch deren Zugriffszeit beim Schreiben.
Implementierung und Nutzung
Bei der Implementierung gibt es bei modernen Betriebssystemen für Computersysteme wie PCs und Server eine Unterscheidung prinzipiell unterschiedlicher Trim-Implementierungen:[4]
- Non-deterministic TRIM
- Deterministic Read After Trim (DRAT)
- Deterministic read Zero After Trim (DZAT, oder auch RZAT[5])
Non-deterministisches Trim bedeutet, dass nach einem Trim-Befehl ein erneutes Lesen des jeweiligen Block 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 geschriebenen Daten damit wieder auslesbar sind – wie es etwa bei anderen Datenspeichern, etwa Festplatten, der Fall ist, oder andere Daten. 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.
Auf Ebene der Dateiverwaltung bedeutet Trim die Möglichkeit für einen dritten Zustand: neben binären Daten, also Nullen und Einsen, bedeutet Trim (bzw. Erase, Punch, Discard, Unmap, DeleteNotify), dass keine Daten vorhanden bzw. in Verwendung sind. Der entsprechenden Datenblock ist damit „uninitialisiert“.
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.[6][7]
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.[5]
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.[8]
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 der TRIM-Befehl bei ATA/SATA, der UNMAP-Befehl bei SCSI oder der Deallocate-Befehl bei NVMe implementiert ist, hängt ebenfalls vom Betriebssystem bzw. dessen Gerätetreibern ab.
Ob das Betriebssystem verschiedenen Trim-Befehle an das Laufwerk sendet ist meist durch entsprechende Optionen einstellbar. ATA-TRIM wurde für das Betriebssystem Linux ab Kernelversion 2.6.33[9] eingeführt, Windows 7[10] verfügt ebenfalls über entsprechende Befehle. Für macOS steht ab Version 10.6.8 ebenfalls eine Implementierung dieses intelligenten Speichermanagements zur allgemeinen Verfügung, allerdings nur für SSDs, die von Apple vorinstalliert geliefert wurden. Es existieren allerdings Lösungen, mit der TRIM auch für nachträglich installierte SSDs aktiviert werden kann.[11] 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.[12]
Betriebssystem | Unterstützt seit | Quelle |
---|---|---|
Windows 7 | Finale Veröffentlichung – Oktober 2009 | [13] |
Windows Server 2008 R2 | Finale Veröffentlichung – Oktober 2009 | [14][15] |
Linux 2.6.33 | Februar 2010 | [16] |
OpenSolaris | Juli 2010 | [17] |
FreeBSD 8.1 (nur für Low-Level Löschen) FreeBSD 8.2 (volle Unterstützung in UFS) |
Juli 2010 29. Januar 2011 |
[18][19] [20] |
Mac OS X Snow Leopard 10.6.7 (nur MacBook Pro 2011)[21] Mac OS X Snow Leopard 10.6.8 bzw. Lion (nur Apple-SSDs) OS X Yosemite 10.10.4 (volle Unterstützung) |
Verfügbarkeit – 24. Februar 2011 Veröffentlichung – 23. Juni 2011 Veröffentlichung – 30. Juni 2015 |
[22] |
Android 4.3 | Veröffentlichung – Juli 2013 | [23] |
Einzelnachweise
- ↑ Jonathan Corbet: Block layer discard requests. In: LWN.net. 12. August 2008, abgerufen am 19. Mai 2021 (englisch).
- ↑ Management and Tools – Command-Line Reference: Fsutil behavior. In: Microsoft Docs. Microsoft, 31. August 2016, abgerufen am 19. Mai 2021 (englisch): „DisableDeleteNotify – Disables (1) or enables (0) delete notifications …“
- ↑ Lutz Labs: SSD-Grundlagen – Aufbau und Funktionsweise von Solid-State Disks. In: c’t. Nr. 24/2015. Heise Zeitschriften Verlag, 30. Oktober 2015, S. 68 (online, kostenpflichtig [abgerufen am 18. Mai 2021]).
- ↑ Yuri Gubanovis, Oleg Afonin: Recovering Evidence from SSD Drives in 2014: Understanding TRIM, Garbage Collection and Exclusions. Forensic Focus, 23. September 2014, abgerufen am 18. Mai 2021 (englisch).
- ↑ a b Storage Administration Guide – Chapter 21. Solid-State Disk Deployment Guidelines. In: RHEL7 Product Documentation. Red Hat, abgerufen am 18. Mai 2021 (englisch).
- ↑ Frank Shu, Nathan Obr: Data Set Management Commands Proposal for ATA8-ACS2, Revision 6. (DOC; 106KiB) Microsoft Corporation, 12. Dezember 2007, archiviert vom (nicht mehr online verfügbar) am 13. Juni 2010; abgerufen am 18. Mai 2021 (englisch, T13/e07154r6).
- ↑ Vorteile von TRIM und deren Einsatz mit Ihrem Intel SSD. 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 …“
- ↑ Thinly-Provisioned Logical Volumes (Thin Volumes). Abgerufen am 20. Februar 2019 (englisch).
- ↑ heise open - Die Neuerungen von Linux 2.6.33. heise.de, 24. Februar 2010, abgerufen am 24. Februar 2010.
- ↑ Neues in NTFS. Microsoft TechNet, 1. Februar 2010, abgerufen am 2. Februar 2011.
- ↑ TRIM Enabler for Mac. groths.org, 3. September 2013, abgerufen am 14. September 2013.
- ↑ TRIM für Drittanbieter SSDs unter OS X 10.10.4 aktivieren. MacTechNews, 1. Juli 2015, abgerufen am 11. Juli 2015.
- ↑ Support and Q&A for Solid-State Drives. MSDN, 9. Mai 2009, abgerufen am 12. August 2010.
- ↑ Windows 7 Enhancements for Solid-State Drives. In: Microsoft downloads. Microsoft Corporation, 12. November 2008, abgerufen am 8. Juli 2009.
- ↑ Q. What is the TRIM function for solid state disks (SSDs) and why is it important? Windows IT Pro, archiviert vom am 2. Januar 2010; abgerufen am 1. September 2010.
- ↑ Trim on Linux. Kernel Newbies, abgerufen am 1. September 2010.
- ↑ SATA TRIM support in OpenSolaris. 29. Juli 2010, abgerufen am 27. Februar 2011.
- ↑ FreeBSD 8.1-RELEASE Release Notes: Disks and Storage. Abgerufen am 1. September 2010.
- ↑ FreeBSD 9 Brainstorming / Wishlist. Abgerufen am 1. September 2010.
- ↑ Add kernel side support for BIO_DELETE/TRIM on UFS. Abgerufen am 1. Februar 2011.
- ↑ AJ: Enable TRIM SSD in Mac OS X 10.6.7. In: OS X Daily. 27. März 2011, abgerufen am 18. Mai 2021 (englisch).
- ↑ TRIM SSD Support Enabled in Mac OS X 10.6.8 Update. Abgerufen am 27. Juni 2011.
- ↑ Android 4.3 bringt TRIM für alle Nexus-Geräte. GIGA, 30. Juli 2013, abgerufen am 30. Juli 2013.