Hallo zusammen! Wir setzen die Einführung neuer Streams zu den bereits beliebten Kursen fort und freuen uns, Ihnen mitteilen zu können, dass wir einen neuen Kursstart haben, der Ende April beginnen wird. Zu diesem Anlass wird eine neue Veröffentlichung bereitgestellt. Die Originalinhalte können Sie .
Virtuelle Dateisysteme fungieren als eine Art magische Abstraktion, die es der Philosophie von Linux ermöglicht, zu sagen: "Alles ist eine Datei."

Was ist ein Dateisystem? Um die Worte eines der ersten Mitwirkenden und Autoren von Linux, zu zitieren: "Ein Dateisystem ist ein hierarchisches Datenspeicherformat, das gemäß einer bestimmten Struktur angeordnet ist." Ungeachtet dessen passt diese Definition ebenso gut zu VFAT (Virtual File Allocation Table), Git und (Was definiert also den Begriff "Dateisystem"?
Grundlagen des Dateisystems
Der Linux-Kernel hat bestimmte Anforderungen an die Entität, die als Dateisystem angesehen werden kann. Sie muss die Methoden open(),, read() und write(), für dauerhafte Objekte, die Namen haben, implementieren. Aus der Sicht der objektorientierten , der Kern definiert das generische Dateisystem (generic filesystem) als abstrakte Schnittstelle, während diese drei großen Funktionen als „virtuell“ gelten und keine spezifische Definition haben. Entsprechend wird die Standardimplementierung des Dateisystems als virtuelle Datei-System (VFS) bezeichnet.

Wenn wir eine Entität öffnen, lesen und schreiben können, dann wird diese Entität als Datei betrachtet, wie wir im obigen Konsolenbeispiel sehen können.
Das Phänomen der VFS unterstreicht nur die in Unix-ähnlichen Systemen übliche Beobachtung, dass „alles eine Datei ist“. Überlegen Sie, wie seltsam es ist, dass das kleine obige Beispiel mit /dev/console zeigt, wie die Konsole tatsächlich funktioniert. Das Bild zeigt eine interaktive Bash-Sitzung. Das Senden einer Zeile an die Konsole (virtual console device) wird auf dem virtuellen Bildschirm angezeigt. VFS hat andere, noch merkwürdige Eigenschaften. Zum Beispiel ermöglicht es die Suche nach .
Die uns bekannten Systeme wie ext4, NFS und /proc haben drei wichtige Funktionen in der C-Datenstruktur, die genannt wird . Darüber hinaus erweitern und überschreiben bestimmte Dateisysteme die Funktionen des VFS auf vertraute objektorientierte Weise. Wie Robert Love anmerkt, ermöglicht die VFS-Abstraktion Linux-Benutzern, Dateien sorglos in oder aus fremden Betriebssystemen oder abstrakten Entitäten wie Pipes zu kopieren, ohne sich um deren internes Datenformat kümmern zu müssen. Von der Benutzerebene aus kann ein Prozess durch einen Systemaufruf aus einer Datei in die Datenstrukturen des Kernels kopieren, indem er die Methode read() eines Dateisystems verwendet und dann die Methode write () eines anderen Dateisystems für die Ausgabe der Daten.
Die Funktionsdefinitionen, die zu den grundlegenden VFS-Typen gehören, finden sich in den Dateien des Kernel-Quellcodes, während die Unterverzeichnisse fs/ spezifische Dateisysteme enthalten. Im Kernel gibt es auch Entitäten wie cgroups, /dev und tmpfs, die während des Bootvorgangs benötigt werden und daher im Unterverzeichnis des Kernels definiert sind init/. Beachten Sie, dass cgroups, /dev und tmpfs die «große Drei» Funktionen nicht aufgerufen werden, sondern direkt in den Speicher gelesen und geschrieben wird. file_operations, und direkt im Speicher lesen und schreiben.
Die folgende Grafik zeigt, wie der Userspace mit verschiedenen Arten von Dateisystemen interagiert, die typischerweise in Linux-Systemen eingebunden werden. Konstruktionen wie Pipes, dmesg und POSIX-Uhren, die ebenfalls die Struktur implementieren, file_operations, deren Zugriff über die VFS-Schicht erfolgt.

VFS ist die "Abstraktionsschicht" zwischen Systemaufrufen und der Umsetzung bestimmter file_operations, wie zum Beispiel ext4 und procfs. Die Funktionen file_operations interagieren entweder mit Gerätetreibern oder mit Speichermedien. tmpfs, devtmpfs und cgroups verwendet keine file_operations, sondern greift direkt auf den Speicher zu.
Die Existenz von VFS ermöglicht die Wiederverwendung von Code, da die grundlegenden Methoden, die mit Dateisystemen verbunden sind, nicht von jedem Dateisystem-Typ neu implementiert werden müssen. Code-Wiederverwendung ist eine weit verbreitete Praxis unter Software-Ingenieuren! Wenn jedoch wiederverwendbarer Code enthält, beeinträchtigt dies alle Implementierungen, die von den gemeinsamen Methoden erben.
/tmp: Простая подсказка
Eine einfache Möglichkeit, das Vorhandensein von VFS im System zu überprüfen, besteht darin, mount | grep -v sd | grep -v :/, was alle eingebundenen (mounted) Dateisysteme, die nicht resident auf der Festplatte sind und keine NFS sind, was auf den meisten Computern zutrifft. Einer der aufgeführten MountsMounts) VFS wird zweifellos /tmp, richtig?

