Warum hat ein neues Verzeichnis eine Anzahl fester Verknüpfungen von 2, bevor etwas hinzugefügt wird?

38

Angenommen, ich erstelle nur das Verzeichnis newDirectory und führe dann den Befehl ls -ld aus. Ich sehe, dass die Anzahl der Hardlinks 2 beträgt. Was genau macht Hardlink 2 von Anfang an aus? Entspricht die Anzahl der Unterverzeichnisse im aktuellen Verzeichnis auch der Anzahl der festen Verbindungen - 2?

John
quelle

Antworten:

39

In der Vergangenheit hat das erste Unix-Dateisystem in jedem Verzeichnis zwei Einträge erstellt: .auf das Verzeichnis selbst und ..auf das übergeordnete Verzeichnis . Dies bot eine einfache Möglichkeit, das Dateisystem sowohl für Anwendungen als auch für das Betriebssystem selbst zu durchlaufen.

Somit hat jedes Verzeichnis eine Verbindungsanzahl von 2 + n, wobei n die Anzahl der Unterverzeichnisse ist. Die Links sind der Eintrag für dieses Verzeichnis in seinem übergeordneten Verzeichnis, der eigene .Eintrag des Verzeichnisses und der ..Eintrag in jedem Unterverzeichnis. Angenommen, dies ist der Inhalt des Teilbaums, in dem /parentsich alle Verzeichnisse befinden:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

Dann dirhat eine Verbindungszahl von 5: der dirEintrag in /parentdem .Eintrag /parent/dirund die drei ..Einträge in jedem von /parent/dir/sub1, /parent/dir/sub2und /parent/dir/sub3. Da /parent/dir/sub1es kein Unterverzeichnis gibt, ist die Anzahl der Verknüpfungen 2 (der sub1Eintrag in /parent/dirund der .Eintrag in /parent/dir/sub1).

Um die Anzahl der Sonderzeichen für das Stammverzeichnis zu minimieren, für das kein übergeordnetes Element vorhanden ist, enthält das Stammverzeichnis einen ..Eintrag, der auf sich selbst verweist. Auf diese Weise hat es auch eine Verknüpfungsanzahl von 2 plus der Anzahl der Unterverzeichnisse, wobei 2 /.und ist /...

Spätere Dateisysteme haben die Tendenz, die übergeordneten Verzeichnisse im Speicher zu verfolgen, und benötigen .und ..existieren normalerweise nicht als tatsächliche Einträge. Typische moderne Unix-Systeme behandeln .und ..als spezielle Werte als Teil des dateisystemtypunabhängigen Dateisystemcodes. Einige Dateisysteme noch enthalten .und ..Einträge, oder so tun, auch wenn nichts erscheint auf dem Datenträger.

Die meisten Dateisysteme melden immer noch eine Linkanzahl von 2 + n für Verzeichnisse, unabhängig davon, ob .und ob ..Einträge vorhanden sind. Es gibt jedoch Ausnahmen, zum Beispiel, dass btrfs dies nicht tut.

Gilles 'SO - hör auf böse zu sein'
quelle
4
..Das Zeigen auf das übergeordnete Verzeichnis wirkt sich nicht auf die Linkanzahl des aktuellen Verzeichnisses aus. Die Anzahl von 2 ergibt sich aus .der (ursprünglichen) Namensliste des Verzeichnisses. Die Art und Weise, wie Sie es ausdrücken, ist ein wenig mehrdeutig und lässt es so klingen wie .und ..sind die beiden. ..sollte nur verwendet werden, um zu erklären, wie die Mathematik funktioniert 2+n:)
th3an0maly
@ th3an0maly Das Zeigen auf das übergeordnete Element wirkt sich auf die Linkanzahl des übergeordneten Elements aus. Ich sehe wirklich nicht, wie „der Eintrag .. in jedem Unterverzeichnis“ mehrdeutig ist, und ich verstehe nicht, was Sie unter „Auflistung des Verzeichnisnamens selbst“ verstehen.
Gilles 'SO- hör auf böse zu sein'
Eigentlich ist diese Antwort: unix.stackexchange.com/a/101516/160264 genau das, worauf ich hingewiesen habe. Lies es, nachdem ich deine Antwort gelesen habe, da deine oben war.
th3an0maly
@ th3an0maly Ich habe noch keine Ahnung, worauf du anspielst. Könnten Sie es klar ausdrücken, anstatt es anzudeuten?
Gilles 'SO - hör auf böse zu sein'
@ Goldilocks Antwort ist klar. Was ich sagen wollte ist, dass Ihre Antwort eher wie seine sein könnte. Aber dann hatte ich seine Antwort nicht gelesen, als ich Ihre Antwort las. Die erste Zeile ist genau das, was mein ursprünglicher Kommentar sagte: "Es gibt eine für das Verzeichnis selbst und eine für das Verzeichnis .darin." Wenn es Ihnen immer noch unklar ist, tut es mir sehr leid, dass ich es nicht weiter klären kann. Alles, was ich besser machen könnte, ist, seine Antwort hier in die Kommentare einzufügen.
th3an0maly
13

Es gibt eine für das Verzeichnis selbst und eine für das Verzeichnis .darin.

Entspricht die Anzahl der Unterverzeichnisse im aktuellen Verzeichnis auch der Anzahl der festen Verbindungen - 2?

Dies ist sinnvoll, da jedes Unterverzeichnis einen ..Hardlink erstellt und darüber hinaus keine Hardlinks zu Verzeichnissen erstellt werden können. 1 Ich würde dem jedoch für nichts Ernstes vertrauen, insb. da es einfach ist, die Unterverzeichnisse zu zählen und die reale Zahl zu erhalten.

Wenn Sie sich nur die lsAusgabe ansehen, um eine Vorstellung davon zu bekommen, wie viele U-Boote es gibt, dann haben Sie eine anständige Vorstellung davon.

1 Oder zumindest kannst du nicht mit ln. Ich habe nicht versucht, programmgesteuert und man 2 linkist nicht eindeutig - es gibt keinen offensichtlichen Fehler beim Verknüpfen mit einem Verzeichnis, obwohl möglicherweise einige zutreffen ( EMLINK, EPERM). Es sei denn, irgendwo gibt es einen Standard, der besagt, dass die einzigen möglichen festen Links zu einem Verzeichnis sind, .und ..ich würde diese Anzahl fester Links wiederum nur als zufälligen Hinweis behandeln.

Goldlöckchen
quelle
2
Ob Verknüpfungen zu Verzeichnissen zulässig sind und ob Sie Unterverzeichnisse aus der Verknüpfungsanzahl herauszählen können, hängt davon ab, welches Dateisystem Sie verwenden - manche erlauben, manche nicht.
alanc
Beachten Sie, dass die Time Machine von macOS tatsächlich Verzeichnisse mit früheren Backups fest verknüpft. Auf diese Weise können sie so tun, als ob jedes inkrementelle Backup eine vollständige Kopie ist, und sie können jedes der inkrementellen Backups löschen, ohne die anderen zu beeinträchtigen. Es ist auch sehr spröde, ich habe mit normalen Systemaufrufen damit gespielt und mein Dateisystem gründlich abgespritzt.
Mittwoch,