Was ist der Unterschied zwischen einem festen Link und einem symbolischen Link?

488

Wie der Titel schon sagt, möchte ich den Unterschied zwischen einem harten und einem weichen Link kennen, die mit dem Befehl erstellt wurden ln. Der Befehl man lnliefert zwar Informationen, beantwortet meine Frage jedoch nicht ausreichend.

Außerdem wäre es schön, wenn jemand eine Einstellung bereitstellen könnte, bei der ein fester Link einem symbolischen Link vorzuziehen ist.

ste_kwr
quelle
15
einer der unterschiede ... du hast eine datei, zum beispiel dateitest. Wenn Sie ln test hardlink machen, ln -s test symlink machen und dann file test in ein anderes Verzeichnis verschieben (oder umbenennen), funktioniert symlink nicht. Hardlink wird funktionieren. Versuchen Sie nun, den Dateitest zu löschen. Hardlink wird immer noch funktionieren, in der Tat werden Sie noch in der Lage sein , Dateien acces bis Anzahl der Hardlinks wegen Inodes ist nicht 0. Das ist die Datei, wird in Handbuch geschrieben ...
Denwerko
5
Ich habe dies erneut geöffnet, weil es eine gute generische Antwort auf dieses Problem verdient (im Gegensatz zu der vorherigen Frage, die ein obskures C-Beispiel war).
Oli
4
Beste Antwort: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia
1
Auch eine ziemlich vollständige Antwort: stackoverflow.com/questions/185899/…
Elzo Valugi
@ AbhishekBhatia das Video ist nicht verfügbar
Ooker

Antworten:

59

In Linux / Unix werden Verknüpfungen als Links bezeichnet


Es gibt zwei Arten von Verknüpfungen: weiche Verknüpfungen (symbolische Verknüpfungen) oder harte Verknüpfungen.

  1. Soft Links (symbolische Links)

    Sie können Verknüpfungen zu Dateien und Verzeichnissen herstellen und Verknüpfungen (Shortcuts) auf verschiedenen Partitionen und mit einer anderen Inode-Nummer als im Original erstellen.

    Wenn die echte Kopie gelöscht wird, funktioniert der Link nicht .

  2. Harte Links

    Hardlinks sind nur für Dateien; Sie können keine Verknüpfung zu einer Datei auf einer anderen Partition mit einer anderen Inode-Nummer herstellen.

    Wenn die echte Kopie gelöscht wird, funktioniert der Link , da auf die zugrunde liegenden Daten zugegriffen wird , auf die die echte Kopie zugegriffen hat.


Frage: Wie mache ich einen Softlink?

Antwort: Eine weiche Verbindung kann hergestellt werden mit ln -s; Zuerst müssen Sie die Quelle und dann das Ziel definieren. (Denken Sie daran, dass Sie die vollständigen Pfade von Quelle und Ziel definieren müssen. Andernfalls funktioniert es nicht.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

Bildbeschreibung hier eingeben

Wie Sie sehen, hat es einen anderen Inode und kann auf einer anderen Partition erstellt werden.


Frage: Wie erstelle ich einen Hardlink?

Antwort: Ein fester Link kann hergestellt werden mit ln; Zuerst müssen Sie die Quelle und dann das Ziel definieren. (Denken Sie daran, dass Sie den vollständigen Pfad von Quelle und Ziel definieren müssen. Andernfalls funktioniert es nicht.)

Nehmen wir an, ich habe ein Skript im /scriptVerzeichnis namens firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

Bildbeschreibung hier eingeben

Wie Sie sehen, hat es den gleichen Inode. Wenn ich das Original lösche, funktioniert der Link und fungiert als Original.

Bildbeschreibung hier eingeben

Oben überprüfe ich, ob der Link funktioniert, und lösche dann das ursprüngliche Firefox-Skript.


Ihre Frage: Es wäre schön, wenn jemand eine Einstellung vornehmen könnte, bei der ein fester Link einem symbolischen Link vorzuziehen ist.

Antwort : Je nach Festplattenpartition Layout Hardlinks haben die Einschränkung , dass sie auf derselben Partition sein muss (-1 Punkt) und nur auf Dateien verweisen können (-1 Punkt) ), aber ein Punkt , wenn das Original auf den Link gelöscht wird funktionieren und es verhält sich wie das Original.

Andererseits kann ein Softlink auf Verzeichnisse oder Dateien verweisen (+1 Punkt), und es gibt keine Partitionsbeschränkung (+1 Punkt), aber (-1 Punkt), wenn die Quelle gelöscht wird, funktioniert der Link nicht.

