Ich weiß, was harte Links sind, aber warum sollte ich sie verwenden? Was ist der Nutzen einer festen Verbindung?
Ich weiß, was harte Links sind, aber warum sollte ich sie verwenden? Was ist der Nutzen einer festen Verbindung?
Antworten:
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 -i
Option ls
ermö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
, mv
und rm
waren 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 mv
bereits 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.
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 .
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 rm
eine 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
, bzcat
und bzip
alle 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.
/bin
, ich denke, das ist eine der Ursachen für Verwirrung. Warum werden ausführbare Dateien manchmal symbolisch und manchmal fest miteinander verknüpft?
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.cfg
Dann können die ~ / tmp / * -Dateien sicher gelöscht werden.
ln
und rm
statt nur ein mv
?
Zu den vielen guten Diskussionen, die es bereits gibt, kommt noch hinzu ...
(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.
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/myfile
mit erstellt /repo/myfile
. Beide sind Zeiger auf dieselben Dateidaten. ändere einen, der andere ändert sich. Nehmen wir jedoch an, dass /repo
dies ein Git-Repository enthält. Wenn Sie einen Zweig auschecken, der ihn nicht enthält myfile
, /repo/myfile
wird er gelöscht. In diesem Moment /foo/myfile
wird 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/myfile
wird 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:
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.