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

Alles Wichtige, was Sie über Hard Link in Linux wissen müssen

Bevor Sie harte Links sehen, rate ich Ihnen, sich über Inodes in Linux zu informieren. Ein Linux-Dateisystem besteht aus zwei Hauptkomponenten:einem Pool von Datenblöcken, in denen Daten gespeichert werden, und einem Datenbanksystem zur Verwaltung dieses Datenpools. Der Inode ist wie ein Index zu diesem Datenbanksystem.

Ein harter Link zu einer Datei zeigt auf den Inode der Datei anstatt auf die Datei selbst. Auf diese Weise erhält der Hardlink alle Attribute der Originaldatei und zeigt auf denselben Datenblock wie die Originaldatei.

Wenn Sie sich an den symbolischen Link oder den Softlink erinnern, wissen Sie, dass er auf die Datei verweist. Ein Hardlink ist ein manuell erstellter Eintrag in einem Verzeichnis, der auf einen bereits existierenden Inode zeigt.

Ich werde es Ihnen mit richtigen Diagrammen erklären. Nehmen wir zum Beispiel diese Verzeichnisstruktur:

Das Stammverzeichnis enthält also im Grunde die Verzeichnisse dir_1 und dir_2. Das Verzeichnis dir_1 enthält die Dateien file_1 und file_2, wohingegen dir_2 file_3 und einen festen Link zu Datei 2 enthält.

Mal sehen, wie es im Dateisystem aussieht. Alles ist gegenständlich. In Wirklichkeit enthält das Stammverzeichnis Tausende von Dateien. Hier gehen wir davon aus, dass es nur zwei Verzeichnisse hat.

Erinnern Sie sich an die Linux-Verzeichnisstruktur? Sie beginnen mit der Wurzel (/). Das Wurzelverzeichnis hat immer Inode 2.

Wenn Sie auf die Datei 3 zugreifen müssen, wäre der absolute Pfad /dir_2/file_3. Hier drinnen können Sie es so lesen:Sie beginnen bei Inode 2 (Root immer Indoe 2) und folgen dem Pfeil zu seinem Datenblock. Dieser Datenblock enthält die Informationen über den Inode von dir_2 (Inode 27 in unserem Beispiel).

Jetzt sehen Sie sich Inode 27 an. Sein Typ ist Verzeichnis. Sie folgen seinem Datenblock, der Informationen über den Inode von file_3 (Inode 88) enthält. Sie schauen in den Inode 88. Sein Typ ist file und wenn Sie seinem Datenblock folgen, greifen Sie auf den Inhalt der Datei zu.

Haben Sie bemerkt, dass das Verzeichnis selbst die Daten seiner Datei nicht enthält? Verzeichnisse sind im Wesentlichen eine Datei, die Informationen über die Inodes ihrer Dateien und Unterverzeichnisse enthält.

Sie müssen sich über die Linkanzahl im obigen Bild wundern. Das ist besonders wichtig, wenn Sie es mit Hardlink zu tun haben. Die Linkanzahl ist die Anzahl der Verzeichniseinträge, die auf einen Inode zeigen. Nehmen Sie zum Beispiel Inode 27 für dir_2. Der Inode 27 liegt einmal im Datenblock des Wurzelverzeichnisses und einmal in einem eigenen Datenblock (dem Spezialverzeichnis .). Und daher hat es eine Linkanzahl von 2.

Beachten Sie, dass alle Dateien mit Ausnahme von file_2 die Linkanzahl 1 haben? Wenn eine Datei eine Linkanzahl von mehr als 1 hat, bedeutet dies, dass es harte Links „zu dieser Datei“ gibt. Da harte Links auf denselben Inode (in unserem Beispiel Inode 17) wie die Zieldatei zeigen, erhalten Sie 2 Verzeichnislisten für Inode 17 (im Datenblock von dir_1 und dir_2).

Sie können den Befehl ln verwenden, um einen festen Link zu erstellen:

ln target_file link_name

Dadurch wird ein harter Link namens link_name zu target_file erstellt. Sie werden sehen, dass link_name wie eine normale Datei aussieht und ihre Attribute mit denen der Zieldatei identisch sind.

Wenn Sie den Befehl ls -li verwenden (die Option -i zeigt die Inode-Nummer), sehen Sie, dass die Linkanzahl 2 ist. Die Linkanzahl steht nach dem Dateiberechtigungsfeld.

134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

Beide haben offensichtlich die gleiche Inode-Nummer 134195.

Nachdem Sie nun eine gute Vorstellung von Hardlinks in Linux haben, gehen wir noch ein bisschen weiter.

