Was ist der Unterschied zwischen einem Hardlink und einer Datei?

37

Eine feste Verbindung ist als Zeiger auf eine Inode definiert. Ein Softlink , der auch als symbolischer Link bezeichnet wird , ist eine unabhängige Datei, die auf einen anderen Link verweist, ohne die Einschränkungen fester Links.

Was ist der Unterschied zwischen einer Datei und einem festen Link? Ein fester Link verweist auf eine Inode. Was ist also eine Datei? Der Inode-Eintrag selbst? Oder eine Inode mit einem harten Link?

Angenommen, ich erstelle eine Datei mit Touch. Dann wird ein Inode-Eintrag in der Inode-Tabelle erstellt . Und ich erstelle einen festen Link, der die gleiche Inode-Nummer wie die Datei hat. Also habe ich eine neue Datei erstellt? Oder ist die Datei nur als Inode definiert?

Levent Divilioglu
quelle
Dies ist mit ziemlicher Sicherheit ein Duplikat von unix.stackexchange.com/questions/9575/…
das
7
@infixed Genau nicht, ich frage nach dem Unterschied zwischen einer Datei und einem festen Link.
Levent Divilioglu
Daher habe ich meine ursprüngliche Antwort wiederhergestellt, von der ich glaube, dass sie auch in den Antworten auf diese verknüpfte Frage behandelt wurde. Also ist es immer noch "genau nicht"?
hinzugefügt
7
Der Unterschied zwischen einer Datei und einem Hardlink ist der gleiche wie der Unterschied zwischen Ihnen und der Zeile mit Ihrem Namen im Telefonbuch.
Jörg W Mittag
2
Dies ist ein Duplikat von unix.stackexchange.com/questions/234402/…
seumasmac

Antworten:

61

Die sehr kurze Antwort lautet:

  • Eine Datei ist ein anonymer Datenblock
  • Ein Hardlink ist ein Name für eine Datei
  • Ein symbolischer Link ist eine spezielle Datei, deren Inhalt ein Pfadname ist

Unix-Dateien und -Verzeichnisse funktionieren genau wie Dateien und Verzeichnisse in der realen Welt (und nicht wie Ordner in der realen Welt). Unix-Dateisysteme sind (konzeptionell) wie folgt aufgebaut:

  • Eine Datei ist ein anonymer Datenblock. es hat keinen Namen, nur eine Nummer (inode)
  • Ein Verzeichnis ist eine spezielle Art von Datei, die eine Zuordnung von Namen zu Dateien (genauer gesagt Inodes) enthält. da ein Verzeichnis nur eine Datei ist, können Verzeichnisse Einträge für Verzeichnisse haben, das ist , wie Rekursion implementiert ist ( man beachte , dass , wenn Unix - Dateisysteme eingeführt wurden, war dies nicht bei allen offensichtlich, erlauben viele Betriebssysteme nicht Verzeichnisse Verzeichnisse zurück zu enthalten dann)
  • Diese Verzeichniseinträge werden als Hardlinks bezeichnet
  • Ein symbolischer Link ist eine andere spezielle Art von Datei, deren Inhalt ein Pfadname ist. Dieser Pfadname wird als Name einer anderen Datei interpretiert
  • Andere Arten von Spezialdateien sind: Sockets, Fifos, Blockgeräte, Zeichengeräte

Unter Berücksichtigung dieser Metapher und insbesondere unter Berücksichtigung der Tatsache, dass Unix-Verzeichnisse wie echte Verzeichnisse und nicht wie echte Ordner funktionieren , werden viele der "Merkwürdigkeiten" erklärt, auf die Neulinge häufig stoßen. Sie haben keinen Schreibzugriff auf? Zum einen löschen Sie nicht die Datei, sondern einen von vielen möglichen Namen für die Datei. Dazu benötigen Sie nur Schreibzugriff auf das Verzeichnis, nicht auf die Datei. Genau wie in der realen Welt.

Oder warum kann ich baumelnde Symlinks haben? Nun, der Symlink enthält einfach einen Pfadnamen. Es gibt nichts, was besagt, dass es tatsächlich eine Datei mit diesem Namen geben muss.

Meine Frage ist einfach, was ist der Unterschied zwischen einer Datei und einem festen Link?

Der Unterschied zwischen einer Datei und einem festen Link ist der gleiche wie der Unterschied zwischen Ihnen und der Zeile mit Ihrem Namen im Telefonbuch.

Ein fester Link verweist auf eine Inode. Was ist also eine Datei? Inode-Eintrag selbst? Oder eine Inode mit einem harten Link?

