it-swarm.com.de

Was ist der Unterschied zwischen ln -s und mount --bind?

Ich versuche den Unterschied zwischen der Verwendung von ln -s und mount --bind zu verstehen. Im Basisszenario kann ich beide verwenden, um von einem anderen Ort aus auf ein Verzeichnis zuzugreifen. In welchen Szenarien verhalten sich die beiden unterschiedlich?

32
Łukasz

Sie werden sich in mindestens zwei Fällen unterschiedlich verhalten:

  • In einem chroot ist die Verknüpfung tot, wenn sich das Verknüpfungsziel außerhalb der Chroot befindet. Ein Bindemount ist weiterhin verfügbar.
  • Mehrere Programme können zwischen symbolischen Links und tatsächlichen Verzeichnissen oder Dateien unterscheiden. Nur wenige (falls vorhanden) können zwischen einem Verzeichnis oder einer Datei und dem darauf gemounteten Verzeichnis unterscheiden. Dies erstreckt sich auch auf symbolische Links zu etwas (A), auf dem etwas anderes (B) montiert ist. Der Link zeigt den Inhalt des Mount-Ziels (B) anstelle des Originals (A).

Sie können auch binden, dass ein Verzeichnis oder eine Datei in ein vorhandenes Verzeichnis oder eine Datei eingebunden wird, wodurch der ursprüngliche Inhalt maskiert wird (sodass auf den ursprünglichen Inhalt nur zugegriffen werden kann, wenn das Original an einer anderen Stelle eingebunden wurde). Für eine symbolische Verknüpfung muss das Original verschoben oder gelöscht werden.

33
muru

Nun, ln -s erstellt eine symbolische Verknüpfung, während mount --bind ein Mount erstellt.

Eine symbolische Verknüpfung ist ein besonderer Dateityp. Wenn Sie ln -s /var/target /var/link ausführen, ist /var/link eine Datei, die den Pfad "/var/target" enthält. Der einzige Unterschied zwischen einer symbolischen Verknüpfung und einer normalen Datei besteht darin, dass bei dem Versuch eines Programms, eine Operation an einer symbolischen Verknüpfung auszuführen, die Operation normalerweise auf dem Ziel anstatt auf der Datei ausgeführt wird. Wenn Sie also ls /var/link ausführen, versucht das Programm ls, eine Verzeichnisliste für /var/link abzurufen, erhält jedoch tatsächlich eine Verzeichnisliste für /var/target.

Symbolische Links sind jedoch immer noch nur Dateien. Sie können umbenannt und gelöscht werden und der ganze Jazz. Beachten Sie, dass Sie keine symbolische Verknüpfung (oder gewöhnliche Datei) mit dem Namen /var/link erstellen können, wenn bereits eine Datei mit dem Namen /var/link vorhanden ist. Sie müssten es zuerst loswerden.

Ein Mount ist keine Datei; Es ist eine Aufzeichnung, die der Kernel im Gedächtnis behält. Wenn Sie mount --bind /var/target /var/mount ausführen, zeichnet der Kernel die Tatsache auf, dass /var/mount jetzt ein neuer Name für /var/target ist. (Ich kenne die Details nicht; insbesondere weiß ich nicht, ob das Mounten von etwas in einem Unterverzeichnis von /var/target dazu führt, dass es auch in /var/mount angezeigt wird, oder warum oder warum nicht Für diese Antwort wäre ich dankbar.) Wenn Sie also ls /var/mount ausführen, geschieht dasselbe wie bei ls /var/target, da /var/mount und /var/target dasselbe Verzeichnis sind .

Reittiere sind keine Dateien. Ich weiß nicht, was passieren würde, wenn Sie versuchen würden, /var/mount umzubenennen oder zu löschen. Beachten Sie, dass Sie unter /var/mount nichts mounten können sofern nicht unter /var/mount bereits ein Verzeichnis vorhanden ist.

13
Tanner Swett

Zusätzlich würde ln -s einen Neustart überleben. mount --bind würde dies nicht tun, es sei denn, Sie bearbeiten/etc/fstab, um es dauerhaft zu machen.

10
Mark Williams

Neben den anderen Antworten. Das System erlaubt keine feste Verbindung zum Verzeichnis:

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

Mit dem Mount können Sie hard link-like machen, dh zwei oder mehr Namen für das gleiche eine Inode:

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(Man findet es hilfreich für Snapshot-Backups mit der alten Version von rsync.)

Beachten Sie außerdem, dass diese Bereitstellung nicht vollständig ist:

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

Daher kann der Mount immer noch gelesen und geschrieben werden, auch wenn ich nach der Option ro gefragt habe (schreibgeschützt).

2
Udi