Zum Inhalt springen

Fstrim

Aus Foxwiki

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
  • Aus der Liste wird nur die erste nicht leere Datei berücksichtigt und alle in dieser Datei aufgeführten und tatsächlich eingebundenen Dateisysteme werden bearbeitet
-t TYPen --types TYPen Ergänzt eine angegebene Option -a oder -A
  • TYPen ist eine mit Kommata getrennte Liste von Dateisystemtypen, wie sie auch mount verwendet
  • In der Liste ungenannte oder mit der Vorsilbe no ausgeschlossene Typen werden nicht bearbeitet
  • Wenn man diese Option nicht verwendet, wird nur der Typ autofs ausgeschlossen
-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

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
  1. 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)
  1. 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
  1. fstrim(8)

Links

Weblinks