Jeder weiß, dass das Speichern / tmp auf physikalischen Medien – Wahnsinn ist! .
Warum ist es unerwünscht, auf /tmp physikalischen Medien zu speichern? Weil die Dateien in /tmp temporär sind und Speichermedien langsamer als der Speicher sind, wo tmpfs erstellt wird. Darüber hinaus sind physikalische Medien bei der Wiederbeschreibung anfälliger für Abnutzung als der Speicher. Schließlich können Dateien in /tmp vertrauliche Informationen enthalten, daher ist ihr Verschwinden bei jedem Neustart eine notwendige Funktion.
Leider erstellen einige Installationsskripte für Linux-Distributionen standardmäßig /tmp auf dem Speichermedium. Geben Sie nicht auf, wenn dies auch bei Ihrem System der Fall war. Befolgen Sie einige einfache Anweisungen aus , um dies zu beheben, und denken Sie daran, dass der Speicher, der für tmpfs wird für andere Zwecke unzugänglich. Mit anderen Worten, ein System mit einem riesigen tmpfs und großen Dateien darin kann den gesamten Speicher aufbrauchen und abstürzen. Ein weiterer Hinweis: beim Editieren der Datei /etc/fstab, denken Sie daran, dass sie mit einer neuen Zeile enden muss, sonst lädt Ihr System nicht.
/proc и /sys
Neben /tmp, die VFS (virtuellen Dateisysteme), die den Linux-Nutzern am vertrautesten sind – sind /proc und /sys. (/dev in gemeinsamem Speicher und haben keinen file_operations). Warum genau diese beiden Komponenten? Lassen Sie uns das genauer betrachten.
procfs macht einen Snapshot des aktuellen Zustands des Kernels und der Prozesse, die er kontrolliert für BenutzerspeicherIn /proc gibt der Kernel Informationen darüber, welche Ressourcen ihm zur Verfügung stehen, wie z. B. Interrupts, virtueller Speicher und Scheduler. Außerdem, /proc/sys ist der Ort, an dem Parameter, die mit dem Befehl sysctl, eingestellt werden, verfügbar für Benutzerspeicher. Der Status und die Statistiken einzelner Prozesse werden in Verzeichnissen ausgegeben /proc/.

