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


768

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.


2
Über 'Verstehe die Verwendung eines Hardlinks nicht' kann es in Build-Systemen verwendet werden, die viel Binärdateien kopieren. Das Erstellen eines festen Links anstelle einer tatsächlichen Kopie beschleunigt die Arbeit. MSBuild 4.0 unterstützt dies.
Ankush

13
Ich finde diesen Link sehr nützlich, um ihn zu verstehen. askubuntu.com/questions/108771/…
kta

2
unix.stackexchange hat eine gute Liste von Aufzählungspunkten ... sehr hilfreich, da alle Einschränkungen sehr präzise dargestellt werden und leicht zu überfliegen sind. (Viele dieser Aufzählungspunkte decken Randfälle / Vorbehalte ab, die nur in den Kommentaren dieser Frage erwähnt werden ... oder überhaupt nicht erwähnt werden)
Trevor Boyd Smith

Antworten:


780

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.


2
Ich bin sicher, dass die i-Knoten von der jeweiligen Variante des Betriebssystems abhängen. Ich glaube jedoch, dass es normalerweise ein einzelner i-Knoten ist. Der i-Node enthält Informationen zur Datei und Informationen darüber, wo die Daten auf der Festplatte gespeichert sind. Große Dateien haben indirekte Zeiger auf zusätzliche Tabellen.
Terson

76
Möglicherweise möchten Sie die nützliche Funktion hinzufügen, dass symbolische Links Dateisysteme überqueren können, Hardlinks jedoch nicht (sie müssen auf eine Datei im selben Dateisystem verweisen).
Paxdiablo

52
Es gibt eine gute visuelle Erklärung in einem Artikel über Linux Gazette
Rodrigue

1
Ich schrieb auch einen Blog darüber nach einigen Lesungen und Experimenten csharpbsharp.tumblr.com
Adnan Bhatti

1
@zen: Sie können ein Dateisystem jederzeit aushängen / erneut einhängen, wenn es nicht verwendet wird. Für die Root-Partition ist dies etwas schwierig, kann aber durchgeführt werden (nicht empfohlen). Um dies für das Root-Verzeichnis zu tun, ist es normalerweise am besten, zuerst eine Rescuse-CD zu starten, die Mounts zu ändern und neu zu starten. Aber Sie sollten diese Art von Frage an Superuser stellen.
Martin York

464

Eine nette Intuition, die helfen könnte, wenn man eine Linux (ish) Konsole verwendet.

Erstellen Sie zwei Dateien:

$ touch foo; touch bar

Geben Sie einige Daten ein:

$ echo "Cat" > foo
$ echo "Dog" > bar

(Eigentlich hätte ich Echo verwenden können, da es die Dateien erstellt, wenn sie nicht existieren ... aber das macht nichts.)

Und wie erwartet:

$cat foo; cat bar
Cat
Dog

Lassen Sie uns harte und weiche Links erstellen:

$ ln foo foo-hard
$ ln -s bar bar-soft

Mal sehen, was gerade passiert ist:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

Das Ändern des Namens von foo spielt keine Rolle:

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard zeigt auf den Inode, den Inhalt, der Datei - das wurde nicht geändert.

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-soft: No such file or directory

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 foogelöscht, foo-hardhält immer noch den Inhalt; Wenn bargelöscht, bar-softhandelt es sich nur um einen Link zu einer nicht vorhandenen Datei.


12
Bedeutet dies, dass eine "Datei" und ein "fester Link" identisch sind und beide auf einen Inode verweisen? Beim Löschen einer Datei oder eines festen Links ist der Inhalt noch vorhanden, solange man noch auf den Inode zeigt, oder?
Daniel W.

1
@ DanFromGermany Richtig. Der Inhalt ist erreichbar, solange mindestens ein fester Link (dh eine Datei) darauf zeigt.
Adam Matan

6
touch blah1; touch blah2kann verkürzt werden auftouch blah1 blah2
Dmitri Zaitsev

11
@DmitriZaitsev Stimmt, aber es wird für Anfänger IMO weniger lesbar sein.
Adam Matan

