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.
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.

fslint-gui gliedert sich grob in drei Teile.” width=”300″ height=”207″ />
Abbildung 2: Übersichtlich: Die Oberflächefslint-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 Dateikorrigieren. - 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.
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.
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.
Infos
[1] Fslint: http://www.pixelbeat.org/fslint/
[2] Fslint-FAQ: https://raw.githubusercontent.com/pixelb/fslint/master/doc/FAQ





