Meine Frage ist, wie Verzeichnisse implementiert werden? Ich kann eine Datenstruktur wie eine Variable glauben, zB eine Tabelle, ein Array oder ähnliches. Da UNIX Open Source ist, kann ich in der Quelle nachsehen, was das Programm beim Erstellen eines neuen Verzeichnisses tut. Können Sie mir sagen, wo ich das Thema suchen oder erläutern soll? Dass ein Verzeichnis eine Datei ist, die ich verstehen konnte, und ein Verzeichnis wirklich eine Datei ist? Ich bin nicht sicher, ob es wahr ist, dass Dateien "in" Dateien gespeichert werden, während man das Wort "file" noch so gut wie immer sagen kann, und ich bin mir nicht sicher, was überhaupt keine Datei ist, da man sogar eine Variable "a" nennen kann Datei. Zum Beispiel ist ein Link sicherlich keine Datei und ein Link ist wie ein Verzeichnis, aber das verstößt dann dagegen, dass ein Verzeichnis eine Datei ist?
quelle
Antworten:
Die interne Struktur der Verzeichnisse hängt vom verwendeten Dateisystem ab. Wenn Sie genau wissen möchten, was passiert, schauen Sie sich die Implementierungen von Dateisystemen an.
Grundsätzlich ist ein Verzeichnis in den meisten Dateisystemen ein assoziatives Array zwischen Dateinamen (Schlüsseln) und Inodennummern (Werten). So etwas¹:
Diese Liste ist in einer Kette von (normalerweise) 4-KB-Blöcken mehr oder weniger effizient codiert. Beachten Sie, dass der Inhalt regulärer Dateien auf ähnliche Weise gespeichert wird. Bei Verzeichnissen macht es keinen Sinn zu wissen, welche Größe tatsächlich in diesen Blöcken verwendet wird. Aus diesem Grund
du
beträgt die Größe der von gemeldeten Verzeichnisse ein Vielfaches von 4 KB.Inodes sind dazu da, Blöcke miteinander zu verbinden, um eine Einheit zu bilden, nämlich eine "Datei" im allgemeinen Sinne. Sie werden durch eine Nummer identifiziert, die eine Art von Adresse ist, und jede wird normalerweise als einzelner spezieller Block gespeichert.
All dies wird im Kernel-Modus verwaltet. Die Software fordert lediglich die Erstellung eines Verzeichnisses mit einer Funktion an,
int mkdir(const char *pathname, mode_t mode);
die zu einem Systemaufruf führt, und der Rest wird hinter den Kulissen ausgeführt.Über links struktur:
Ein fester Link ist keine Datei, sondern lediglich ein neuer Verzeichniseintrag (dh eine Zuordnung von Name zu Inode-Nummer ), der auf eine bereits vorhandene Inode-Entität² verweist. Dies bedeutet, dass auf denselben Inode über verschiedene Pfadnamen zugegriffen werden kann. Da Metadaten (Berechtigungen, Eigentumsrechte, Zeitstempel usw.) im Inode gespeichert sind, sind diese eindeutig und unabhängig vom Pfadnamen, der für den Zugriff auf die Datei ausgewählt wurde.
Ein symbolischer Link ist eine Datei und unterscheidet sich von ihrem Ziel. Dies bedeutet, dass es eine eigene Inode hat. Früher wurde es wie eine normale Datei behandelt: Der Zielpfad wurde in einem Datenblock gespeichert. Aus Gründen der Effizienz werden in neueren ext- Dateisystemen Pfade, die kürzer als 60 Byte sind, im Inode selbst gespeichert (unter Verwendung der Felder, die normalerweise zum Speichern der Zeiger auf Datenblöcke verwendet würden).
-
1. dies wurde erhalten mit
ls -ai1 testdir
.2. Wessen Typ muss sich heutzutage von 'directory' unterscheiden?
quelle
Um den Beitrag von Stéphane Gimenez zu erweitern, müssen Sie beim Erstellen eines neuen Verzeichnisses einen neuen Inode mit dem Wert st_mode von S_IFDIR (im Berechtigungsmodus) erstellen und zwei Einträge im ersten Datenblock des neuen Inodes mit dem Link ( 2) Systemaufruf: '.' welche auf diesen neuen Inode verweist und '..' welche auf das übergeordnete Verzeichnis verweist, dann einen Eintrag im übergeordneten Verzeichnis mit dem Inode und dem Namen des neuen Verzeichnisses erstellen - der erste und letzte Teil werden vom Systemaufruf mknod ( 2). Heutzutage kann nur root mknod (2) für solche Aufgaben verwenden, über die wir sprechen.
mkdir("/home/larry.user/xyzzy", 0666)
Dies ist beispielsweise im Wesentlichen der folgende Code (dies war C-Code aus SysV-Tagen [1]):Dies war zu fehleranfällig (und einer der Hauptgründe für fsck), sodass ein mkdir (2) -Systemaufruf erstellt wurde, um dies für Sie tun zu können.
Beachten Sie, dass jedes Dateisystemobjekt mit mknod (2) erstellt werden kann: reguläre Datei, Verzeichnis, Gerätedatei, Symlink usw. Um also eine der Fragen des OP zu beantworten, ist ein Verzeichnis eine Datei, dh "es" ist ein Objekt, das durch eine Inode repräsentiert wird und sich in einem Dateisystem befindet, das sich mit einer I / O-Schnittstelle verhält. "
quelle
touch
das eine leere Datei erstellt, und sehen, was es tut.Wenn Sie weitere Informationen zu Unix / Linux-Dateisystemen wünschen, empfehle ich Ihnen 2 Bücher Grundlegendes zum Linux-Kernel und zur Linux-Kernel-Entwicklung . Dies sind die besten Bücher zum Verständnis des Linux-Kernels.
In den Unix-Systemen "Common File Model" wird jedes Verzeichnis als Datei betrachtet, die eine Liste von Dateien und Verzeichnissen enthält.
Im VFS (Virtual File Systems) werden die Verzeichnisse in einer Struktur namens dargestellt
dentry
. Esdentry
handelt sich um eine C-Struktur mit einem Zeichenfolgennamen ( d_name ), einem Zeiger auf einen Inode ( d_inode ) und einem Zeiger auf den übergeordneten Eintrag ( d_parent ). Eine Inode ist eine Struktur zum Verarbeiten von Informationen zu einer Datei im Dateisystem. Wenn Sie beispielsweise das Verzeichnis haben/tmp/test/foo
, erstellt das VFS für jede Komponente im Pfadnamen ein Eintragsobjekt. Es wird also ein Eintragsobjekt für/
, ein zweites Eintragsobjekt für dentest
Eintrag des Wurzelverzeichnisses und ein drittes Eintragsobjekt für denfoo
Eintrag des Testverzeichnisses erstellt .quelle
Sie können mit dem Lesen von http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM beginnen . Weitere Informationen finden Sie im hervorragenden klassischen Buch "Das Design und die Implementierung des 4.4 BSD-Betriebssystems".
quelle
locate
seine Werke tut und wie dies im Zusammenhang mit der Aktualisierung des Programm finden , indem Sieupdatedb
(spez I Verwendung PC-BSD, DragonflyBSD und Ubuntu Natty Boote von Live - CDs und Benchmarking verschiedene Installationen und Schnittstellen)