Warum sind harte Links für Verzeichnisse nicht erlaubt?

129

Ich benutze Ubuntu 12.04. Wenn ich versuche, einen festen Link für ein Verzeichnis zu erstellen, schlägt dies fehl. Ich kann feste Verknüpfungen für Dateien innerhalb der Dateisystemgrenzen erstellen. Ich kenne den Grund, warum wir keine Hardlinks für Dateien außerhalb des Dateisystems erstellen können.

Ich habe diese Befehle ausprobiert:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Ich möchte nur den Grund dafür wissen. Ist es für alle GNU / Linux-Distributionen und Unix-Versionen (BSD, Solaris, HP-UX, IBM AIX) gleich oder nur für Ubuntu oder Linux?

Nischay
quelle
2
Versuchen Sie es ln -F <src> <dst>und es könnte funktionieren. In älteren Unix-Versionen funktionierte es natürlich auch für den Superuser. Weiß noch jemand, ob das UCB oder System V war? Ja, schlimme Dinge könnten passieren, aber normalerweise nicht. Soweit ich mich erinnere, rmdirwusste ich nicht , dass ich nach einem harten Link weiter löschen musste. Benutzer könnten jedoch verwirrt werden und fehlerhafte Elemente löschen.
Steve Pitchers
@StevePitchers Wie kann ich rmdirmit harten Links umgehen? Eine harte Verbindung ist nur eine normale Verbindung - aber eine zusätzliche. Es ist nicht einmal einfach herauszufinden, ob es ungewöhnliche zusätzliche Links ohne zusätzliche Aufzeichnungen gibt.
Volker Siegel
1
Jeder Knoten speichert die Anzahl der Hardlinks, die darauf verweisen: Der Inhalt wird erst freigegeben, wenn keine Links mehr vorhanden sind. So rmdirkann man feststellen, ob das Verzeichnis Links von anderen Orten hat. Das rekursive Entfernen rm -rmuss sorgfältig codiert werden, um sicherzustellen, dass es auch dann korrekt funktioniert, wenn Fehler wie "Berechtigung verweigert" auftreten. Übrigens, UCB = BSD, doh!
Steve Pitchers
2
Ich habe ln -FVerzeichnisse durchgearbeitet und habe es funktionieren lassen. Sie wagen es jedoch nicht, das Verzeichnis nachträglich zu löschen, da Sie befürchten, das Dateisystem zu beschädigen.
Edward Falk

Antworten:

159

Verzeichnis-Hardlinks können das Dateisystem auf verschiedene Arten beschädigen

Sie ermöglichen es Ihnen, Loops zu erstellen

Eine feste Verknüpfung zu einem Verzeichnis kann eine Verknüpfung zu einem übergeordneten Element von sich selbst herstellen, wodurch eine Dateisystemschleife erstellt wird. Diese Befehle könnten beispielsweise eine Schleife mit dem Backlink erstellen l:

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Ein Dateisystem mit einer Verzeichnisschleife hat eine unendliche Tiefe:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Das Vermeiden einer Endlosschleife beim Durchlaufen einer solchen Verzeichnisstruktur ist etwas schwierig (obwohl POSIX finddies beispielsweise vermeiden muss).

Ein Dateisystem mit einer solchen festen Verknüpfung ist kein Baum mehr, da ein Baum definitionsgemäß keine Schleife enthalten darf.

Sie unterbrechen die Eindeutigkeit der übergeordneten Verzeichnisse

Bei einer Dateisystemschleife existieren mehrere übergeordnete Verzeichnisse:

cd /tmp/a/b
cd /tmp/a/b/l/b

Im ersten Fall /tmp/aist das übergeordnete Verzeichnis von /tmp/a/b.
Im zweiten Fall /tmp/a/b/list das übergeordnete Verzeichnis von /tmp/a/b/l/bdasselbe wie /tmp/a/b.
Es hat also zwei übergeordnete Verzeichnisse.

Sie multiplizieren Dateien

Dateien werden nach dem Auflösen von Symlinks durch Pfade identifiziert. Damit

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

sind verschiedene Dateien.
Es gibt unendlich viele weitere Pfade der Datei. Sie sind natürlich in Bezug auf ihre Inode-Nummer gleich. Wenn Sie jedoch keine expliziten Schleifen erwarten, gibt es keinen Grund, dies zu überprüfen.