8
Ich denke, dies ist die am besten verständliche Antwort in Bezug auf viele Antworten, die ich gelesen habe. Ein Beispiel ist besser als eine Reihe von Erklärungstexten.
Scott Chu

435

Ein Bild sagt mehr als tausend Worte. So visualisiere ich es:

Geben Sie hier die Bildbeschreibung ein

So kommen wir zu diesem Bild:

  1. Erstellen Sie myfile.txtim 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!":

    $ echo 'Hello, World!' > myfile.txt
    
  2. Erstellen Sie einen festen Link my-hard-linkzur Datei myfile.txt. Dies bedeutet "Erstellen Sie eine Datei, die auf denselben Inode verweisen soll, auf den verwiesen wird myfile.txt":

    $ ln myfile.txt my-hard-link
    
  3. Erstellen Sie einen Softlink my-soft-linkzur Datei myfile.txt, dh "Erstellen Sie eine Datei, die auf die Datei verweisen soll myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

Schauen Sie, was jetzt passiert, wenn myfile.txtes gelöscht (oder verschoben) wird: zeigt my-hard-linkimmer noch auf denselben Inhalt und ist daher nicht betroffen, während my-soft-linkjetzt auf nichts zeigt. Andere Antworten diskutieren die Vor- und Nachteile der einzelnen.


3
@ThunderWiring Mit "Punkt" meine ich, was auch immer der Link verweist. Im Falle einer festen Verbindung verweist sie direkt auf einen Inode (dh denselben Inode, auf den verwiesen wird myfile.txt). Für den Softlink ist seine Referenz nicht der Inode (der die Daten enthält), sondern seine Referenz ist der Dateisystempfad zu myfile.txt(z. B. /home/Documents/myfile.txt)
akivajgordon

4
Ihre visuelle Antwort @akivajgordon gefällt mir sehr gut - hat mir wirklich geholfen, die Unterschiede besser zu verstehen!
Wmock

7
Zehntausend Wörter!
SaganRitual

13
Vielleicht bin ich langsam, aber Ihr Bild hat in etwa 2 Sekunden 20 Jahre Rätsel gelöst.
JDK1.0

3
Die nützlichste Antwort, ich bin verrückt, dass dies so tief in diesem Beitrag vergraben ist. Ich würde Ihnen hundert Internetpunkte geben, aber leider kann ich Ihnen nur einen geben.
Dagrooms

71

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.


35

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 der ls -l linkAusgabe sehen Sie den ersten Buchstaben lrwxrwxrwxals 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:

  • Harter Link verweist auf den Dateiinhalt. während Softlink auf den Dateinamen verweist.
  • Während die Größe des Hardlinks die Größe des Inhalts ist, während der Softlink die Dateinamengröße hat.
  • Hardlinks haben dieselbe Inode. Softlinks nicht.
  • Hardlinks können keine Dateisysteme überqueren. Softlinks tun es.
  • 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

    /home/bobbin/sync.sh
    /root/synchro
    
  • Hardlinks können nicht auf Verzeichnisse verweisen.

Die Hardlinks haben zwei Einschränkungen:

  • Die Verzeichnisse können nicht fest verknüpft werden. Linux erlaubt dies nicht, um die azyklische Baumstruktur von Verzeichnissen beizubehalten.
  • Ein fester Link kann nicht zwischen Dateisystemen erstellt werden. Beide Dateien müssen sich auf demselben Dateisystem befinden, da unterschiedliche Dateisysteme unterschiedliche unabhängige Inode-Tabellen haben (zwei Dateien auf unterschiedlichen Dateisystemen, jedoch mit derselben Inode-Nummer, sind unterschiedlich).

3
"Während die Größe des Hardlinks die Größe des Inhalts ist, während der Softlink die Dateinamengröße hat." Nur um dies zu verdeutlichen, wirkt sich das Herstellen einer weiteren festen Verbindung nur um wenige Bytes auf den freien Speicherplatz aus.
Ingo

34

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:

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

Entfernen wir nun die Datei "a" und sehen, was mit der Ausgabe von "a", "b" und "c" passiert:

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 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.


