GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum scheinen Hardlinks denselben Platz einzunehmen wie die Originale?

Eine Datei ist ein Inode mit Metadaten, darunter eine Liste von Zeigern, wo die Daten zu finden sind.

Um auf eine Datei zugreifen zu können, müssen Sie diese verlinken es zu einem Verzeichnis (denken Sie an Verzeichnisse als Telefonverzeichnisse, nicht an Ordner), d.h. fügen Sie einem oder mehreren Verzeichnissen einen oder mehrere Einträge hinzu, um einen Namen zuzuordnen mit dieser Datei.

All diese Links, diese Dateinamen verweisen auf dieselbe Datei. Es gibt keine, die das Original ist, und die anderen, die Links sind. Sie sind alle Zugangspunkte zu derselben Datei (demselben Inode) im Verzeichnisbaum. Wenn Sie die Größe der Datei (lstat Systemaufruf) Sie Informationen (die oben erwähnten Metadaten) abrufen, die im Inode gespeichert sind, spielt es keine Rolle, welchen Dateinamen, welchen Link Sie verwenden, um auf diese Datei zu verweisen.

Im Gegensatz dazu sind Symlinks eine andere Datei (ein weiterer Inode), deren Inhalt ein Pfad ist zur Zieldatei. Wie jede andere Datei müssen diese Symlinks mit einem Verzeichnis verknüpft sein (muss einen Namen haben), damit Sie darauf zugreifen können. Sie können auch mehrere Links zu einem Symlink haben, oder mit anderen Worten, Symlinks können mehrere Namen haben (in einem oder mehreren Verzeichnissen).

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

Oberhalb der Aktennummer 10486707 befindet sich eine reguläre Akte. Zwei Einträge im aktuellen Verzeichnis (einer mit dem Namen a , einer mit dem Namen b ) Link dazu. Weil die Linkanzahl 2 ist, wissen wir, dass es keinen anderen Namen dieser Datei im aktuellen Verzeichnis oder einem anderen Verzeichnis gibt. Dateinummer 10502404 ist eine weitere Datei, diesmal vom Typ Symlink, die zweimal mit dem aktuellen Verzeichnis verknüpft ist. Sein Inhalt (Ziel) ist der relative Pfad "a".

Beachten Sie, dass, wenn 10502404 mit einem anderen Verzeichnis als dem aktuellen verknüpft wäre, es normalerweise auf eine andere Datei verweisen würde, je nachdem, wie darauf zugegriffen wurde.

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

Dateien haben keine Namen, die ihnen zugeordnet sind, außer in den Verzeichnissen, die sie verknüpfen. Der Platz, der von ihren Namen eingenommen wird, sind die Einträge in diesen Verzeichnissen, er wird in der Dateigröße/Festplattennutzung der Verzeichnisse berücksichtigt.

Sie werden feststellen, dass der Systemaufruf zum Entfernen einer Datei unlink lautet . Das heißt, Sie entfernen keine Dateien, Sie trennen sie von den Verzeichnissen, in denen sie referenziert sind. Sobald die Verknüpfung mit dem letzten Verzeichnis aufgehoben wurde, das einen Eintrag zu einer bestimmten Datei hatte, wird diese Datei dann zerstört (solange kein Prozess sie hat geöffnet).


Der Hardlink ist im Wesentlichen die Originaldatei. Die angezeigte Größe ist also die Größe der Datei, mit der verlinkt wird. Es ist weich Links, die nur den Platz ihres Namens einnehmen (irgendwie).

Soweit es das Dateisystem betrifft, sind der Hardlink und das Original dasselbe, sie zeigen auf denselben Inode, also wird dieselbe Größe gemeldet.


Linux
  1. Warum erkennt das Bash-Skript keine Aliase?

  2. Ausgabe nach Stdout und gleichzeitig Grep in eine Datei?

  3. Der Unterschied zwischen symbolischen und harten Links?

  4. Ausgabe soll in Datei mit dem gleichen Namen wie die Eingabedatei gespeichert werden?

  5. In dieselbe Datei wie die vom Befehl verarbeitete Quelldatei umleiten?

Der ln-Befehl unter Linux:Soft- und Hardlinks erstellen

Warum unterscheiden sich die md5-Hashes zweier Tarballs derselben Datei?

Was ist der einfachste Weg, um Speicherplatz auf einer Festplatte freizugeben?

So füllen Sie eine Festplatte unter Linux

Warum ist es so schwer, eine Datei in Ubuntu zu finden?

Warum wird das Root-Verzeichnis durch ein /-Zeichen gekennzeichnet?