PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hardlinks



Blindpassenger
20.09.02, 07:43
Hallo,

was genau sind Hardlinks? Werden die Dateien dabei kopiert? Wenn ich einen Hardlink mache
ln /bin/* /hierhin/bin/

und hinterher eine Datei in /bin ändere, ändert sich die Datei in /hierhin/bin nicht. Kann ich jetzt daraus schlussfolgern: Hardlinken=Verzeichnis kopieren?

tia,
Stefan

Thomas Mitzkat
20.09.02, 08:03
Hardlinken=Dateien kopieren?

sieht so aus

Christian81
20.09.02, 08:14
mit Hardlinks erzeugt man 2 Dateien mit dem gleichen Inhalt. D.h. beide Dateizeiger zeigen auf den selben Speicherplatz. Wenn man also in der einen Datei was ändert, ändert sich auch in der anderen 'Datei'. Hardlinks können nur innerhalb ein und derselben Partition erzeugt werden.

phoen][x
20.09.02, 08:21
Wie zwei Zeiger die auf die gleiche Addresse zeigen?

Und warum lassen sich Verzeichnisse hardlinken?
Das Manual sagt "POSIX forbids the system call link(2) and the utility ln to make hard links to directories (but does not forbid hard links to cross filesystem boundaries)", aber warum?

-phoen][x-

Christian81
20.09.02, 08:31
richtig

wenn ich dann die eine Datei (Zeiger) lösche, bleibt der Inhalt und der andere Zeiger noch vorhanden. Ob eine Datei mehrere Links hat sieht man bei der Ausgabe von ls -als

2860 -rw-r--r-- 2 christia users 2923964 Aug 27 15:46 test.bz2

--> 2 Links vorhanden :)

Hardlinks auf UVs sind nicht erlaubt, sonst könnten unreferenzierbare Schleifen entstehen. Hardlinks über Partitionen hinweg geht auch nicht, da sich partitionen ja ohne weiteres verändern könnten - woanders anschliessen etc. (genauer erkläre ich das jetzt nicht ;) )

phoen][x
20.09.02, 08:42
Wieder was gelernt. Danke Christian81, ich schliesse dich in mein Abendgebet mit ein. :)

-phoen][x-

f0rtex
20.09.02, 10:10
Hier noch einen Ausschnitt aus dem Linux-Magazin



Kunstfehler sind manchmal nicht ganz auszuschließen, und so stellte Dr. Linux in Heft 05/1999 eine Fehldiagnose, indem er unter der Überschrift Links oder Links? schrieb:

Bei einem Hardlink wird eine Kopie der Datei mit einem anderen Namen erzeugt.

Das ist offensichtlich falsch: Bei einem Hardlink wird keine Dateikopie erzeugt, wie man es vom Kopier-Kommando cp gewohnt ist, sondern lediglich ein neuer Verzeichniseintrag für sie erstellt.

Um das zu verstehen ist ein wenig Hintergrundwissen über das Dateisystem erforderlich: Die erforderlichen Informationen zum Auffinden einer Datei (z.B. wo sie auf dem Datenträger abgespeichert ist, wie groß sie ist, mit welchen Rechten sie belegt ist, ...) befinden sich in den sogenannten Inodes ("Informationsknoten"). Diese Inodes sind numeriert, aber da sich Menschen im allgemeinen Wörter besser merken können als Nummern, verlangt auch unter Linux niemand von Ihnen, eine Datei mit ihrer Inodenummer anzusprechen. Dafür gibt es Dateinamen, die das Dateisystem in Dateiverzeichnissen ("directories") den Inodenummern zuordnet.

Bei einem Hardlink wird im Verzeichnis ein weiterer Dateiname-Inodenummer-Eintrag erzeugt, nur mit dem Unterschied, daß dies nicht der erste Dateiname ist, der der entsprechenden Nummer zugeordnet wird. Wieviele Dateinamen auf die Inodenummer einer Datei passen, ist im Inode gespeichert und läßt sich anhand der Zahl rechts von den Rechteangaben in der Ausgabe von ls -l ablesen:

[pjung@janeway drlinux]$ ls -l
total 5
drwxr-xr-x 2 pjung users 1024 Apr 19 17:24 .
drwxr-xr-x 5 pjung users 1024 Apr 19 16:46 ..
-rw-r--r-- 1 pjung users 2193 Apr 19 17:24 drlinux0799.html
[pjung@janeway drlinux]$ ln drlinux0799.html dr.html
[pjung@janeway drlinux]$ ls -l
total 8
drwxr-xr-x 2 pjung users 1024 Apr 19 17:24 .
drwxr-xr-x 5 pjung users 1024 Apr 19 16:46 ..
-rw-r--r-- 2 pjung users 2193 Apr 19 17:24 dr.html
-rw-r--r-- 2 pjung users 2193 Apr 19 17:24 drlinux0799.html

Eine Datei gilt dann als gelöscht, wenn kein Verzeichniseintrag mehr existiert. Diese Verzeichniseinträge haben einen entscheidenden Nachteil: Da ein ext2fs-Dateisystem, wie es unter Linux Standard ist, nur die Partition verwalten kann, auf der es sich befindet, funktionieren die Dateiname-Inodenummer-Zuordnungen nicht partitionsübergreifend. Zum Verweisen auf Dateien, die sich auf anderen Partitionen befinden, müssen daher symbolische Links herhalten. Hierbei handelt es sich um ganz normale - wenngleich vom Dateisystem speziell behandelte - Dateien, die den Namen der Datei enthalten, auf die der Link verweist. Wird die Zieldatei gelöscht, zeigt ein symbolischer Link folglich ins Leere.


MfG
f0rtex

Thomas Mitzkat
20.09.02, 17:46
>Bei einem Hardlink wird eine Kopie der Datei mit einem anderen Namen erzeugt.

Das ist offensichtlich falsch: Bei einem Hardlink wird keine Dateikopie erzeugt, wie man es vom Kopier-Kommando cp gewohnt ist, sondern lediglich ein neuer Verzeichniseintrag für sie erstellt.


Das dachte ich auch bis zu dem Zeitpunkt, als Blindpassenger seine Frage gestellt hat auch. Nur habe ich es ausprobiert und seltsamerweise erhalte ich bei einem Hardlink auf ein File eine "zweite" unabhängige Datei, und ich kann beide einzeln löschen! Also musste ich meine Meinung revidieren und Euch entschieden widersprechen. Offenbar hat sich etwas geändert!

pudding
20.09.02, 17:52
hmmm

das hiese ja durch jeden hard link verringert sich auch mein freier platz in der partition;
kann ich nicht glauben


pudding

Christian81
20.09.02, 18:15
christian@term7:~> df
Dateisystem 1k-Blöcke Benutzt Verfügbar Ben% montiert auf
/dev/hda6 38507432 32335452 5774452 85% /
/dev/hda5 52627 2453 47366 5% /boot
shmfs 127772 0 127772 0% /dev/shm
christian@term7:~> dd if=/dev/zero of=file1.dat bs=4096 count=20000
20000+0 Records ein
20000+0 Records aus
christian@term7:~> df
Dateisystem 1k-Blöcke Benutzt Verfügbar Ben% montiert auf
/dev/hda6 38507432 32415536 5694368 86% /
/dev/hda5 52627 2453 47366 5% /boot
shmfs 127772 0 127772 0% /dev/shm
christian@term7:~> ln file1.dat file2.dat
christian@term7:~> df
Dateisystem 1k-Blöcke Benutzt Verfügbar Ben% montiert auf
/dev/hda6 38507432 32415536 5694368 86% /
/dev/hda5 52627 2453 47366 5% /boot
shmfs 127772 0 127772 0% /dev/shm
christian@term7:~>



wo ist da platz weg? ;)

der einzige Platz, der belegt wird, ist der Eintrag in die Verzeichnisstruktur...

nochwas:



christian@term7:~> dd if=/dev/zero of=file1.dat bs=4096 count=2
2+0 Records ein
2+0 Records aus
christian@term7:~> cat file1.dat
christian@term7:~> ln file1.dat file2.dat
christian@term7:~> echo "Hallo" >> file2.dat
christian@term7:~> cat file1.dat
Hallo
christian@term7:~>

Thomas Mitzkat
21.09.02, 00:56
ok - nehme alles zurück, der inhalt ändert sich in beiden dateien gleichermassen, wenn ich ein ändere.