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[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, 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 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üsste 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, 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.[4]
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[5]. 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 der Implementierung gibt es bei modernen Betriebssystemen für Computersysteme wie PCs und Server, aber auch z. B. Smartphones und Tablets, eine Unterscheidung prinzipiell unterschiedlicher Trim-Implementierungen:[6]
- Non-deterministic TRIM
- Deterministic Read After Trim (DRAT)
- Deterministic read Zero After Trim (DZAT, oder auch RZAT[7])
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.[8][9]
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.[7]
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.[10]
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.[11]
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.
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[12] eingeführt, Windows 7[13] 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.[14] 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.[15]
Betriebssystem | Unterstützt seit | Quelle |
---|---|---|
Windows 7 | Finale Veröffentlichung – Oktober 2009 | [16] |
Windows Server 2008 R2 | Finale Veröffentlichung – Oktober 2009 | [17][18] |
Linux 2.6.33 | Februar 2010 | [19] |
OpenSolaris | Juli 2010 | [20] |
FreeBSD 8.1 (nur für Low-Level Löschen) FreeBSD 8.2 (volle Unterstützung in UFS) |
Juli 2010 29. Januar 2011 |
[21][22] [23] |
Mac OS X Snow Leopard 10.6.7 (nur MacBook Pro 2011)[24] 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 |
[25] |
Android 4.3 | Veröffentlichung – Juli 2013 | [26] |
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]).
- Byungjo Kim, Dong Hyun Kang, Changwoo Min, Young Ik Eom: Understanding Implications of Trim, Discard, and Background Command for eMMC Storage Device. (PDF; 547 KiB) In: 2014 IEEE 3rd Global Conference on Consumer Electronics (GCCE). Sungkyunkwan-Universität, Samsung Electronics, 2014, S. 709–710, abgerufen am 20. Mai 2021 (englisch, Auszug).
- TRIM bei SSD – Datenwiederherstellung nicht möglich. In: 030-datenrettung.de. 28. Juni 2021, abgerufen am 28. Juni 2021 (deutsch).
- 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).
- 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; 106 KiB) (Nicht mehr online verfügbar.) Microsoft Corporation, 12. Dezember 2007, archiviert vom Original 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 …“
- Adrian Hunter: [PATCH] mmc: add an ioctl for erasing. (E-Mail) In: Linux Kernel-Patch. 5. Mai 2010, abgerufen am 20. Mai 2021 (englisch): „In addition, eMMCv4.4 also offers: Secure Erase, Trim, Secure Trim“
- 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 Original 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.