Kürzlich wurde ich während eines Vorstellungsgesprächs danach gefragt. Ich war ehrlich und sagte, ich wüsste, wie sich eine symbolische Verknüpfung verhält und wie man eine erstellt, verstehe aber nicht die Verwendung einer harten Verknüpfung und wie sie sich von einer symbolischen unterscheidet.
768
Antworten:
Unter dem Dateisystem werden Dateien durch Inodes dargestellt. (Oder sind es mehrere Inodes? Nicht sicher.)
Eine Datei im Dateisystem ist im Grunde eine Verknüpfung zu einem Inode.
Ein fester Link erstellt dann einfach eine andere Datei mit einem Link zu demselben zugrunde liegenden Inode.
Wenn Sie eine Datei löschen, wird ein Link zum zugrunde liegenden Inode entfernt. Der Inode wird nur gelöscht (oder löschbar / überschreibbar), wenn alle Links zum Inode gelöscht wurden.
Ein symbolischer Link ist ein Link zu einem anderen Namen im Dateisystem.
Sobald eine feste Verbindung hergestellt wurde, erfolgt die Verknüpfung zum Inode. Das Löschen, Umbenennen oder Verschieben der Originaldatei wirkt sich nicht auf den Hardlink aus, da dieser mit dem zugrunde liegenden Inode verknüpft ist. Alle Änderungen an den Daten auf dem Inode werden in allen Dateien wiedergegeben, die auf diesen Inode verweisen.
Hinweis: Hardlinks sind nur innerhalb desselben Dateisystems gültig. Symbolische Links können sich über Dateisysteme erstrecken, da sie einfach der Name einer anderen Datei sind.
quelle
Eine nette Intuition, die helfen könnte, wenn man eine Linux (ish) Konsole verwendet.
Erstellen Sie zwei Dateien:
Geben Sie einige Daten ein:
(Eigentlich hätte ich Echo verwenden können, da es die Dateien erstellt, wenn sie nicht existieren ... aber das macht nichts.)
Und wie erwartet:
Lassen Sie uns harte und weiche Links erstellen:
Mal sehen, was gerade passiert ist:
Das Ändern des Namens von foo spielt keine Rolle:
foo-hard zeigt auf den Inode, den Inhalt, der Datei - das wurde nicht geändert.
Der Inhalt der Datei konnte nicht gefunden werden, da der Softlink auf den Namen verweist, der geändert wurde, und nicht auf den Inhalt.
Ebenso Wenn
foo
gelöscht,foo-hard
hält immer noch den Inhalt; Wennbar
gelöscht,bar-soft
handelt es sich nur um einen Link zu einer nicht vorhandenen Datei.quelle
touch blah1; touch blah2
kann verkürzt werden auftouch blah1 blah2
Ein Bild sagt mehr als tausend Worte. So visualisiere ich es:
So kommen wir zu diesem Bild:
Erstellen Sie
myfile.txt
im Dateisystem einen Namen, der auf einen neuen Inode verweist (der die Metadaten für die Datei enthält und auf die Datenblöcke verweist, die den Inhalt enthalten, dh den Text "Hello, World!":Erstellen Sie einen festen Link
my-hard-link
zur Dateimyfile.txt
. Dies bedeutet "Erstellen Sie eine Datei, die auf denselben Inode verweisen soll, auf den verwiesen wirdmyfile.txt
":Erstellen Sie einen Softlink
my-soft-link
zur Dateimyfile.txt
, dh "Erstellen Sie eine Datei, die auf die Datei verweisen sollmyfile.txt
":Schauen Sie, was jetzt passiert, wenn
myfile.txt
es gelöscht (oder verschoben) wird: zeigtmy-hard-link
immer noch auf denselben Inhalt und ist daher nicht betroffen, währendmy-soft-link
jetzt auf nichts zeigt. Andere Antworten diskutieren die Vor- und Nachteile der einzelnen.quelle
myfile.txt
). Für den Softlink ist seine Referenz nicht der Inode (der die Daten enthält), sondern seine Referenz ist der Dateisystempfad zumyfile.txt
(z. B./home/Documents/myfile.txt
)Harte Links sind nützlich, wenn die Originaldatei verschoben wird. Verschieben Sie beispielsweise eine Datei von / bin nach / usr / bin oder nach / usr / local / bin. Jeder Symlink zu der Datei in / bin würde dadurch unterbrochen, aber ein Hardlink, der ein Link direkt zum Inode für die Datei ist, wäre egal.
Feste Links benötigen möglicherweise weniger Speicherplatz, da sie nur einen Verzeichniseintrag belegen, während ein Symlink einen eigenen Inode benötigt, um den Namen zu speichern, auf den er verweist.
Die Auflösung von Hardlinks nimmt auch weniger Zeit in Anspruch - Symlinks können auf andere Symlinks verweisen, die sich in Symlink-Verzeichnissen befinden. Einige davon können sich auf NFS oder anderen Dateisystemen mit hoher Latenz befinden und daher zu einer Auflösung des Netzwerkverkehrs führen. Hardlinks, die sich immer im selben Dateisystem befinden, werden immer in einer einzigen Suche aufgelöst und beinhalten keine Netzwerklatenz (wenn es sich um einen Hardlink in einem NFS-Dateisystem handelt, übernimmt der NFS-Server die Auflösung und ist für ihn unsichtbar das Client-System). Manchmal ist das wichtig. Nicht für mich, aber ich kann mir Hochleistungssysteme vorstellen, bei denen dies wichtig sein könnte.
Ich denke auch, dass Dinge wie mmap (2) und sogar open (2) die gleiche Funktionalität wie Hardlinks verwenden, um den Inode einer Datei aktiv zu halten. und erst wenn der Prozess geschlossen ist, verschwindet die Datei wirklich. Dies ermöglicht viel sicherere temporäre Dateien (wenn Sie das Öffnen und Aufheben der Verknüpfung atomar durchführen können, für die es möglicherweise eine POSIX-API gibt, an die ich mich nicht erinnere, dann haben Sie wirklich eine sichere temporäre Datei), in der Sie lesen / schreiben können Ihre Daten, ohne dass jemand darauf zugreifen kann. Nun, das war wahr, bevor / proc jedem die Möglichkeit gab, sich Ihre Dateideskriptoren anzusehen, aber das ist eine andere Geschichte.
Apropos, bei der Wiederherstellung einer Datei, die in Prozess A geöffnet, aber im Dateisystem nicht verknüpft ist, werden Hardlinks verwendet, um die Inode-Links neu zu erstellen, damit die Datei nicht verschwindet, wenn der Prozess, in dem sie geöffnet ist, sie schließt oder verschwindet.
quelle
Soft Link :
Soft oder Symbolic ist eher eine Verknüpfung zur Originaldatei. Wenn Sie das Original löschen, schlägt die Verknüpfung fehl und wenn Sie nur die Verknüpfung löschen, passiert nichts mit dem Original.
Softlink-Syntax :
ln -s Pathof_Target_file link
Ausgabe :
link -> ./Target_file
Beweis:
readlink link
Auch in derls -l link
Ausgabe sehen Sie den ersten Buchstabenlrwxrwxrwx
als l, was darauf hinweist, dass die Datei ein Softlink ist.Link löschen:
unlink link
Hinweis: Wenn Sie möchten, kann Ihr Softlink auch funktionieren, nachdem Sie ihn aus dem aktuellen Verzeichnis an einen anderen Ort verschoben haben. Stellen Sie sicher, dass Sie beim Erstellen eines Softlinks einen absoluten Pfad und keinen relativen Pfad angeben. dh (ab / root / user / Target_file und nicht ./Target_file)
Harte Verbindung:
Hard Link ist eher eine Spiegelkopie oder mehrere Pfade zu derselben Datei. Wenn Sie etwas mit Datei1 tun, wird es in Datei 2 angezeigt. Wenn Sie eine löschen, bleibt die andere in Ordnung.
Der Inode (oder die Datei) wird nur gelöscht, wenn alle (festen) Links oder alle Pfade zum Inode (dieselbe Datei) gelöscht wurden.
Sobald ein fester Link hergestellt wurde, hat der Link den Inode der Originaldatei. Das Löschen des Umbenennens oder Verschiebens der Originaldatei wirkt sich nicht auf den festen Link aus, da dieser mit dem zugrunde liegenden Inode verknüpft ist. Alle Änderungen an den Daten auf dem Inode werden in allen Dateien wiedergegeben, die auf diesen Inode verweisen.
Hard Link-Syntax :
ln Target_file link
Ausgabe: Eine Datei mit Namensverknüpfung wird mit derselben Inode-Nummer wie Targetfile erstellt.
Beweis:
ls -i link Target_file
(überprüfen Sie ihre Inodes)Löschen des Links:
rm -f link
(Löschen Sie den Link wie eine normale Datei)Hinweis : Symbolische Links können sich über Dateisysteme erstrecken, da sie einfach der Name einer anderen Datei sind. Während Hardlinks nur innerhalb desselben Dateisystems gültig sind.
Symbolische Links haben einige Funktionen, bei denen harte Links fehlen:
Sie wissen sofort, wohin ein symbolischer Link verweist, während Sie mit festen Links das gesamte Dateisystem durchsuchen müssen, um Dateien zu finden, die denselben Inode verwenden.
# find / -inum 517333
Hardlinks können nicht auf Verzeichnisse verweisen.
Die Hardlinks haben zwei Einschränkungen:
quelle
Ein einfacher Weg, um den Unterschied zwischen einer harten und einer symbolischen Verbindung zu erkennen, ist ein einfaches Beispiel. Ein fester Link zu einer Datei verweist auf den Ort, an dem die Datei gespeichert ist, oder auf den Inode dieser Datei. Ein symbolischer Link verweist auf die eigentliche Datei.
Wenn wir also eine Datei mit dem Namen "a" haben und einen festen Link "b" und einen symbolischen Link "c" erstellen, die sich alle auf die Datei "a" beziehen:
Die Ausgabe von "a", "b" und "c" lautet:
Entfernen wir nun die Datei "a" und sehen, was mit der Ausgabe von "a", "b" und "c" passiert:
Also was ist passiert?
Da die Datei "c" auf die Datei "a" selbst zeigt, hat die Datei "c" nichts zu verweisen, wenn die Datei "a" gelöscht wird. Tatsächlich wird sie auch gelöscht.
Die Datei "b" zeigt jedoch auf den Speicherort oder den Inode der Datei "a". Wenn also die Datei "a" gelöscht wird, zeigt sie nicht mehr auf den Inode, aber da die Datei "b" dies tut, speichert der Inode weiterhin den Inhalt von "a", bis keine festen Links mehr darauf verweisen.
quelle
Symbolische Links verweisen auf einen Pfadnamen. Dies kann sich an einer beliebigen Stelle im Dateibaum eines Systems befinden und muss nicht einmal vorhanden sein, wenn der Link erstellt wird. Der Zielpfad kann relativ oder absolut sein.
Hardlinks sind zusätzliche Zeiger auf einen Inode, dh sie können nur auf demselben Volume wie das Ziel vorhanden sein. Zusätzliche feste Links zu einer Datei sind nicht von dem "ursprünglichen" Namen zu unterscheiden, der zum Verweisen auf eine Datei verwendet wird.
quelle
Ich würde Sie auf Wikipedia verweisen:
Ein paar Punkte:
quelle
Harte Links sind sehr nützlich, wenn Sie inkrementelle Sicherungen durchführen. Siehe zum Beispiel rsnapshot . Die Idee ist, mit festen Links zu kopieren:
Die neue Sicherung nimmt außer den von Ihnen vorgenommenen Änderungen keinen zusätzlichen Speicherplatz ein, da alle inkrementellen Sicherungen auf denselben Satz von Inodes für Dateien verweisen, die sich nicht geändert haben.
quelle
Hard Link Vs Soft Link kann durch dieses Bild leicht erklärt werden.
quelle
Ich füge Nicks Frage hinzu: Wann sind harte Links nützlich oder notwendig? Die einzige Anwendung, die mir in den Sinn kommt, in der symbolische Links den Job nicht erledigen würden, ist die Bereitstellung einer Kopie einer Systemdatei in einer Chroot-Umgebung.
quelle
Von MSDN ,
Symbolischer Link
Ein Beispiel für eine absolute symbolische Verbindung
Ein Beispiel für relative symbolische Verknüpfungen
Harte Verbindung
Um einen festen Link in Windows zu erstellen, navigieren Sie zu dem Ort, an dem der Link erstellt werden soll, und geben Sie den folgenden Befehl ein:
Beachten Sie, dass Sie Hardlinks in jeder Reihenfolge löschen können, unabhängig von der Reihenfolge, in der sie erstellt wurden. Außerdem können keine festen Links erstellt werden, wenn
Kreuzung
NTFS unterstützt einen anderen Verbindungstyp namens Junction. MSDN definiert es wie folgt:
Die fettgedruckten Teile im Abschnitt für harte Verbindungen und im Abschnitt für Verbindungsstellen zeigen den grundlegenden Unterschied zwischen den beiden.
Befehl zum Erstellen einer Junction in Windows, navigieren Sie zu dem Ort, an dem der Link erstellt werden soll, und geben Sie Folgendes ein:
quelle
Ebenfalls:
quelle
Einfach, Hardlink: Fügt einfach einen neuen Namen zu einer Datei hinzu, das heißt, eine Datei kann viele Namen gleichzeitig haben, alle Namen sind gleich, niemand bevorzugt, Hardlink ist nicht dazu gedacht, den gesamten Inhalt zu kopieren von Datei und neue Datei erstellen ist das nicht, es wird nur ein alternativer Name erstellt, um bekannt zu sein.
Symbolischer Link (Symlink): ist ein Dateizeiger auf eine andere Datei. Wenn der symbolische Link auf eine vorhandene Datei verweist, die später gelöscht wird, verweist der symbolische Link weiterhin auf denselben Dateinamen, obwohl der Name keine Datei mehr benennt.
quelle
Was Sie als gewöhnliche "Datei" betrachten, sind eigentlich zwei verschiedene Dinge: Die Daten einer Datei und ein Verzeichniseintrag. Wenn Sie einen festen Link für eine Datei erstellen, erstellen Sie tatsächlich einen zweiten Verzeichniseintrag, der auf dieselben Daten verweist. Beide Verzeichniseinträge haben genau die gleiche Funktionalität. Jeder kann verwendet werden, um die Datei zum Lesen zu öffnen. Sie haben also nicht wirklich "eine Datei plus einen festen Link", sondern "Dateidaten mit zwei Verzeichniseinträgen". Was Sie als Löschen einer Datei betrachten, löscht tatsächlich einen Verzeichniseintrag. Wenn der letzte Verzeichniseintrag für die Daten gelöscht wird, werden auch die Daten selbst gelöscht. Bei normalen Dateien mit nur einem Verzeichniseintrag werden die Daten wie immer gelöscht, wenn der Verzeichniseintrag gelöscht wird. (Während eine Datei geöffnet wird, erstellt das Betriebssystem einen temporären Link zur Datei.
Erstellen Sie beispielsweise eine Datei A.txt, einen festen Link B.txt und löschen Sie A.txt. Beim Erstellen von A.txt wurden einige Daten und ein Verzeichniseintrag A.txt erstellt. Beim Erstellen des Hardlinks wurde ein weiterer Verzeichniseintrag B.txt erstellt, der auf genau dieselben Daten verweist. Wenn Sie A.txt löschen, haben Sie immer noch alle Daten und einen einzelnen Verzeichniseintrag B.txt, genau so, als hätten Sie zuerst eine Datei B.txt erstellt.
Ein Softlink ist nur eine (fast) normale Datei, außer dass er keine Daten enthält, sondern den Pfad eines anderen Verzeichniseintrags. Wenn Sie die Datei löschen, auf die sich der Softlink bezieht, enthält der Softlink einen Pfad, der nicht mehr auf einen Verzeichniseintrag verweist. Es ist kaputt. Wenn Sie den Softlink löschen, ist dies wie das Löschen einer anderen Datei. Die Datei, auf die sie verweist, bleibt davon unberührt.
quelle
Ein Verzeichniseintrag ist eine Struktur verknüpfen:
Das Ino ist die Anzahl der Inodes, der Name ist der Dateiname, die Inode-Struktur wie folgt:
Wenn Sie beispielsweise eine Datei / 1 erstellen, lautet der Verzeichniseintrag möglicherweise wie folgt:
Die Inode-Struktur könnte wie folgt aussehen:
dann erstellen Sie einen festen Link (kann / 100 sein), der Verzeichniseintrag könnte wie folgt aussehen:
Die Inode-Struktur könnte wie folgt aussehen:
Dann erstellen Sie einen symbolischen Link (möglicherweise / 200) zu Datei 1, der Verzeichniseintrag lautet möglicherweise wie folgt:
Die Inode-Struktur könnte wie folgt aussehen:
quelle
Wenn man zu allen obigen Antworten hinzufügt, kann der Unterschied beim Finden der Hardlink- und Softlink-Datei wie folgt verstanden werden:
Ich habe eine Datei
f6
in meinem aktuellen Verzeichnis sowie ein Verzeichnis mit dem Nament2
.Datei benannt
f1
und./t2/f2
sind symbolische Links zuf6
.Datei benannt
f7
und./t2/f8
sind feste Links vonf6
.Um sowohl weiche als auch harte Links zu finden, können wir verwenden:
Um nur Hardlink zu finden, können wir verwenden:
Da Hardlinks auf demselben Dateisystem erstellt werden können, können wir alle Hardlinks ohne verwendete
-L
Option (mit-xdev
Option) im selben Dateisystem / Mountpunkt durchsuchen . Dies erspart die unnötige Suche nach verschiedenen Einhängepunkten.Das Durchsuchen des Hardlinks ist also etwas schneller als das Durchsuchen der Softlinks (Bitte korrigieren Sie, wenn ich falsch oder nicht klar bin).
quelle
Symbolische Links geben einer Datei einen anderen Namen, ähnlich wie bei harten Links. Eine Datei kann jedoch auch dann gelöscht werden, wenn noch symbolische Links vorhanden sind.
quelle
Meine zwei Cent für die Nutzung:
Weiche Links können lange Pfadnamen zu verkürzen verwendet werden, dh:
Änderungen an
/short/file.txt
werden auf die Originaldatei angewendet.Harte Links können bewegen , um große Dateien verwendet werden:
ln /myapp/dev/application.bin /myapp/prd/application.bin
Das sofortige Kopieren in einen anderen Ordner und die Originaldatei (ein
/myapp/dev
) können verschoben oder gelöscht werden, ohne dass die Datei berührt wird/myapp/prd
quelle
Ich habe gerade einen einfachen Weg gefunden, um Hardlinks in einem gängigen Szenario, der Softwareinstallation, zu verstehen.
Eines Tages habe ich eine Software zur
Downloads
Installation in einen Ordner heruntergeladen . Nachdem ich dies getan hattesudo make install
, wurden einige ausführbare Dateiencp
in den lokalen Ordner bin verschoben. Hiercp
entsteht eine harte Verbindung . Ich war mit der Software zufrieden, stellte aber bald fest, dass dies aufDownloads
lange Sicht kein guter Ort ist. Also habe ichmv
den Softwareordner in dassource
Verzeichnis verschoben . Nun, ich kann die Software immer noch wie zuvor ausführen, ohne mich um Dinge mit Zielverknüpfungen kümmern zu müssen, wie in Windows. Dies bedeutet, dass Hardlink Inode direkt und andere Dateien in der Nähe findet.quelle
In dieser Antwort meine ich, wenn ich eine Datei sage, den Speicherort im Speicher
Alle gespeicherten Daten werden mithilfe einer Datenstruktur namens Inodes im Speicher gespeichert. Jeder Inode hat eine Inodenummer. Die Inode-Nummer wird für den Zugriff auf den Inode verwendet. Alle festen Links zu einer Datei haben möglicherweise unterschiedliche Namen, haben jedoch dieselbe Inode-Nummer. Da alle Hardlinks dieselbe Inodenummer haben (die auf denselben Inode zugreifen), verweisen alle auf denselben physischen Speicher.
Eine symbolische Verknüpfung ist eine spezielle Art von Datei. Da es sich auch um eine Datei handelt, hat sie einen Dateinamen und eine Inode-Nummer. Wie oben erwähnt, greift die Inode-Nummer auf eine Inode zu, die auf Daten verweist. Was eine symbolische Verknüpfung besonders macht, ist die folgende Die Inodenummern in symbolischen Links greifen auf diejenigen Inodes zu, die auf "einen Pfad" zu einer anderen Datei verweisen. Insbesondere die Inode-Nummer in symbolischen Links greift auf diejenigen Inodes zu, die auf einen anderen harten Link verweisen.
Wenn wir eine Datei in der GUI verschieben, kopieren oder löschen, spielen wir mit den Hardlinks der Datei und nicht mit dem physischen Speicher. Wenn wir eine Datei löschen, löschen wir den Hardlink der Datei. Der physische Speicher wird nicht gelöscht. Wenn alle Hardlinks zur Datei gelöscht werden, kann nicht auf die gespeicherten Daten zugegriffen werden, obwohl sie möglicherweise noch im Speicher vorhanden sind
quelle