Warum gibt es feste Links?

Antworten:

56

Der Hauptvorteil von Hardlinks ist, dass es im Vergleich zu Softlinks keine Größen- oder Geschwindigkeitseinbußen gibt. Softlinks sind eine zusätzliche Indirektionsebene neben dem normalen Dateizugriff. Der Kernel muss den Link beim Öffnen der Datei dereferenzieren, was einige Zeit in Anspruch nimmt. Der Link benötigt auch etwas Platz auf der Festplatte, um den Text des Links aufzunehmen. Diese Nachteile gibt es bei festen Links nicht, da sie in die Struktur des Dateisystems integriert sind.

Der beste Weg, dies zu sehen, ist:

$ ls -id .
1069765 ./
$ mkdir tmp ; cd tmp
$ ls -id ..
1069765 ../

Die -iOption lsermöglicht es Ihnen , die gibt Inode - Nummer der Datei. Auf dem System, auf dem ich das obige Beispiel vorbereitet habe, befand ich mich zufällig in einem Verzeichnis mit der Inode-Nummer 1069765, aber der spezifische Wert spielt keine Rolle. Es ist nur ein eindeutiger Wert, der eine bestimmte Datei / ein bestimmtes Verzeichnis identifiziert.

Dies besagt, dass, wenn wir in ein Unterverzeichnis gehen und einen anderen Dateisystemeintrag mit dem Namen anschauen .., dieser die gleiche Inode-Nummer hat, die wir zuvor hatten. Dies geschieht nicht, da die Shell ..für Sie interpretiert , wie dies bei MS-DOS und Windows der Fall ist . Unter Unix-Dateisystemen ..ist dies ein echter Verzeichniseintrag. Es ist ein fester Link, der zurück zum vorherigen Verzeichnis verweist.

Harte Verbindungen sind die Sehnen, die die Verzeichnisse des Dateisystems miteinander verbinden. Es war einmal, dass Unix keine festen Links hatte. Sie wurden hinzugefügt, um das ursprüngliche Flat-File-System von Unix in ein hierarchisches Dateisystem zu verwandeln .

(Weitere Informationen hierzu finden Sie unter Warum hat '/' einen '..'-Eintrag ? .)

Auf Unix-Systemen ist es auch üblich, dass mehrere unterschiedliche Befehle von derselben ausführbaren Datei implementiert werden. Es scheint nicht der Fall unter Linux nicht mehr zu sein, aber auf Systemen verwendete ich in der Vergangenheit cp, mvund rmwaren alle gleich ausführbar. Wenn Sie darüber nachdenken, ist es sinnvoll: Wenn Sie eine Datei zwischen Volumes verschieben, handelt es sich praktisch um eine Kopie, auf die ein Entfernen folgt, sodass mvbereits die Funktionen der anderen beiden Befehle implementiert werden mussten. Die ausführbare Datei kann herausfinden, welche Operation bereitzustellen ist, da ihr der Name übergeben wird, von dem sie aufgerufen wurde.

Ein weiteres Beispiel, das in Embedded Linuxes häufig vorkommt, ist BusyBox , eine einzelne ausführbare Datei, die Dutzende von Befehlen implementiert .

Ich sollte darauf hinweisen, dass Benutzer auf den meisten Dateisystemen keine festen Links zu Verzeichnissen erstellen dürfen. Die Einträge .und ..werden automatisch vom Dateisystemcode verwaltet, der normalerweise Teil des Kernels ist. Die Einschränkung besteht darin, dass es zu ernsthaften Problemen mit dem Dateisystem kommen kann, wenn Sie beim Erstellen und Verwenden von Verzeichnis-Hardlinks nicht aufpassen. Dies ist einer der vielen Gründe, warum weiche Links existieren. Sie tragen nicht das gleiche Risiko.

Warren Young
quelle
4
Info "Der Link benötigt auch etwas Speicherplatz auf der Festplatte, um den Text des Links aufzunehmen." In modernen Dateisystemen wird kein zusätzlicher Speicherplatz zum Speichern des Verknüpfungspfads verwendet, da der Verzeichniseintrag selbst zum Speichern verwendet wird, zumindest wenn der Name nicht zu lang ist. Dies nennt man "schnelle Symlinks"
jlliagre
Ich möchte hinzufügen, dass einige Anwendungen nicht wissen, wie man mit weichen (sym) Links umgeht. Daher können harte Links nützlich sein, um Redundanzen bei der Konfiguration zu vermeiden, indem auf dieselben Daten / Konfigurationsdateien verwiesen wird. Ein Beispiel ist ioquake3, das symlinked pk3-Dateien nicht folgen kann, aber hardlinked pk3-Dateien folgen kann.
Gaborous
3
Wenn Sie das Ziel eines Symlinks löschen, ist die Datei nicht mehr vorhanden und der Symlink ist beschädigt. Ein Problem, das mit einem festen Link nicht existiert.
Spectras
1
Harte Links haben aber auch eine Info - ihre Namen. Also sollte es Platz brauchen.
Josef Klimuk
39

