Was steckt hinter einer symbolischen Verbindung?

8

Wie werden symbolische Links intern von UNIX / Linux-Systemen verwaltet? Es ist bekannt, dass ein symbolischer Link auch ohne eine tatsächliche Zieldatei existieren kann (Dangling Link). Was ist das, was intern eine symbolische Verbindung darstellt?

In Windows lautet die Antwort reparse point .

Fragen:

Ist die Antwort ein inode in UNIX / Linux?

Wenn ja, wird die Inode-Nummer für Ziel und Links gleich sein?

Wenn ja, kann der Link inode andere Berechtigungen haben als der Inode des Zieles (falls einer existiert)?

    
Aravind 04.06.2013, 08:24
quelle

2 Antworten

13

Es geht nicht um UNIX / Linux, sondern um Dateisystem-Implementierung - aber ja, Unix / Linux verwendet Inodes auf Kernel-Ebene und Dateisystem-Implementierungen haben Inodes (zumindest virtuelle).

Im allgemeinen sind symbolische Links einfach Dateien (übrigens sind Verzeichnisse auch Dateien), die haben:

  • das Flag file-type im "inode", das dem System mitteilt, dass diese Datei ein "symbolischer Link"
  • ist
  • Dateiinhalt: Pfad zum Ziel - mit anderen Worten: Ein symbolischer Link ist einfach eine Datei, die einen Dateinamen mit einem Flag im Inode enthält.

Virtuelle Dateisysteme können auch symbolische Links haben. Überprüfen Sie daher FUSE oder andere Implementierungsquellen des Dateisystems. (ext2 / ext3 / ufs..etc)

Also,

  

Ist die Antwort ein Inode in UNIX / Linux?

hängt von der Dateisystemimplementierung ab, aber ja, im Allgemeinen enthält der Inode einen "Dateityp" (und Besitzer, Zugriffsrechte, Zeitstempel, Größe, Zeiger auf Datenblöcke). Es gibt Dateisysteme, die nicht inode s (in einer physischen Implementation) haben, sondern nur "virtuelle Inodes", um die Kompatibilität mit dem Kernel aufrechtzuerhalten.

  

Wenn ja, wird die Inode-Nummer für Ziel und Links gleich sein?

Nein . Normalerweise ist der Symlink eine Datei mit einem eigenen Inode (mit Dateityp, eigenen Datenblöcken, etc.)

  

Wenn ja, kann der Link inode Berechtigungen haben, die sich von denen des Ziels unterscheiden   Inode (falls vorhanden)?

Hier geht es um wie Symlink-Dateien behandelt werden. Normalerweise erlaubt der Kernel keine Änderungen an den Symlink-Berechtigungen - und Symlinks haben immer Standardberechtigungen. Sie könnten Ihr eigenes Dateisystem schreiben, das unterschiedliche Berechtigungen für symbolische Links zulässt, aber Sie würden in Schwierigkeiten geraten, weil gängige Programme wie chmod die Berechtigungen für symbolische Links selbst nicht ändern, also wäre ein solches Dateisystem sowieso sinnlos)

Um den Unterschied zwischen Hardlinks und Symlinks zu verstehen, sollten Sie zuerst die Verzeichnisse verstehen.

Verzeichnisse sind Dateien (mit einem Flag im Inode differenziert), die dem Kernel sagen, "handle diese Datei als eine Karte von file-name bis inode_number ". Hardlinks sind einfach Dateinamen, die auf das gleiche inode abgebildet werden. Also, wenn die Verzeichnis-Datei enthält:

%Vor%

Das bedeutet, in diesem Verzeichnis befinden sich 3 Dateien:

  • file_a wird von inode 1000
  • beschrieben
  • file_b wird von Inode 1001 und
  • beschrieben
  • file_c wird wieder von inode 1000 beschrieben (also ist es ein hardlink mit datei_a, nicht hardlink zu datei_a - weil es unmöglich ist zu sagen, welcher Dateiname zuerst kam - sie sind identisch).

Dies ist der Hauptunterschied zu Symlinks, bei denen der Inode von file_b (inode 1001) Inhalt "file_a" und ein Flag "dies ist ein symbolischer Link" haben kann. In diesem Fall wäre file_b ein Symlink, der auf file_a zeigt.

    
jm666 04.06.2013, 09:22
quelle
2

Sie können das auch ganz einfach selbst ausprobieren:

%Vor%

Die Option -i auf ls zeigt Inode-Nummern in der ersten Spalte an. Sie können sehen, dass der Symlink eine andere Inode-Nummer hat, während der Hardlink dieselbe hat. Sie können auch den Befehl stat(1) verwenden:

%Vor%

Wenn Sie dies programmgesteuert durchführen möchten, können Sie den Systemaufruf lstat(2) verwenden, um Informationen über den Symlink selbst (seine Inode-Nummer usw.) zu finden, während stat(2) Informationen über das Ziel des Symlinks, wenn es existiert. Beispiel in Python:

%Vor%     
regnarg 19.06.2016 17:16
quelle