Dateisystem aufräumen mit Fslint

Aus LinuxUser 07/2015

Dateisystem aufräumen mit Fslint

© alphaspirit, 123RF

Müllabfuhr

Fslint hilft, Problemquellen im Dateisystem aufzuspüren und sie zu beheben oder zumindest abzumildern. Nebenbei entschlackt es auch noch die Festplatte.

Bei Dateisystemen handelt es sich im Prinzip um große, nicht sonderlich intelligente Datenbanken. Wie die klassischen Datenbanken neigen auch Dateisysteme dazu, mit der Zeit eine Menge virtuellen Staub und Fusseln (englisch: “lint”) anzusetzen. Damit sie funktionsfähig bleiben, ist es gute Praxis, sie von Zeit zu Zeit zu überprüfen und gegebenenfalls zu reparieren.

Zum einen geschieht dies auf einer elementaren Ebene beim Systemstart mittels Fsck. Während dieses als Wrapper für die diversen speziellen Tools fungiert, die Dateisysteme auf der untersten (Block-)Ebene bearbeiten, berücksichtigt es keinerlei Probleme, die mit der logischen (Verzeichnis-)Struktur zu tun haben – dabei können diese Probleme beinahe ebensogroßen Schaden anrichten. Zu den typischen Problemen in der Verzeichnisschicht von Dateisystemen zählen “dangling links” (symbolische Links, die auf eine nicht mehr existierende Datei zeigen) oder Dateinamen, die auf ganz unterschiedliche Weise problematisch gewählt wurden, aber es gibt noch vieles mehr.

Eine Reihe von Entwicklern beschäftigen sich schon längere Zeit damit, Probleme auf Dateisystemebene aufzuspüren. Padraig Brady verdanken wir die recht einfach anzuwendende Lösung Fslint [1]. Die leicht verständliche Oberfläche fslint-gui vereinigt und vereinheitlicht die Benutzung von einem guten Dutzend Tools, die jeweils eine bestimmte Aufgabe adressieren (siehe Tabelle “Fslint-Werkzeuge”). Alle Tools lassen sich auch unabhängig von der Oberfläche einsetzen, was zum einen automatisierte Anwendungen ermöglicht und zum anderen effektives Arbeiten auf der Shell ermöglicht.

Fslint-Werkzeuge

Name Funktion
findup finde Dateiduplikate
findnl finde Dateien mit problematischen Namen
findu8 finde Dateien mit ungültigen UTF8-Kodierungen
findbl finde problematische Symlinks (“bad links”)
findsn finde unterschiedliche Dateien mit identischen Namen (“same name”)
finded finde leere Verzeichnisse (“empty directories”)
findid finde Dateien unbekannter User (“dead user IDs”)
findns finde ungestrippte Programme (“non-stripped executables”)
findrs finde Dateien mit redundanten Leerzeichen (“redundant whitespace”)
findtf finde temporäre Dateien
findul finde (vermutlich) ungenutzte Libraries (“unused libraries”)
zipdir verkleinert Ext2/3-Verzeichnisse
Support-Skripte unter supprt/
md5sum_approx erzeugt MD5-Prüfsummen für Dateiteile
getffp erzeugt Pfade im Find-Format
getffl erzeugt Library-Pfade im Find-Format
fslver Fehlerbehandlung
rmlint Zusammenführen von Dateien
Support-Skripte unter fstool/
lS nach Dateigrößen sortierte Ausgabe
edu spezielle Ermittlung der Verzeichnisgröße
dupwaste von zu löschenden Dateien verschwendeter Speicherplatz
dir_size spezielle Ermittlung der Verzeichnisgröße

Fslint einrichten

Ärgerlicherweise bringen nur wenige Distributionen Fslint in ihren Repositories mit. Die meisten davon installieren Fslint im Verzeichnis /usr/share/fslint/ (so auch Ubuntu 14.04 LTS) oder in einem im Pfad ($PATH) enthaltenen Verzeichnis. In den meisten Fällen müssen Sie aber den Tarball von der Fslint-Homepage herunterladen (Listing 1). Eine Installation im engeren Sinn kann entfallen, da es sich um eine Kombination aus Python-Code (GUI) und Shell-Skripten (Tools) handelt.