Eine äußerst nützliche Verwendung von Hardlinks sind inkrementelle Sicherungen in Kombination mit rsync. Das spart viel Platz und erleichtert die Wiederherstellung. Ich verwende diesen Ansatz für die Sicherung auf meinen Servern.

Nehmen Sie sich etwas Zeit, um diese Erklärung zu lesen .

hmontoliu
quelle
12

Wenn Sie nach dem Lesen dieser Wikipedia-Seite die Frage "Warum sollte ich sie jemals verwenden?" Haben, verstehen Sie nicht, was harte Links sind.

Ein Link ist ein Verzeichniseintrag, der auf Blöcke auf der Festplatte verweist. Mit anderen Worten, jede Datei auf Ihrem System verfügt über mindestens einen Link. Bei Ihnen ist rmeine Datei der eigentliche Systemaufruf unlink(). Der Verzeichniseintrag wird entfernt. Die Blöcke auf der Festplatte haben sich nicht geändert, aber die Verknüpfung ist nicht mehr vorhanden, sodass die Datei aus der Verzeichnisliste entfernt wurde.

Sie persönlich dürfen niemals feste Links verwenden, aber diese befinden sich überall auf Ihrem System. Zum Beispiel:

$ ls -li /bin | grep 53119771
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bunzip2
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzcat
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzip2

Sie können sehen , dass bunzip2, bzcatund bzipalle verwenden die gleichen Inode. Im Wesentlichen handelt es sich um eine Datei mit drei Namen. Sie könnten drei Kopien der Datei haben, aber warum? Es würde nur unnötig Speicherplatz verbrauchen.

Bahamat
quelle
12
Aber es gibt auch eine Reihe von Symlinks /bin, ich denke, das ist eine der Ursachen für Verwirrung. Warum werden ausführbare Dateien manchmal symbolisch und manchmal fest miteinander verknüpft?
Dmitry Pashkevich
16
Diese Antwort liefert überhaupt keinen Grund für die Verwendung von Hardlinks über Softlinks.
Mark Amery
8

Es gibt eine beliebige Anzahl von Verwendungen. Ich benutze sie, um dateibasierte Sperren zu erstellen. Der Systemaufruf link (2) ist im Gegensatz zu den meisten anderen Systemaufrufen atomar.

Eine weitere Verwendung ist rsnapshot, bei dem Backups über Hardlinks erstellt werden, um den Speicherplatz auf der Festplatte zu verringern. Wenn eine Datei nicht geändert wurde, ist die Datei fest mit den älteren Instanzen der Datei verknüpft. Geänderte Dateien werden erneut kopiert.

Ich benutze sie auch, um Konfigurationsdateien auf Servern auszutauschen: rm file.cfg && ln ~/tmp/file.cfg file.cfgDann können die ~ / tmp / * -Dateien sicher gelöscht werden.

Arcege
quelle
1
Warum das getrennte lnund rmstatt nur ein mv?
Tommiie
6

Zu den vielen guten Diskussionen, die es bereits gibt, kommt noch hinzu ...

  • Die Art und Weise, wie der Ressourcenzugriff für Programme unter Unix implementiert wird (dh "Alles ist eine Datei" ), bedeutet, dass die Infrastruktur für die Verarbeitung mehrerer Verweise auf eine Datei erforderlich ist, damit das Betriebssystem überhaupt funktioniert, sodass hier keine zusätzlichen Kosten anfallen.
  • Die Art und Weise, wie Verzeichnisse in den ursprünglichen Unix - Dateisystemen implementiert wurden (dh eine Liste von (inode, name)Paaren mit festem Format bedeutet, dass das Vorhandensein von Hardlinks keine zusätzlichen Kosten für das Dateisystem verursacht (vorausgesetzt, wir verhindern Zyklen, indem keine Hardlinks zu Verzeichnissen (außer .und) zugelassen werden) ..(Fühlt sich das für irgendjemanden anders an?))

also bekommen wir sie kostenlos.

dmckee
quelle
2