Wenn Sie die Zieldatei löschen, können Sie weiterhin über den festen Link auf ihren Inhalt zugreifen. Das liegt daran, dass sowohl die Zieldatei als auch der Hardlink denselben Inode haben und daher auf denselben Datenblock verweisen.

Das Löschen von Dateien in Linux ist im Grunde das Aufheben der Verknüpfung. Angenommen, Sie löschen die Datei_1 mit dem Befehl rm. Der Linux-Kernel wird feststellen, dass file_1 Inode 16 entspricht. Er entfernt den Eintrag file_1 aus der Liste von dir_1 und reduziert die Linkanzahl von Inode 16 um 1. Da die Linkanzahl von Inode 16 jetzt 0 ist, weiß der Kernel, dass niemand darauf verlinkt Inode, sodass es sicher ist, den Inode zu entfernen und den damit verbundenen Datenblock zu löschen.

Angenommen, Sie löschen file_2. Der Kernel entfernt die Datei_2 aus der Liste von dir_1 und geht zu Inode 17. Er reduziert die Linkanzahl von Inode 17 auf 1. Da die Linkanzahl nicht Null ist, löscht der Kernel weder die Inode noch die damit verbundenen Daten es. Wenn Sie also auf den Hardlink zugreifen, können Sie immer noch auf die Daten zugreifen, obwohl die Originaldatei gelöscht wurde.

Sie können einen Softlink zu einem Verzeichnis erstellen, aber wenn Sie versuchen, einen Hardlink zu einem Verzeichnis zu erstellen, wird ein Fehler wie dieser angezeigt:

ln: newdir/test_dir: hard link not allowed for directory

Warum sind Hardlinks für Verzeichnisse nicht erlaubt? Dies liegt daran, dass die Verwendung von Hardlinks für Verzeichnisse das Dateisystem beschädigen kann. Theoretisch können Sie mit der Option -d oder -F einen festen Link zu Verzeichnissen erstellen. Aber die meisten Linux-Distributionen erlauben das nicht, selbst wenn Sie Root-Benutzer sind.

Sehen wir uns noch einmal den Hardlink an, den ich zuvor erstellt habe:

134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

Sie haben identische Attribute, aber Sie können anhand des Namens im obigen Beispiel erraten, um welchen Link es sich handelt, aber was ist, wenn der Name nicht offensichtlich ist? Woher wissen Sie, ob ihre Namen Ziel_1 und Ziel_2 sind?

Wenn sich die Datei und die Links in einem anderen Verzeichnis befinden, können Sie versuchen, die mtime und andere Parameter zu überprüfen, um zu wissen, wann der Inhalt des Verzeichnisses geändert wurde, aber selbst das ist keine Gewissheit. Wenn sich die Datei und der Hardlink im selben Verzeichnis befinden und der Verlauf gelöscht wurde, bin ich mir nicht sicher, wie Sie herausfinden können, welche die Originaldatei und welche der Hardlink ist.

Wenn Sie sehen, dass eine Datei mehr als eine Linkanzahl hat, werden Sie vielleicht neugierig auf die anderen damit verknüpften festen Links.

Eine Möglichkeit, dies herauszufinden, besteht darin, die Inode-Nummer der Datei zu verwenden. Sie können den Befehl ls -i oder den Befehl stat verwenden, um die Inode-Nummer abzurufen.

Sobald Sie die Inode-Nummer haben, können Sie mit dem Befehl find alle damit verbundenen Links sehen.

find . -inum inode_number

War es schwer, die harten Links zu verstehen?

Ich hoffe, es war nicht zu „schwer“ und Sie haben ein besseres Verständnis für das Konzept des Hardlinks in Linux. Wenn Sie Zweifel oder Vorschläge zu diesem Thema haben, hinterlassen Sie bitte unten einen Kommentar.


Linux
  1. Alles, was Sie über Ubuntu 13.04 wissen müssen

  2. Was ist SteamOS? Alles Wichtige, was Sie über diese „Gaming-Distribution“ wissen müssen

  3. Linux-tmp-Verzeichnis:Alles, was Sie wissen müssen

  4. Linux-Dateikomprimierung:Alles, was Sie wissen müssen

  5. Linux-Dateiberechtigungen:Alles, was Sie wissen müssen

Alles, was Sie über Peppermint Linux OS wissen müssen

Alles, was Sie über Black Lab Linux wissen müssen

Alles, was Sie über die Linux Mint-Distribution wissen müssen

Alles, was Sie über Inodes in Linux wissen müssen

Alles Wichtige, was Sie über UID in Linux wissen müssen

Alles, was Sie über das Linux /tmp-Verzeichnis wissen müssen