Sie entpacken das Archiv einfach in ein beliebiges Verzeichnis, das Sie dann in $PATH aufnehmen – hier bietet sich aus Konsistenzgründen /usr/share/fslint/ an. Um die korrekte Lokalisierung zu erhalten, wechseln Sie anschließend in fslint/po/ und rufen dort make auf. Anschließend müssen Sie noch den Pfad entsprechend ergänzen, um das Programm aufrufen zu können. Zum Ausprobieren genügt die Variante aus der vorletzten Zeile von Listing 1; für eine dauerhafte Änderung müssen Sie diese Zeile in der ~/.bashrc ergänzen oder editieren.

Listing 1

$ cd /usr/share/
$ sudo wget http://www.pixelbeat.org/fslint/fslint-2.44.tar.gz
$ sudo tar xf fslint-2.44.tar.gz
$ cd fslint-2.44/po/
$ sudo make
$ cd ../..
$ sudo rm fslint-2.44.tar.gz
$ PATH=$PATH:/usr/share/fslint-2.44/ && export PATH
$ fslint-gui &

Um Fslint in die Paketverwaltung des genutzten Systems zu integrieren, müssen Sie es selbst paketieren. Anweisungen dazu für viele gängige Distributionen bieten die Fslint-Homepage sowie die FAQ des Tools [2].

Unter der Haube

Es lohnt, die jeweils als Shell-Skript realisierten Tools des Fslint-Pakets einmal näher anzusehen. So dient beispielsweise findup dazu, Duplikate von Dateien aufzufinden. Das Skript erweist sich als hervorragend strukturiert und gut dokumentiert (Listing 2). Es verfügt über eine Reihe von interessanten Details, etwa, um die Dateiduplikate aus dem Strom von Dateinamen herauszufiltern.

Listing 2

[...]
# The following optional block, md5sums a small sample of each file,
# which can help when there are many files of the same size,
# even more so if they are large. This usually adds a small amount of
# runtime, however it can save a large amount of time in certain situations.
if "$script_dir"/supprt/md5sum_approx </dev/null 2>/dev/null; then
    xargs -r0 "$script_dir"/supprt/md5sum_approx |
    sort |                     #group duplicate files together
    uniq --all-repeated -w32 | #pick just duplicates
    cut -d' ' -f3- |           #get filenames
    sort |                     #sort by paths to try to minimise disk seeks
    tr '\n' '\0'               #delimit names with \0
else
    cat
fi |
[...]

Weiterhin verfügen die Shell-Skripte über zusätzliche Optionen, die in der grafischen Oberfläche nur indirekt zur Verfügung stehen. So fügt -m (“merge”) die gefundenen Dateien durch die Verwendung von Hardlinks zusammen, wohingegen -d (“delete”) alle bis auf eine einzige Kopie identischer Dateien entfernt. Mit -t (“test”) zeigt Findup die identischen Files an, ohne eine Aktion auszuführen. Die Ausgabe lässt sich mit dem Skript in eine externe Datei umleiten, manuell bearbeiten und anschließend weiterverwenden.

Links: Hart und weich

Verknüpfungen zwischen Dateien und Verzeichnissen lassen sich auf vier unterschiedliche Weisen erzeugen, wie die Manpage zu ln erklärt. Links auf bestehende Ziele lassen sich als harte (physikalische) Links – nur für Dateien innerhalb ein und desselben Dateisystems – anlegen und zeigen auf denselben Inode. Weiche oder symbolische Links dürfen Sie für beliebige Ziele erzeugen; das System interpretiert sie zur Laufzeit als relative Links relativ zum Elternverzeichnis. Symlinks dürfen auch auf Verzeichnisse zeigen und können die Grenzen des eigenen Dateisystems überschreiten.

Die Verwendung von find in den Skripten hat einen speziellen Vorteil: So lassen sich alle relevanten Optionen dieses Befehls – beispielsweise die Rekursionstiefe (-maxdepth und -mindepth) – beim Aufruf auf der Befehlszeile direkt übergeben. Das beschleunigt unter Umständen durch gezielte Einschränkungen die Bearbeitung erheblich oder schließt bestimmte Verzeichnisse und Dateien aus. Verzeichnisse lassen sich beispielsweise wie in der ersten Zeile von Listing 3 gezeigt ausschließen; für einzelne Dateien gelingt das wie in der zweiten Zeile gezeigt.