Qasim
quelle
Kann ich einen festen Link erstellen und die Inode als Quelle angeben?
TMOTTM
324

Ein Hardlink ist kein Zeiger auf eine Datei, sondern ein Verzeichniseintrag (eine Datei), der auf denselben Inode verweist. Auch wenn Sie den Namen der anderen Datei ändern, verweist ein Hardlink immer noch auf die Datei. Wenn Sie die andere Datei durch eine neue Version ersetzen (indem Sie sie kopieren), verweist ein Hardlink nicht auf die neue Datei. Sie können nur Hardlinks innerhalb desselben Dateisystems haben. Mit Hardlinks haben Sie keine Vorstellung von den Originaldateien und -links, alle sind gleich (stellen Sie sich das als Referenz auf ein Objekt vor). Es ist ein sehr einfaches Konzept.

Andererseits verweist ein Symlink tatsächlich auf einen anderen Pfad (einen Dateinamen). Bei jedem Zugriff über den Symlink wird der Name der Datei aufgelöst. Wenn Sie die Datei verschieben, folgt der Symlink nicht. Wenn Sie die Datei durch eine andere ersetzen und den Namen beibehalten, zeigt der Symlink auf die neue Datei. Symlinks können sich über Dateisysteme erstrecken. Bei Symlinks haben Sie eine sehr klare Unterscheidung zwischen der tatsächlichen Datei und dem Symlink, in dem neben dem Pfad, auf den die Datei verweist, keine Informationen gespeichert sind.

vartec
quelle
1
Eine Sache, die (mit eigenen Worten) "auf die Datei zeigt", kann als Zeiger bezeichnet werden (dies ist trivialerweise nahezu tautologisch wahr). Wenn wir keine Auswahl treffen, kann (im Allgemeinen) die Vorstellung von Hardlinks existieren, auch wenn ein Dateisystem keine Inodes verwendet.
JFS
320

"Ein Bild sagt mehr als tausend Worte." Bildliche Darstellung


Und: "Ein Beispiel ist hundert Absätze wert ..."

Erstellen Sie zwei Dateien:

$ touch blah1   
$ touch blah2

Geben Sie einige Daten ein:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

Und wie erwartet:

$cat blah1; cat blah2
Cat
Dog

Lassen Sie uns harte und weiche Links 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 zeigt auf die inode, den inhalt der datei - das hat sich 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 Namen zeigt, der geändert wurde, und nicht auf den Inhalt.
Wenn blah1 gelöscht wird, enthält blah1-hard weiterhin den Inhalt. Wenn blah2 gelöscht wird, ist blah2-soft nur eine Verknüpfung zu einer nicht vorhandenen Datei.


Quelle: Offensichtlich aus StackOverflow kopieren !

ABcDexter
quelle
13
Um fair zu Ihnen zu sein - Sie haben das schöne Bild oben hinzugefügt ... ah, Sie haben das auch kopiert! Das Kombinieren der beiden Antworten ist eigentlich sehr hilfreich :)
ICC97
2
besser erklärt, nirgendwo!
Dennisbot
3
Ich starrte das Bild 20 Sekunden lang an und fand es dann plötzlich heraus. Das ist eigentlich genial.
Mohammed Joraid
1
Übrigens: Die Verwendung von Hardlinks mit git ist eine schlechte Idee , nur für den Fall, dass sich jemand (der über Softlinks frustriert ist) wundert ... könnte dies auch auf andere Versionssysteme zutreffen.
Frank Nocke
1
Ist ein Inode zu seinen Hardlinks ähnlich einer in der Cloud gespeicherten Datei, wenn ein Gerät darauf zugreift?
Ooker
89

Beide sind Zeiger auf Dateien; Der Unterschied ist die Art des Zeigers. Ein symbolischer Link verweist namentlich auf eine andere Datei . Es verfügt über ein spezielles Modusbit, das es als symbolische Verknüpfung kennzeichnet, und sein Inhalt ist der Name der realen Datei. Da es nur einen Namen enthält, muss dieser Name nicht unbedingt vorhanden sein oder kann auf einem anderen Dateisystem vorhanden sein. Wenn Sie die benannte Datei ersetzen (den Inhalt ändern, ohne den Namen zu ändern), enthält der Link weiterhin den gleichen Namen und verweist jetzt auf die neue Datei. Sie können einen symbolischen Link leicht identifizieren und den Namen der Datei sehen, auf die er verweist.

