Fstrim
fstrim - ungenutzte Blöcke in einem eingehängten Dateisystem verwerfen
Beschreibung
Das Programm fstrim für die Kommandozeile[1] stammt aus dem Paket util-linux, welches bei jeder Installation von Ubuntu bereits mit installiert wird
Es kann mit Rootrechten[2] mit folgender allgemeiner Syntax aufgerufen werden
fstrim OPTIONen EINBINDEPUNKT
Das Programm bearbeitet eingebundene Dateisysteme; diese können entweder über Optionen -a, -A, -I oder -t bzw
- deren Langform identifiziert werden, oder es wird über den Parameter EINBINDEPUNKT eines explizit angegeben
Man kann in einer anderen (hier nicht besprochen) Betriebsart auch einen über die Optionen -o, -l und -m bzw
- deren Langform beschrieben Bereich auf einem Datenträger bearbeiten lassen
- Diese und die vorgenannte Betriebsart kann man vermischen
- Lese hierzu Details in der Manpage von fstrim
- BESCHREIBUNG
fstrim wird in eingehängten Dateisystemen verwendet, um in diesem Dateisystem nicht genutzte Blöcke zu verwerfen (zu »trimmen«). Dies ist nützlich bei Solid State Drives (SSDs) und Medien mit knappem Speicherplatz.
Per Vorgabe verwirft fstrim alle ungenutzten Blöcke im Dateisystem. Zum Anpassen des Verhaltens sind Optionen verfügbar, die auf Bereichen oder Größenangaben basieren, wie nachfolgend erläutert.
Das Argument Einhängepunkt bezeichnet den Pfadnamen des Verzeichnisses, in dem das Dateisystem eingehängt ist und wird benötigt, wenn -A, -a, --fstab oder --all nicht angegeben ist.
Die häufige Ausführung von fstrim oder auch mount -o discard kann die Lebensdauer qualitativ minderwertiger SSD-Geräte negativ beeinflussen. Eine für die meisten Arbeitsplatzrechner und Server sinnvolle Zeitspanne ist einmal pro Woche. Beachten Sie, dass nicht alle Geräte eine Verwerfungs-Warteschlange unterstützen, daher verursacht jeder Verwerfungsbefehl Leistungseinbußen bei allem, was zu dieser Zeit auf die Platte zugreift.
Installation
fstrim ist Teil von util-linux
Aufruf
fstrim [-v] [-o offset] [-l length] [-m minimum-size] -A|-a|mountpoint
Optionen
Unix | GNU | Parameter | Beschreibung |
---|---|---|---|
-h | --help | Hilfe mit Liste der Optionen und deren Kurzbeschreibung ausgeben | |
-V | --version | Version des Programms anzeigen | |
-n | --dry-run | Nichts wirklich ausführen, nur andeuten was passieren könnte | |
-a -I /proc/self/mountinfo | --all | Alle zum Zeitpunkt des Aufrufs tatsächlich eingebundenen Dateisysteme bearbeiten | |
-A -I /etc/fstab | --fstab | Alle in der Datei fstab[4] aufgeführten, tatsächlich eingebundenen Dateisysteme bearbeiten | |
-I LISTE | --listet-in LISTE | LISTE ist eine Folge von durch : getrennten Dateinamen
| |
-t TYPen | --types TYPen | Ergänzt eine angegebene Option -a oder -A
| |
-v | --verbose | Erzeugt ausführlichere Ausgabe, insbesondere die Anzahl der getrimmten Bytes | |
--quiet-unsupported | Wenn das Dateisystem oder das Gerät TRIM nicht unterstützt, keine Meldung erzeugen |
- OPTIONEN
Nachfolgend kann den Argumenten Versatz, Länge und minimale-Größe eines der multiplikativen Suffixe KiB (=1024), MiB (=1024*1024) und so weiter für GiB, TiB, PiB, EiB, ZiB und YiB folgen (das »iB« ist optional, zum Beispiel ist »K« gleichbedeutend mit »KiB«) oder die Suffixe KB (=1000), MB (=1000*1000) und so weiter für GB, TB, PB, EB, ZB und YB folgen.
-A, --fstab
»trimmt« alle in /etc/fstab erwähnten eingehängten Dateisysteme auf Geräten, die den Verwerfungsvorgang unterstützen. Das Wurzeldateisystem wird aus der Kernel-Befehlszeile ermittelt, falls diese Information in der Datei fehlt. Weitere übergebene Optionen, wie --offset, --length und --minimum, werden auf alle diese Geräte angewendet. Fehlermeldungen von Dateisystemen, die den Verwerfungsvorgang nicht unterstützen, von schreibgeschützten Geräten, autofs und schreibgeschützten Dateisystemen werden stillschweigend ignoriert. Dateisysteme mit der Einhängeoption »X-fstrim.notrim« werden übersprungen.
-a, --all
»trimmt« alle eingehängten Dateisysteme auf Geräten, die den Verwerfungsvorgang unterstützen. Weitere übergebene Optionen, wie --offset, --length und --minimum, werden auf alle diese Geräte angewendet. Fehlermeldungen von Dateisystemen, die den Verwerfungsvorgang nicht unterstützen sowie schreibgeschützte Geräte und Dateisysteme werden stillschweigend ignoriert.
-n, --dry-run
Diese Option macht alles außer dem eigentlichen Aufruf des FITRIM-Ioctl.
-o, --offset Versatz
gibt den Byte-Versatz im Dateisystem an, an dem nach zu verwerfenden freien Blöcken gesucht werden soll. Vorgabewert ist 0, beginnend am Anfang des Dateisystems.
-l, --length Länge
gibt die Anzahl der Bytes nach der Startposition für die Suche nach zu verwerfenden freien Blöcken an. Falls der angegebene Wert hinter dem Ende des Dateisystems liegt, stoppt fstrim an den Dateisystemgrenzen. Der Vorgabewert nimmt das Ende des Dateisystems an.
-I, --listed-in Liste
gibt eine durch Doppelpunkte getrennte Liste im Fstab-Format oder im Mountinfo-Format des Kernels an. Alle fehlenden oder leeren Dateien werden stillschweigend ignoriert. Die Erweiterung der Liste endet mit dem Erscheinen der ersten nicht-leeren Datei. Zum Beispiel:
--listed-in /etc/fstab:/proc/self/mountinfo.
Dateisysteme mit der Einhängeoption »X-fstrim.notrim« in der fstab werden übersprungen.
-m, --minimum minimale-Größe
gibt den minimalen freien zu verwerfenden Bereich in Bytes an. Dieser Wert wird intern auf ein Vielfaches der Blockgröße des Dateisystems gerundet. Kleinere freie Bereiche werden ignoriert und fstrim wird das Minimum anpassen, falls es kleiner als das Minimum des Gerätes ist und dies (fstrim_range.minlen) zur Anwendungsebene zurückmelden. Durch Erhöhen dieses Wertes wird die fstrim-Operation auf Dateisystemen mit stark fragmentierten freien Bereichen schneller vonstatten gehen, andererseits werden nicht alle Blöcke verworfen. Der Vorgabewert ist 0, wodurch alle freien Blöcke verworfen werden.
-t, --types Liste
gibt bei der Verwendung mit --all oder --fstab die zugelassenen oder verbotenen Dateisystemtypen an. Die Liste ist eine durch Kommata getrennte Liste aus Dateisystemnamen. Die Liste wird so ausgewertet wie mount -t Typmuster liest. Nur angegebene Dateisystemtypen sind zugelassen. Falls der Liste ein »no« vorangestellt ist, sind alle angegebenen Typen verboten, beziehungsweise jedes einzelne Dateisystem ist verboten, dem ein »no« vorangestellt ist. Falls die Option nicht verwendet wird, dann sind alle Dateisysteme (außer »autofs«) zugelassen.
-v, --verbose
gibt ausführliche Meldungen aus. Falls angegeben, gibt fstrim die Anzahl der Bytes aus, die vom Dateisystem als potenzielle Blöcke zum Verwerfen gemeldet werden. Diese Anzahl ist die maximal zu verwerfende Menge aus der Sicht des Speichergerätes, da FITRIM ioctl wiederholt aufgerufen wird und dadurch die gleichen zu verwerfenden Sektoren mehrfach ausgegeben werden.
fstrim meldet jedes Mal die gleichen potenziell zu verwerfenden Bytes, aber es werden nur Sektoren des Speichergerätes tatsächlich verworfen, die zwischenzeitlich beschrieben worden sind. Weiterhin behält sich die Block-Ebene des Kernels vor, die zu verwerfenden Bereiche anzupassen, damit sie in die Stripe-Geometrie des Raids passen und nicht-trimmfähigen Geräten in einer LVM-Umgebung gerecht zu werden. Diese Beschränkungen werden in fstrim_range.len (der Option --length) nicht reflektiert.
--quiet-unsupported
unterdrückt Fehlermeldungen, falls der Trimm-Vorgang (Ioctl) nicht unterstützt wird. Diese Option ist für die Verwendung in systemd-Dienstedateien oder cron(8)-Skripten gedacht, um dort Warnungen zu unterdrücken, die auf bekannten Problemen beruhen, wie beispielsweise die Meldung Bad file descriptor des NFS-Treibers, wenn ein Gerät schreibgeschützt eingehängt ist, oder die fehlende Dateisystemunterstützung beim FITRIM-Ioctl-Aufruf. Diese Option leert auch den Exit-Status, wenn in der fstrim-Befehslzeile ein nicht unterstütztes Dateisystem angegeben wird.
-h, --help
zeigt einen Hilfetext an und beendet das Programm.
-V, --version
Display version and exit.
Parameter
Umgebungsvariablen
Exit-Status
Wert | Beschreibung |
---|---|
0 | Erfolg |
>0 | Fehler |
Anwendung
Batched Discard
Trimmen per "Batched Discard" ist sehr einfach
- Es läuft hinaus auf einen Aufruf des Befehls fstrim
- manuell in einem Terminal[1] mit RootRechten[2]
- oder per Skript
- oder periodisch per Cronjob (nicht empfohlen)
- oder periodisch per Systemd-Unit
Beispiel
Das folgende Beispiel setzt voraus, dass auf /home/ tatsächlich ein eigenes Dateisystem eingebunden ist bzw
- dass das ein Einbindepunkt und nicht nur ein Ordner ist
sudo fstrim -v /home
Als Ausgabe erhält man mit der Option -v eine Ausgabe, wie viele Bytes getrimmt wurden
/home: 1825476608 bytes were trimmed
In diesem Beispiel wurden ungefähr 1,825 GB getrimmt
Es ist nicht ganz klar, was das bedeuten soll
- Schön wäre es, wenn hier gemeldet würde, wie viele Bytes wieder beschreibbar gemacht wurden
- Das ist vermutlich eine zu optimistische Interpretation: Tatsächlich ist es wohl nur die Maximalzahl der möglicherweise befreiten Bytes und die Anzahl der wirklich wieder befreiten Bytes kann sehr viel kleiner sein, möglicherweise auch gar keines
Beispiel Skript
Das Skript unter geeignetem Namen an geeigneter Stelle ablegen, als Eigentümer und Gruppe root setzen und ausführbar machen
1
2 3 4 5 6 7 |
# !/bin/bash
{ echo "*** $(date -R) ***" for MP in / /home # <-- Anpassen auf die eigenen Bedürfnisse do /sbin/fstrim -v "$MP" || echo Fehler beim trimmen von $MP done } | tee >>/var/log/batched_discard.log |
Eine Ausgabe sieht dann z.B
- so aus
*** Sun, 12 Oct 2014 12:51:07 +0200 *** /: 290,9 MiB (305029120 bytes) trimmed /home: 116,4 MiB (122036224 bytes) trimmed
Man kann es z.B
- als Job für Anacron ablegen
Beispiel Systemd-Unit
Beispiel für eine Systemd-Unit für fstrim
- basierend auf der des Betriebssystems
# /etc/systemd/system/UU-fstrim.service [Unit] Description=Discard unused blocks on filesystems from /etc/fstab Documentation=man:fstrim(8) ConditionVirtualization=!container [Service] Type=oneshot ExecStart=/sbin/fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported PrivateDevices=no PrivateNetwork=yes PrivateUsers=no ProtectKernelTunables=yes ProtectKernelModules=yes ProtectControlGroups=yes MemoryDenyWriteExecute=yes SystemCallFilter=@default @file-system @basic-io @system-service
Die markierten Optionen für den Aufruf von fstrim sind an die eigenen Bedürfnisse anzupassen
- Da bei Ubuntu die Datei /etc/fstab[4] nicht leer ist, bleibt die Angabe weiterer Dateien wirkungslos
Online Discard
Diese Methode ist zwar einfach zu konfigurieren, aber ihre richtige Anwendung ist dennoch sehr anspruchsvoll
- Man benötigt umfangreiches Fachwissen, detaillierte Kenntnisse über die Implementierung im Linux Kernel und genaue Kenntnis der technischen Spezifikationen der verbauten SSD (Hardware) sowie deren Verhalten (Fehler in der Firmware)
- Dieser Abschnitt richtet sich an Experten und enthält keine vollständige Übersicht und erst recht keine für Laien taugliche Anleitung
Experten-Info
Es gibt inzwischen mehrere Varianten für kontinuierliches Trimmen: # Die ursprüngliche Implementierung (später als "non-queued continuous trim" betzeichnet) war optimiert auf frühere Bauarten von SSDs ohne "wear leveling"
- SATA-Geräte vor Revision 3.1 unterstützen nur diese Variante, die im Betrieb einige unerwünschte Effekte produzieren kann
- Die Spezifikation SATA Rev. 3.1 wurde im Juli 2011 veröffentlicht
- Bis heute (2024) sind Controller nach dieser bzw
- folgenden Revisionen selten
- Externe Gehäuse mit USB/SATA-Wandler beherrschen in der Regel nur SATA Rev 3.0
- Bei der neueren Variante "queued continuous trim" werden TRIM-Anforderungen von der SSD gesammelt und als Batch ausgeführt
- Dies reduziert die Häufigkeit des während der Ausführung von TRIM erfolgenden Einfrieren des Systems
- Die Variante „Ausführung von "queued continuous trim" durch die SSD“ erfordert eine SSD nach hinreichend neuer SATA Revision (zunehmend erfüllt) und ebenso beim SATA-Controller (bei externen Geräten immer noch selten)
- Für manche SSDs ist dieser Modus im Linux Kernel gesperrt wegen ernsthafter Korruption von Daten. → Folgende Tabelle 3 und Trim_(computing)
- Manche Administratoren misstrauen nach schlechten Erfahrungen aus der Anfangszeit der Methode „Ausführung von "queued continuous trim" durch die SSD“ grundsätzlich dieser Methode und sperren deshalb im Kernel deren technische Grundlage Native_Command_Queuing (NCQ) beim Start des Kernels über eine Bootoption
- libata.force=noncq (NCQ komplett abschalten) oder
- libata.force=noncqtrim (NCQ für TRIM abschalten)
- Bei der Variante „Ausführung von "queued continuous trim" durch den Dateisystemtreiber“ simuliert der Dateisystemtreiber die vorstehende Arbeitsweise
- Er sammelt selbst die TRIM-Anforderungen und sendet diese als "non-queued"-TRIM-Anforderungen
Manche SSDs sind bekannt für ihre fehlerhafte Implementierung mancher ATA-Befehle im Kontext TRIM und deshalb im Linux Kernel (genauer in der libata) für bestimmte Betriebsweisen gesperrt
- Eine fehlende Mitgliedschaft in dieser schwarzen Liste ist natürlich keine Garantie für fehlerfreie Funktion, sondern bedeutet nur fehlende Erkenntnisse über das betreffende Gerät
Tabelle 3: SSDs mit Beschränkungen bei Online Discard | |||
Hersteller | Modell | Firmware | |
Micron/Crucial | M500 | alle | "queued continuous trim" gesperrt |
M550 | MU01 | ||
Micron | M510 | MU01 | |
Crucial | MX100 | MU01 | |
Samsung | 840850 | alle | |
SuperSSpeed | S238 | alle | TRIM generell gesperrt: Löscht falsche Blöcke, somit Datenverlust |
- Hinweis
Für SSDs der ersten Baureihen fanden sich Berichte, wodurch die per „Online Discard“ entstehenden TRIM-Befehle die Performance der SSD reduzieren oder diese unbenutzbar machen könnten
- Bei aktuellen SSDs ist dieses Problem nicht bekannt
Dennoch ist "Online Discard" aggressiver als "Batchd Discard", lässt somit die SSD schneller altern und sollte daher nur in den Fällen eingesetzt werde, wenn "Batched Discard" keine befriedigenden Ergebnisse liefert
Zur Nutzung von "Online Discard" muss man beim Einbinden die (bzw
- abhängig von Dateisystemtyp eine verwandte) Option discard verwenden
- Mit einer solchen Option fordert der Dateisystemtreiber fortlaufend TRIM von der SSD an, sobald im Dateisystem Speicherbereiche frei werden
- Die Details kann man in der Dokumentation des jeweiligen Dateisystems nachlesen
- Siehe auch die folgenden Abschnitte für ext4, Btrfs und Swap
Anhang
Siehe auch
Dokumentation
- Man-Page
Links
Weblinks