Listing 3

$ findup \( -path "*/.svn" \) -prune -o
$ findup \( ! -name "*.tex" \)

Während die Fslint-Tools, deren Namen mit find beginnen, zum Auffinden von Dateien und Verzeichnissen dienen, übernehmen die Skripte im Verzeichnis fslint/supprt/ alle Aktionen. Für einige davon existieren gleich zwei Varianten: So löschen beziehungsweise vereinigen (“merge”) sowohl fixdup.sh als auch fixdup die ausgewählten Dateien. Beide bedienen sich des durch findup erzeugten Formats, wobei es sich bei Fixdup um ein Python-Skript handelt, das etwas schneller als die Shell-Skript-Variante arbeitet. Unter fstool/ gibt es vier weitere interessante Skripts. Bei komplexen Ergebnismengen (Abbildung 1) kommen Sie eventuell über einen Umweg am besten zum Ziel.

Abbildung 1: In der Praxis erhalten Sie oft sehr inhomogene Ergebnislisten. Hier kann der Export in eine externe Datei, die Sie anschließend manuell bearbeiten, eine gute Alternative bieten.

Abbildung 1: In der Praxis erhalten Sie oft sehr inhomogene Ergebnislisten. Hier kann der Export in eine externe Datei, die Sie anschließend manuell bearbeiten, eine gute Alternative bieten.

Auf Find basierende Tools zum Systemcheck

Die Fslint-Tools basieren im Wesentlichen auf dem GNU-Befehl find. Dieser ist sehr leistungsfähig und liest Dateisysteme stückweise ein, ein Verzeichnis nach dem anderen. Idealerweise sollte dies im Single-User-Modus erfolgen, den Sie bereits beim Booten auswählen oder später als Superuser aktivieren. Lässt sich dieser Modus aus bestimmten Gründen nicht verwenden, weil beispielsweise ein Server weiter erreichbar sein muss, kann es zu Problemen kommen. So entstehen möglicherweise Dateidubletten in Verzeichnissen, die Fslint bereits durchlaufen hat, oder ein Benutzer modifiziert bereits erfasste Dateien.

So schön die Algorithmen der Fslint-Tools ausfallen, bei großen Dateisystemen kommen sie wie alle auf find basierenden Techniken an ihre Grenzen. Zum einen wächst die Ausführungszeit proportional zur Dateisystemgröße. Da steht bei den heutigen TByte-Platten unter Umständen Nachtarbeit an, und auch dann ist nicht sichergestellt, dass die Tools alle relevanten Dateien auch finden: Sie könnten ja zwischenzeitlich in bereits bearbeiteten Verzeichnissen entstehen. Schwer wiegt auch oft das zweite Manko: Nicht nur die Bearbeitungszeit wächst mit zunehmender Dateisystemgröße, dasselbe gilt auch für den benötigten Hauptspeicher. Im Zweifelsfall greift das System dann auf den Auslagerungsspeicher zurück, was die Bearbeitung weiter verlangsamt.

Arbeit in der GUI

Die Fslint-Tools stellen für Spezialisten und erfahrene Linux-User eine echte Bereicherung dar: Sie erlauben das effektive, zielgenaue Bearbeiten von Dateisystemen, wenn auch auf einem abstrakten Level. Für weniger versierte Anwender entwickelte Padraig Brady eine Python-Oberfläche, die annähernd die gleichen Features bietet, diese aber auf übersichtliche Weise strukturiert und die Ergebnisse gut verständlich darstellt. Um mit dem Werkzeug im Systembereich arbeiten zu können, müssen Sie es mit Superuser-Privilegien einsetzen.

Abbildung 2: Übersichtlich: Die Oberfläche <code srcset=

fslint-gui gliedert sich grob in drei Teile.” width=”300″ height=”207″ /> Abbildung 2: Übersichtlich: Die Oberfläche fslint-gui gliedert sich grob in drei Teile.

