GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum sind harte Links zu Verzeichnissen in Unix/Linux nicht erlaubt?

Ich habe in Lehrbüchern gelesen, dass Unix/Linux keine harten Links zu Verzeichnissen zulässt, aber weiche Links. Liegt es daran, dass, wenn wir Zyklen haben und wenn wir harte Links erstellen, und wir nach einiger Zeit die Originaldatei löschen, dies auf einen Müllwert verweist?

Wenn Zyklen der einzige Grund dafür waren, harte Links nicht zuzulassen, warum sind dann weiche Links zu Verzeichnissen erlaubt?

Akzeptierte Antwort:

Dies ist nur eine schlechte Idee, da es keine Möglichkeit gibt, den Unterschied zwischen einem festen Link und einem Originalnamen zu erkennen.

Feste Links zu Verzeichnissen zuzulassen würde die gerichtete azyklische Graphstruktur des Dateisystems unterbrechen, möglicherweise Verzeichnisschleifen und baumelnde Verzeichnisunterbäume erzeugen, was zu fsck führen würde und alle anderen fehleranfälligen Dateibaum-Walker.

Um dies zu verstehen, lassen Sie uns zunächst über Inodes sprechen. Die Daten im Dateisystem werden in Blöcken auf der Festplatte gespeichert, und diese Blöcke werden von einem Inode zusammengeführt. Sie können sich den Inode als DIE Datei vorstellen.
Inodes haben jedoch keine Dateinamen. Hier kommen Links ins Spiel.

Ein Link ist nur ein Zeiger auf einen Inode. Ein Verzeichnis ist ein Inode, der Links enthält. Jeder Dateiname in einem Verzeichnis ist nur ein Link zu einem Inode. Das Öffnen einer Datei in Unix erstellt ebenfalls einen Link, aber es ist eine andere Art von Link (es ist kein benannter Link).

Ein fester Link ist nur ein zusätzlicher Verzeichniseintrag, der auf diesen Inode zeigt. Wenn Sie ls -l , die Zahl nach den Berechtigungen ist die Anzahl der benannten Links. Die meisten regulären Dateien haben einen Link. Durch das Erstellen eines neuen Hardlinks zu einer Datei verweisen beide Dateinamen auf denselben Inode. Hinweis:

% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r--  1 danny  staff  0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
-rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3
            ^
            ^ this is the link count

Jetzt können Sie deutlich sehen, dass es so etwas wie einen festen Link nicht gibt. Ein fester Link ist dasselbe wie ein normaler Name. Im obigen Beispiel test oder test2 , was ist die Originaldatei und was ist der Hardlink? Am Ende können Sie es nicht wirklich sagen (auch nicht anhand von Zeitstempeln), da beide Namen auf denselben Inhalt verweisen, denselben Inode:

% ls -li test*  
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
14445892 -rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3

Das -i Flag zu ls zeigt Ihnen die Inode-Nummern am Anfang der Zeile. Beachten Sie, wie test und test2 dieselbe Inode-Nummer haben,
aber test3 hat eine andere.

Verwandt:Suchen Sie Dateien, für die mehrere Variationen dieses Dateinamens zusammen im selben Verzeichnis vorhanden sind?

Wenn Sie dies nun für Verzeichnisse tun dürften, könnten zwei verschiedene Verzeichnisse an verschiedenen Stellen im Dateisystem auf dasselbe verweisen. Tatsächlich könnte ein Unterverzeichnis auf sein Großelternelement zurückverweisen und eine Schleife erzeugen.

Warum ist diese Schleife ein Problem? Denn wenn Sie traversieren, gibt es keine Möglichkeit zu erkennen, dass Sie sich in einer Schleife befinden (ohne die Inode-Nummern zu verfolgen, während Sie traversieren). Stellen Sie sich vor, Sie schreiben den du Befehl, der die Unterverzeichnisse rekursiv durchlaufen muss, um die Festplattennutzung herauszufinden. Wie würde du wissen, wann es eine Schleife traf? Es ist fehleranfällig und viel Buchhaltung, die du tun müssten, nur um diese einfache Aufgabe zu erledigen.

Symlinks sind ein ganz anderes Biest, da sie eine spezielle Art von „Datei“ sind, der viele Dateisystem-APIs automatisch folgen. Beachten Sie, dass ein Symlink auf ein nicht vorhandenes Ziel verweisen kann, da er namentlich und nicht direkt auf einen Inode verweist. Dieses Konzept ergibt bei Hardlinks keinen Sinn, da die bloße Existenz eines „Hardlinks“ bedeutet, dass die Datei existiert.

Warum also kann du Umgang mit Symlinks einfach und nicht mit harten Links? Wir konnten oben sehen, dass Hardlinks nicht von normalen Verzeichniseinträgen zu unterscheiden sind. Symlinks sind jedoch speziell, erkennbar und überspringbar! du bemerkt, dass der Symlink ein Symlink ist, und überspringt ihn komplett!

% ls -l 
total 4
drwxr-xr-x  3 danny  staff  102 Oct 13 18:14 test1/
lrwxr-xr-x  1 danny  staff    5 Oct 13 18:13 [email protected] -> test1
% du -ah
242M    ./test1/bigfile
242M    ./test1
4.0K    ./test2
242M    .

Linux
  1. So erstellen Sie Soft- und Hardlinks in Linux

  2. Was sind Softlinks und Hardlinks im Linux-Dateisystem?

  3. Unterschied zwischen Softlinks und Hardlinks in Linux

  4. Warum sehe ich MSG_EOR für SOCK_SEQPACKET unter Linux nicht?

  5. Warum sind Makefiles in Linux so nützlich?

Ln-Befehl:So erstellen Sie symbolische Links in Linux

Ln-Befehl unter Linux (Symbolische Links erstellen)

Anleitung zum Hinzufügen symbolischer Linux-Links

Linux – Erstellen eines Duplikats eines Pfads in Unix?

Der ln-Befehl unter Linux:Soft- und Hardlinks erstellen

Softlinks in Linux – Die vollständige Referenz