Ein fester Link zeigt anhand der Inode-Nummer auf die Datei. Daher unterscheiden sich harte Links nicht vom Vornamen einer Datei. Es gibt keinen "echten" Namen im Vergleich zum Namen des festen Links. Alle festen Links sind gleichermaßen gültige Namen für die Datei. Aus diesem Grund muss die Datei, zu der Sie einen Link erstellen, tatsächlich vorhanden sein und sich in demselben Dateisystem befinden, in dem Sie den Link erstellen möchten. Wenn Sie den ursprünglichen Namen löschen, verweist der Hardlink weiterhin auf dieselbe Datei. Da alle festen Verknüpfungen gleichermaßen gültige Namen für die Datei sind, können Sie einen Namen nicht anzeigen und die anderen Namen für die Datei sehen. Um dies zu finden, müssen Sie sich jede Datei ansehen und ihre Inode-Nummer vergleichen, um die anderen Namen zu finden, die dieselbe Inode-Nummer haben.

Aus der Ausgabe von können Sie ersehen, wie viele Namen eine Datei hat ls -l. Die erste Zahl nach dem Dateimodus ist die Anzahl der Links. Eine Datei mit mehr als einem Link hat irgendwo einen anderen Namen, und umgekehrt hat eine Datei mit nur einem Link keine (anderen) festen Links.

Psusi
quelle
If you replace the named file, then the link still contains the same name, and so now it points to the new file- Ich denke, das ist nicht gut erklärt. Meinen Sie, wenn ich die Datei ersetze, auf die ich einen symbolischen Link habe, dann bleiben die Links, die den Namen enthalten, unberührt. Aber es würde nur auf die ersetzte Datei verweisen, wenn ihr Dateiname (dh die neue Datei, die die alte ersetzt hat) mit der ersetzten Datei (dh der alten Datei, die durch die neue ersetzt wurde) identisch ist. Richtig?
Mike
@Mike, ja: Der symbolische Link zeigt auf den ursprünglichen Dateinamen. Wenn Sie also diese Datei ersetzen, zeigt der Link jetzt auf die neue Datei.
Psusi
Aber nur, wenn es den gleichen richtigen Namen hat? Würde Symlink auf Banane zeigen und ich die Datei durch Orange ersetzen, dann kann Sy Link die Datei Banane nicht mehr finden, dh es wird nicht funktionieren
Mike
@ Mike, die Welt zu ersetzen bedeutet, dass es den gleichen Namen hat, sonst Sie nur eine Datei löschen und eine andere hinzufügen;)
psusi
58

Ein Hardlink kann nur auf demselben Dateisystem funktionieren, es ist einfach ein anderer Name für denselben Inode (Dateien werden intern von Inodes referenziert). Eine Datei wird nur dann von der Festplatte gelöscht, wenn der letzte Link zu ihrem Inode weg ist (Sie rmd oder unlinkd den letzten Link). Hardlinks funktionieren normalerweise nur für Dateien, nicht für Verzeichnisse.

Ein Symlink (symbolischer Link) ist eine spezielle Datei, die einen Pfad zu einer anderen Datei enthält. Dieser Pfad kann absolut oder relativ sein. symlinks können dateisystemübergreifend funktionieren und sogar auf verschiedene Dateien verweisen, wenn Sie beispielsweise eine externe Festplatte ausstecken und durch eine andere ersetzen, deren Pfad eine andere Datei enthält. Ein Symlink kann auf Dateien oder Verzeichnisse verweisen.

stricken
quelle
Danke, das sagt mir, wie sie funktionieren, aber was genau macht der harte Link? Und warum funktioniert das nicht für Verzeichnisse?
ste_kwr
@ Knittl: Bist du sicher? Auf einigen Dateisystemen scheinen Hardlinks zu Verzeichnissen erlaubt zu sein, aber nur Root kann sie erstellen. Siehe die -d, -F, --directorySchalter. Und ja, ich habe den Hinweis auf der ln(1)Seite gesehen :)
0xC0000022L
1
@kniwor: Der einfachste Weg, Hardlinks zu beschreiben, ist "nur ein anderer Name für dieselbe Datei (dh Daten auf der Festplatte)". Und - zumindest auf meinen Systemen - lnkönnen keine Hardlinks zu Verzeichnissen erstellt werden. Es gibt jedoch Hardlinks zu Verzeichnissen, wobei .und das bekannteste Beispiel sind ... Ich wollte das nicht in meine ursprüngliche Antwort aufnehmen, da dies die Dinge nur komplizieren würde.
Knittl
2
@STATUS_ACCESS_DENIED: Na gut ... aber normalerweise ist es keine gute Idee. Deshalb schrieb ich »normalerweise« in meine ursprüngliche Antwort. Siehe auch meinen vorherigen Kommentar für Beispiele.
Knittl
Ein fester Link kann also auf denselben Ordner / dieselbe Datei mit unterschiedlichen Namen verweisen, dh mit unterschiedlichen Namen, die auf denselben Inode verweisen.
Charlie Parker
21

In einer der Antworten des anderen Threads (der jetzt oben in Ihrem Beitrag verlinkt ist) wird diese Seite erwähnt, die meiner Meinung nach eine ziemlich gute Erklärung auf mittlerer Ebene darstellt. Wenn Sie sich in der Ascii-Kunst verirren, finden Sie hier die folgende Version:

  • Standarddateien sind ein Zeiger vom Dateisystem auf einen Inode, der wiederum auf physische Daten verweist. Die Dateikomponente speichert ihren Link zum Dateisystem (im Wesentlichen ihren Pfad) und einen Link zum Inode.
  • Hardlinks sind wie Dateien. Sie sind nur ein zusätzlicher Zeiger direkt auf eine Inode.
  • Symbolische Verknüpfungen sind separate Dateien (einschließlich separater Inodes und Daten), die einen Dateisystempfad zu einer Datei speichern.

Der Kernel und die beteiligten Dateisysteme übersetzen alles transparent.

Darauf aufbauend:

  • Hardlinks erlauben nur die Verknüpfung mit demselben Dateisystem. Symlinks können auf einen beliebigen Pfad verweisen.
  • Hardlinks verweisen (im Wesentlichen) auf absolute Daten. Symlinks können auf relative Pfade verweisen (zB ../parent.file)
  • Wenn Sie den Zielzeiger einer festen Verknüpfung verschieben (die im Grunde genommen nur eine feste Verknüpfung ist, die auf eine Inode verweist), funktioniert die feste Verknüpfung immer noch. Wenn Sie das Ziel eines Symlinks verschieben, wird der Symlink normalerweise unterbrochen.
  • Das Auflösen einer festen Verbindung wäre schneller, aber unermesslich. Dieser unbedeutende Teil der Geschwindigkeit geht zu Lasten eines unflexiblen Dateisystems.

Ich hätte mich vielleicht ein wenig verwirren können, aber wenn ich verschiedene Dinge durchgelesen habe, habe ich Mühe, den Unterschied zwischen einer Standarddatei und einem Hardlink zu finden. Die Art und Weise, wie ich es lese, besteht jede Datei aus einem Hardlink (der den Dateinamen speichert), der mit einem Inode verknüpft ist, der auf physische Daten verweist.

Durch das Hinzufügen eines Hardlinks erhält ein Inode lediglich einen zusätzlichen dateisystembasierten Zeiger. Ist das richtig?

Oli
quelle
5
Ich denke, Sie haben Recht, jede Datei ist ein Pfadname für einen Inode, und ein fester Link ist ein zusätzlicher Pfadname für denselben Inode. Ein fester Link unterscheidet sich also nicht von einer normalen Datei.
Enzotib
Ich versuche das zu verstehen ... aber Sie sagen:> "Symbolische Links sind separate Dateien (einschließlich separater Inode und Daten ), die einen Dateisystempfad zu einer Datei speichern." Hat ein Symlink wirklich separate Daten? Dann ist es genau wie eine Kopie des Verzeichnisses, auf das es verweist, richtig? ... und jedes Mal, wenn etwas in den Symlink geschrieben wird, muss es zweimal auf die Festplatte geschrieben werden? Macht keinen Sinn.
MiniGod
@MiniGod Nein, ein Symlink ist ein Inode zu einem Datenblock, der einen Pfad zu einem anderen Inode (Dateiname) speichert. Ja, es ist matrixartig verwirrend, aber wenn Sie es einmal verstanden haben, werden Sie es nie vergessen :)
Oli
@Oli Ich könnte verwirrt sein, aber wenn Sie sagen: "einschließlich separater Inode und Daten ", meinen Sie, dass der Symlink separate Daten hat !?
MiniGod
1
@MiniGod Ja. Der Symlink ist ein Inode, der auf Daten verweist (genau wie eine normale Datei), und diese Daten sind ein Pfad. Es ist ein bisschen schlauer als das - transparente Nutzung durch Symlinks zu ermöglichen - aber das ist im Wesentlichen alles, was sie sind.
Oli
15

Wann benutzt man Soft Link:

Verknüpfung zwischen Dateisystemen: Wenn Sie Dateien zwischen Dateisystemen verknüpfen möchten, können Sie nur Symlinks / Softlinks verwenden.

Verknüpfungen zu Verzeichnissen: Wenn Sie Verzeichnisse verknüpfen möchten, müssen Sie Softlinks verwenden, da Sie keine feste Verknüpfung zu einem Verzeichnis erstellen können.

Wann benutzt man Hard Link:

Speicherplatz: Feste Verknüpfungen belegen nur sehr wenig Speicherplatz, da beim Erstellen fester Verknüpfungen keine neuen Inodes erstellt werden. In Softlinks erstellen wir eine Datei, die Speicherplatz beansprucht (normalerweise 4 KB, abhängig vom Dateisystem).

Leistung: Die Leistung ist beim Zugriff auf einen festen Link etwas besser, da Sie direkt auf den Festplattenzeiger zugreifen, anstatt eine andere Datei zu durchsuchen. Speicherort der Datei verschieben: Wenn Sie die Quelldatei an einen anderen Speicherort im selben Dateisystem verschieben, funktioniert die harte Verknüpfung weiterhin, die weiche Verknüpfung schlägt jedoch fehl.

Redundanz: Wenn Sie die Sicherheit Ihrer Daten sicherstellen möchten, sollten Sie einen Hardlink verwenden, da bei einem Hardlink die Daten sicher sind, bis alle Links zu den Dateien gelöscht werden, anstatt bei einem Softlink, verlieren Sie die Daten, wenn die Master-Instanz der Datei gelöscht wird.

Osama
quelle
Beachten Sie, dass es auch eine schnelle symbolische Verknüpfung für Pfadnamen mit einer Größe von bis zu 64 Byte gibt. Es nimmt immer noch einen Inode ein, belegt aber nicht den 4-KB-Blockspeicher.
Syockit
8

Die Verwirrung setzt ein, wenn Sie versuchen, den Unterschied zwischen "dem Dateinamen" und einem festen Link zu finden, weil es keinen gibt.

Jede von Ihnen erstellte Datei besteht aus Daten auf der Festplatte und einer festen Verknüpfung - einem Dateinamen in einem Verzeichnis und einem Zeiger auf die Daten auf der Festplatte. Ende der Geschichte. Wenn die letzte (oder einzige) feste Verbindung gelöscht wird, weiß das Betriebssystem, dass die Daten nicht mehr benötigt werden.

Daraus können Sie ersehen, dass die eigentlichen Daten niemals gelöscht werden, sondern nur die Hardlink (s). Und wenn die Festplatte überfüllt ist, werden die Daten möglicherweise durch die Daten einer anderen Datei überschrieben. Bis dahin könnten die Daten aus der gelöschten Datei wiederhergestellt sein, aber ohne den festen Link ist es schwer zu finden.

Symlinks teilen Ihnen, wie bereits erläutert, einfach mit, dass sich eine Datei <targetname>in einem Ordner mit dem Namen befindet <targetfolder>. Sie zeigen auf die harte Verbindung. Sie wissen nicht, wo sich die Daten befinden. Die harte Verbindung weiß das.

Gonesoft
quelle
0

Es ist sehr einfach. Dateien (und Verzeichnisse!) Werden unter Adressen auf dem Blockgerät (Festplatte oder was auch immer) gespeichert. Normalerweise haben Sie einen einzelnen Namen, der einer Adresse zugeordnet ist, und auf diese Weise erhalten Sie Ihre Datei. Ein fester Link ist ein zweiter, dritter usw. Name, der derselben Adresse zugeordnet ist. Ein symbolischer Link bezieht sich stattdessen auf das Symbol - den Namen - und ebenso auf einen zweiten Namen, der dem Vornamen zugeordnet ist. Was den Kernel betrifft, stoppt er nach dem Lesen des symbolischen Link-Ziels und kehrt zum Anfang zurück, wobei der Zielwert der Dateiname (mehr oder weniger) ist, sodass relative Symlinks möglich, aber äußerst wenig hilfreich sind. Der Zielname wird nicht über der Dateisystemebene verwendet, es sei denn, er wird explizit im Userspace-Code abgefragt.

Jim Driscoll
quelle