Ich habe in Lehrbüchern gelesen, dass Unix / Linux keine festen Links zu Verzeichnissen zulässt, aber weiche Links zulässt. Liegt es daran, dass, wenn wir Zyklen haben und wenn wir feste Verknüpfungen erstellen und nach einiger Zeit die Originaldatei löschen, dies auf einen Abfallwert hinweist?
Wenn Zyklen der einzige Grund dafür waren, dass harte Links nicht zugelassen wurden, warum sind dann weiche Links zu Verzeichnissen zulässig?
filesystems
directory
symlink
hard-link
user3539
quelle
quelle
..
es gehen? Vor allem nach dem Entfernen des festen Links zu diesem Verzeichnis, in dem Verzeichnis, auf das von..
? Es muss irgendwo hinweisen...
muss auf keinem Laufwerk physisch vorhanden sein. Es ist ohnehin Aufgabe des Betriebssystems, das aktuelle Arbeitsverzeichnis im Auge zu behalten. Daher sollte es relativ einfach sein, auch eine Liste der Inodes zu führen, die mit jedem Prozess-cwd verknüpft sind, und auf diese zu verweisen, wenn eine Verwendung von festgestellt wird..
. Das würde natürlich bedeuten, dass Symlinks in diesem Sinne erstellt werden müssten, aber Sie müssen bereits darauf achten, Symlinks nicht zu beschädigen, und ich denke nicht, dass zusätzliche Regeln sie unbrauchbar machen würden.Antworten:
Dies ist nur eine schlechte Idee, da es keine Möglichkeit gibt, den Unterschied zwischen einem festen Link und einem ursprünglichen Namen zu erkennen.
Das Zulassen fester Verknüpfungen zu Verzeichnissen würde die gerichtete azyklische Graphstruktur des Dateisystems unterbrechen und möglicherweise Verzeichnisschleifen und baumelnde Verzeichnis-Teilbäume erzeugen, was dazu führen würde,
fsck
dass andere Dateibaumwanderer fehleranfällig werden.Lassen Sie uns zunächst über Inodes sprechen, um dies zu verstehen. Die Daten im Dateisystem werden in Blöcken auf der Festplatte gespeichert, und diese Blöcke werden von einem Inode zusammengefasst. Sie können sich die Inode als DIE Datei vorstellen. Inodes fehlen jedoch Dateinamen. Hier kommen Links ins Spiel.
Ein Link ist nur ein Zeiger auf eine Inode. Ein Verzeichnis ist eine Inode, die Links enthält. Jeder Dateiname in einem Verzeichnis ist nur eine Verknüpfung zu einer Inode. Beim Öffnen einer Datei in Unix wird auch ein Link erstellt, es handelt sich jedoch um eine andere Art von Link (es handelt sich nicht um einen benannten Link).
Ein fester Link ist nur ein zusätzlicher Verzeichniseintrag, der auf diese Inode verweist. Bei Ihnen entspricht
ls -l
die Zahl nach den Berechtigungen der Anzahl der benannten Links. Die meisten regulären Dateien haben einen Link. Wenn Sie eine neue feste Verknüpfung zu einer Datei erstellen, verweisen beide Dateinamen auf denselben Inode. Hinweis:Jetzt können Sie klar erkennen, dass es keine harte Verbindung gibt. Ein fester Link entspricht einem normalen Namen. Im obigen Beispiel
test
odertest2
, welches ist die Originaldatei und welches ist die feste Verbindung? Am Ende kann man es nicht wirklich sagen (auch nicht anhand von Zeitstempeln), da beide Namen auf denselben Inhalt verweisen, denselben Inode:Das
-i
Flagls
zeigt Ihnen Inode-Nummern am Anfang der Zeile. Beachten Sie, wietest
undtest2
haben die gleiche Inode-Nummer, abertest3
eine andere.Wenn Sie dies für Verzeichnisse tun könnten, könnten zwei verschiedene Verzeichnisse an verschiedenen Stellen im Dateisystem auf dasselbe verweisen. Tatsächlich könnte ein Unterverzeichnis auf seine Großeltern verweisen und eine Schleife erstellen.
Warum ist diese Schleife ein Problem? Denn wenn Sie überqueren, gibt es keine Möglichkeit zu erkennen, dass Sie sich in einer Schleife befinden (ohne die Inode-Nummern zu verfolgen, während Sie überqueren). Stellen Sie sich vor, Sie schreiben den
du
Befehl, der durch Unterverzeichnisse wiederholt werden muss, um Informationen zur Datenträgerverwendung zu erhalten. Wie würde esdu
wissen, wenn es eine Schleife traf? Es ist fehleranfällig und eine Menge Buchhaltungdu
müssten, nur um diese einfache Aufgabe zu erledigen.Symlinks sind eine ganz andere Bestie, da sie eine spezielle Art von "Datei" sind, der viele Dateisystem-APIs normalerweise automatisch folgen. Beachten Sie, dass ein Symlink auf ein nicht vorhandenes Ziel verweisen kann, da er auf einen Namen und nicht direkt auf einen Inode verweist. Dieses Konzept macht bei Hardlinks keinen Sinn, da das bloße Vorhandensein eines "Hardlinks" bedeutet, dass die Datei existiert.
Warum kann man
du
sich also leicht mit Symlinks und nicht mit harten Links befassen? Wir haben oben gesehen, dass harte Links nicht von normalen Verzeichniseinträgen zu unterscheiden sind. Symlinks sind jedoch speziell, erkennbar und überspringbar!du
stellt fest, dass der Symlink ein Symlink ist, und überspringt ihn vollständig!quelle
Allowing hard links to directories would break the directed acyclic graph structure of the filesystem
. Können Sie bitte mehr über das Problem mit Zyklen unter Verwendung von Hardlinks erklären? Warum ist es inMit Ausnahme der Mount - Punkte, jedes Verzeichnis hat einen und nur parent:
..
.Eine Möglichkeit
pwd
besteht darin, das Gerät zu überprüfen: inode auf '.' und '..'. Wenn sie identisch sind, haben Sie das Stammverzeichnis des Dateisystems erreicht. Suchen Sie andernfalls den Namen des aktuellen Verzeichnisses im übergeordneten Verzeichnis, verschieben Sie ihn auf einen Stapel, und vergleichen Sie '../.' mit '../ ..', dann '../../.' mit '../../ ..' usw. Sobald Sie die Wurzel erreicht haben, beginnen Sie, die Namen vom Stapel zu kopieren und auszudrucken. Dieser Algorithmus basiert auf der Tatsache, dass jedes Verzeichnis ein und nur ein übergeordnetes Verzeichnis hat.Wenn feste Verknüpfungen zu Verzeichnissen zulässig sind, auf welches der mehreren übergeordneten Elemente sollte der Verweis lauten
..
? Das ist ein zwingender Grund, warum Hardlinks zu Verzeichnissen nicht erlaubt sind.Symlinks zu Verzeichnissen verursachen dieses Problem nicht. Wenn ein Programm dies wünscht, kann es
lstat()
für jeden Teil des Pfadnamens ein Häkchen setzen und feststellen, wenn ein Symlink gefunden wird. Derpwd
Algorithmus gibt den wahren absoluten Pfadnamen für ein Zielverzeichnis zurück. Die Tatsache, dass es irgendwo einen Text gibt (den Symlink), der auf das Zielverzeichnis verweist, ist so ziemlich irrelevant. Das Vorhandensein eines solchen Symlinks erzeugt keine Schleife im Diagramm.quelle
..
eine Art virtuellen Hardlink zum übergeordneten Element vorstellen, gibt es keinen technischen Grund dafür, dass das Ziel des Links nur einen weiteren Link haben kann.pwd
Müsste nur einen anderen Algorithmus verwenden, um den Pfad aufzulösen.Sie können bind mount verwenden, um fest verknüpfte Verzeichnisse zu simulieren
quelle
Ich möchte noch einige Punkte zu dieser Frage hinzufügen. Harte Links für Verzeichnisse sind unter Linux erlaubt, jedoch auf eingeschränkte Weise.
Eine Möglichkeit, dies zu testen, besteht darin, den Inhalt eines Verzeichnisses aufzulisten und zwei spezielle Verzeichnisse zu finden "." und "..". Wie wir wissen "." verweist auf dasselbe Verzeichnis und ".." verweist auf das übergeordnete Verzeichnis.
Erstellen wir also einen Verzeichnisbaum, in dem "a" das übergeordnete Verzeichnis ist, dessen untergeordnetes Verzeichnis "b" ist.
Notieren Sie sich den Inode des Verzeichnisses "a". Und wenn wir ein
ls -la
from-Verzeichnis "a" machen, können wir das sehen. " Verzeichnis verweist auch auf den gleichen Inode.Und hier können wir feststellen, dass das Verzeichnis "a" drei feste Links hat. Dies liegt daran, dass die Inode 797358 drei Hardlinks im Namen von "." in "a" Verzeichnis und Name als ".." in Verzeichnis "b" und eines mit dem Namen "a" itslef.
Hier können wir verstehen, dass Hardlinks nur für Verzeichnisse vorhanden sind, die eine Verbindung zu ihren übergeordneten und untergeordneten Verzeichnissen herstellen. Und so hat ein Verzeichnis ohne ein Kind nur zwei Hardlinks, und so hat das Verzeichnis "b" nur zwei Hardlinks.
Ein Grund, warum das feste Verknüpfen von Verzeichnissen frei verhindert wurde, wäre, unendliche Referenzschleifen zu vermeiden, die Programme verwirren, die das Dateisystem durchlaufen.
Da das Dateisystem als Baum organisiert ist und der Baum keinen zyklischen Bezug haben kann, sollte dies vermieden werden.
quelle
Keiner der folgenden Gründe ist der wahre Grund dafür, harte Links zu Verzeichnissen zu verbieten. Jedes Problem ist ziemlich einfach zu lösen:
Der eigentliche Grund (wie von @ Thorbjørn Ravn Andersen angedeutet) liegt darin, dass Sie ein Verzeichnis mit mehreren übergeordneten Elementen aus dem Verzeichnis löschen , auf das durch Folgendes verwiesen wird
..
:Worauf sollte
..
jetzt hingewiesen werden?Wenn das Verzeichnis aus dem übergeordneten Verzeichnis gelöscht wird, die Anzahl der Verknüpfungen jedoch immer noch größer
0
ist, muss irgendwo noch etwas darauf verweisen. Sie können nicht..
auf nichts zeigen lassen; Viele Programme sind darauf angewiesen..
, sodass das System das gesamte Dateisystem durchlaufen muss , bis es das erste findet, das auf das gelöschte Verzeichnis verweist, um es zu aktualisieren..
. Entweder das, oder das Dateisystem müsste eine Liste aller Verzeichnisse führen, die auf ein fest verknüpftes Verzeichnis verweisen.In jedem Fall wäre dies ein Mehraufwand für die Leistung und eine zusätzliche Komplikation für die Metadaten und / oder den Code des Dateisystems, sodass die Designer beschlossen, dies nicht zuzulassen.
quelle
..
) löschen , aktualisieren Sie..
, um auf eines der anderen Elternteile in der Liste zu verweisen.a/..
was immer bedeuten würde.
. So funktionieren URLs übrigens. Es ist der Browser, der ".." auflöst, bevor er überhaupt auf den Server gelangt. Und es funktioniert großartig.Die Erstellung von Hardlinks in Verzeichnissen ist nicht umkehrbar. Angenommen, wir haben:
Ich verbinde es mit
/dir2
./dir2
Enthält also jetzt auch alle diese Dateien und VerzeichnisseWas ist, wenn ich es mir anders überlege? Ich kann nicht nur
rmdir /dir2
(weil es nicht leer ist)Und wenn ich rekursiv lösche
/dir2
... wird es auch von gelöscht/dir1
!IMHO ist es ein weitgehend ausreichender Grund, dies zu vermeiden!
Bearbeiten:
In den Kommentaren wird empfohlen, das Verzeichnis zu entfernen, indem Sie dies tun
rm
. Aberrm
auf einem nicht leeren Verzeichnis schlägt fehl, und dieses Verhalten muss bestehen bleiben, egal ob das Verzeichnis fest verbunden ist oder nicht. Man kann es also nicht einfachrm
trennen. Es würde ein neues Argument erfordernrm
, um nur zu sagen "Wenn der Verzeichnis-Inode einen Referenzzähler> 1 hat, dann wird nur die Verknüpfung des Verzeichnisses aufgehoben".Das wiederum verstößt gegen ein anderes Prinzip, das am wenigsten überrascht: Das Entfernen eines soeben erstellten Verzeichnis-Hardlinks ist nicht dasselbe wie das Entfernen eines normalen Datei-Hardlinks ...
Ich werde meinen Satz umformulieren: Ohne weitere Entwicklung wäre die Erstellung von Hardlinks nicht umkehrbar (da kein aktueller Befehl die Entfernung bewältigen könnte, ohne mit dem aktuellen Verhalten inkohärent zu sein).
Wenn wir mehr Entwicklung erlauben, um den Fall, die Anzahl der Fallstricke und das Risiko von Datenverlusten zu bewältigen, wenn Sie sich nicht genug darüber im Klaren sind, wie das System funktioniert, ist eine solche Entwicklung meiner Meinung nach ein ausreichender Grund, das Hardlinking für Verzeichnisse einzuschränken.
quelle
rm
, was darunter liegt (Unlink). Siehe: unix.stackexchange.com/questions/151951/… Dies ist wirklich kein Problem, genauso wenig wie bei fest verknüpften Dateien. Durch das Aufheben der Verknüpfung wird lediglich die angegebene Referenz entfernt und die Anzahl der Verknüpfungen verringert. Die Tatsache, dassrmdir
nicht leere Verzeichnisse nicht gelöscht werden, ist irrelevant - das würde es auch nicht tundir1
. Hardlinks sind keine Kopien von Daten, sondern die gleiche Datei. Wenn Sie also die Datei dir2 löschen, wird die Verzeichnisliste für dir1 gelöscht. Sie müssten immer die Verbindung trennen.rm
in einem Verzeichnis nicht aufgehoben wird, wenn es nicht leer ist. Siehe Bearbeiten.Das ist eine gute Erklärung. Zu "Auf welches der mehreren Elternteile soll .. hingewiesen werden?" Eine Lösung wäre, wenn ein Prozess seinen vollständigen Pfad beibehalten würde, entweder als Inodes oder als String. Inodes wären robuster, da Namen geändert werden können. Zumindest in früheren Zeiten gab es für jede geöffnete Datei einen In-Core-Inode, der beim Öffnen einer Datei inkrementiert und beim Schließen dekrementiert wurde. Wenn es Null erreichte und der Speicherplatz, auf den es zeigte, freigegeben wurde. Wenn die Datei von niemandem mehr geöffnet wurde, wurde sie (die In-Core-Kopie) aufgegeben. Auf diese Weise wird der Pfad als gültig beibehalten, wenn ein anderer Prozess ein Verzeichnis in ein anderes Verzeichnis verschoben hat, während sich das Unterverzeichnis im Pfad eines anderen Prozesses befand. Ähnlich wie Sie eine geöffnete Datei löschen können, diese jedoch einfach aus dem Verzeichnis entfernt wird,
Hardlinking-Verzeichnisse waren in Bell Labs UNIX (mindestens V6 und V7) bisher frei zulässig. Sie wissen nichts über Berkeley oder höher. Keine Flagge erforderlich. Könnten Sie Schleifen machen? Ja, mach das nicht. Es ist sehr klar, was Sie tun, wenn Sie eine Schleife machen. Nether sollten Sie Knotenknüpfen üben, während Sie darauf warten, dass Sie an der Reihe sind, aus einem Flugzeug zu springen, wenn Sie das andere Ende bequem an einem Haken am Schott hängen.
Was ich heute damit machen wollte, war, lhome fest mit home zu verknüpfen, damit ich / home / administ zur Verfügung haben konnte, unabhängig davon, ob / home mit einem automout über home verdeckt war oder nicht, wobei dieser automount einen Symlink namens administ zu / lhome hatte / administ. Auf diese Weise kann ich ein Administratorkonto einrichten, das unabhängig vom Status meines primären Home-Dateisystems funktioniert. Das IST ein Experiment für Linux, aber ich denke , zu einer Zeit für den UCB basierten SunOS gelernt , dass Autoaktivierungen auf der ASCII - String - Ebene getan werden. Es ist schwer zu erkennen, wie sie sonst als Schicht über einem beliebigen FS ausgeführt werden könnten.
Ich habe das woanders gelesen. und .. sind auch keine Dateien mehr im Verzeichnis. Ich bin sicher, dass es dafür gute Gründe gibt und dass vieles, was uns Spaß macht (wie zum Beispiel die Möglichkeit, NTFS zu mounten), aufgrund solcher Dinge möglich ist, aber ein Teil der Eleganz von UNIX lag in der Implementierung. Es sind die Vorteile wie Allgemeingültigkeit und Formbarkeit, die diese Eleganz ermöglichten, dass es so robust ist und vier Jahrzehnte lang Bestand hat. Wenn wir die eleganten Implementierungen verlieren, wird es irgendwann wie Windows (ich hoffe, ich irre mich!). Jemand würde dann ein neues Betriebssystem erstellen, das auf eleganten Prinzipien basiert. Etwas zum Nachdenken. Vielleicht irre ich mich, ich bin (offensichtlich) nicht mit der aktuellen Implementierung vertraut. Es ist erstaunlich, wie gut 30 Jahre altes Verständnis auf Linux zutrifft ... die meiste Zeit!
quelle
.
und..
sind nicht in harten Links Datei-System für moderne Dateisysteme. Der Dateisystemtreiber fälscht sie jedoch. Es ist dieses Dateisystem, das das feste Verknüpfen von Verzeichnissen stoppt. Für alte Dateisysteme war es möglich (aber gefährlich). Zu tun , was Sie versuchen, buchenmount --bind
, auchmount --make…
und vielleicht Container.Nach meinem Dafürhalten ist der Hauptgrund, dass es nützlich ist, Verzeichnisnamen ändern zu können, ohne laufende Programme zu beschädigen, die ihr Arbeitsverzeichnis verwenden, um auf andere Dateien zu verweisen. Angenommen, Sie haben Wine zum Ausführen verwendet
~/.newwineprefix/drive_c/Program Files/Firefox/Firefox.exe
und möchten~/.wine
stattdessen das gesamte Präfix auf verschieben . Wenn Firefox aus irgendeinem Grunddrive_c/windows
unter Bezugnahme auf zugegriffen hat , behält das../../windows
Umbenennen~/.newwineprefix
von..
Pausenimplementierungen das übergeordnete Verzeichnis als Textzeichenfolge anstelle einer Inode bei.Das Speichern des Inodes eines einzelnen übergeordneten Verzeichnisses muss einfacher sein als der Versuch, jeden Pfad sowohl als Textzeichenfolge als auch als Reihe von Inodes zu verfolgen.
Ein weiterer Grund ist, dass fehlerhafte Anwendungen möglicherweise Schleifen erstellen können. Verhaltensanwendungen sollten in der Lage sein, zu überprüfen, ob der Inode des Verzeichnisses, in das verschoben wird, mit dem Inode eines der verschachtelten Verzeichnisse identisch ist, so wie Sie ein Verzeichnis nicht in sich selbst verschieben können, dies wird jedoch möglicherweise nicht erzwungen auf Dateisystemebene.
Ein weiterer Grund könnte sein, dass Sie, wenn Sie Verzeichnisse fest verknüpfen könnten, verhindern möchten, dass ein Verzeichnis fest verknüpft wird, das Sie nicht ändern können.
find
Aus Sicherheitsgründen werden Dateien, die von anderen Benutzern erstellt wurden, aus temporären Verzeichnissen gelöscht. Dies kann zu Problemen führen, wenn ein Benutzer ein reales Verzeichnis für einen Symlink wechselt, währendfind
er einen anderen Befehl aufruft. Die Möglichkeit, wichtige Verzeichnisse fest zu verknüpfen, würde einen Administrator zwingen, zusätzliche Tests hinzuzufügenfind
, um deren Beeinträchtigung zu vermeiden. (Ok, Sie können dies für Dateien bereits nicht tun, daher ist dieser Grund ungültig.)Ein weiterer Grund ist, dass das Speichern des Inodes des übergeordneten Verzeichnisses im Falle einer Beschädigung oder Beschädigung des Dateisystems zusätzliche Redundanz bieten kann. Wenn Sie
..
alle übergeordneten Verzeichnisse auflisten möchten, die einen Hardlink zu diesem Verzeichnis haben, so dass ein anderes, willkürliches übergeordnetes Verzeichnis leicht gefunden werden kann, wenn das aktuelle Verzeichnis einen Delink aufweist Dateisystem speichert und verwendet Inodes. Wenn Programme Pfade als eine (für jeden Hardlink eindeutige) Reihe von Verzeichnis-Inodes behandeln, wird dies vermieden, aber im Falle einer Beschädigung des Dateisystems wird die Redundanz nicht erreicht.quelle