Kürzlich wurde ich während eines Vorstellungsgesprächs gefragt. Ich war ehrlich und sagte, dass ich wusste, wie sich ein symbolischer Link verhält und wie er erstellt wird, verstehe jedoch nicht die Verwendung eines harten Links und wie er sich von einem symbolischen Link unterscheidet.
Unter dem Dateisystem werden Dateien durch Inodes dargestellt (oder sind sich mehrere Inodes nicht sicher)
Eine Datei im Dateisystem ist im Wesentlichen eine Verknüpfung zu einem Inode.
Ein fester Link erstellt dann eine weitere Datei mit einem Link zu demselben zugrunde liegenden Inode.
Wenn Sie eine Datei löschen, wird eine Verknüpfung zum zugrunde liegenden Inode entfernt. Der Inode wird nur gelöscht (oder gelöscht/ü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, besteht die Verbindung zum Inode. Das Löschen des Umbenennens oder Verschiebens der Originaldatei wirkt sich nicht auf die feste Verknüpfung aus, da sie mit dem zugrunde liegenden Inode verknüpft wird. Alle Änderungen an den Daten im Inode spiegeln sich in allen Dateien wider, die auf diesen Inode verweisen.
Hinweis: Hardlinks sind nur innerhalb desselben Dateisystems gültig. Symbolische Links können Dateisysteme umfassen, da sie einfach der Name einer anderen Datei sind.
Einige nette Intuitionen, die helfen könnten, wenn Sie eine beliebige Linux (ish) Konsole verwenden.
Erstellen Sie zwei Dateien:
$ touch blah1; touch blah2
Geben Sie einige Daten ein:
$ echo "Cat" > blah1
$ echo "Dog" > blah2
(Eigentlich hätte ich eigentlich Echo verwenden können, da es die Dateien erstellt, wenn sie nicht existieren ... aber das macht nichts.)
Und wie erwartet:
$cat blah1; cat blah2
Cat
Dog
Lassen Sie uns Hard- und Softlinks erstellen:
$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft
Mal sehen, was gerade passiert ist:
$ ls -l
blah1
blah1-hard
blah2
blah2-soft -> blah2
Das Ändern des Namens von blah1 spielt keine Rolle:
$ mv blah1 blah1-new
$ cat blah1-hard
Cat
blah1-hard verweist auf den Inode, den Inhalt der Datei - das wurde nicht geändert.
$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft
cat: blah2-soft: No such file or directory
Der Inhalt der Datei konnte nicht gefunden werden, da der Softlink auf den geänderten Namen verweist und nicht auf den Inhalt. Wenn blah1 gelöscht wird, enthält blah1-hard den Inhalt ebenfalls. Wenn blah2 gelöscht wird, ist blah2-soft nur ein Link zu einer nicht vorhandenen Datei.
Ein Bild sagt mehr als tausend Worte. So visualisiere ich es:
So kommen wir zu diesem Bild:
Erstellen Sie im Dateisystem einen Namen myfile.txt
, der auf einen neuen Inode verweist (der die Metadaten für die Datei enthält und auf die Datenblöcke zeigt, die den Inhalt enthalten, d. H. Den Text "Hello, World!"):
$ echo 'Hello, World!' > myfile.txt
Erstellen Sie einen festen Link my-hard-link
zur Datei myfile.txt
. Dies bedeutet "Erstellen Sie eine Datei, die auf den gleichen Inode verweist, auf den myfile.txt
zeigt":
$ ln myfile.txt my-hard-link
Erstellen Sie einen Softlink my-soft-link
zur Datei myfile.txt
. Dies bedeutet "Erstellen Sie eine Datei, die auf die Datei myfile.txt
zeigen soll":
$ ln -s myfile.txt my-soft-link
Schauen Sie, was jetzt passiert, wenn myfile.txt
gelöscht (oder verschoben) wird: my-hard-link
zeigt immer noch auf den gleichen Inhalt und ist daher nicht betroffen, wohingegen my-soft-link
jetzt auf nichts zeigt. In anderen Antworten werden die Vor- und Nachteile der einzelnen Themen diskutiert.
Hardlinks sind nützlich, wenn die Originaldatei verschoben wird. Beispielsweise verschieben Sie 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 der Datei ist, würde dies nicht interessieren.
Feste Links benötigen möglicherweise weniger Speicherplatz, da sie nur einen Verzeichniseintrag beanspruchen, während ein Symlink einen eigenen Inode benötigt, um den Namen zu speichern, auf den er verweist.
Harte Links benötigen auch weniger Zeit zum Auflösen - Symlinks können auf andere Symlinks verweisen, die sich in symbolverknüpften Verzeichnissen befinden. Einige davon könnten sich auf NFS oder anderen Dateisystemen mit hoher Latenzzeit befinden und könnten dazu führen, dass Netzwerkverkehr aufgelöst wird. Feste Verknüpfungen, 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, führt der NFS-Server die Auflösung aus und ist für diese nicht sichtbar das Client-System). Manchmal ist das wichtig. Nicht für mich, aber ich kann mir leistungsfähige Systeme 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, so dass der Inode auch dann verbleibt, wenn die Datei unlink (2) ed wird. Erst wenn der Prozess geschlossen ist, wird die Datei wirklich entfernt. Dies ermöglicht wesentlich sicherere temporäre Dateien (wenn Sie das Öffnen und Aufheben der Verknüpfung atomar bewirken können, wobei es möglicherweise eine POSIX-API gibt, für 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. Das war richtig, bevor/proc jedem die Möglichkeit gab, Ihre Dateideskriptoren einzusehen, aber das ist eine andere Geschichte.
Apropos: Das Wiederherstellen einer Datei, die im Prozess A geöffnet ist, die aber im Dateisystem nicht verknüpft ist, dreht sich um Hardlinks, um die Inode-Links wiederherzustellen, sodass die Datei nicht verschwindet, wenn der Prozess, der sie geöffnet hat, sie schließt oder verschwindet.
Ein einfacher Weg, um den Unterschied zwischen einem harten Link und einem symbolischen Link zu erkennen, ist ein einfaches Beispiel. Eine feste Verknüpfung zu einer Datei zeigt 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 namens "a" haben und eine feste Verknüpfung "b" und eine symbolische Verknüpfung "c" erstellen, die sich alle auf die Datei "a" beziehen,
echo "111" > a
ln a b
ln -s a c
Die Ausgabe von "a", "b" und "c" lautet:
cat a --> 111
cat b --> 111
cat c --> 111
Nun entfernen wir die Datei "a" und sehen, was mit der Ausgabe von "a", "b" und "c" geschieht:
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
Also was ist passiert?
Da die Datei "c" auf die Datei "a" selbst verweist, hat die Datei "c" nichts zu zeigen, wenn die Datei "a" gelöscht wird. Sie wird 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. Da die Datei "b" dies tut, speichert der Inode weiterhin alle Inhalte, die zu "a" gehören, bis keine harten Links mehr darauf zeigen.
Soft Link:
soft oder symbolisch ist eher eine Abkürzung für die 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 der ls -l link
-Ausgabe wird der erste Buchstabe in lrwxrwxrwx
als l angezeigt, was darauf hinweist, dass es sich bei der Datei um einen Softlink handelt.
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 den absoluten Pfad und nicht den relativen Pfad angeben. (beginnend mit/root/user/Target_file und nicht ./Target_file)
Hard Link:
Hard Link ist eher eine Spiegelkopie oder mehrere Pfade zu derselben Datei. Tun Sie etwas zu file1 und es erscheint in Datei 2 . Beim Löschen einer Datei bleibt die andere immer in Ordnung.
Der Inode (oder die Datei) wird nur gelöscht, wenn alle (harten) Links oder alle Pfade zu dem Inode (derselben Datei) gelöscht wurden.
Nachdem ein Hardlink erstellt wurde, hat der Link den Inode der Originaldatei. Das Löschen des Umbenennens oder Verschiebens der Originaldatei hat keine Auswirkungen auf die feste Verknüpfung, da sie mit dem zugrunde liegenden Inode verknüpft wird. Alle Änderungen an den Daten im Inode spiegeln sich in allen Dateien wider, die auf diesen Inode verweisen.
Hard Link-Syntax : ln Target_file link
Ausgabe: Eine Datei mit Namenslink wird mit der gleichen Inode-Nummer wie in Targetfile erstellt.
Proof: ls -i link Target_file
(überprüfen Sie ihre Inodes)
Löschen des Links: rm -f link
(Löschen Sie den Link genauso wie eine normale Datei)
Hinweis : Symbolische Links können Dateisysteme umfassen, da sie einfach der Name einer anderen Datei sind. Hard-Links sind nur innerhalb desselben Dateisystems gültig.
Symbolische Links haben einige Funktionen, die nicht vorhanden sind:
wenn Sie wissen, wohin ein symbolischer Link verweist, während Sie mit harten -Links arbeiten, müssen Sie das gesamte Dateisystem durchsuchen, um Dateien zu finden , die denselben Inode verwenden.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
hardlinks können nicht auf Verzeichnisse verweisen.
Die Hardlinks haben zwei Einschränkungen:
Symbolische Links sind mit einem Pfadnamen verknüpft. Dies kann sich an einer beliebigen Stelle in der Dateistruktur eines Systems befinden und muss nicht einmal existieren, wenn die Verknüpfung 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. Weitere Hardlinks zu einer Datei sind nicht vom "ursprünglichen" Namen zu unterscheiden, der zum Referenzieren einer Datei verwendet wird.
Ich würde Sie auf Wikipedia verweisen:
Ein paar Punkte:
Hardlinks sind sehr nützlich, wenn Sie inkrementelle Sicherungen durchführen. Siehe zum Beispiel rsnapshot . Die Idee ist, mit harten Links zu kopieren:
Die neue Sicherung nimmt außer den von Ihnen vorgenommenen Änderungen keinen zusätzlichen Speicherplatz in Anspruch, da alle inkrementellen Sicherungen auf die gleichen Inodes für Dateien verweisen, die sich nicht geändert haben.
Ich füge Nicks Frage hinzu: Wann sind Hardlinks nützlich oder notwendig? Die einzige Anwendung, die mir in den Sinn kommt, bei der symbolische Links die Aufgabe nicht erfüllen würden, ist die Bereitstellung einer Kopie einer Systemdatei in einer Chroot-Umgebung.
Ebenfalls:
Was Sie als gewöhnliche "Datei" bezeichnen, besteht eigentlich aus zwei verschiedenen Dingen: den Daten einer Datei und einem Verzeichniseintrag. Wenn Sie eine feste Verknüpfung für eine Datei erstellen, erstellen Sie tatsächlich einen zweiten Verzeichniseintrag, der sich auf dieselben Daten bezieht. Beide Verzeichniseinträge haben genau dieselbe Funktionalität. Jeder kann zum Öffnen der Datei zum Lesen verwendet werden. Sie haben also nicht wirklich "eine Datei plus einen harten Link", sondern "Dateidaten mit zwei Verzeichniseinträgen". Was Sie als Löschen einer Datei bezeichnen, 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 gewöhnlichen Dateien, die nur einen Verzeichniseintrag haben, werden beim Löschen des Verzeichniseintrags die Daten wie immer gelöscht. (Während eine Datei geöffnet ist, erstellt das Betriebssystem eine temporäre Verknüpfung zu der Datei. Wenn Sie alle Verzeichniseinträge löschen, bleiben die Daten jedoch erhalten, sobald Sie die Datei schließen.)
Erstellen Sie beispielsweise eine Datei A.txt, eine feste Verknüpfung B.txt und löschen Sie A.txt. Beim Erstellen von A.txt wurden einige Daten erstellt und ein Verzeichniseintrag "A.txt". Beim Erstellen der festen Verknüpfung wurde ein weiterer Verzeichniseintrag B.txt erstellt, der auf dieselben Daten verweist. Wenn Sie A.txt löschen, haben Sie noch alle Daten und einen einzigen Verzeichniseintrag B.txt, genau so, als hätten Sie anfangs eine Datei B.txt erstellt.
Ein Softlink ist nur eine (fast) gewöhnliche Datei, enthält jedoch keine Daten, 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 er verweist, ist davon nicht betroffen.
Ein symbolischer Link ist ein Dateisystemobjekt, das auf ein anderes Dateisystemobjekt verweist. Das Objekt, auf das gezeigt wird, wird als Ziel bezeichnet.
Symbolische Links sind für Benutzer transparent. Die Links erscheinen als normal Dateien oder Verzeichnisse und kann vom Benutzer oder der Anwendung bearbeitet werden auf genau dieselbe Weise.
Symbolische Links dienen zur Unterstützung bei Migration und Anwendung Kompatibilität mit UNIX-Betriebssystemen. Microsoft hat .__ implementiert. Seine symbolischen Links funktionieren genauso wie UNIX-Links.
Symbolische Links können entweder absolute oder relative Links sein. Absolut Links sind Links, die jeden Teil des Pfadnamens angeben. relativ Verknüpfungen werden relativ zu der Position bestimmt, in der sich die relativen Verknüpfungsbezeichner in .__ befinden. einen angegebenen Pfad
Ein Beispiel für einen absoluten symbolischen Link
X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"
Ein Beispiel relativer symbolischer Links
X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"
Ein fester Link ist die Dateisystemdarstellung einer Datei, durch die mehr als ein Pfad verweist auf eine einzelne Datei im selben Volume.
Um eine feste Verknüpfung in Windows zu erstellen, navigieren Sie zu der Stelle, an der die Verknüpfung erstellt werden soll, und geben Sie den folgenden Befehl ein:
mklink /H Link_name target_path
Beachten Sie, dass Sie feste Links in beliebiger Reihenfolge löschen können, unabhängig von der Reihenfolge, in der sie erstellt wurden. Hardlinks können auch nicht erstellt werden, wenn
NTFS unterstützt einen anderen Verbindungstyp namens Junction. MSDN definiert es wie folgt:
Eine Junction (auch Softlink genannt) unterscheidet sich von einer Hardlink-Verknüpfung dadurch, dass es sich bei den von ihr referenzierten Speicherobjekten um separate Verzeichnisse handelt und eine Junction kann Verzeichnisse verbinden, die sich auf verschiedenen lokalen Volumes auf demselben Computer befinden. Ansonsten funktionieren Junctions identisch zu harten Links.
Die fettgedruckten Teile im Hardlink-Abschnitt und im Junction-Abschnitt zeigen den grundlegenden Unterschied zwischen den beiden.
Befehl zum Erstellen einer Kreuzung in Fenstern. Navigieren Sie zu der Stelle, an der die Verknüpfung erstellt werden soll, und geben Sie Folgendes ein:
mklink /J link_name target_path
Ein Verzeichniseintrag ist link a structrue:
struct dentry{
ino_t ino;
char name[256];
}
das Ino ist die Nummer des Inodes, der Name ist der Dateiname, die Inode-Struktur mag :
struct inode{
link_t nlink;
...
}
zum Beispiel erstellen Sie eine Datei/1, der Verzeichniseintrag könnte etwa wie folgt aussehen:
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
die Inode-Struktur mag vielleicht:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
dann erstellen Sie einen Hardlink (möglicherweise/100), der Verzeichniseintrag könnte etwa wie folgt aussehen:
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
die Inode-Struktur mag vielleicht:
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
dann erstellen Sie einen symbolischen Link (möglicherweise/200) zu Datei 1, der Verzeichniseintrag könnte folgendermaßen aussehen:
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
die Inode-Struktur mag vielleicht:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 2 */
...
}
struct inode{ /* inode number 16 */
link_t nlink; /* nlink = 1 */
...
} /* the data of inode 16 maybe /1 or 1 */
Einfach Hard Link: Fügt einer Datei einfach einen neuen Namen hinzu, das heißt, eine Datei kann mehrere Namen gleichzeitig haben, alle Namen sind gleich, keiner wird bevorzugt. Hard Link ist nicht dazu gedacht, den gesamten Inhalt zu kopieren von datei und neue datei erstellen ist nicht das, es wird einfach ein alternativer name erstellt, der bekannt sein soll ..
Symbolischer Link (symbolischer Link): ist ein Dateizeiger auf eine andere Datei. Wenn der symbolische Link auf eine vorhandene Datei verweist, die später gelöscht wird, zeigt der symbolische Link weiterhin auf denselben Dateinamen, auch wenn der Name keine Datei mehr benennt.
Zusätzlich zu den obigen Antworten 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 namens t2
.
Die Datei f1
und ./t2/f2
sind symbolische Links zu f6
.
Die Datei f7
und ./t2/f8
sind feste Links von f6
.
Um sowohl einen weichen als auch einen harten Link zu finden, können wir verwenden:
$ find -L . -samefile f6
> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8
Um nur Hardlinks zu finden, können wir verwenden:
$ find . -xdev -samefile f6
> ./f6
> ./f7
> ./t2/f8
Da Hardlinks auf demselben Dateisystem erstellt werden können, können wir alle Hardlinks ohne -L
-Option (mit -xdev
-Option) im selben Dateisystem/Mount-Punkt durchsuchen. Es speichert die unnötige Suche in verschiedenen Mount-Punkten.
Das Suchen des Hardlinks ist also etwas schneller als das Suchen der Softlinks (Bitte korrigieren, wenn ich falsch oder nicht klar bin).
Symbolische Links geben einer Datei einen anderen Namen, ähnlich wie bei harten Links. Eine Datei kann jedoch auch gelöscht werden, wenn noch symbolische Links vorhanden sind.
Meine zwei Cent beim Gebrauch:
Soft Links können verwendet werden, um lange Pfadnamen zu verkürzen, d. H .:
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
Änderungen, die an /short/file.txt
vorgenommen wurden, werden auf die Originaldatei angewendet.
Hard Links können verwendet werden, um große Dateien zu verschieben:
$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin
ln /myapp/dev/application.bin /myapp/prd/application.bin
Sofortige Kopie in einen anderen Ordner und Originaldatei (auf /myapp/dev
) kann verschoben oder gelöscht werden, ohne die Datei in /myapp/prd
zu berühren.
In dieser Antwort meine ich, wenn ich eine Datei sage, die Position im Speicher
Alle Daten, die gespeichert werden, werden in einer Datenstruktur mit dem Namen inodes gespeichert. Jeder Inode hat eine Inodenummer. Die Inode-Nummer wird für den Zugriff auf den Inode verwendet. Da alle Hardlinks die gleiche Inodenummer haben (wodurch auf denselben Inode zugegriffen wird), verweisen alle auf denselben physischen Speicher.
Ein symbolischer Link ist eine spezielle Art von Datei. Da es sich auch um eine Datei handelt, wird sie einen Dateinamen und eine Inode-Nummer haben. Wie oben erwähnt, gelangt man zu einer Inode, die auf Daten verweist Die Inodenummern in symbolischen Links greifen auf diejenigen Inodes zu, die auf "einen Pfad" zu einer anderen Datei verweisen. Genauer gesagt, die Inodenummer in symbolischen Links greift auf diejenigen Inodes zu, die auf einen anderen Hardlink zeigen.
wenn wir eine Datei in der GUI verschieben, kopieren oder löschen, spielen wir mit den Hardlinks der Datei, nicht mit dem physischen Speicher. Wenn wir eine Datei löschen, löschen wir den Hardlink der Datei. Wir löschen den physischen Speicher nicht aus. Wenn alle zu verknüpfenden Hardlinks gelöscht werden, kann auf die gespeicherten Daten nicht zugegriffen werden, obwohl sie möglicherweise noch im Speicher vorhanden sind
Ich habe gerade einen einfachen Weg gefunden, harte Links in einem üblichen Szenario, der Software-Installation, zu verstehen.
Eines Tages habe ich eine Software zur Installation in den Ordner Downloads
heruntergeladen. Nachdem ich Sudo make install
ausgeführt hatte, wurden einige ausführbare Dateien in den lokalen Ordner "cp
ed" gesetzt. Hier erstellt cp
hard link. Ich war mit der Software zufrieden, stellte jedoch schnell fest, dass Downloads
auf lange Sicht kein guter Ort ist. Also mv
ed ich den Softwareordner in das source
Verzeichnis. Nun, ich kann die Software weiterhin wie zuvor ausführen, ohne sich um etwaige Zielverknüpfungen wie in Windows zu kümmern. Dies bedeutet, dass hard link Inode direkt und andere Dateien findet.