Hier /proc/meminfo – ist eine leere Datei, die dennoch wertvolle Informationen enthält.
Das Verhalten /proc von Dateien zeigt, wie unterschiedlich die Dateisysteme VFS sein können. Einerseits /proc/meminfo enthalten Informationen, die mit dem Befehl free angezeigt werden können.. Auf der anderen Seite ist es leer! Wie kann das sein? Die Situation erinnert an den berühmten Artikel mit dem Titel , geschrieben von dem Physikprofessor der Cornell-Universität, David Mermin, im Jahr 1985. Die Sache ist die, dass der Kernel Statistiken über den Speicher sammelt, wenn eine Anfrage an /proc, und tatsächlich ist in den Dateien /proc nichts vorhanden, wenn niemand hinschaut. Wie Mermin sagte, „Die grundlegende quantenmechanische Doktrin besagt, dass eine Messung in der Regel keinen zuvor existierenden Wert des gemessenen Merkmals offenbart.“ (Denken Sie über die Frage zum Mond als Hausaufgabe nach!) , „Die grundlegende Quantenlehre besagt, dass eine Messung im Allgemeinen nicht den zuvor bestehenden Wert der gemessenen Eigenschaft offenbart.“ (Denken Sie über die Frage zum Mond als Hausaufgabe nach!)
Die scheinbare Leere procfs hat ihren Sinn, da die sich dort befindlichen Informationen dynamisch sind. Eine etwas andere Situation gibt es mit sysfs. Lassen Sie uns vergleichen, wie viele Dateien mit einer Größe von mindestens einem Byte in /proc auch in /sys.

Procfs existieren. Es hat eine Datei, nämlich die exportierte Kernelkonfiguration, die eine Ausnahme darstellt, da sie nur einmal pro Bootvorgang generiert werden muss. Auf der anderen Seite im /sys Es gibt viele umfangreichere Dateien, von denen viele einen kompletten Speicherplatz einnehmen. In der Regel enthalten diese Dateien sysfs genau eine Zahl oder eine Zeile, im Gegensatz zu den Informationslisten, die beim Lesen solcher Dateien wie /proc/meminfo.
Ziel sysfs – Eigenschaften bereitzustellen, die für das Lesen und Schreiben verfügbar sind, das, was der Kernel als «kobjects» im Userspace bezeichnet. Das einzige Ziel der kobjects ist das Zählen von Referenzen: Wenn die letzte Referenz auf ein kobject entfernt wird, stellt das System die damit verbundenen Ressourcen wieder her. Dennoch /sys macht den Großteil des berühmten des Kernels aus, das niemals, unter keinen Umständen, . Das bedeutet nicht, dass die Dateien in sysfs statisch sind, was dem Referenzzählungssystem instabiler Objekte widersprechen würde.
Die stabile binäre Anwendungsoberfläche des Kernels (stable ABI) begrenzt, was erscheinen kann in /sys, und nicht das, was tatsächlich in diesem spezifischen Moment vorhanden ist. Die Auflistung der Berechtigungen in sysfs ermöglicht ein Verständnis darüber, wie konfigurierbare Parameter von Geräten, Modulen, Dateisystemen usw. eingestellt oder gelesen werden können. Wir schließen daraus, dass procfs auch Teil des stabilen ABI des Kernels ist, obwohl dies nicht ausdrücklich angegeben ist. .

Dateien in sysfs beschreiben eine spezifische Eigenschaft für jede Entität und können lesbar, beschreibbar oder beides sein. Eine „0“ in der Datei bedeutet, dass das SSD nicht entfernt werden kann.
Den zweiten Teil der Übersetzung beginnen wir mit der Beobachtung des VFS mit Hilfe von eBPF- und bcc-Tools, und jetzt freuen wir uns auf Ihre Kommentare und laden traditionell ein zu , das bereits am 9. April von unserem Dozenten durchgeführt wird — .
Quelle: habr.com