Ein Verzeichnis-Hardlink kann auch auf ein untergeordnetes Verzeichnis oder ein Verzeichnis verweisen, das weder untergeordnet noch übergeordnet ist. In diesem Fall wird eine Datei, die dem Link untergeordnet ist, in zwei Dateien repliziert, die durch zwei Pfade gekennzeichnet sind.

Dein Beispiel

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Wie können Softlinks zu Verzeichnissen funktionieren?

Ein Pfad, der Softlinks und sogar Softlink-Verzeichnisschleifen enthalten kann, wird häufig nur zum Identifizieren und Öffnen einer Datei verwendet. Es kann als normaler linearer Pfad verwendet werden.

Es gibt jedoch auch andere Situationen, in denen Pfade zum Vergleichen von Dateien verwendet werden. In diesem Fall können symbolische Verknüpfungen im Pfad zuerst aufgelöst und in eine minimale und gemeinsam vereinbarte Darstellung umgewandelt werden, um einen kanonischen Pfad zu erstellen :

Dies ist möglich, da die Softlinks alle zu Pfaden ohne Link erweitert werden können. Nachdem dies mit allen Softlinks in einem Pfad durchgeführt wurde, ist der verbleibende Pfad Teil eines Baums, in dem ein Pfad immer eindeutig ist.

Der Befehl readlinkkann einen Pfad in seinen kanonischen Pfad auflösen:

$ readlink -f /some/symlinked/path

Softlinks unterscheiden sich von dem, was das Dateisystem verwendet

Ein Softlink kann nicht alle Probleme verursachen, da er sich von den Links im Dateisystem unterscheidet. Es kann von Hardlinks unterschieden und bei Bedarf in einen Pfad ohne Symlinks aufgelöst werden.
In gewisser Weise ändert das Hinzufügen von Symlinks nicht die grundlegende Dateisystemstruktur, sondern behält sie bei, fügt jedoch eine strukturiertere Struktur wie eine Anwendungsebene hinzu.


Von man readlink:

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]
Volker Siegel
quelle
1
Warum kann ein Softlink das alles nicht?
Tanay
1
@ Tanay Richtig, es könnte der Erweiterung helfen, es mit ähnlichen Fällen mit weichen Links zu vergleichen. Ich werde es versuchen.
Volker Siegel
Genau wie betrifft das nur Verzeichnisse? So wie ich es verstehe, sind diese Probleme auch ein Problem für fest verknüpfte Dateien. Darüber hinaus sehe ich in der Verknüpfung eine einfache Möglichkeit, die Berechtigung eines bestimmten Verzeichnisses so zu ändern, dass andere darin zugelassen werden, ohne dass sie auch in der übergeordneten Kette zugelassen werden müssen. Klingt sehr nützlich, wenn Sie nicht in der Lage sind, Gruppen hinzuzufügen / zu ändern ...
inetknght
Gute Antwort, aber wie hat Apple diese Probleme für Time Machine gelöst?
Damien
Hört sich sehr interessant an! Aber ich weiß nichts darüber, worum es geht - können Sie mir einen Hinweis geben?
Volker Siegel
77

"Sie sollten sowieso keine festen Links verwenden" ist zu weit gefasst. Sie müssen den Unterschied zwischen festen und symbolischen Links verstehen und diese entsprechend verwenden. Jedes hat seine eigenen Vor- und Nachteile:

Symlinks können:

  • Zeigen Sie auf Verzeichnisse
  • Zeigen Sie auf nicht vorhandene Objekte
  • Zeigen Sie auf Dateien und Verzeichnisse außerhalb desselben Dateisystems

Harte Links können:

  • Verhindern Sie, dass die Datei, auf die sie verweisen, gelöscht wird

Harte Links sind besonders nützlich, wenn Sie Anwendungen ausführen, die beim Schreiben kopiert werden. Mit ihnen können Sie eine Sicherungskopie einer Verzeichnisstruktur aufbewahren und dabei nur Speicherplatz für die Dateien verwenden, die zwischen zwei Versionen wechseln.

Der Befehl cp -alist in dieser Hinsicht besonders nützlich. Es wird eine vollständige Kopie einer Verzeichnisstruktur erstellt, in der alle Dateien durch feste Links zu den Originaldateien dargestellt werden. Anschließend können Sie Dateien in der Struktur aktualisieren. Nur die von Ihnen aktualisierten Dateien belegen zusätzlichen Speicherplatz. Dies ist besonders nützlich, wenn Sie Backups mit mehreren Generationen verwalten.