Eine Datei ist ein anonymes Datenelement. Das ist es. Eine Datei ist kein inode, eine Datei hat eine Inode, so wie du kein Sozialversicherungsnummer sind, Sie haben eine SSN.

Ein fester Link ist ein Name für eine Datei. Eine Datei kann viele Namen haben.

Angenommen, ich erstelle eine Datei mit Touch, dann wird ein Inode-Eintrag in der Inode-Tabelle erstellt .

Ja.

Und ich erstelle einen festen Link, der die gleiche Inode-Nummer mit der Datei hat.

Ein fester Link hat keine Inode-Nummer, da es sich nicht um eine Datei handelt. Nur Dateien haben Inode-Nummern.

Der Hardlink verknüpft einen Namen mit einer Inode-Nummer.

Also habe ich eine neue Datei erstellt?

Ja.

Oder ist die Datei nur als Inode definiert?

Nein. Die Datei hat einen Inode, es ist kein Inode.

Jörg W. Mittag
quelle
15
Ich hatte nie wirklich verstanden (oder richtig darüber nachgedacht), welche Metapher hinter dem Wort "Verzeichnis" steckt. Das Telefonbuchbeispiel ist großartig. Vielleicht sollten Sie es früher einführen (wenn Sie die reale Welt zum ersten Mal erwähnen). In ähnlicher Weise haben die meisten Menschen selten mit "Dateien" außerhalb eines Computers zu tun, daher wäre es vielleicht klarer zu sagen, "genau wie Papierdateien und ein Verzeichnis wie ein Telefonbuch".
IMSoP
2
@IMSoP Es ist eine Generationslücke. Vor Computern war ein Telefonbuch eine Art Verzeichnis. Das Cambridge-Wörterbuch sagt: " Verzeichnis: Ein Buch, das eine Liste von Namen, Adressen oder anderen Fakten enthält. [...]
Schlagen
2
@kubanczyk In der Tat - für Leute, die in vor-digitalen Büros gearbeitet haben, scheinen die Metaphern so offensichtlich, dass es sich fast herablassend anfühlt, sie zu erklären. Aber für die meiner Generation und jünger ist es so unklar, warum der Stauraum auf der Rückseite eines Autos als "Kofferraum" oder "Kofferraum" bezeichnet wird, also muss man es wirklich ausdrücken.
IMSoP
Das Wort "Haben" in der Phrase "Ein fester Link hat keine Inode-Nummer" ist möglicherweise irreführend, weil Sie dann sagen, dass "Der feste Link einen Namen mit einer Inode-Nummer verknüpft". Die Datenstruktur des "hardlink" -Verzeichniseintrags enthält tatsächlich die Inode-Nr. - auf diese Weise wird die Verknüpfung der Inode-Nr. "Zugeordnet". Mit "nicht haben" meine ich, dass der Hardlink keine Inode-Nummer hat, die angibt, wo der Link auf der Festplatte gespeichert ist.
Kelvin
2
Zu sagen , dass eine Datei hat eine Inode ist etwas nach hinten. Der Inode ist die Struktur, die die Information darüber enthält, wo sich der "Datenblock" befindet. Wenn es keine Inode gibt, gibt es keine Datei.
Barmar
18

Ein fester Link ist ein Verzeichniseintrag. Eine Datei kann mehrere Verzeichniseinträge haben, wenn sie unter verschiedenen Namen oder in verschiedenen Verzeichnissen vorhanden ist. Ein Verzeichniseintrag wird als "fester Link" bezeichnet, wenn er mit anderen Verzeichniseinträgen für dieselbe Datei in Beziehung gesetzt wird.

Der Inode enthält die Metadaten der Datei mit Ausnahme des Namens und des Inhalts (Speicherort des Inhalts, Berechtigungen, Zeitstempel usw.). Es gibt eine Inode pro Datei. (Nicht bei allen Dateisystemen befinden sich die Metadaten in einem eindeutig identifizierbaren Bereich auf der Festplatte, den Sie als "Inode" bezeichnen können. Es handelt sich jedoch um eine allgemeine Architektur.) Ein Verzeichniseintrag verknüpft einen Namen mit einem Inode. Es ist möglich, dass mehr als ein Verzeichniseintrag auf denselben Inode verweist, daher der Begriff „Link“. Eine solche Verknüpfung wird als "harte Verknüpfung" bezeichnet, wenn sie sich von "weichen Verknüpfungen" oder "symbolischen Verknüpfungen" unterscheidet, die nicht "für diesen Namen diese Inode verwenden", sondern "für diesen Namen diesen anderen Namen nachschlagen".