Abbildung 2 zeigt die Oberfläche kurz nach dem Start. Im oberen Bereich des Fensters (Suchpfad) wählen Sie die zu bearbeitenden Verzeichnisse aus. Hier dürfen auch eingehängte externe Dateisysteme enthalten sein, die Fslint ohne Unterschiede beim Bearbeiten berücksichtigt. Durch Anklicken der Auswahlbox Absteigend? am rechten Rand beziehen Sie auch die Unterverzeichnisse mit in die Bearbeitung ein. Da dies manchmal zu Situationen führt, wo auch unerwünschte Verzeichnisse ausgewählt werden, erlaubt Weitere Suchparameter, gezielt einzelne Verzeichnisse von der Bearbeitung auszuschließen, beispielsweise .wine/ im Home-Verzeichnis der Anwender.

Im darunterliegenden Bereich wählen Sie die gewünschte Aktion aus und erhalten die Liste mit den Ergebnissen, die der Button Finden erzeugt beziehungsweise aktualisiert. Beachten Sie dabei, dass der voreinstellte Platz oft nicht ausreicht, um alle relevanten Informationen anzuzeigen. Da Sie sowohl das Fenster vergrößern als auch die Spalten verkleinern können, sollte sich eine Lösung finden lassen.

Es folgt eine schmale Zeile, die nach der Ausgabe von Ergebnissen statistische Informationen dazu anzeigt. Im untersten Teil des Fensters gibt Fslint bei Bedarf (Fehler-)Meldungen aus, die durch die find*-Skripte oder die von Ihnen aufgerufenen Befehle erzeugt werden.

Die Tools