user133232
quelle
41
den letzten Absatz in Bezug auf , wenn Sie bearbeiten „kopiert“ hardlinked Datei, wird die ursprüngliche Datei auch geändert - siehe unix.stackexchange.com/questions/70531/...
marcin
32
Diese Beschreibung von Hardlinks ist eher irreführend. Es ist im Grunde genommen richtig, dass Hardlinks "verhindern, dass die Datei, auf die sie verweisen, gelöscht wird", aber das ist nur ein Nebeneffekt von Hardlinks. Es ist sicherlich NICHT wahr, dass Sie Hardlinks in einem Verzeichnis erstellen, die "ursprüngliche" Datei ändern und dann erwarten können, dass die Hardlinks irgendwie auf den alten Inhalt verweisen. Tatsächlich ist die Richtschnur für harte Links die Tatsache, dass es sich überhaupt nicht um einen Link handelt, zumindest nicht mehr als um die ursprüngliche "Datei", die nur ein Name ist, der auf eine Datei verweist. Ein fester Link ist einfach ein anderer Name, der auf dieselbe Datei verweist.
Matty
7
Die Sicherungsidee ist gut und ich benutze sie tatsächlich häufig, aber ich denke, Benutzer sollten gewarnt werden, dass das Ändern einer Datei auch die Sicherung verändert.
Mark
3
Ein Symlink muss auf gar nichts verweisen. ln -s "Don't use this directory" READMEist legitim. Wenn Sie darüber nachdenken, kann ein Verzeichnis tatsächlich als relationale Datenbank verwendet werden und enthält überhaupt keine tatsächlichen Dateien.
Edward Falk
5
-1 Dies beantwortet die Frage nicht und einige Informationen sind einfach falsch.
wjandrea
43

Zu Ihrer Information, mit mount können Sie dasselbe erreichen wie mit harten Links für Verzeichnisse:

mount -t bind /var/www /home/user/workspace/www

Dies ist sehr gefährlich, da die meisten Tools und Programme die Bindung nicht kennen . Ich habe mal so etwas wie im obigen Beispiel gemacht und bin dann weitergegangen rm -rf /home/user. Zum Glück gab es nichts Relevantes in /var/www.

Stackount
quelle
6
Ich habe benutzt mount --bind <src> <dest>. Vorsichtig verwenden, um das src;)
kachar
1
Ich bekomme:mount: unknown filesystem type 'bind'
Wizek
4
auf Busybox, es istmount -o bind src dest
Mat M
@ MatM dasselbe mit Debian
Hanshenrik
2
Wenn Sie nur zum Lesen bereitstellen müssen, können Sie Berechtigungen für den Bereitstellungspunkt festlegen und das rm -rfProblem vermeiden . superuser.com/questions/320415/...
zanerock
19

Der Grund, warum das Verknüpfen von Verzeichnissen nicht erlaubt ist, ist ein wenig technisch. Im Wesentlichen brechen sie die Dateisystemstruktur . Sie sollten im Allgemeinen sowieso keine festen Links verwenden. Symbolische Links ermöglichen den größten Teil der gleichen Funktionalität, ohne Probleme zu verursachen (z ln -s target link. B. ).

Astex
quelle
17
Harte Links haben gute Anwendungsfälle. Zu sagen, Sie sollten sie im Allgemeinen nicht verwenden, ist etwas zu weit gefasst.
Sander Steffann
4
+2 für die Bereitstellung des Links, der die Frage des OP (und meiner) tatsächlich beantwortet, -1 für die Abgabe einer Stellungnahme ("Sie sollten im Allgemeinen sowieso keine festen Links verwenden" - wenn Links vorhanden wären, die dies unterstützen, wäre dies in Ordnung). Was gut war, weil ich sowieso keine +2 geben kann. ; D
msb
3
Der Link "Sie brechen die Dateisystemstruktur" funktioniert nicht.
Charlie Parker
5
Versuchen Sie, den Inhalt des Links in der Antwort zusammenzufassen, und behalten Sie den Link als Referenz bei. Dies ist eine bewährte Methode für den Austausch von Stapeln, um das Verrotten von Links zu vermeiden.
Oxwivi
3
gut gemacht @CharlieParker; bester unbeabsichtigter (?) ironischer Kommentar aller Zeiten :)
Eliran Malka