
F*ck file system - CLI-Dateisuche-Tool, das den OS-Kernel umgeht und deine Festplatte direkt liest
Dies ist ein CLI-Tool zum Durchsuchen von Dateien (wie grep), das nicht den OS-Kernel zum Lesen von Dateien verwendet, sondern deine Festplatten direkt liest. Es ist praktisch nutzlos, aber wahnsinnig cool.
Das sind nur ~1,5k Zeilen C-Code, die:
/dev/rdisk*); die Suche in einer Image-Datei benötigt keine erhöhten Rechtesync-Aufruf)aber gleichzeitig
read()-Pfad und liest das Blockgerät stattdessen direkt per preadFür die tatsächlich funktionierende schnelle Dateisuche schau dir mein Projekt fff an – es übertrifft ripgrep deutlich, ohne sudo zu benötigen.
Unter Linux ist so ziemlich jedes Dateisystem einfach zu implementieren
Dies ist das am einfachsten zu unterstützende Dateisystem: Es ist ein Journaling-Dateisystem, das direkt an Ort und Stelle schreibt (kein Copy-on-Write). Daher ist es für ffs meistens das beste Dateisystem. Manchmal kann es vorkommen, dass ffs einige kürzliche Aktualisierungen der Dateien nicht sieht. Das kann passieren, wenn der Kernel kürzliche Aktualisierungen im Cache hält und das Schreiben auf die Festplatte verzögert. Du kannst die Synchronisierung erzwingen mit
sync
Das B-Baum-Dateisystem ist deutlich komplizierter, ist eine effizientere Dateispeicherung und bringt eine zusätzliche Einschränkung mit sich:
Wenn eine beliebige Datei in deinem Dateisystem aktualisiert wird, muss auch der gesamte Superblock aktualisiert werden. Das bedeutet: Wenn ffs den Superblock (den High-Level-B-Baum) liest und der Kernel danach den Baum aktualisiert, wird der gesamte Lesevorgang ungültig.
Das lässt sich mit fsfreeze umgehen oder durch Erstellen eines separaten, abgetrennten Volumes.
APFS ist ein proprietäres Dateisystem von Apple, das per Reverse Engineering nachgebaut wurde und auch hier unterstützt wird. Allerdings hat Apple seine Sicherheitsrichtlinien erheblich verschärft.
Du wirst ffs ohne Deaktivierung von SIP nicht auf deiner Hauptfestplatte ausführen können
SIP – System Integrity Protection – ist eine spezielle Sicherheitsfunktion, die jeglichen Zugriff auf den Superblock der Hauptfestplatte selbst für Root-Benutzer verbietet. Du kannst sie nicht einmal mit sudo umgehen; du musst diese Funktion deaktivieren (falls du Projekte wie yabai verwendest, ist sie möglicherweise bereits deaktiviert).
Es gibt eine Möglichkeit, ffs auf dem Apple-Dateisystem zu testen, ohne deine Hauptfestplatte anzufassen: Du kannst rohe .dmg-Dateien ohne erhöhte Rechte durchsuchen (ja, die App-Installer sind einfach abgetrennte Volumes). Mit ffs musst du nichts mounten, du kannst einfach einen Pfad zu den rohen Bytes eines Volumes zusammen mit dem Dateisystemtyp angeben:
ffs "<QUERY>" /path/to/volume.dmg apfs
Da ffs Bytes direkt liest, kannst du damit beliebige abgetrennte Volumes durchsuchen, ohne sie in das Dateisystem einzuhängen. Zum Beispiel das Lesen von .iso- oder .dmg-Dateien.
Das ist der lustigste Teil – ffs hat keinen Zugriff auf den VFS-/Kernel-Dateisystemcache. Deshalb ist es in kleineren (oder bereits gecachten) Verzeichnissen langsamer, wird aber progressiv schneller, sobald der Cache erschöpft ist und dein Kernel den tatsächlichen Festplattenzustand lesen muss.
Warum? Genau um zu beweisen, dass der Kernel-VFS ab einem bestimmten Punkt ein Overhead wird.
Dies ist das Suchergebnis, das ffs mit ripgrep auf einem mit btrfs gemounteten Laufwerk vergleicht. Beachte, dass ripgrep einen weitaus fortschrittlicheren auf SIMD basierenden Matcher und File-Walker verwendet, während ffs nur ~1,8k Zeilen C-Code ist.
[repos — 631k files]
ffs |#### | 5.505s
rg |### | 4.813s
[dev — 1.50M files]
ffs |############ | 18.413s
rg |################# | 25.673s
[home — 3.25M files]
ffs |######################## | 36.205s
rg |##################################################| 74.690s
Die für ripgrep verwendeten Flags sind -F --no-heading -H -n --no-ignore --hidden --one-file-system --no-messages – wodurch dieselben Ergebnisse wie bei ffs ausgegeben werden.
Um das Projekt zu kompilieren, benötigst du nur libzstd für btrfs, openmp in deiner pkg-config, und dann einfach:
make ffs
ffs --help