it-swarm.com.de

Wie implementiere ich einen Dateisystemtreiber unter Linux?

Angenommen, ich habe ein neues Dateisystem erfunden und möchte jetzt einen Dateisystemtreiber dafür erstellen.

Wie würde ich diesen Dateisystemtreiber implementieren? Wird dies mit einem Kernelmodul durchgeführt?

Und wie kann der Dateisystemtreiber auf die Festplatte zugreifen, sollte der Dateisystemtreiber Code für den Zugriff auf die Festplatte enthalten oder enthält Linux einen Gerätetreiber für den Zugriff auf die Festplatte, die von allen Dateisystemtreibern verwendet wird?

15
user343344

Ja, Dateisysteme unter Linux können als Kernelmodule implementiert werden. Es gibt aber auch die Schnittstelle Fuse (Dateisystem 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 zuerst über die Fuse-Schnittstelle das Testen und Entwickeln erleichtern. Sobald Sie die Interna des Dateisystems in Fuse-Form ausgearbeitet haben, können Sie mit der Implementierung einer leistungsoptimierten Kernelmodulversion beginnen.

Hier sind einige grundlegende Informationen zum Implementieren eines Dateisystems im Kernelraum. Es ist ziemlich alt (ab 1996!), Aber das sollte Ihnen zumindest eine grundlegende Vorstellung davon geben, was Sie tun müssen.

Wenn Sie sich für die Fuse-Route entscheiden, hier ist libfuse, die Referenzimplementierung der Userspace-Seite der Fuse-Schnittstelle.

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, als die verwendet wird Der erste Schritt, um Ihren Dateisystemtyp zu identifizieren und ihn bereitzustellen. In diesem Stadium passiert nichts mehr.

Wenn ein Dateisystem bereitgestellt wird und entweder der Dateisystemtyp passend zu Ihrem Treiber angegeben wird oder eine automatische Erkennung des Dateisystemtyps durchgeführt wird, ruft die Virtual FileSystem-Schicht (kurz VFS) des Kernels 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 soll Ihr Treiber alles lesen, was er benötigt, um zu überprüfen, ob er der richtige Treiber für das Dateisystem ist, 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 entweder einen Fehler im Benutzerbereich oder fragt - wenn eine automatische Erkennung des Dateisystemtyps durchgeführt wird - ein anderes Dateisystem Treiber 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 Festplattenblöcke mit Standardfunktionen auf Kernelebene mit dem ihm zugewiesenen Gerätezeiger lesen und schreiben.

Die VFS-Schicht erwartet, dass der Dateisystemtreiber der VFS-Schicht eine Reihe von Standardfunktionen zur Verfügung stellt. Einige davon sind obligatorisch, damit die VFS-Schicht mit dem Dateisystem etwas Sinnvolles tun kann, andere sind optional und Sie können einfach einen NULL-Wert anstelle eines Zeigers auf eine solche optionale Funktion zurückgeben.

24
telcoM

Ja, ein Kerneltreiber kann ein Dateisystem verwalten.

Die beste Lösung, um ein Dateisystem zu prototypisieren, ist die Verwendung von Fuse. Und nachdem Sie darüber nachdenken können, es in einen Kerneltreiber umzuwandeln.

Wikipedia => https://en.wikipedia.org/wiki/Filesystem_in_Userspace

Quelle => https://github.com/libfuse/libfuse

ein Tutorial => https://developer.ibm.com/articles/l-Fuse/

5
EchoMike444

Ja, dies erfolgt normalerweise mit einem Kerneltreiber, der entweder als Kernelmodul geladen oder in den Kernel kompiliert werden kann.

Sie können ähnliche Dateisystemtreiber und ihre Funktionsweise überprüfen hier .

Diese Treiber verwenden wahrscheinlich interne Kernelfunktionen, um auf Speichergeräte als Byteblöcke zuzugreifen. Sie können jedoch auch Blockgeräte verwenden, die von Treibern in den Ordnern Blockgeräte und Zeichengeräte verfügbar gemacht werden.

0
Erik

Sie können Fuse verwenden, um ein User-Land-Dateisystem zu erstellen oder ein Kernelmodul zu schreiben. Es ist einfacher, mit Fuse zu arbeiten, da Sie eine Auswahl an Sprachen haben und den Kernel (und damit das gesamte System) nicht zum Absturz bringen.

Kernelmodule können schneller sein, aber die erste Regel für die Optimierung lautet: Tun Sie dies erst, wenn Sie den Arbeitscode getestet haben. Das zweite ist so: Tu es nicht, bis du Beweise dafür hast, dass es zu langsam ist. Und das dritte: Behalte es nicht, es sei denn, du hast Beweise dafür, dass es schneller/kleiner wird.

Und ja, der Kernel hat bereits Treiber für die Hardware, Sie implementieren sie nicht erneut.

0
ctrl-alt-delor