Virtuelle Linux-Dateisysteme: Warum werden sie benötigt und wie funktionieren sie? Teil 1

Hallo allerseits! Wir starten weiterhin neue Threads in Kursen, die Sie bereits lieben, und haben es eilig, Ihnen mitzuteilen, dass wir einen neuen Satz im Linux Administrator- Kurs starten, der Ende April beginnen wird. Eine neue Veröffentlichung wird zeitlich auf diese Veranstaltung abgestimmt. Das Originalmaterial finden Sie hier .

Virtuelle Dateisysteme fungieren als eine Art magische Abstraktion, mit der die Linux-Philosophie sagen kann, dass „alles eine Datei ist“.



Was ist ein Dateisystem? Basierend auf den Worten eines der ersten Linux-Autoren und Autoren, Robert Love : „Ein Dateisystem ist ein hierarchisches Data Warehouse, das gemäß einer bestimmten Struktur zusammengestellt wurde.“ Wie auch immer, diese Definition eignet sich gleichermaßen für VFAT (Virtual File Allocation Table), Git und Cassandra ( NoSQL Database ). Was genau definiert ein Konzept wie „Dateisystem“?

Grundlagen des Dateisystems

Der Linux-Kernel hat spezielle Anforderungen an eine Entität, die als Dateisystem betrachtet werden kann. Es sollte die Methoden open() , read() und write() für persistente Objekte mit Namen implementieren. Unter dem Gesichtspunkt der objektorientierten Programmierung definiert der Kernel ein generisches Dateisystem (generisches Dateisystem) als abstrakte Schnittstelle, und diese drei großen Funktionen werden als "virtuell" betrachtet und haben keine spezifische Definition. Dementsprechend wird die Standardimplementierung des Dateisystems als virtuelles Dateisystem (VFS) bezeichnet.



Wenn wir eine Entität öffnen, lesen und in sie schreiben können, wird diese Entität als Datei betrachtet, wie aus dem obigen Beispiel in der Konsole hervorgeht.
Das VFS-Phänomen unterstreicht nur die Beobachtungscharakteristik von Unix-ähnlichen Systemen, die besagt, dass "alles eine Datei ist". Denken Sie daran, wie seltsam es ist, dass das kleine Beispiel oben mit / dev / console zeigt, wie die Konsole tatsächlich funktioniert. Das Bild zeigt eine interaktive Bash-Sitzung. Durch das Senden einer Zeichenfolge an die Konsole (virtuelles Konsolengerät) wird diese auf einem virtuellen Bildschirm angezeigt. VFS hat andere, noch seltsamere Eigenschaften. Zum Beispiel ist es möglich, sie zu durchsuchen.

Bekannte Systeme wie ext4, NFS und / proc haben drei wichtige Funktionen in der C-Datenstruktur, die als file_operations bezeichnet werden . Darüber hinaus erweitern und definieren bestimmte Dateisysteme VFS-Funktionen auf vertraute, objektorientierte Weise. Wie Robert Love bemerkt, können Linux-Benutzer mit der VFS-Abstraktion problemlos Dateien auf oder von Betriebssystemen von Drittanbietern oder abstrakten Entitäten wie Pipes kopieren, ohne sich um ihr internes Datenformat kümmern zu müssen. Auf der Benutzerseite (Userspace) kann ein Prozess mithilfe eines Systemaufrufs mithilfe der read() -Methode eines Dateisystems aus einer Datei in die Kerneldatenstrukturen kopieren und anschließend mit der write() -Methode eines anderen Dateisystems Daten ausgeben.