Stellen Sie sich Dateien als Räume und Verzeichniseinträge als Türen vor. "Öffne die Datei /foo/bar" bedeutet "gehe in den Flur /foound gehe in den Raum bar". "Gehe in den Raum bar" bedeutet wirklich "öffne die Tür barund betrete den Raum", aber "Gehe in den Raum bar" ist eine unauffällige Möglichkeit, das Gleiche in kürzerer Form auszudrücken. Es ist möglich, dass mehr als eine Tür zum selben Raum führt.

Wenn Sie eine feste Verknüpfung zu einer vorhandenen Datei erstellen ( ln existing new), erstellen Sie eine zweite Verknüpfung zu derselben Datei, dh, Sie erstellen einen neuen Verzeichniseintrag, der auf die bereits vorhandene Datei verweist. Nach der Erstellung haben die beiden Verzeichniseinträge den gleichen Status: Es gibt keinen "primären" und keinen "sekundären" Verzeichniseintrag, sondern beide verweisen auf dieselbe Datei.

Sie können auch alle Links zu einer Datei entfernen, ohne die Datei selbst zu entfernen. Dies passiert, wenn Sie eine Datei löschen (dh wenn Sie alle Verzeichniseinträge entfernen), während ein Programm die Datei noch geöffnet hat. Die Datei verbleibt im Dateisystem und wird erst dann tatsächlich entfernt, wenn der letzte Prozess, bei dem die Datei geöffnet war, sie schließt. In der Raum-und-Türen-Metapher nimmt ein Raum, der keine Türen hat, immer noch Platz ein.

Gilles 'SO - hör auf böse zu sein'
quelle
Wann wurden Hard- und Softlinks zum ersten Mal eingeführt?
n611x007
2
@ n611x007: Könnten Sie bitte eine neue Frage öffnen , wenn Sie eine neue Frage oder eine Folgefrage haben? Der Kommentarbereich ist nicht geeignet oder für neue Fragen oder erweiterte Diskussionen gedacht. Vielen Dank.
David Foerster
1
@ n611x007 Harte Links sind älter als Unix, v1 hatte sie . Symlinks in Unix sind etwas neuer. Wikipedia hat eine gewisse Geschichte.
Gilles 'SO- hör auf böse zu sein'
Räume und Türen ist eine tolle Analogie! Symlinks sind dann wie Schilder an den Türen.
curiousdannii
1
@curiousdannii: Symlinks ähneln eher Räumen, in denen eine Person sitzt, die sagt, "oi m8 wrong office go to # 234"
Lightness Races with Monica
8

Neben allen anderen Antworten möchte ich auf folgende wichtige Eigenschaften hinweisen:

Ein Softlink ist eine echte Referenz, dh es ist eine kleine Datei, die einen Pfadnamen enthält. Das Auflösen eines Softlinks geschieht für die Anwendung transparent: Wenn ein Prozess eine Datei öffnet, /this/path/herebeispielsweise einen Symlink, auf /that/other/pathden verwiesen wird, übernimmt /that/other/pathdas Betriebssystem die gesamte Abwicklung des Öffnens . Wenn /that/other/pathes sich um einen Symlink handelt, wird dies auch vom Betriebssystem behandelt. Tatsächlich folgt das Betriebssystem der Kette von Symlinks, bis es etwas anderes findet (z. B. eine reguläre Datei) oder bis es viele Einträge erreicht SYMLOOP_MAX(siehe sysconf(3)). In diesem Fall gibt das Betriebssystem (genauer: den entsprechenden Systemaufruf) einen Fehler zurück und setzt errnozu ELOOP. Somit wird ein zirkulärer Verweis xyz -> xyzden Prozess nicht blockieren. ( path_resolution(7)Einzelheiten zu Linux-Systemen finden Sie unter .)

Beachten Sie, dass ein Prozess durch die Verwendung von lstat(2)und durch lchown(2)andere (siehe symlink(7)für die ganze Geschichte) prüfen kann, ob ein Pfadname ein Symlink ist oder nicht, und seine (in der Inode-Tabelle gespeicherten) Dateiattribute ändern kann .