Die Verwendungszwecke der unter der Oberfläche zusammengefassten Tools sind relativ einfach zu verstehen, aber auch ein zweiter Blick auf die Details lohnt dennoch.

  • Duplikate sucht in den angegebenen Verzeichnissen nach Dateien identischen Inhalts, unabhängig vom Dateinamen.
  • Installierte Pakete funktioniert nur auf Debian-basierten Systemen und listet die installierten Pakete auf.
  • Ungültige Namen findet problematische Dateinamen.
  • Namenskonflikte zeigt ausführbare Dateien mit identischen Namen an.
  • Temporäre Dateien findet vermutlich als temporäre Zwischenspeicher angelegte Dateien, die den typischen Namensregeln (*~, #*#, *.bak, …) genügen.
  • Fehlerhafte Symlinks zeigt fehlerhafte symbolische Links an.
  • Fehlerhafte IDs identifiziert Dateien mit UIDs von nicht (mehr) vorhandenen Usern
  • Leere Verzeichnisse gibt Ordner ohne Inhalt aus.
  • Ungestrippte Programme liefert eine Liste von Programmen und Bibliotheken, die nicht von unnötigem Debug-Code bereinigt wurden. Normalerweise können Sie das durch strip Datei korrigieren.
  • Redundante Leerzeichen identifiziert Dateien, die mehrfache Leerzeichen enthalten – dazu später mehr.

Das Ermitteln von Dateidubletten gehört mit zu den ersten Features, über die Fslint verfügte, und zeigt sich entsprechend weit entwickelt. Das Tool verwendet einen Algorithmus, der zunächst Dateien gleicher Länge identifiziert. Dann sortiert es diejenigen davon aus, die über Hardlinks miteinander verknüpft sind. Zu guter Letzt vergleicht es die übrig gebliebenen Dateien mittels mehrerer Checksummen.

Wie Sie mit den ermittelten Dateien umgehen wollen, legen Sie in zwei Stufen fest: Zum einen können Sie mit dem Kontextmenü für einzelne oder zuvor ausgewählte Dateien bestimmte Aktionen vornehmen. Meist werden Sie aber die zweite Möglichkeit verwenden, die Schalter unterhalb des Ergebnisfensters. Auswählen erlaubt dort das Vormerken von Dateien auf unterschiedliche Weisen. Über Speichern legen Sie die Ergebnisliste in Dateiform ab, mit Delete löschen Sie die ausgewählten Files.

Zusammenfügen führt die gefundenen Dateien zusammen, ersetzt die Duplikate also durch harte Links. Hier gibt es eine Stolperfalle: Diese Aktion bezieht sich, anders als alle sonstigen Aktionen in Fslint, nicht auf die ausgewählten Dateien, sondern auf alle anderen, nicht ausgewählten. Das entsprechende Dialogfenster macht diesen Sachverhalt zwar noch einmal unzweideutig klar (Abbildung 3), lässt sich aber leicht übersehen.

Abbildung 3: Alles umgekehrt: Beim Zusammenführen von Dateien bleiben die ausgewählten Files unbearbeitet.

Abbildung 3: Alles umgekehrt: Beim Zusammenführen von Dateien bleiben die ausgewählten Files unbearbeitet.

Identische Programmnamen können zu großen Problemen führen, wenn dem Anwender nicht zweifelsfrei klar ist, welches Programm er wann verwendet. Typischerweise entstehen entsprechende Situationen durch die Installation neuer, alter oder abweichender Programmversion beispielsweise unter /usr/local/bin/. In einem solchen Fall entscheidet die Konstruktion des Systempfads $PATH, welche Version Verwendung findet (Abbildung 4).

Abbildung 4: Wie Fslint hier zutage fördert, existieren von einigen Programmen mehrere Versionen auf dem Rechner. Dass sogar eine Bash mit dabei ist, sollte dem Admin zu denken geben.

Abbildung 4: Wie Fslint hier zutage fördert, existieren von einigen Programmen mehrere Versionen auf dem Rechner. Dass sogar eine Bash mit dabei ist, sollte dem Admin zu denken geben.

Beachten Sie hierbei: Unter Durchsuche () legen Sie fest, wie und wo Fslint nach den Namenskonflikten sucht. Die unter dem Schalter Konflikt-verursachende Dateien angebotenen Varianten ändern sich, sobald Sie das Häkchen entfernen. Dann lassen sich auch andere Konflikte aufspüren, wie beispielsweise unterschiedliche Schreibweisen (veränderte Groß/Kleinschreibung) oder Konflikte mit Alias-Definitionen.

Was Fslint beim Test auf Ungültige Namen auflistet, legen Sie an zwei Stellen fest: Der Schieberegler Empfindlichkeit über dem Ergebnisfenster stellt in vier Schritten die Genauigkeit ein, mit der der Test die Probleme erkennt; hohe Werte führen zu mehr Ergebnissen. Zusätzlich können Sie sich spezielle, durch UTF-8 verursachte Probleme über den Schalter Ungültiger UTF8-Modus? darstellen lassen. Beide Modifikationen bedingen einen separaten Find-Lauf. In vielen Fällen – insbesondere beim Übertragen von Dateien zwischen mehreren Rechnern mit unterschiedlichen Betriebssystemen – sollten Sie beide Funktionen nutzen, um die immer noch bestehenden Unterschiede zu minimieren und Unverträglichkeiten auszuräumen.

Ungültige Namen

Fslint verwendet das Skript findnl, um problematische Dateinamen zu finden. Es kennt die Optionen -1 bis -3, die im Wesentlichen unterschiedlich lange Pfad- und Dateinamen erlauben, sowie den Schalter -p, der auf POSIX-Kompatibilität achtet. Weiterhin schränkt eine höhere Empfindlichkeit auch die in den Dateinamen zulässigen Zeichen immer weiter ein. Zunächst berücksichtigt das Skript nur spezielle Zeichen (Leerzeichen, @, …) am Anfang und Ende der Namen, dann die auf der Shell zu maskierenden Zeichen wie ?, *, $ und #, schließlich auch mehrfache Punkte in den Namen (*.*.*) und anderes mehr. Das Skript setzt die Regeln sehr übersichtlich in gerade einmal 160 Zeilen Code – ein Blick darauf lohnt sich. Auch die Prüfung auf UTF8-Kompatibilität löst Fslint über Skripte; hier kommt neben findu8 auch supprt/fslver zum Einsatz.

Temporäre Dateien ermittelt Fslint mithilfe des Skripts findtf. Es verfügt über zwei wichtige Optionen, die Sie auch beide in der grafischen Oberfläche finden: -c (“core mode”) findet Core-Files, --age=Tage gibt nur Dateien aus, die schon älter sind, als im Schwellwert angegeben (voreinstellt: null). Falls Ihnen hier noch Namensmuster für auf Ihrem System typische temporäre Dateien fehlen, ergänzen Sie diese einfach im Skript in der Variablen tmpFiles (Listing 4). Muster ('*.del') geben Sie hier mit dem Joker in einfachen Hochkommas an, feste Dateinamen direkt (delme).

Listing 4

[...]
tmpFiles="'*.del' delme core dead.letter '*~' ',*' '*.v' tmp junk '\#*' \
'.emacs_[0-9]*' '*.[Bb][Aa][Kk]' '*.swp' '*.pure'"
[...]

Fehlerhafte Symlinks identifiziert das Script findbl, das neben “dangling links” (-d, voreinstellt) durch Optionen gesteuert folgende Probleme erkennt: * -d: alle hängenden, also ins Leere führende Links (Hängend) * -s: absolute Links zu Pfaden unterhalb des aktuellen Verzeichnisses (Verdächtig) * -l: alle relativen Links (Relativ) * -a: alle absoluten Links (Absolut) * -n: alle redundanten Links (/././., /////, /../, …)

Als Treffer für Fehlerhafte IDs wirft Fslint alle Dateien aus, deren Eigentümer oder Gruppe nicht im System bekannt beziehungsweise nicht mehr vorhanden sind – die Eigentümer fehlen also in /etc/passwd, die Gruppen in /etc/group. Das sollte nicht auftreten und weist auf Probleme bei der Installation oder beim Übertragen von Dateien aus anderen Systemen hin.

Die Prüfung auf Redundante Leerzeichen untersucht nicht etwa die Dateinamen, sondern die Inhalte von Textdateien. Bei automatisch erzeugten Dateien (etwa *.aux– oder .log-Files), aber auch durch Schreibfehler entstehen manchmal Zeilen, in denen mehrere Leerzeichen unmittelbar hintereinander auftreten. Viele Programme insbesondere zum Auswerten von Protokollen können damit nur bedingt umgehen, weshalb Sie die Inhalte dieser Dateien “reparieren” sollten.

Dazu versteht das fragliche Fslint-Skript drei Optionen: -c (“count”) zählt die problematischen Zeilen, -w (“whitespace”) findet Leerzeichen am Zeilenende, und -t (“tabs”) meldet das gemischte Auftreten von Tabulatoren und Leerzeichen. Der Schalter --view zeigt problematische Textstellen in Vi an, wofür der Editor installiert sein muss – er zählt aber bei fast allen gängigen Distributionen zum Standard-Installationsumfang.

Fazit

Sie sind der Meinung, Ihr gut aufgeräumtes Home-Verzeichnis könne kaum problematische Dateien enthalten, vom System einmal ganz abgesehen? Dann unterliegen Sie mit an Sicherheit grenzender Wahrscheinlichkeit eben jener Illusion, die auch der Autor des Artikels bis zum ersten Testlauf mit Fslint hegte. Die von der Fslint-Suite selbst auf dem vermeintlich saubersten System zutage geförderten Ergebnisse sprechen für sich und für die Qualität der cleveren Müllabfuhr-Suite.

Inwieweit die aufgefundenen Schwächen tatsächliche Probleme darstellen, gilt es jeweils im Einzelfall abzuklären, doch hängende Links, überflüssige Dubletten und Verzeichnisse ohne Inhalt nutzen keinem Anwender. Schon die Möglichkeit, blitzschnell zurückgebliebene temporäre Dateien aufzuspüren und zu entfernen rechtfertigt den regelmäßigen Einsatz von Fslint. Erstaunlich eigentlich, dass fast alle gängigen Distributionen es unterlassen, dieses praktische Werkzeug in ihren Repositories zu paketieren.

Vom praktischen Nutzen einmal ganz abgesehen, erweist sich Fslint noch in einer weiteren Beziehung als wahres Schatzkästlein: Für alle Shell-Begeisterten und Einsteiger in die Welt der Shell-Skripte kann die Suite als Inspirationsquelle dienen und demonstriert vorbildlich, wie lesbare Skripte aussehen sollten. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 07/2015 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben