Frage Was ist der Unterschied zwischen einer harten Verbindung und einer symbolischen Verbindung?


Wie der Titel sagt, würde ich gerne den Unterschied zwischen einer harten Verbindung und einer durch den Befehl erzeugten weichen Verbindung kennen ln. Der Befehl man ln gibt zwar Auskunft, beantwortet meine Frage jedoch nicht ausreichend.

Es wäre auch schön, wenn jemand eine Einstellung bereitstellen könnte, bei der eine feste Verbindung einer symbolischen Verbindung vorzuziehen ist.


447
2018-02-29 09:03


Ursprung


einer der Unterschiede ... Sie haben eine Datei, zum Beispiel Dateitest. Wenn Sie ln test hardlink machen, ln -s test symlink machen und dann file test auf 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 immer noch in der Lage sein, auf die Datei zuzugreifen, bis die Anzahl der Hardlinks zu der Datei isnt 0 ist. Das liegt an Inodes, sie ist in Handbuch geschrieben ... - Denwerko
Ich habe es wieder geöffnet, weil es eine gute allgemeine Antwort zu diesem Thema verdient (anders als die vorherige Frage, die ein obskures C-Beispiel war). - Oli♦
Beste Antwort: youtube.com/watch?v=aO0OkNxDJ3c - Abhishek Bhatia
Auch eine ziemlich vollständige Antwort: stackoverflow.com/questions/185899/... - Elzo Valugi
@AbhishekBhatia das Video ist nicht verfügbar - Ooker


Antworten:


 Unter Linux / Unix werden Verknüpfungen als Links bezeichnet


Es gibt zwei Arten von Links: weiche Links (symbolische Links) oder harte Links.

  1. Weiche Links (symbolische Links)

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

    Wenn die echt Kopie ist gelöscht, der Link wird nicht funktionieren.

  2. Harte Verbindungen

    Hard Links 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 echt Kopie wird gelöscht Link wird funktionieren, weil es auf die zugrunde liegenden Daten zugreift, auf die die reale Kopie zugreift.


Frage: Wie mache ich eine weiche Verbindung?

Antworten: Eine weiche Verbindung kann mit hergestellt werden ln -s; Zuerst müssen Sie die Quelle definieren und dann müssen Sie das Ziel definieren. (Beachten Sie, dass Sie die vollständigen Pfade von Quelle und Ziel definieren müssen; andernfalls wird es nicht funktionieren.)

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

enter image description here

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


Frage: Wie mache ich einen harten Link?

Antworten: Eine harte Verbindung kann mit hergestellt werden ln; Zuerst müssen Sie die Quelle definieren und dann müssen Sie das Ziel definieren. (Denken Sie daran, dass Sie den vollständigen Pfad von Quelle und Ziel definieren müssen; andernfalls wird es nicht funktionieren.)

Nehmen wir an, ich habe ein Skript in der /script Verzeichnis benannt firefox.

 ls -i # Shows you the inode
 5898242 firefox

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

enter image description here

Wie Sie sehen können, hat es dieselbe Inode. Wenn ich das Original lösche, wird der Link funktionieren und als Original fungieren.

enter image description here

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


Sie Frage: Es wäre schön, wenn jemand eine Einstellung bereitstellen könnte, bei der eine feste Verbindung einer symbolischen Verbindung vorzuziehen ist.

Antworten : Abhängig vom Layout der Festplattenpartition Harte Verbindungen haben die Einschränkung, dass sie sich auf derselben Partition befinden müssen ( -1 Punkt ) und kann nur mit Dateien verlinken ( -1 Punkt ) ), aber +1 Punkt Wenn das Original gelöscht wird, funktioniert der Link und verhält sich wie das Original.

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


31
2018-05-09 00:42





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, zeigt ein Hardlink immer noch auf die Datei. Wenn Sie die andere Datei durch eine neue Version ersetzen (indem Sie sie kopieren), zeigt ein Hardlink nicht auf die neue Datei. Sie können nur Hardlinks innerhalb desselben Dateisystems haben. Bei Hardlinks haben Sie kein Konzept der Originaldateien und Links, alle sind gleich (denken Sie daran als Referenz auf ein Objekt). Es ist ein sehr niedriges Konzept.

Auf der anderen Seite zeigt ein Symlink auf einen anderen Pfad (einen Dateinamen); Es löst den Namen der Datei bei jedem Zugriff auf den Symlink auf. Wenn Sie die Datei verschieben, wird der Symlink nicht folgen. Wenn Sie die Datei durch einen anderen ersetzen und den Namen beibehalten, zeigt der Symlink auf die neue Datei. Symlinks können sich über Dateisysteme erstrecken. Bei Symlinks unterscheiden Sie sehr deutlich zwischen der eigentlichen Datei und dem Symlink, der neben dem Pfad zu der Datei, auf die er verweist, keine Informationen speichert.


314
2018-05-18 09:51



Eine Sache, die (nach eigenen Worten) "zeigt auf die Datei"  kann als a bezeichnet werden Zeiger (es ist trivial fast tautologisch wahr). Wenn wir pingelig sind, dann kann (im Allgemeinen) die Vorstellung von Hardlinks existieren, selbst wenn ein Dateisystem keine Inodes verwendet. - jfs


"Ein Bild sagt mehr als tausend Worte." Pictorial representation


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

Erstelle zwei Dateien:

$ touch blah1   
$ touch blah2

Geben Sie einige Daten in sie 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

Die Änderung des Namens von blah1 spielt keine Rolle:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard zeigt 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 die weiche Verknüpfung auf den Namen zeigt, der geändert wurde, und nicht auf den Inhalt.
Ähnlich, wenn blah1 gelöscht wird, enthält blah1-hard immer noch den Inhalt; Wenn blah2 gelöscht wird, ist blah2-soft nur ein Link zu einer nicht existierenden Datei.


Quelle: eklatant kopiere es aus Paketüberfluss!


293
2017-07-21 07:33



Um fair zu sein - du hast das schöne Bild an der Spitze hinzugefügt ... ah du hast das auch kopiert! Die Kombination der beiden Antworten ist tatsächlich sehr hilfreich :) - icc97
besser erklärt, nirgendwo! - dennisbot
Ich starrte das Bild 20 Sekunden lang an und dann, plötzlich, fand ich es heraus. Das ist wirklich genial. - Mohammed Joraid
BTW: Verwenden von Hardlinks mit git  ist eine schlechte Idee, nur für den Fall, dass jemand (frustriert über weiche Links) sich wundert ... könnte auch auf andere Versionierungssysteme angewendet werden. - Frank Nocke
Ist ein Inode auf seine Hardlinks ähnlich wie eine in der Cloud gespeicherte Datei auf irgendein Gerät zugreift? - Ooker


Beide sind Zeiger auf Dateien; der Unterschied ist der nett von Zeiger. Ein symbolischer Link verweist auf eine andere Datei namentlich. Es hat ein spezielles Modus-Bit, das es als symbolischen Link identifiziert, und sein Inhalt ist der Name der realen Datei. Da er nur einen Namen enthält, muss dieser Name nicht existieren oder auf einem anderen Dateisystem existieren. Wenn Sie die benannte Datei ersetzen (den Inhalt ändern, ohne den Namen zu ändern), enthält der Link immer noch den gleichen Namen. Jetzt zeigt er auf die neue Datei. Sie können einen symbolischen Link leicht identifizieren und den Namen der Datei sehen, auf die er zeigt.

Ein fester Link zeigt auf die Datei nach Inode-Nummer. Hardlinks unterscheiden sich daher nicht vom Vornamen einer Datei. Es gibt keinen "echten" Namen vs. Hardlink-Namen; Alle festen Links sind gleichwertige Namen für die Datei. Aus diesem Grund muss die Datei, zu der Sie eine Verknüpfung herstellen, tatsächlich vorhanden sein und sich im selben Dateisystem befinden, in dem Sie versuchen, die Verknüpfung zu erstellen. Wenn Sie den ursprünglichen Namen löschen, verweist die feste Verknüpfung immer noch auf die gleiche Datei. Da alle festen Verbindungen für die Datei gleichgültige Namen sind, können Sie nicht auf einen suchen 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.

Sie können feststellen, wie viele Namen eine Datei von der Ausgabe von hat ls -l. Die erste Nummer nach dem Dateimodus ist die Linkanzahl. Eine Datei mit mehr als einem Link hat irgendwo andere Namen, und umgekehrt hat eine Datei mit einer Linkanzahl von nur 1 keine (anderen) festen Links.


87
2018-05-18 15:23



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. Meinst du, wenn ich die Datei ersetze, wo ich einen symbolischen Link habe, bleiben die Links, die den Namen enthalten, unberührt. Aber es würde nur auf die ersetzte Datei zeigen, wenn ihr Dateiname (d. H. Eine neue Datei, die die alte ersetzt) ​​dieselbe wie die ersetzte Datei ist (d. H. Alte Datei, die durch die neue ersetzt wurde). - Mike
@Mike, yes: Der symbolische Link verweist auf den ursprünglichen Dateinamen. Wenn Sie also diese Datei ersetzen, verweist der Link jetzt auf die neue Datei. - psusi
Aber nur wenn es den gleichen Namen richtig hat? Würde symlink Punkt auf Banane und ich ersetze die Datei mit Orange, dann sy Link kann die Datei Banane nicht mehr finden, d.h. es wird nicht funktionieren - Mike
@Mike, die Welt ersetzen bedeutet, dass es denselben Namen hat, sonst löschen Sie nur eine Datei und fügen eine weitere hinzu;) - psusi


Ein Hardlink kann nur auf demselben Dateisystem arbeiten, 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 die letzte Verbindung zu ihrem Inode verschwunden ist (Sie rmd oder unlinkd der letzte Link). Hardlinks funktionieren normalerweise nur für Dateien, nicht für Verzeichnisse.

Ein Symlink (symbolische Verbindung) ist eine spezielle Datei, die einen Pfad zu einer anderen Datei enthält. Dieser Pfad kann absolut oder relativ sein. Symlinks können über Dateisysteme hinweg funktionieren und sogar auf andere Dateien verweisen, wenn Sie beispielsweise eine externe Festplatte ausstecken und durch eine andere ersetzen, die eine andere Datei auf dem gleichen Pfad hat. Ein Symlink kann auf Dateien oder Verzeichnisse verweisen.


57
2018-02-29 09:20



Danke, das sagt mir, wie sie funktionieren, aber was genau macht die harte Verbindung? Und warum funktioniert es nicht für Verzeichnisse? - ste_kwr
@ Knittl: Bist du sicher? Es scheint, dass auf einigen Dateisystemen Hardlinks zu Verzeichnissen erlaubt sind, aber nur Root kann sie erstellen. Siehe die -d, -F, --directory Schalter. Und ja, ich haben die Notiz in der ln(1) Seite :) - 0xC0000022L
@kniwor: Der einfachste Weg, Hardlinks zu beschreiben, ist "nur ein anderer Name für dieselbe Datei (also Daten auf der Festplatte)". Und - zumindest auf meinem System - ln kann nicht verwendet werden, um Hardlinks zu Verzeichnissen zu machen. Es gibt jedoch Links zu Verzeichnissen, von denen das prominenteste Beispiel ist . und ... Ich wollte das nicht in meine ursprüngliche Antwort aufnehmen, da dies die Dinge nur verkomplizieren würde. - knittl
@STATUS_ACCESS_DENIED: Okay, aber es ist normalerweise keine gute Idee. Deshalb habe ich »gewöhnlich« in meine ursprüngliche Antwort geschrieben. Siehe auch meinen vorherigen Kommentar für Beispiele. - knittl
eine feste Verbindung kann also auf den gleichen Ordner / die gleiche Datei mit anderen Namen verweisen, d. h. mit unterschiedlichen Namen, die mit der gleichen Inode verlinken? - Charlie Parker


Eine der Antworten aus dem anderen Thread (jetzt von oben auf deinen Beitrag verlinkt) erwähnt diese Seite was ich denke, ist eine ziemlich gute Erklärung auf mittlerer Ebene. Wenn Sie sich in der Ascii-Kunst verlieren, hier ist die Tl; Dr-Version:

  • Standarddateien sind ein Zeiger vom Dateisystem auf einen Inode, der wiederum auf physikalische Daten zeigt. Die Dateikomponente speichert ihre Verbindung zum Dateisystem (im Wesentlichen ihren Pfad) und eine Verbindung zum Inode.
  • Hard-Links sind genauso wie Dateien. Sie sind nur ein zusätzlicher Zeiger direkt auf einen Inode.
  • Symbolische Links sind separate Dateien (einschließlich separater Inode und Daten), die einen Dateisystempfad zu einer Datei speichern.

Die beteiligten Kernel und Dateisysteme übersetzen alles transparent.

Also basierend darauf:

  • Hard-Links erlauben nur das Verlinken des gleichen Dateisystems. Symlinks können auf jeden Pfad zeigen.
  • Hard-Links (im Wesentlichen) zeigen auf absolute Daten. Symlinks können auf relative Pfade zeigen (z. B. ../parent.file)
  • Wenn Sie den Zielzeiger einer festen Verbindung verschieben (was daran erinnert, dass selbst im Wesentlichen nur eine feste Verbindung zu einem Inode ist), funktioniert die feste Verbindung weiterhin. Das Verschieben des Ziels eines Symlinks würde normalerweise den Symlink unterbrechen.
  • Eine harte Verbindung zu lösen wäre schneller, aber unermesslich. Dieser unbedeutende Teil der Geschwindigkeit geht auf Kosten eines inflexiblen Dateisystems.

Ich könnte mich ein wenig verwirrt haben, aber durch verschiedene Dinge zu lesen, ich habe Mühe, den Unterschied zwischen einer Standarddatei und einem Hardlink zu finden. Die Art, wie ich es lese, besteht darin, dass jede Datei aus einem Hardlink (Speichern des Dateinamens) besteht, der mit einem Inode verknüpft ist, der auf physische Daten zeigt.

Das Hinzufügen eines Hardlinks bietet nur einen Inode mit einem zusätzlichen Dateisystem-basierten Zeiger. Ist das richtig?


20
2018-05-18 15:10



Ich denke, Sie haben Recht, jede Datei ist ein Pfadname für einen Inode, und eine harte Verbindung ist ein zusätzlicher Pfadname für den gleichen Inode. Eine harte Verbindung unterscheidet sich also nicht von einer normalen Datei. - enzotib
Ich versuche das zu verstehen ... aber du sagst:> "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, zu dem es verlinkt, oder? ... und jedes Mal, wenn etwas in den Symlink geschrieben wird, muss es zweimal auf Festplatte geschrieben werden? Macht keinen Sinn. - MiniGod
@MiniGod Nein Ein Symlink ist ein Inode für einen Datenblock, der einen Pfad zu einem anderen Inode (Dateiname) speichert. Ja, es ist Matrix-wie verwirrend, aber sobald Sie es bekommen, werden Sie nie vergessen :) - Oli♦
@Oli Ich könnte verwirrt sein, aber wenn du sagst: "inklusive separater Inode und Daten ", Sie meinen, dass der Symlink separate Daten hat !? - MiniGod
@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 cleverer als das - um eine transparente Nutzung durch Symlinks zu ermöglichen - aber das ist im Wesentlichen alles, was sie sind. - Oli♦


Wann sollte Soft Link verwendet werden:

Link über Dateisysteme: Wenn Sie Dateien über die Dateisysteme hinweg verknüpfen möchten, können Sie nur Symlinks / Softlinks verwenden.

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

Wann man den harten Link benutzt:

Speicherplatz: Bei harten Verbindungen wird nur sehr wenig Speicherplatz belegt, da beim Erstellen von festen Verbindungen keine neuen Inodes erstellt werden. In weichen Links erstellen wir eine Datei, die Speicherplatz verbraucht (normalerweise 4 KB, abhängig vom Dateisystem)

Leistung: Die Leistung wird beim Zugriff auf eine feste Verbindung etwas besser, da Sie direkt auf den Festplattenzeiger zugreifen, anstatt eine andere Datei zu durchsuchen. Dateispeicherort verschieben: Wenn Sie die Quelldatei an einen anderen Speicherort im selben Dateisystem verschieben, funktioniert die feste Verbindung weiterhin, die weiche Verbindung schlägt jedoch fehl.

Redundanz: Wenn Sie die Sicherheit Ihrer Daten sicherstellen möchten, sollten Sie eine feste Verbindung verwenden, da die Daten in harter Verbindung sicher sind, bis alle Verknüpfungen zu den Dateien gelöscht werden, anstatt in der weichen Verknüpfung, Sie werden verlieren die Daten, wenn die Master-Instanz der Datei gelöscht wird.


15
2017-09-06 23:48



Beachten Sie, dass es auch eine schnelle symbolische Verbindung für eine Pfadnamengröße von bis zu 64 Byte gibt. Es nimmt immer noch einen Inode auf, verbraucht aber nicht den 4kB Blockraum. - syockit