In Bezug auf die Berechtigung werden Sie feststellen, dass Symlinks immer die Berechtigung 777 haben ( rwxrwxrwxin symbolischer Notation). Dies ist darauf zurückzuführen, dass andere Berechtigungen ohnehin durch Zugriff auf die eigentliche Datei umgangen werden können. Umgekehrt macht 777 für einen Symlink die Symlink-Datei nicht zugänglich, wenn sie überhaupt nicht zugänglich war. Beispielsweise macht ein Symlink mit den Berechtigungen 777, der auf eine Datei mit den Berechtigungen 640 zeigt, die Datei nicht für "andere" (die allgemeine Öffentlichkeit) zugänglich. Mit anderen Worten, auf eine Datei kann xyznur dann über einen Symlink zugegriffen werden, wenn sie direkt, dh ohne Indirektion, zugänglich ist. Daher haben die Berechtigungen des Symlinks keinerlei Auswirkungen auf die Sicherheit.

Einer der wichtigsten sichtbaren Unterschiede zwischen Hardlinks und Symlinks (auch als Softlinks bezeichnet) besteht darin, dass Symlinks zwischen Dateisystemen funktionieren, während Hardlinks auf ein Dateisystem beschränkt sind. Das heißt, eine Datei auf Partition A kann symbolisch mit Partition B verknüpft werden, aber von dort aus kann keine feste Verknüpfung hergestellt werden. Dies ergibt sich aus der Tatsache, dass ein Hardlink tatsächlich ein Eintrag in einem Verzeichnis ist, das aus einem Dateinamen und einer Inode-Nummer besteht, und dass Inode-Nummern nur pro Dateisystem eindeutig sind.

Der Begriff Hardlink ist eigentlich etwas irreführend. Während für Symlinks Quelle und Ziel klar voneinander zu unterscheiden sind (der Symlink hat einen eigenen Eintrag in der Inode-Tabelle), gilt dies nicht für Hardlinks. Wenn Sie einen Hardlink für eine Datei erstellen, sind der ursprüngliche Eintrag und der Hardlink in Bezug auf das, was zuerst vorhanden war, nicht zu unterscheiden. (Da sie sich auf denselben Inode beziehen, teilen sie ihre Dateiattribute wie Eigentümer, Berechtigungen, Zeitstempel usw.) Dies führt zu der Aussage, dass jeder Verzeichniseintrag tatsächlich ein Hardlink ist und dass das Hardlinken einer Datei nur das Erstellen eines zweiten bedeutet. oder dritter, oder vierter ...) Hardlink. Tatsächlich speichert jeder Inode einen Zähler für die Anzahl der Hardlinks zu diesem Inode.

Beachten Sie schließlich, dass normale Benutzer Verzeichnisse möglicherweise nicht fest verknüpfen. Das liegt daran, dass dies mit äußerster Vorsicht geschehen muss: Ein unachtsamer Benutzer kann Zyklen in den ansonsten streng hierarchischen Dateibaum einführen, auf die alle üblichen Tools (wie fsck) und das Betriebssystem selbst nicht vorbereitet sind.

Gegenmodus
quelle
6

Eine einfache Antwort:

  • Ein Dateieintrag in einem Verzeichnis ist ein fester Link zu dieser Datei.

  • Einige Dateien haben mehr als eine solche feste Verknüpfung, da mehrere feste Verknüpfungen zu derselben Datei zulässig sind.

Andrew Henle
quelle
3

In den Anfängen von Unix waren die Dateien intern Inodes auf einem bestimmten Laufwerk. Die Dateinamen waren eine benutzerfreundlichere Möglichkeit, auf sie zuzugreifen.

Ein fester Link hat einem Inode mehr als einen Dateinamen zugewiesen. Sie könnten eine Datei erstellen, einen zweiten Namen fest mit dem Namen verknüpfen und den ersten Namen löschen, und es wäre nicht zu unterscheiden, wenn Sie die Datei mit dem zweiten Namen an erster Stelle erstellt hätten.

Der Systemaufruf, den ein Programm zum Löschen einer Datei benötigt, lautet "unlink (2)". Die Daten werden erst gelöscht, wenn der Nachname vom Inode getrennt wurde. (und die inode ist nicht irgendwo durch einen prozess geöffnet)

Dies macht es Linux einfacher, ein Upgrade durchzuführen, während noch Programme ausgeführt werden. Wenn auf einem Prozess eine ausführbare Datei ausgeführt wird und ein Update stattfindet, wird der Programmname erneut verwendet, aber der Inode mit der alten Version ist noch vorhanden, sodass er weiterhin ausgeführt werden kann. Wenn der letzte Prozess, der diese alte Version ausführt, beendet wird, wird der Speicher für diese alte Version freigegeben.

Softlinks sind entstanden, weil Sie bei einem einheitlichen Dateibaum mit mehreren Einhängepunkten keine feste Verbindung von einer Festplatte zu einer Inode auf einer anderen herstellen konnten. So wurden weiche Links erfunden.