Es kann hilfreich sein, darauf hinzuweisen, dass eine Datei ein sehr abstraktes Objekt ist und bei allen abstrakten Dingen die eigentliche Absicht von Implementierungen auf hoher Ebene nicht richtig erklärt werden kann, ohne das Risiko einzugehen, dass Abstraktionen weggeblasen werden.
Cholthi Paul Ttiopic

28

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.


Wenn Sie die Datei entfernen, auf die Sie verlinken, wird eine symbolische Verknüpfung unterbrochen. Eine feste Verknüpfung bleibt gültig, da sie die Datei im Dateisystem "behält".
NJSF

21

Ich würde Sie auf Wikipedia verweisen:

Ein paar Punkte:

  • Symlinks können im Gegensatz zu Hardlinks (meistens) Dateisysteme überqueren.
  • Symlinks können auf Verzeichnisse verweisen.
  • Hardlinks verweisen auf eine Datei und ermöglichen es Ihnen, auf dieselbe Datei mit mehr als einem Namen zu verweisen.
  • Solange mindestens ein Link vorhanden ist, sind die Daten noch verfügbar.

1
In der Theorie (und in einigen Fällen sogar in der Praxis) können Hardlinks auch auf Verzeichnisse verweisen (tatsächlich ist "." Ein Hardlink zum aktuellen Verzeichnis und ".." ein Hardlink zum übergeordneten Verzeichnis). Sie können jedoch gefährlich sein, sodass die meisten UNIX-Versionen dies nicht zulassen (oder dass Sie spezielle Schritte ausführen müssen, um dies zu tun). Apple verwendet sie beispielsweise für die Implementierung von Zeitmaschinen: earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer

3
Sie zeigen auf einen Link zu einem Artikel ... macht Sie das zu einem symbolischen Link?
Ian Campbell

@JoachimSauer Glauben Sie, dass das neue Apple-Dateisystem Time Machine die Verwendung von Hardlinks zu Verzeichnissen überflüssig macht?
cjm

Ich fand die Erklärung von Wikipedia deutlich kürzer und konkreter als die Erklärungen in den am besten bewerteten Antworten.
Seen sind

9

Harte Links sind sehr nützlich, wenn Sie inkrementelle Sicherungen durchführen. Siehe zum Beispiel rsnapshot . Die Idee ist, mit festen Links zu kopieren:

  • Kopieren Sie die Sicherungsnummer n nach n + 1
  • Kopieren Sie die Sicherung n - 1 nach n
  • ...
  • Kopieren Sie Backup 0 nach Backup 1
  • Aktualisieren Sie Backup 0 mit allen geänderten Dateien.

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.


6

Hard Link vs Soft Link

Hard Link Vs Soft Link kann durch dieses Bild leicht erklärt werden.


5
Ich denke dein Softlink Bild ist nicht richtig. Punkt: Der Inode des Softlinks sollte nicht auf den Inode der Originaldatei zeigen. Denn wenn Sie die Originaldatei umbenennen, ist der zugehörige Softlink tot
percy507

@ percy507 ja du hast recht - aber ich finde es trotzdem eine sehr schöne und intuitive erklärung. Stellen Sie sich vor, der Pfeil zwischen den Inodes ist nicht da ...
Michael Litvin

5

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.


Verteiltes System mit Montagepunkten an verschiedenen Stellen auf verschiedenen Systemen. Natürlich könnte dies aus dem System heraus entworfen werden, indem es konsistent ist.
Terson

Ich denke, @Tanktalus war ein großartiges Beispiel.
Nick Stinemates

4

Von MSDN ,

Symbolischer Link

Eine symbolische Verknüpfung 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 werden als normale Dateien oder Verzeichnisse angezeigt und können vom Benutzer oder der Anwendung auf genau dieselbe Weise bearbeitet werden.

Symbolische Links sollen die Migration und Anwendungskompatibilität mit UNIX-Betriebssystemen unterstützen. Microsoft hat seine symbolischen Links so implementiert, dass sie genau wie UNIX-Links funktionieren.

Symbolische Links können entweder absolute oder relative Links sein. Absolute Links sind Links, die jeden Teil des Pfadnamens angeben. Relative Links werden relativ dazu bestimmt, wo sich Relativ-Link-Spezifizierer in einem angegebenen Pfad befinden