Funktionsdefinitionen, die zu den grundlegenden VFS-Typen gehören, befinden sich in fs / *. C- Dateien aus der Kernelquelle, während fs/ -Unterverzeichnisse bestimmte Dateisysteme enthalten. Der Kernel enthält auch Entitäten wie cgroups , /dev und tmpfs , die während des Startvorgangs benötigt werden und daher im Unterverzeichnis init/ kernel definiert sind. Beachten Sie, dass cgroups , /dev und tmpfs nicht die Big Three-Funktionen von file_operations , sondern direkt lesen und in den Speicher schreiben.
Das folgende Diagramm zeigt, wie Userspace auf die verschiedenen Arten von Dateisystemen zugreift, die normalerweise auf Linux-Systemen bereitgestellt werden. Konstruktionen wie pipes , dmesg und POSIX clocks , die auch die file_operations Struktur implementieren, auf die über die VFS-Schicht file_operations wird, werden nicht angezeigt.



VFS ist die „Shell-Schicht“ zwischen Systemaufrufen und Implementierungen bestimmter file_operations wie ext4 und procfs . Die Funktionen file_operations können entweder mit Gerätetreibern oder Speicherzugriffsgeräten interagieren. tmpfs , devtmpfs und cgroups verwenden keine file_operations , sondern greifen direkt auf den Speicher zu.
Das Vorhandensein von VFS bietet die Möglichkeit, Code wiederzuverwenden, da die mit Dateisystemen verbundenen grundlegenden Methoden nicht von jedem Dateisystemtyp neu implementiert werden müssen. Die Wiederverwendung von Code ist eine weit verbreitete Praxis für Softwareentwickler! Wenn der wiederverwendbare Code jedoch schwerwiegende Fehler enthält, leiden alle Implementierungen, die allgemeine Methoden erben, darunter.

/ tmp: Einfacher Hinweis

Eine einfache Möglichkeit, um festzustellen, ob VFS auf dem System vorhanden ist, ist die Eingabe von mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ , das alle gemounteten Dateisysteme anzeigt, die sich nicht auf der Festplatte befinden, und nicht NFS, was auf den meisten Computern der Fall ist. Eines der oben aufgeführten VFS-Mounts wird zweifellos /tmp , oder?



Jeder weiß, dass das Speichern von /tmp auf einem physischen Medium verrückt ist! Quelle

Warum ist es unerwünscht, /tmp auf physischen Medien zu speichern? Weil die Dateien in /tmp temporär sind und Speichergeräte langsamer sind als der Speicher, in dem tmpfs erstellt wird. Darüber hinaus sind physische Medien anfälliger für das Überschreiben von Verschleiß als Speicher. Schließlich können die Dateien in / tmp vertrauliche Informationen enthalten, sodass ihr Verschwinden bei jedem Neustart eine integrale Funktion ist.

Leider erstellen einige Installationsskripte für die Linux-Distribution / tmp auf dem Standardspeichergerät. Verzweifeln Sie nicht, wenn dies Ihrem System passiert ist. Befolgen Sie einige einfache Anweisungen aus dem Arch-Wiki , um dies zu beheben, und denken Sie daran, dass der für tmpfs zugewiesene Speicher für andere Zwecke nicht mehr zugänglich ist. Mit anderen Worten, ein System mit riesigen tmpfs und großen Dateien kann keinen Speicher mehr haben und abstürzen. Ein weiterer Hinweis: Denken Sie beim Bearbeiten der /etc/fstab daran, dass sie mit einer neuen Zeile enden muss, da Ihr System sonst nicht startet.

/ proc und / sys

Neben /tmp sind /proc und /sys die VFS (Virtual File Systems), mit denen Linux-Benutzer am besten vertraut sind. ( /dev befindet sich im gemeinsamen Speicher und hat keine file_operations ). Warum genau diese beiden Komponenten? Schauen wir uns dieses Problem an.

procfs eine Momentaufnahme des Kernels und der Prozesse, die es für den userspace überwacht. In /proc Kernel Informationen darüber an, über welche Tools er verfügt, z. B. Interrupts, virtueller Speicher und den Scheduler. Darüber hinaus ist /proc/sys der Ort, an dem mit dem Befehl sysctl konfigurierte Optionen für den sysctl verfügbar sind. Der Status und die Statistik der einzelnen Prozesse werden in den Verzeichnissen /proc/ angezeigt.