Ich sollte wahrscheinlich ein Fallstrick-Szenario mit harten Links behandeln. Eine feste Verknüpfung ist dieselbe Datei mit einem anderen Namen und / oder einem anderen Speicherort , solange die ursprüngliche verknüpfte Datei vorhanden ist . Es ist nicht einmal richtig, die Datei als "original" zu betrachten: Beide sind Verzeichniseinträge für sich und beide (oder mehr) sind alle gleich. Bei langlebigen Dateien kann dies ein Segen sein. Wenn jedoch eine der beiden Dateien gelöscht und erstellt wird, werden die Dateien auch bei gleichem Namen und Inhalt getrennt.

Angenommen, Sie haben einen Hardlink /foo/myfilemit erstellt /repo/myfile. Beide sind Zeiger auf dieselben Dateidaten. ändere einen, der andere ändert sich. Nehmen wir jedoch an, dass /repodies ein Git-Repository enthält. Wenn Sie einen Zweig auschecken, der ihn nicht enthält myfile, /repo/myfilewird er gelöscht. In diesem Moment /foo/myfilewird eine einfache Kopie von /repo/myfile, als wäre in dem Moment der andere des Paares nicht verbunden. Es ist einfach, nicht einmal zu bemerken, wenn Sie zwischen Zweigen wechseln, dass sich das Dateirepertoire ändert, sondern wenn Sie den ursprünglichen Zweig auschecken, eine neue Datei/repo/myfilewird von Git erstellt. Wenn Sie nicht aufgepasst haben, werden Sie sich fragen, warum die beiden Dateien jetzt unterschiedliche Inhalte haben, obwohl es leicht zu fassen ist, da die Beziehung zwischen den festen Verknüpfungen keine Ahnung über ihre Namen hat. Eine weiche Verbindung würde im Gegenteil durch diesen Lösch-Erstellungs-Zyklus überleben.

Andererseits ist sich Software, die harte Links verwendet, dessen bewusst, und Git ist ein Paradebeispiel. Git klont fast kostenlos ein Repository auf demselben Dateisystem, da standardmäßig feste Links verwendet werden, anstatt Dateien zu kopieren. Für Git ist der Hardlink ein perfekter Anwendungsfall, da sich die Objekt- und Paketdateien nie ändern, sodass ein Klon des Repositorys niemals die anderen ändert (Git weiß, dass modifizierbare Dateien nicht per Hardlink verknüpft werden), und jeder der Klone kann dies tun Löschen ohne Vorsichtsmaßnahme: Es muss nicht nachverfolgt werden, welches das "Original" ist und die Dateien tatsächlich enthält: Jeder der festen Links ist ein gleichberechtigter Partner und "enthält" die vollständige Datei. Softlinks würden hier einfach nicht funktionieren.

Ein weiterer Vorteil des festen Links ist, dass jeder Link verschoben werden kann, ohne den Zugriff auf den Dateiinhalt zu unterbrechen. Bei Softlinks werden beim Verschieben der Originaldatei alle Softlinks zum Baumeln gebracht.

Das Fazit ist, dass in vielen Anwendungsfällen jeder Verbindungstyp gleich gut funktioniert, aber in einigen Fällen der eine oder andere Typ von Vorteil ist. Die in vielen Antworten erwähnte Effizienz ist bei modernen Maschinen und Dateisystemen wahrscheinlich von sehr geringer Bedeutung, es sei denn, Sie bereinigen ein Dateisystem auf einem FLASH-Chip eines mickrigen eingebetteten Controllers. Die funktionalen Unterschiede sind wichtiger und bestimmen in der Regel die technischen Einschränkungen und die endgültige Wahl:

  • Die "Quelle" der festen Verbindung kann sicher verschoben werden, während die weiche Verbindung unterbrochen wird.
  • Die feste Verknüpfung ist nicht von der Datei zu unterscheiden, von der aus sie verknüpft wurde, und die Datei ist aktiv, solange eine der festen Verknüpfungen aktiv ist. Die weiche Verbindung ist asymmetrisch.
  • Der Peer mit fester Verknüpfung bricht aus der verknüpften Gruppe aus, wenn er gelöscht und neu erstellt wird, der Softlink verliert jedoch nicht sein Ziel.
  • Der Softlink kann Dateisysteme überqueren, der Hardlink nicht.
  • Der Softlink kann auf ein Verzeichnis verweisen, der Hardlink normalerweise nicht (und sollte es praktisch immer nicht).

Außerdem muss ich darauf hinweisen, dass der Bibliotheksaufruf, der eine Datei löscht, unlink()aus einem Grund aufgerufen wird ! Jeder Verzeichniseintrag ist nur eine anfangs singuläre feste Verknüpfung zu seinem Inode.

kkm
quelle