Das Linux-Dateisystem ist eine Kernkomponente des Betriebssystems, und sein Betriebsmechanismus ist das, was wir Programmierer verstehen und beherrschen müssen. Die Festplatte stellt den grundlegendsten dauerhaften Speicher für das System bereit, und das Dateisystem stellt alle Dateien im System bereit Die Basis der Festplatte. Unter Linux ist alles eine Datei. Nicht nur gewöhnliche Dateien und Verzeichnisse, sondern auch Blockgeräte, Sockets, Pipes usw. müssen über ein einheitliches Dateisystem verwaltet werden. Heute sprechen wir gemeinsam über die Frage: Wie funktionieren Festplatten und Dateisysteme?
Indexknoten und Verzeichniseinträge
Im Linux-Dateisystem umfassen die Metadaten einer Datei: Verzeichniseinträge, Indexknoten und Datenblöcke.
- Verzeichniseintrag: Wird als Dentry bezeichnet und dient zum Aufzeichnen des Dateinamens, des Indexknotenzeigers und der Zuordnung zu anderen Verzeichniseinträgen. Mehrere zugehörige Verzeichniseinträge bilden die Verzeichnisstruktur des Dateisystems. Ein Verzeichniseintrag ist eine vom Kernel verwaltete Speicherdatenstruktur und wird daher häufig als Verzeichniseintragscache (Cache) bezeichnet.
- Indexknoten: Wird als Inode bezeichnet und dient zum Aufzeichnen der Metadaten der Datei, einschließlich Inode-Nummer, Dateigröße, Zugriffsberechtigungen, Änderungsdatum, Datenspeicherort, Anzahl der Links usw. Die Informationen zum Indexknoten werden auf der Festplatte gespeichert zur Speicherung, belegt den Speicherplatz.
- Datenblock: Wird als Block bezeichnet, in dem Dateidaten gespeichert werden. Die kleinste Speichereinheit einer Festplatte wird als Sektor bezeichnet. Jeder Sektor speichert 512 Byte, was 0,5 KB entspricht. Wenn das Betriebssystem die Festplatte liest, ist dies zu ineffizient liest mehrere Sektoren kontinuierlich gleichzeitig, dh liest jeweils einen „Block“. Dieser aus mehreren Sektoren bestehende „Block“ ist die kleinste Dateizugriffseinheit. „Block“-Größe, am häufigsten ist 4 KB (acht Sektoren).
Um den Dateizugriff zu beschleunigen, werden Indexknoten normalerweise in den Speicher geladen und die Festplatte beim Formatieren in drei Speicherbereiche unterteilt: Superblock, Indexknotenbereich und Datenblockbereich.
- Super Block wird zum Speichern detaillierter Informationen des Dateisystems verwendet, wie z. B. die Anzahl der Blöcke, die Blockgröße, freie Blöcke usw.
- Indexknotenbereich, der zum Speichern von Indexknoten verwendet wird.
- Datenblockbereich, der zum Speichern von Datei- oder Verzeichnisdaten verwendet wird.
Virtuelles Dateisystem
Das virtuelle Dateisystem (VFS, Virtual File System) des Linux-Systems ist eine wichtige Abstraktionsschicht, die Benutzern und Anwendungen eine einheitliche Dateisystemschnittstelle bietet und ihnen den einheitlichen Zugriff auf verschiedene Arten von Dateisystemen ermöglicht Sie müssen sich um die Implementierungsdetails des zugrunde liegenden Dateisystems kümmern.
Sowohl das Benutzerprogramm als auch die Glibc-Bibliothek gehören zum Benutzerbereich, und Dateioperationen werden durch Aufrufen von Funktionen der Systemaufrufschicht (SCI) abgeschlossen. Bei diesen Funktionen handelt es sich um vom Linux-Kernel bereitgestellte Schnittstellen, über die Benutzer Vorgänge vom System anfordern können. Beispielsweise ruft der Befehl cat im System die Funktion open() auf, um die Datei zu öffnen, ruft dann die Funktion read() auf, um den Dateiinhalt zu lesen, und ruft schließlich die Funktion write() auf, um den Dateiinhalt an die Konsole auszugeben . Gängige Dateisystemtypen können in mehrere große Kategorien unterteilt werden.
- Basierend auf der lokalen Festplatte: EXT3, EXT4, XFS, OverlayFS usw. Das Merkmal dieses Dateisystemtyps besteht darin, dass die Daten direkt auf der lokal auf dem Computer montierten Festplatte gespeichert werden, mit guter Leistung und ohne Netzwerk-E/A-Zugriffsverbrauch.
- Basierend auf Netzwerkdateisystemen: NFS, CIFS/SMB, CephFS, GlusterFS usw. Das Merkmal dieses Dateityps besteht darin, dass Benutzer über das Netzwerk auf Dateien zugreifen und diese verwalten können. Verteilung, Cross-Plattform, Flexibilität und Skalierbarkeit sind ihre größten Vorteile.
- Speicherbasierte Dateisysteme: tmpfs, ramfs, /proc usw. Diese speicherbasierten Dateisysteme werden normalerweise für bestimmte Zwecke verwendet, z. B. temporäre Dateispeicherung, Caching, schnellen Datenzugriff usw. Sie bieten eine leistungsstarke Lösung zum Lesen und Schreiben von Dateien im Speicher, müssen sich aber auch der Speicherbeschränkungen und der Datenvolatilität bewusst sein.
Datei-E/A
Wir partitionieren und formatieren die Festplatte, um verschiedene Arten von Dateisystemen zu erstellen, die in bestimmte Verzeichnisse im VFS von Linux gemountet werden müssen, bevor sie vom System verwendet werden können. Es gibt verschiedene E/A-Typen für Dateilese- und -schreibvorgänge, und das Anwendungsprogramm wählt je nach Bedarf die geeignete Methode aus.
Gepufferte vs. ungepufferte E/A
- Die sogenannte „Keine Pufferung“ bedeutet nicht, dass der Kernel keine Pufferung bereitstellt, sondern nur einfache Systemaufrufe, keine Funktionsbibliotheksaufrufe. Der Systemkernel stellt einen Blockpuffer zum Lesen und Schreiben auf die Festplatte bereit. Wenn die Schreibfunktion zum Schreiben von Daten verwendet wird, wird der Systemaufruf direkt aufgerufen, um die Daten in den Blockpuffer zu schreiben und in die Warteschlange zu stellen Bei einer bestimmten Menge werden die Daten in die Warteschlange gestellt. Daher bedeutet die sogenannte ungepufferte E/A, dass der Prozess keine Pufferfunktion bereitstellt. Bei jedem Aufruf der Schreib- oder Lesefunktion wird diese direkt vom System aufgerufen. (Vom Kernel gepuffert).
- Gepufferte E/A bedeutet, dass der Prozess die Eingabe- und Ausgabeströme verbessert und einen Stream-Puffer bereitstellt. Wenn Sie die Schreibfunktion zum Schreiben von Daten verwenden, werden die Daten zunächst in den Stream-Puffer geschrieben. Wenn bestimmte Bedingungen erreicht sind, z. B. wenn der Stream-Puffer voll ist, werden die Daten sofort an den vom Kernel bereitgestellten Blockpuffer gesendet dann über den Blockpuffer auf die Festplatte geschrieben. (doppelte Pufferung)
- Daher sind beim Schreiben der gleichen Datenmenge auf die Festplatte für gepufferte E/A weniger Systemaufrufe erforderlich als für ungepufferte E/A.
Direkte E/A und indirekte E/A
- Direkte E/A: Das Anwendungsprogramm greift direkt auf die Festplattendaten zu, ohne den Kernel-Puffer zu durchlaufen. Der Zweck besteht darin, die Datenkopie vom Kernel-Puffer in den Cache des Benutzerprogramms zu reduzieren.
- Indirekte E/A: Wenn Dateien gelesen oder geschrieben werden, müssen sie zuerst den Seitencache des Systems durchlaufen und dann vom Kernel oder zusätzlichen Systemaufrufen auf die Festplatte geschrieben werden.
- Wenn sich bei direkter E/A die Daten, auf die zugegriffen wird, nicht im Anwendungscache befinden, werden die Daten jedes Mal direkt von der Festplatte geladen, und die Effizienz dieses direkten Ladens ist langsamer. Für Anwendungen wie Datenbankverwaltungssysteme ist es jedoch wahrscheinlicher, dass sie ihren eigenen Caching-Mechanismus wählen, da Datenbankverwaltungssysteme die in der Datenbank gespeicherten Daten häufig besser kennen als das Betriebssystem und direkte E/A besser geeignet ist.
Blockierende E/A und nicht blockierende E/A
- Blockieren von E/A: Der Anwendungsprozess blockiert beim Aufrufen einer E/A-Operation erst, nachdem er darauf gewartet hat, dass die Daten vorbereitet und in den Puffer des Anwendungsprozesses kopiert werden. Die Merkmale sind: geringe Implementierungsschwierigkeiten, einfache Anwendungsentwicklung und geeignet für die Entwicklung von Netzwerkanwendungen mit geringer Parallelität.
- Nicht blockierende E/A: bedeutet, dass die Anwendung, nachdem sie einen E/A-Vorgang ausgeführt hat, den aktuellen Thread nicht blockiert und weiterhin andere Aufgaben ausführen und dann das Ergebnis des Aufrufs durch Abfrage oder Ereignisbenachrichtigung erhalten kann. Die Merkmale sind: relativ komplex. Geeignet für die Entwicklung von Netzwerkanwendungen, die ein geringes Maß an Parallelität aufweisen und keine zeitnahe Reaktion erfordern
Synchrone und asynchrone E/A
- Synchronisierte E/A: bedeutet, dass die Anwendung, nachdem sie eine E/A-Operation ausgeführt hat, warten muss, bis die gesamte E/A abgeschlossen ist, bevor sie die E/A-Antwort erhalten kann.
- Asynchrone E/A: bedeutet, dass die Anwendung, nachdem sie den E/A-Vorgang ausgeführt hat, nicht auf den Abschluss und die Antwort nach Abschluss warten muss, sondern mit der Ausführung fortfahren kann. Nachdem diese E/A abgeschlossen ist, wird die Antwort in Form einer Ereignisbenachrichtigung an die Anwendung übermittelt.
Einige allgemeine Kenntnisse über Dateien
Auf der Festplatte ist noch viel Speicherplatz frei und es ist nicht genügend Platz für neue Dateien und Verzeichnisse vorhanden.
- Ideen zur Fehlerbehebung: Es besteht eine hohe Wahrscheinlichkeit, dass zu viele kleine Dateien vorhanden sind und die Inodes aufgebraucht sind. Sie können df -i verwenden.
Die Statistiken zur Festplattennutzung zwischen du und df sind inkonsistent.
- du zählt die Größe jeder vom Dateisystem aufgezeichneten Datei und akkumuliert dann die Gesamtgröße, die über das Dateisystem ermittelt wird. df liest hauptsächlich Festplattennutzungsinformationen aus dem Superblock (Superblock). Was df erhält, ist die Nutzung von Festplattenblöcken. Diese Situation wird höchstwahrscheinlich dadurch verursacht, dass eine Datei gelöscht wird, sie jedoch von einem anderen Prozess verwendet wird (der das Handle besitzt), das über lsof grep gelöscht gefunden werden kann. Wenn der Prozess stoppt oder abgebrochen wird, werden diese Leerzeichen freigegeben.
Wenn wir die Festplattenkapazität abfragen, warum ist die Größe von „Verwendet+Verfügbar“ immer kleiner als die Gesamtkapazität (SIze)?
- Um Notfälle zu verhindern, reserviert das Linux ext-Dateisystem einen Teil des Festplattenspeichers. Der spezifische reservierte Wert kann über tune2fs -l [dev_name] | (dev_name) angezeigt werden , der hier reserviert ist, wird von df in den verwendeten Speicherplatz berechnet, was zu inkonsistenten Statistiken zwischen df und du führt. Wenn Sie die Größe des reservierten Speicherplatzes anpassen müssen, können wir tune2fs -m [size] [dev_name] verwenden, um Anpassungen vorzunehmen.
Das obige ist der detaillierte Inhalt vonMöchten Sie herausfinden, wie das Linux-Dateisystem funktioniert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!