Hier ist /proc/meminfo eine leere Datei, die dennoch wertvolle Informationen enthält.

Das Verhalten von /proc Dateien zeigt, wie unterschiedlich VFS-Festplattendateisysteme sein können. /proc/meminfo enthält /proc/meminfo Informationen, die mit dem Befehl free angezeigt werden können. Andererseits ist es dort leer! Wie ist das Die Situation ähnelt einem berühmten Artikel mit dem Titel "Existiert der Mond, wenn niemand darauf schaut?" Realität und Quantentheorie “, geschrieben 1985 von David Mermin, Physikprofessor an der Cornell University. Tatsache ist, dass der Kernel Speicherstatistiken sammelt, wenn eine Anforderung an /proc , und tatsächlich nichts in den /proc Dateien vorhanden ist, wenn niemand dort sucht. Wie Mermin sagte: "Die grundlegende Quantenlehre besagt, dass die Messung in der Regel nicht den bereits vorhandenen Wert der gemessenen Eigenschaft offenbart." (Stellen Sie sich die Mondfrage als Hausaufgabe vor!)
Die scheinbare Leere von procfs macht Sinn, weil die Informationen dort dynamisch sind. Eine etwas andere Situation mit sysfs . Vergleichen wir, wie viele Dateien mit mindestens einem Byte in /proc und /sys .



Procfs verfügt über eine Datei, nämlich die exportierte Kernelkonfiguration. Dies ist eine Ausnahme, da sie nur einmal pro Start generiert werden muss. /sys hingegen enthält viel mehr umfangreiche Dateien, von denen viele eine ganze Seite des Speichers belegen. Normalerweise enthalten sysfs Dateien genau eine Zahl oder Zeile, im Gegensatz zu Informationstabellen, die durch Lesen von Dateien wie /proc/meminfo .

Der Zweck von sysfs besteht darin, lesbare und beschreibbare Eigenschaften dessen bereitzustellen, was der Kernel im «kobjects» nennt. Der einzige Zweck von kobjects besteht darin, Links zu zählen: Wenn der letzte Link zu kobject gelöscht wird, stellt das System die damit verbundenen Ressourcen wieder her. /sys macht jedoch den größten Teil des berühmten Kernels "Stable ABI for Userspace" aus , den unter keinen Umständen beschädigt werden kann . Dies bedeutet nicht, dass die Dateien in sysfs statisch sind, was dem Zählen von Links zu instabilen Objekten widersprechen würde.
Die stabile Kernel-Anwendungsschnittstelle eines Kernels (der stabile ABI des Kernels) begrenzt, was in /sys angezeigt werden kann, und nicht, was in diesem bestimmten Moment tatsächlich vorhanden ist. Das Auflisten von Dateiberechtigungen in sysfs bietet einen Überblick darüber, wie konfigurierbare Einstellungen für Geräte, Module, Dateisysteme usw. möglich sind. kann angepasst oder gelesen werden. Wir schließen daraus, dass procfs auch Teil des stabilen ABI-Kernels ist, obwohl dies in der Dokumentation nicht explizit angegeben ist.



Dateien in sysfs beschreiben eine bestimmte Eigenschaft für jede Entität und können gleichzeitig lesbar, wiederbeschreibbar oder beides sein. Eine "0" in der Datei zeigt an, dass die SSD nicht gelöscht werden kann.

Wir beginnen den zweiten Teil der Übersetzung mit der Beobachtung von VFS mithilfe der eBPF- und bcc-Tools. Jetzt warten wir auf Ihre Kommentare und laden Sie traditionell zu dem offenen Webinar ein , das am 9. April von unserem Lehrer Vladimir Drozdetsky abgehalten wird.

Der zweite Teil.

Source: https://habr.com/ru/post/de446614/


All Articles