Ja, Dateisysteme in Linux können als Kernelmodule implementiert werden. Es gibt aber auch die FUSE-Schnittstelle (Filesystem in USErspace), über die ein regulärer User-Space-Prozess als Dateisystemtreiber fungieren kann. Wenn Sie ein neues Dateisystem als Prototyp erstellen, kann die Implementierung zunächst über die FUSE-Schnittstelle das Testen und Entwickeln vereinfachen. Sobald Sie die Interna des Dateisystems in FUSE-Form ausgearbeitet haben, können Sie mit der Implementierung einer leistungsoptimierten Kernelmodul-Version davon beginnen.
Im Folgenden finden Sie einige grundlegende Informationen zur Implementierung eines Dateisystems im Kernel-Space. Es ist ziemlich alt (ab 1996!), Aber das sollte Ihnen zumindest eine Grundidee für die Art von Dingen geben, die Sie tun müssen.
Wenn Sie sich für die FUSE-Route entscheiden, finden Sie hier libfuse, die Referenzimplementierung der Userspace-Seite der FUSE-Oberfläche.
Dateisystemtreiber als Kernelmodul
Grundsätzlich muss die Initialisierungsfunktion Ihres Dateisystemtreibermoduls nur eine register_filesystem()
Funktion aufrufen und ihr als Parameter eine Struktur geben, die einen Funktionszeiger enthält, der die Funktion in Ihrem Dateisystemtreiber identifiziert, die als erster Schritt zur Identifizierung Ihres Dateisystems verwendet wird Tippen und montieren. In diesem Stadium passiert nichts mehr.
Wenn ein Dateisystem gemountet wird und entweder der Dateisystemtyp passend zu Ihrem Treiber angegeben wird oder die automatische Erkennung des Dateisystemtyps durchgeführt wird, ruft die Kernel-Ebene für das virtuelle Dateisystem (kurz VFS) diese Funktion auf. Grundsätzlich heißt es: "Hier ist ein Zeiger auf eine Darstellung eines Standard-Linux-Blockgeräts auf Kernel-Ebene. Sehen Sie sich das an, prüfen Sie, ob Sie damit umgehen können, und sagen Sie mir dann, was Sie damit tun können."
Zu diesem Zeitpunkt muss Ihr Treiber alle erforderlichen Informationen lesen, um sicherzustellen, dass es sich um den richtigen Treiber für das Dateisystem handelt, und dann eine Struktur zurückgeben, die Zeiger auf weitere Funktionen enthält, die Ihr Treiber mit diesem bestimmten Dateisystem ausführen kann. Wenn der Dateisystemtreiber die Daten auf der Festplatte nicht erkennt, soll er ein entsprechendes Fehlerergebnis zurückgeben. Anschließend meldet VFS dem Userspace entweder einen Fehler oder fragt - wenn die automatische Erkennung des Dateisystemtyps durchgeführt wird - ein anderes Dateisystem Fahrer zu versuchen.
Die anderen Treiber im Kernel stellen die Standardschnittstelle für Blockgeräte bereit, sodass der Dateisystemtreiber keine Hardwareunterstützung implementieren muss. Grundsätzlich kann der Dateisystemtreiber Plattenblöcke mit Standardfunktionen auf Kernel-Ebene mit dem ihm zugewiesenen Gerätezeiger lesen und schreiben.
Die VFS-Ebene erwartet, dass der Dateisystemtreiber der VFS-Ebene eine Reihe von Standardfunktionen zur Verfügung stellt. Einige davon sind obligatorisch, damit die VFS-Ebene mit dem Dateisystem etwas Sinnvolles tun kann. Andere sind optional, und Sie können anstelle eines Zeigers auf eine solche optionale Funktion einfach einen NULL-Wert zurückgeben.