Ein Beispiel für eine absolute symbolische Verbindung

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Ein Beispiel für relative symbolische Verknüpfungen

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"

Harte Verbindung

Ein fester Link ist die Dateisystemdarstellung einer Datei, über die mehr als ein Pfad auf eine einzelne Datei auf demselben Volume verweist .

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:

mklink /H Link_name target_path

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

  • Referenzen befinden sich in verschiedenen lokalen Laufwerken
  • Referenzen umfassen Netzwerklaufwerk. Mit anderen Worten, eine der Referenzen ist ein Netzlaufwerk
  • Der zu erstellende Hardlink befindet sich auf demselben Pfad wie das Ziel

Kreuzung

NTFS unterstützt einen anderen Verbindungstyp namens Junction. MSDN definiert es wie folgt:

Eine Junction (auch als Soft Link bezeichnet) unterscheidet sich von einer Hard Link darin, dass die Speicherobjekte, auf die sie verweist, separate Verzeichnisse sind und eine Junction Verzeichnisse verknüpfen kann, die sich auf verschiedenen lokalen Volumes auf demselben Computer befinden . Ansonsten funktionieren Junctions identisch mit Hardlinks.

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:

mklink /J link_name target_path

3

Ebenfalls:

  1. Die Leseleistung von Hardlinks ist besser als die von symbolischen Links (Mikroleistung).
  2. Symbolische Links können kopiert, versioniert usw. werden. Mit anderen Worten, sie sind eine tatsächliche Datei. Auf der anderen Seite ist ein Hardlink etwas niedriger und Sie werden feststellen, dass es im Vergleich zu symbolischen Links weniger Tools gibt, mit denen Sie mit den Hardlinks als Hardlinks und nicht als normale Dateien arbeiten können

3

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.


3

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.


2

Ein Verzeichniseintrag ist eine Struktur verknüpfen:

struct dentry{
    ino_t ino;
    char  name[256];
}

Das Ino ist die Anzahl der Inodes, der Name ist der Dateiname, die Inode-Struktur wie folgt:

struct inode{
      link_t nlink; 
      ...
}

Wenn Sie beispielsweise eine Datei / 1 erstellen, lautet der Verzeichniseintrag möglicherweise wie folgt:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

Die Inode-Struktur könnte wie folgt aussehen:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

dann erstellen Sie einen festen Link (kann / 100 sein), der Verzeichniseintrag könnte wie folgt aussehen:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

Die Inode-Struktur könnte wie folgt aussehen:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

Dann erstellen Sie einen symbolischen Link (möglicherweise / 200) zu Datei 1, der Verzeichniseintrag lautet möglicherweise wie folgt:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

Die Inode-Struktur könnte wie folgt aussehen:

   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 */

2

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 f6in meinem aktuellen Verzeichnis sowie ein Verzeichnis mit dem Namen t2.

Datei benannt f1und ./t2/f2sind symbolische Links zu f6.

Datei benannt f7und ./t2/f8sind feste Links von f6.

Um sowohl weiche als auch harte Links zu finden, können wir verwenden:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

Um nur Hardlink 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 verwendete -LOption (mit -xdevOption) 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).


1

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.


Nein. Der Symlink ist kein "anderer Name für dieselbe Datei", sondern eine eigenständige Datei, die mit der Zieldatei verknüpft ist.
Kusalananda

1

Meine zwei Cent für die Nutzung:

Weiche Links können lange Pfadnamen zu verkürzen verwendet werden, dh:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

Änderungen an /short/file.txtwerden auf die Originaldatei angewendet.

Harte Links können bewegen , um große Dateien verwendet werden:

$ 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

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


0

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 DownloadsInstallation in einen Ordner heruntergeladen . Nachdem ich dies getan hatte sudo make install, wurden einige ausführbare Dateien cpin den lokalen Ordner bin verschoben. Hier cpentsteht eine harte Verbindung . Ich war mit der Software zufrieden, stellte aber bald fest, dass dies auf Downloadslange Sicht kein guter Ort ist. Also habe ich mvden Softwareordner in das sourceVerzeichnis 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.


0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.