1031 Stimmen

Was ist der Unterschied zwischen einem symbolischen Link und einem Festplatten-Link?

Vor kurzem wurde ich während eines Vorstellungsgesprächs danach gefragt. Ich war ehrlich und sagte, dass ich wusste, wie sich ein symbolischer Link verhält und wie man einen erstellt, aber ich verstehe nicht den Einsatz eines Hardlinks und wie er sich von einem symbolischen unterscheidet.

4 Stimmen

Über 'do not understand the use of a hard link' kann es in Build-Systemen verwendet werden, die viele Binärdateien kopieren. Das Erstellen eines Hardlinks anstelle einer tatsächlichen Kopie beschleunigt die Dinge. MSBuild 4.0 unterstützt dies.

20 Stimmen

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

3 Stimmen

unix.stackexchange hat eine gute Liste von Aufzählungspunkten... sehr hilfreich, da sie alle Einschränkungen sehr prägnant darstellt und leicht zu überfliegen ist. (viele dieser Aufzählungspunkte behandeln Randfälle/Haken, die nur in den Kommentaren zu dieser Frage erwähnt werden... oder überhaupt nicht erwähnt werden)

3voto

mc.robin Punkte 169

Ein Verzeichniseintrag ist wie eine Struktur:

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

Das ino ist die Inode-Nummer, der Name ist der Dateiname, die Inode-Struktur könnte sein:

struct inode{
      link_t nlink; 
      ...
}

Zum Beispiel erstellen Sie eine Datei /1, der Verzeichniseintrag könnte sein:

struct dentry{
     ino_t ino; /* z.B. 15 */
     char  name[256]; /* "1" */
} 

Die Inode-Struktur könnte sein:

   struct inode{ /* Inode-Nummer 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

Dann erstellen Sie einen Hard-Link (vielleicht /100), der Verzeichniseintrag könnte sein:

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

Die Inode-Struktur könnte sein:

   struct inode{ /* Inode-Nummer 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

Dann erstellen Sie einen symbolischen Link (vielleicht /200) zur Datei 1, der Verzeichniseintrag könnte sein:

  struct dentry{
        ino_t ino; /* z.B. 16 */
        char  name[256]; /* "200" */
  }

Die Inode-Struktur könnte sein:

   struct inode{ /* Inode-Nummer 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* Inode-Nummer 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* die Daten von Inode 16 könnten /1 oder 1 sein */

3voto

Matheus Santoro Punkte 31

Meine Meinung zur Verwendung:

Soft Links können verwendet werden, um lange Dateipfade zu verkürzen, z. B.:

ln -s /langer/ordner/name/auf/langem/pfad/datei.txt /kurze/datei.txt

Änderungen an /kurze/datei.txt werden auf die Originaldatei angewendet.

Hard Links können verwendet werden, um große Dateien zu verschieben:

$ ls -lh /meineapp/dev/
total 10G
-rw-r--r-- 2 root root 10G 22. Mai 12:09 anwendung.bin

ln /meineapp/dev/anwendung.bin /meineapp/prd/anwendung.bin

Sofortige Kopie in einen anderen Ordner, und die Originaldatei (auf /meineapp/dev) kann verschoben oder gelöscht werden, ohne die Datei auf /meineapp/prd zu berühren

3voto

Amr Mostafa Punkte 869

Außerdem:

  1. Die Leseleistung von Hardlinks ist besser als bei symbolischen Links (Mikro-Performance)
  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 auf einer etwas niedrigeren Ebene und man wird feststellen, dass im Vergleich zu symbolischen Links weniger Tools vorhanden sind, die Mittel für die Arbeit mit den Hardlinks als Hardlinks und nicht als normale Dateien bieten.

2voto

ChandanK Punkte 549

Zusätzlich zu allen oben genannten Antworten kann der Unterschied bei der Suche nach der Hardlink- und Softlink-Datei wie folgt verstanden werden:

Ich habe eine Datei f6 in meinem aktuellen Verzeichnis sowie ein Verzeichnis namens t2.

Datei mit dem Namen f1 und ./t2/f2 sind symbolische Links zu f6.

Datei mit dem Namen f7 und ./t2/f8 sind Hardlinks von f6.

Um sowohl den Softlink als auch den Hardlink zu finden, können wir Folgendes verwenden:

$ find -L . -samefile f6 

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

Um nur den Hardlink zu finden, können wir Folgendes verwenden:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Da Hardlinks auf dem selben Dateisystem erstellt werden können, können wir alle Hardlinks ohne die Verwendung der -L-Option suchen (mit der -xdev-Option) im selben Dateisystem/Mountpoint. Dies spart die unnötige Suche in unterschiedlichen Mountpoints.

Daher ist die Suche nach Hardlinks etwas schneller als die Suche nach Softlinks (Bitte korrigieren Sie mich, wenn ich falsch liege oder nicht klar bin).

1voto

lmmorris1 Punkte 31

Symbolische Links geben einer Datei einen anderen Namen, ähnlich wie bei harten Links. Aber eine Datei kann gelöscht werden, auch wenn noch symbolische Links vorhanden sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X