Wird ein Verzeichnis entfernt, wenn die Anzahl der festen Links 0 wird?

10

Wird ein Verzeichnis entfernt, wenn die Anzahl der festen Links 0 wird?

Ein Verzeichnis hat aufgrund von immer mindestens 2 als Anzahl der festen Links .. Wenn rm -rein Verzeichnis nicht verringert es die Anzahl der harten Links 2-0 von 2 statt 1?

Kann die Anzahl der festen Links eines Verzeichnisses jemals 1 sein?

Vielen Dank.

Tim
quelle

Antworten:

9

Erstens verwenden nicht alle Dateisysteme .und ..als Hardlinks. Dies ist im gnu find Handbuch dokumentiert. Ich werde diese Dateisysteme für den Rest meiner Antwort ignorieren, da sie nicht für Unix entwickelt wurden und nur die Dinge komplizieren, ohne Klarheit zu schaffen. Aus dem gleichen Grund werde ich auch das Stammverzeichnis und die Mount-Punkte ignorieren.

Die Anzahl der Links zu einem Verzeichnis beträgt aufgrund von .und nie weniger als zwei ... Die Anzahl der Unterverzeichnisse entspricht der Anzahl der Links minus zwei. Aus diesem Grund können Sie ein Verzeichnis nicht verknüpfen oder die Verknüpfung aufheben, ebenso rm -rwie stateine Datei vor dem Löschen und Verwenden rmdiranstelle von unlinkVerzeichnissen. Die beiden Systemaufrufe verwenden völlig unterschiedliche Codepfade im Kernel.

hildred
quelle
Vielen Dank. Ein Verzeichnis hat einen festen Link .., nur wenn es ein Unterverzeichnis hat, richtig? Ist ..also nicht immer für ein Verzeichnis vorhanden, oder?
Tim
..ist in jedem Verzeichnis vorhanden, das ein Unterverzeichnis ist. Das ist alles, aber /das hat auch eines, also alle Verzeichnisse.
Hildred
1
(1) Wenn ein Verzeichnis kein Unterverzeichnis hat, hat das Verzeichnis keine feste Verbindung ..zu sich selbst. Was sind die harten Links zum Verzeichnis? die Datei mit dem Pfadnamen und .? (2) Warum ignorierst du Einhängepunkte?
Tim
Wenn das Verzeichnis ein Unterverzeichnis ist. Der Eintrag ..zeigt auf das übergeordnete Element. Als Sonderfall verweist der Stammverzeichnis-Link auf sich selbst. Auf diese Weise können cd ..\..ähnliche Befehle wie erwartet ausgeführt werden, unabhängig davon, wo Sie sich befinden. Sie können mit dem statBefehl testen .
BillThor
1
Sie haben Recht, dass die Anzahl der Links nie unter 2 liegt, aber nicht wegen ... Es liegt an .und dem Namen im übergeordneten Verzeichnis, der darauf verweist. Die einzige Ausnahme ist die Wurzel, die kein übergeordnetes Element hat. Aber es hat ..auf sich selbst gezeigt, also hat es auch
Linkanzahl
11

Jede Datei in einem konventionell gestalteten UNIX-Dateisystem, deren Referenzanzahl (z. B. die Summe aus Hardlinkanzahl und Anzahl der geöffneten Dateihandles *) 0 erreicht, wird entfernt. Doch auf modernen UNIX - Systemen, die rmdirentfernt Systemaufruf ein leeres Verzeichnis in einem einzigen Arbeitsgang , anstatt zu entfernen .und ..eine-by-one.

In historischen UNIX-Systemen war dieser Systemaufruf jedoch nicht vorhanden. Stattdessen war der rmdir Befehl ein setuid-Programm ( Quellcode finden Sie hier ), das überprüfte, ob ein Verzeichnis leer war (außer den speziellen Einträgen), und dann entfernt ..und .in dieser Reihenfolge das Verzeichnis selbst entfernte, alles mit dem unlinkSystemaufruf, den nur root für Verzeichnisse verwenden durfte (daher wurde der Befehl setuid). Auf diesen Systemen wäre die Verbindungsanzahl eines Verzeichnisses momentan 1, nachdem sie .entfernt wurde, aber bevor das Verzeichnis aus dem übergeordneten Verzeichnis entfernt wurde, wäre es 0.

Der rmBefehl verhinderte übrigens, dass sogar root Verzeichnisse entfernte. Und rm -rwürde den rmdirBefehl aufrufen , Verzeichnisse nach dem Leeren ihres Inhalts zu entfernen.

Auf diesen historischen Systemen kann der Missbrauch des unlinkAufrufs eines Programms, das als Root ausgeführt wird, mit rmdiroder in eine Race-Bedingung gerät oder mveine Datei in einem Prozess erstellt, dessen aktuelles Verzeichnis gelöscht wurde (moderne Systeme verhindern dies), dazu führen, dass Dateien oder Verzeichnisse baumeln die eine Hardlink-Anzahl über 0 haben, aber nicht im Verzeichnisbaum vorhanden sind. Dieser Zustand wurde von erkannt dcheckund ist immer noch einer der Eincheckvorgänge, fsckda er auf den meisten Dateisystemen physisch möglich bleibt.


Dateisysteme müssen im Übrigen keine Verzeichnisse (einschließlich .und ..) als normale Dateien mit Hardlinks implementieren . Auf diesen Dateisystemen wird die Hardlink-Anzahl eines Verzeichnisses immer als gemeldet 0(aber natürlich ist seine Existenz im übergeordneten Verzeichnis für eine "Referenzanzahl" von 1 qualifiziert).


Das Verhalten eines entfernten Verzeichnisses (z. B. wenn es von einem Prozess untersucht wird, der es bereits geöffnet hat oder als aktuelles Verzeichnis hat) und die genaue Bedeutung der "Linkanzahl" eines Verzeichnisses sind nicht angegeben. Unter Mac OS X wird beispielsweise eine Hardlink-Anzahl von 2 gemeldet , obwohl keine echten Hardlinks vorhanden sind. Obwohl .und ..nicht in der Liste statangezeigt , kann das Verzeichnis geöffnet und mit dem Namen .oder aufgerufen werden ... Unter Linux ist der Linkzähler 0 aber .und ..ebenfalls noch Arbeit.

Mac OS X gibt auch die Anzahl aller Dateien in einem Verzeichnis als Linkanzahl an, anstatt nur die Anzahl der Unterverzeichnisse. Aber es ist 2, auch wenn .und ..weg sind.


* Dies umfasst normale offene Deskriptoren, speicherabgebildete Abschnitte (einschließlich z. B. Ausführen von Binärdateien und gemeinsam genutzten Bibliotheken) und die Verarbeitung aktueller Verzeichnisse.

Random832
quelle
2
strcpyzu einem Array fester Größe in einer ausführbaren setuid-Datei ... das waren gute Zeiten!
Andrea Corbellini
@AndreaCorbellini Es gibt tatsächlich einen veröffentlichten Exploit für mkdirbasierend auf der Tatsache, dass es dasselbe in umgekehrter Reihenfolge tun muss.
Random832
1
Ich glaube, ich habe es gefunden: securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :)
Andrea Corbellini
Fragen Sie nach rmdir, würde ..entfernen Sie nicht das übergeordnete Verzeichnis entfernen?
Edward Torvalds
@edwardtorvalds Nein, ich bezog mich auf das Entfernen des Links ".." selbst, nicht auf das übergeordnete Verzeichnis, auf das es verweist.
Random832