angebracht
quelle
Ich denke, dies ist ein Duplikat von unix.stackexchange.com/questions/9575/…
eingefügt
2
early dayswarum ist es jetzt anders? Ihre Antwort scheint diese Ansicht in keiner Weise widerzuspiegeln?
n611x007
@ n611x007 Weil heutzutage Dinge wie Linux Nicht-Unix-Dateisysteme mounten können, die nicht zum Inode-Modell passen. Wie zum Beispiel FAT-Derivate und ISO-9660. Es ist eine viel vielfältigere Dateisystem Ökologie statt einer one-size fits all
Infix
1

Eine Datei sind die auf die Festplatte geschriebenen Daten. Auf diese Daten wird durch ihren Inode verwiesen, der Metadaten über die Datei enthält, die dem System mitteilen, welche Blöcke auf der Festplatte von dieser Datei unter anderem verwendet werden. Ein fester Link verweist auf die Inode-Nummer dieser Datei.

Eigentlich erstellen Sie eine neue Datei, aber diese Datei enthält nur die Inode-Nummer der Datei, auf die sie verweist, und einen Namen. Es ist besser, sich vorzustellen, dass ein Zeiger auf den Inode oder auf die Datei erstellt wird.

user151768
quelle
1

Datei ist ein weit verbreitetes Konzept für Einträge in einem Dateisystem.

Normalerweise enthält es Verzeichnis , reguläre Datei (fester Link) und symbolischen Link (weicher Link). Und kann sogar Gerät und Steckdose enthalten.

Meine Frage ist einfach, was ist der Unterschied zwischen einer Datei und einem festen Link? Ein fester Link verweist auf eine Inode. Was ist also eine Datei? Inode-Eintrag selbst? Oder eine Inode mit einem harten Link?

Angenommen, ich erstelle eine Datei mit Touch, dann wird ein Inode-Eintrag in der Inode-Tabelle erstellt. Und ich erstelle einen festen Link, der die gleiche Inode-Nummer mit der Datei hat. Also habe ich eine neue Datei erstellt? Oder ist die Datei nur als Inode definiert?

Da auch symbolische Links normalerweise als Datei gezählt werden, kann ein fester Link selbst auch als Datei gezählt werden. Sie können sagen, dass es sich um eine Datei handelt, unabhängig davon, ob es sich um einen harten oder einen weichen Link handelt.

Das Konzept ist etwas mehrdeutig, daher kann man auch sagen, dass ein Inode-Eintrag eine Datei ist, obwohl Sie sich möglicherweise tatsächlich auf die Daten beziehen möchten.

Wenn Sie ein C ++ - oder Java-Programmierer sind, sollten Sie sich über std :: filesystem :: file_type , java.io.File und java.nio.file.Files informieren .

Details zu Unterschieden zwischen Hardlink und Softlink finden Sie im Link im Kommentar von infixed.

cshu
quelle
1

Der Unterschied zwischen einer "Datei" mit einem bestimmten Namen und einer "festen Verknüpfung" ist historisch. Eine (reguläre) Datei mit einem bestimmten Namen wird durch einen Aufruf des Erstellungssystems erstellt, eine feste Verknüpfung wird durch einen Aufruf des Verknüpfungssystems erstellt.

Während Menschen über den Verlauf von Verzeichniseinträgen sprechen und sich daran erinnern und sie entsprechend als Dateien und feste Links bezeichnen, tut dies das Dateisystem nicht. Die Verzeichniseinträge von "Originaldatei" und "fester Link" sind in ihrer Qualität völlig ununterscheidbar: Beide stellen eine Referenz zwischen einem Dateinamen und dem Inode einer Datei her, und sobald die letzte solche Referenz weg ist (Referenzen sind nicht nur Dateinamen für Eine Datei, aber auch Dateideskriptoren, mit denen auf eine geöffnete Datei zugegriffen werden kann. Die Datei für den nicht referenzierten Inode wird als gelöscht betrachtet und der Inode und der zugehörige Dateibereich werden zurückgefordert.

Wenn Menschen "Dateien" und "harte Links" gegenüberstellen, entstand das erste mit einer "Linkanzahl von 1" und alle anderen mit einer größeren Linkanzahl. Der Unterschied ist akademisch und das Umbenennen einer Datei auf einmal bestand darin, einen festen Link für den Zielnamen zu erstellen und den Link für den Quellnamen zu entfernen. Heutzutage wird normalerweise ein einzelner Systemaufruf verwendet, der dies atomar erledigt.

user217420
quelle