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.
Ja, ein Kerneltreiber kann ein Dateisystem verwalten.
Die beste Lösung, um ein Prototyp eines Dateisystems zu erstellen, ist die Verwendung von FUSE. Und nachdem Sie darüber nachgedacht haben, 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/
quelle
Ja, dies wird normalerweise mit einem Kerneltreiber durchgeführt, der entweder als Kernelmodul geladen oder in den Kernel kompiliert werden kann.
Sie können ähnliche Dateisystemtreiber und deren Funktionsweise hier nachlesen .
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 für Blockgeräte und Zeichengeräte verfügbar gemacht werden .
quelle
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 wie es: Tun Sie es nicht, bis Sie Beweise dafür haben, dass es zu langsam ist. Und die dritte: Behalten Sie es nicht bei, es sei denn, Sie haben Beweise dafür, dass es schneller / kleiner wird.
Und ja, der Kernel hat bereits Treiber für die Hardware, Sie implementieren sie nicht erneut.
quelle
pivot_root
, da in den initramfs noch ausgelastete Inodes vorhanden sind./init
von einem initramfs gestartetes/init
Programm wird (glaube ich) nach pivot_root ausgeführt, um die Kontrolle auf die realen Root-FSs zu übertragen/init
. Eine FUSE-Binärdatei konnte sich jedoch nicht durch execve ersetzen, wenn der Zugriff auf den Root-FS davon abhing, dass der FUSE-Prozess auf den Kernel reagiert. Nun, vielleicht, indem Sie zuerst den Pagecache initialisieren, aber das klingt nicht zuverlässig.