Antworten:
Ein Bind-Mount ist eine alternative Ansicht einer Verzeichnisstruktur. Beim Mounten wird klassischerweise eine Ansicht eines Speichergeräts als Verzeichnisbaum erstellt. Ein Bind-Mount übernimmt stattdessen eine vorhandene Verzeichnisstruktur und repliziert sie unter einem anderen Punkt. Die Verzeichnisse und Dateien im Bind-Mount sind dieselben wie im Original. Jede Änderung auf einer Seite wirkt sich sofort auf die andere Seite aus, da in beiden Ansichten die gleichen Daten angezeigt werden.
Zum Beispiel nach der Ausgabe des Linux-Befehls
mount --bind /some/where /else/where
die Verzeichnisse /some/where
und /else/where
haben den gleichen Inhalt.
Im Gegensatz zu einem festen Link oder einem symbolischen Link hat ein Bind-Mount keine Auswirkungen darauf, was im Dateisystem gespeichert ist. Es ist eine Eigenschaft des Live-Systems.
Das bindfs
Dateisystem ist ein FUSE- Dateisystem, das eine Ansicht eines Verzeichnisbaums erstellt. Zum Beispiel der Befehl
bindfs /some/where /else/where
Erstellt /else/where
einen Einhängepunkt, unter dem der Inhalt von /some/where
sichtbar ist.
Da bindfs ein separates Dateisystem ist, werden die Dateien /some/where/foo
und /else/where/foo
Anwendungen als unterschiedliche Dateien angezeigt (das bindfs-Dateisystem hat einen eigenen st_dev
Wert). Jede Änderung auf einer Seite wird auf der anderen Seite „magisch“ reflektiert, aber die Tatsache, dass die Dateien identisch sind, ist nur dann ersichtlich, wenn man weiß, wie bindfs funktioniert.
Bindfs hat keine Kenntnis von Einhängepunkten. Wenn sich also ein Einhängepunkt darunter befindet /some/where
, wird er als ein anderes Verzeichnis darunter angezeigt /else/where
. Das Aktivieren oder Deaktivieren eines Dateisystems darunter wird als Änderung des entsprechenden Verzeichnisses /some/where
angezeigt /else/where
.
Bindfs kann einige der Dateimetadaten ändern: Es können gefälschte Berechtigungen und Eigentumsrechte für Dateien angezeigt werden. Einzelheiten finden Sie im Handbuch . Beispiele finden Sie weiter unten.
Ein bindfs-Dateisystem kann als Nicht-Root-Benutzer gemountet werden. Sie benötigen lediglich die Berechtigung zum Mounten von FUSE-Dateisystemen. Abhängig von Ihrer Distribution kann es erforderlich sein, dass Sie sich in der fuse
Gruppe befinden oder allen Benutzern gestattet sind. Verwenden Sie zum Abmelden eines FUSE-Dateisystems fusermount -u
anstelle von umount
z
fusermount -u /else/where
FreeBSD stellt das nullfs
Dateisystem bereit, das eine alternative Ansicht eines Dateisystems erstellt. Die folgenden zwei Befehle sind äquivalent:
mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where
Wird nach dem Ausgeben eines Befehls /else/where
zu einem Einhängepunkt, an dem der Inhalt von /some/where
sichtbar ist.
Da nullfs ein separates Dateisystem ist, werden die Dateien /some/where/foo
und /else/where/foo
Anwendungen als unterschiedliche Dateien angezeigt (das nullfs-Dateisystem hat einen eigenen st_dev
Wert). Jede Änderung auf einer Seite wird auf der anderen Seite „magisch“ reflektiert, aber die Tatsache, dass die Dateien identisch sind, ist nur dann ersichtlich, wenn man weiß, wie nullfs funktioniert.
Im Gegensatz zu FUSE bindfs, das auf der Ebene des Verzeichnisbaums agiert, wirkt FreeBSDs nullfs tiefer im Kernel, sodass Mount-Punkte unter /else/where
nicht sichtbar sind: Nur der Baum, der Teil desselben Mount-Punkts /some/where
ist, der sich unter widerspiegelt /else/where
.
Das nullfs-Dateisystem kann unter anderen BSD-Varianten (OS X, OpenBSD, NetBSD) verwendet werden, wird jedoch nicht als Teil des Standardsystems kompiliert.
Unter Linux stehen Bind-Mounts als Kernel-Feature zur Verfügung. Sie können eine mit dem mount
Befehl erstellen , indem Sie entweder die --bind
Befehlszeilenoption oder die bind
Mount-Option übergeben. Die folgenden zwei Befehle sind äquivalent:
mount --bind /some/where /else/where
mount -o bind /some/where /else/where
Hierbei ist das „Gerät“ /some/where
keine Festplattenpartition wie bei einem On-Disk-Dateisystem, sondern ein vorhandenes Verzeichnis. Der Mount-Punkt /else/where
muss wie gewohnt ein vorhandenes Verzeichnis sein. Beachten Sie, dass in beiden Fällen kein Dateisystemtyp angegeben ist: Wenn Sie einen Bind-Mount durchführen, ist kein Dateisystemtreiber erforderlich, sondern es werden die Kerneldatenstrukturen aus dem ursprünglichen Mount kopiert.
mount --bind
Unterstützt auch das Mounten eines Nicht-Verzeichnisses in ein Nicht-Verzeichnis: /some/where
Kann eine reguläre Datei sein (in diesem Fall /else/where
muss es sich auch um eine reguläre Datei handeln).
Ein Linux-Bind-Mount ist meist nicht vom Original zu unterscheiden. Der Befehl df -T /else/where
zeigt dasselbe Gerät und denselben Dateisystemtyp an wie df -T /some/where
. Die Dateien /some/where/foo
und /else/where/foo
sind nicht zu unterscheiden, als ob es sich um harte Links handele. Es ist möglich, die Verbindung zu trennen /some/where
. In diesem Fall /else/where
bleibt die Verbindung bestehen.
Bei älteren Kernels (ich weiß nicht genau, wann, glaube ich, bis zu 3.x) waren Bind-Mounts wirklich nicht vom Original zu unterscheiden. Neuere Kernel verfolgen Bindungsbereitstellungen und legen die Informationen über PID / mountinfo offen, wodurch findmnt
Bindungsbereitstellungen als solche angegeben werden können .
Sie können Bind-Mount-Einträge einfügen /etc/fstab
. Fügen Sie einfach bind
(oder rbind
usw.) in die Optionen zusammen mit anderen gewünschten Optionen ein. Das „Gerät“ ist der vorhandene Baum. Die Dateisystemspalte kann none
oder enthalten bind
(wird ignoriert, die Verwendung eines Dateisystemnamens wäre jedoch verwirrend). Zum Beispiel:
/some/where /readonly/view none bind,ro
Wenn sich darunter Einhängepunkte befinden /some/where
, ist deren Inhalt darunter nicht sichtbar /else/where
. Stattdessen bind
können Sie rbind
auch darunter liegende Einhängepunkte replizieren /some/where
. Wenn zum Beispiel /some/where/mnt
ein Einhängepunkt ist, dann
mount --rbind /some/where /else/where
ist äquivalent zu
mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt
Außerdem können unter Linux Bereitstellungen als freigegeben , als Slave , privat oder nicht bindend deklariert werden . Dies wirkt sich darauf aus, ob sich dieser Mount-Vorgang unter einem Bind-Mount widerspiegelt, der den Mount-Punkt repliziert. Weitere Informationen finden Sie in der Kerneldokumentation .
Linux bietet auch die Möglichkeit, Reittiere zu verschieben: --bind
kopiert und --move
verschiebt einen Reittierpunkt.
In zwei gebundenen Verzeichnissen können unterschiedliche Mount-Optionen angegeben werden. Es gibt jedoch eine Besonderheit: Das Binden und Festlegen der Mount-Optionen kann nicht atomar erfolgen, sondern muss aus zwei aufeinander folgenden Operationen bestehen. (Ältere Kernel haben dies nicht zugelassen.) Mit den folgenden Befehlen wird beispielsweise eine schreibgeschützte Ansicht erstellt, es gibt jedoch ein kleines Zeitfenster, in dem /else/where
Lese- und Schreibzugriff möglich ist:
mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where
Wenn Ihr System FUSE nicht unterstützt, besteht ein klassischer Trick, um denselben Effekt zu erzielen, darin, einen NFS-Server auszuführen, die Dateien zu exportieren, auf die Sie zugreifen möchten, localhost
und sie auf demselben Computer bereitzustellen. Dies hat einen erheblichen Mehraufwand an Speicher und Leistung zur Folge, sodass Bindungs-Mounts, sofern verfügbar, einen eindeutigen Vorteil haben (was bei den meisten Unix-Varianten dank FUSE der Fall ist).
Es kann nützlich sein, eine schreibgeschützte Ansicht eines Dateisystems zu erstellen, entweder aus Sicherheitsgründen oder nur als Sicherheitsebene, um sicherzustellen, dass Sie es nicht versehentlich ändern.
Mit bindfs:
bindfs -r /some/where /mnt/readonly
Mit Linux ist das ganz einfach:
mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly
Dadurch verbleibt ein kurzes Zeitintervall, in dem /mnt/readonly
Lese- und Schreibzugriff ausgeführt werden. Wenn dies ein Sicherheitsrisiko darstellt, erstellen Sie zuerst das Bind-Mount in einem Verzeichnis, auf das nur Root zugreifen kann, machen Sie es schreibgeschützt und verschieben Sie es dann an einen öffentlichen Mount-Punkt. Beachten Sie im folgenden Snippet, dass es wichtig ist, dass /root/private
(das Verzeichnis über dem Mount-Punkt) privat ist. Die ursprünglichen Berechtigungen für /root/private/mnt
sind irrelevant, da sie hinter dem Einhängepunkt versteckt sind.
mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly
Dateisysteme zeichnen Benutzer und Gruppen anhand ihrer numerischen ID auf. Manchmal haben Sie mehrere Systeme, die derselben Person unterschiedliche Benutzer-IDs zuweisen. Dies ist kein Problem beim Netzwerkzugriff, macht jedoch Benutzer-IDs bedeutungslos, wenn Sie Daten auf einer Festplatte von einem System auf ein anderes übertragen. Angenommen, Sie haben eine Festplatte mit einem Mehrbenutzer-Dateisystem (z. B. ext4, btrfs, zfs, UFS usw.) auf einem System erstellt, auf dem Alice die Benutzer-ID 1000 und Bob die Benutzer-ID 1001 hat, und Sie möchten diese Festplatte zugänglich machen Ein System, in dem Alice die Benutzer-ID 1001 und Bob die Benutzer-ID 1000 hat. Wenn Sie den Datenträger direkt einbinden, werden die Dateien von Alice als Eigentum von Bob (da die Benutzer-ID 1001 ist) und die Dateien von Bob als Eigentum von Alice (weil die Benutzer-ID ist 1000).
Sie können bindfs verwenden, um Benutzer-IDs neu zuzuordnen. Mounten Sie zuerst die Festplattenpartition in einem privaten Verzeichnis, auf das nur Root zugreifen kann. Erstellen Sie anschließend in einem öffentlichen Bereich eine Bindfs-Ansicht, in der Benutzer- und Gruppen-IDs neu zugeordnet werden und die Benutzer- und Gruppen-IDs von Alice und Bob vertauscht werden.
mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk
Siehe Wie kann man auf Dateien im Benutzerordner des nicht gebooteten Systems zugreifen? und montiere --bind anderen User als mich selbst ein weiteres Beispiel.
Ein chroot-Gefängnis oder -Container führt einen Prozess in einem Teilbaum der Verzeichnisstruktur des Systems aus. Dies kann nützlich sein, um ein Programm mit eingeschränktem Zugriff auszuführen, z. Eine Einschränkung von chroot ist, dass das Programm auf einen Teilbaum beschränkt ist: Es kann nicht auf unabhängige Teilbäume zugreifen. Mit Bindungs-Reittieren können andere Teilbäume auf diesen Hauptbaum gepfropft werden. Dies macht sie grundlegend für die praktischste Verwendung von Containern unter Linux.
Angenommen, ein Computer führt einen Dienst aus, /usr/sbin/somethingd
der nur Zugriff auf Daten unter haben soll /var/lib/something
. Der kleinste Verzeichnisbaum, der diese beiden Dateien enthält, ist das Stammverzeichnis. Wie kann der Service eingeschränkt werden? Eine Möglichkeit besteht darin, feste Verknüpfungen zu allen Dateien herzustellen, die der Dienst benötigt (mindestens /usr/sbin/somethingd
und zu mehreren gemeinsam genutzten Bibliotheken) /var/lib/something
. Dies ist jedoch umständlich (die festen Links müssen bei jedem Upgrade einer Datei aktualisiert werden) und funktioniert nicht, wenn /var/lib/something
und /usr
auf verschiedenen Dateisystemen. Eine bessere Lösung besteht darin, ein Ad-hoc-Stammverzeichnis zu erstellen und es mit Reitern zu füllen:
mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &
Die Mount-Namespaces von Linux verallgemeinern Chroots. Mit Bindungs-Mounts können Namespaces auf flexible Weise aufgefüllt werden. Siehe Erstellen einer Prozess eine andere Datei für den gleichen Dateinamen lesen für ein Beispiel.
Eine andere Verwendung von chroots besteht darin, eine andere Distribution in einem Verzeichnis zu installieren und Programme von dort aus auszuführen, selbst wenn Dateien in fest codierten Pfaden erforderlich sind, die nicht vorhanden sind oder unterschiedliche Inhalte auf dem Basissystem haben. Dies kann beispielsweise nützlich sein, um eine 32-Bit-Distribution auf einem 64-Bit-System zu installieren, das gemischte Pakete nicht unterstützt, ältere Versionen einer Distribution oder andere Distributionen zu installieren, um die Kompatibilität zu testen, oder um eine neuere zu testende Release zu installieren die neuesten Funktionen unter Beibehaltung eines stabilen Basissystems usw. Siehe Wie führe ich 32-Bit-Programme auf einem 64-Bit-Debian / Ubuntu aus? für ein Beispiel unter Debian / Ubuntu.
Angenommen, Sie haben eine Installation der neuesten Pakete Ihrer Distribution in dem Verzeichnis /f/unstable
, in dem Sie Programme ausführen, indem Sie mit in dieses Verzeichnis wechseln chroot /f/unstable
. Um Ausgangsverzeichnisse für diese Installationen verfügbar zu machen, binden Sie diese in die Chroot:
mount --bind /home /f/unstable/home
Das Programm schroot macht das automatisch.
Wenn Sie ein Dateisystem in ein Verzeichnis mounten, wird dadurch ausgeblendet, was sich hinter dem Verzeichnis befindet. Auf die Dateien in diesem Verzeichnis kann erst zugegriffen werden, nachdem die Bereitstellung des Verzeichnisses aufgehoben wurde. Da BSD-nullfs- und Linux-Bindungsbereitstellungen auf einer niedrigeren Ebene als die Bereitstellungsinfrastruktur ausgeführt werden, macht eine nullfs-Bereitstellung oder eine Bindungsbereitstellung eines Dateisystems Verzeichnisse verfügbar, die im Original hinter Unterbereitstellungen verborgen waren.
Angenommen, Sie haben ein tmpfs-Dateisystem bereitgestellt unter /tmp
. Wenn sich Dateien unter befanden, /tmp
als das tmpfs-Dateisystem erstellt wurde, bleiben diese Dateien möglicherweise weiterhin erhalten, auf die effektiv nicht zugegriffen werden kann, sie belegen jedoch Speicherplatz. Lauf
mount --bind / /mnt
(Linux) oder
mount -t nullfs / /mnt
(FreeBSD), um eine Ansicht des Root-Dateisystems unter zu erstellen /mnt
. Das Verzeichnis /mnt/tmp
ist das aus dem Root-Dateisystem.
Einige NFS-Server (z. B. der Linux-Kernel-NFS-Server vor NFSv4) geben beim Exportieren eines Verzeichnisses immer den tatsächlichen Verzeichnisspeicherort an. Das heißt, wenn ein Client dies anfordert server:/requested/location
, bedient der Server den Baum am Standort /requested/location
. Es ist manchmal wünschenswert, Clients zu erlauben, /request/location
Dateien unter anzufordern, aber tatsächlich bereitzustellen /actual/location
. Wenn Ihr NFS-Server die Bereitstellung eines alternativen Standorts nicht unterstützt, können Sie ein Bind-Mount für die erwartete Anforderung erstellen, z
/requested/location *.localdomain(rw,async)
in /etc/exports
und die folgenden in /etc/fstab
:
/actual/location /requested/location bind bind
Manchmal möchten Sie einen symbolischen Link erstellen, damit eine Datei /some/where/is/my/file
unter angezeigt wird /else/where
, aber die verwendete Anwendung file
erweitert symbolische Links und lehnt ab /some/where/is/my/file
. Ein Bind Mount kann dies umgehen: bind-mount /some/where/is/my
to /else/where/is/my
und realpath
meldet sich /else/where/is/my/file
dann als unter /else/where
, nicht unter /some/where
.
Wenn Sie Bindmounts verwenden, müssen Sie sich um Anwendungen kümmern, die den Dateisystembaum rekursiv durchlaufen, wie z. B. Sicherungen und Indizierungen (z. B. zum Erstellen einer Lokalisierungsdatenbank ).
In der Regel sollten Bindungsbereitstellungen von rekursiven Verzeichnisdurchläufen ausgeschlossen werden, damit jeder Verzeichnisbaum am ursprünglichen Speicherort nur einmal durchlaufen wird. Konfigurieren Sie mit bindfs und nullfs das Traversal-Tool so, dass diese Dateisystemtypen nach Möglichkeit ignoriert werden. Linux-Bind-Mounts können nicht als solche erkannt werden: Der neue Speicherort entspricht dem Original. Bei Linux-Bindungsbereitstellungen oder bei Tools, die nur Pfade und keine Dateisystemtypen ausschließen können, müssen Sie die Bereitstellungspunkte für die Bindungsbereitstellungen ausschließen.
Überquerungen , die an Dateisystem - Grenzen (zB Stop find -xdev
, rsync -x
, du -x
, ...) wird automatisch beendet , wenn sie ein bindfs oder nullfs Punkt stoßen montieren, weil die Mount - Punkt ein anderes Dateisystem ist. Bei Linux-Bindemounts ist die Situation etwas komplizierter: Es gibt nur dann eine Dateisystemgrenze, wenn der Bindemount ein anderes Dateisystem pfropft, nicht, wenn er einen anderen Teil desselben Dateisystems pfropft.
Bindungsbereitstellungen bieten eine Ansicht einer Verzeichnisstruktur an einem anderen Speicherort. Sie legen dieselben Dateien offen, möglicherweise mit unterschiedlichen Mount-Optionen und (mit bindfs) unterschiedlichen Eigentumsrechten und Berechtigungen. Dateisysteme, die eine geänderte Ansicht eines Verzeichnisbaums darstellen, werden als Overlay-Dateisysteme oder stapelbare Dateisysteme bezeichnet . Es gibt viele andere Overlay-Dateisysteme, die erweiterte Transformationen durchführen. Hier sind einige gebräuchliche. Wenn Ihr gewünschter Anwendungsfall hier nicht behandelt wird, überprüfen Sie das Repository von FUSE-Dateisystemen .
bindfs -r
nur ein bisschen leichter.Union-Mounts - Präsentieren Sie mehrere Dateisysteme (so genannte Branches ) in einem einzigen Verzeichnis: Wenn sie tree1
enthalten foo
und enthalten, tree2
enthält bar
ihre Union-Ansicht beide foo
und bar
. Neue Dateien werden in einen bestimmten Zweig oder in einen Zweig geschrieben, der nach komplexeren Regeln ausgewählt wurde. Es gibt verschiedene Implementierungen dieses Konzepts, darunter:
mount --bind /dir1 /dir1
das? Wie unterscheidet es sich von dem Fall, in dem Quelle und Ziel der Montage unterschiedlich sind?
/proc/self/mountinfo
. Was Chroot betrifft, so kann es zur Isolierung verwendet werden, jedoch nicht für sich allein. Sie benötigen jedoch keine Mount-Namespaces: chroot reicht für den Namespace-Teil des Dateisystems. Sie müssen sicherstellen, dass kein Prozess in der Chroot als derselbe Benutzer wie ein Prozess außerhalb der Chroot ausgeführt wird.
Ganz einfach: Wenn Sie die Bindungsbereitstellung verwenden, wird eine Datei oder ein Verzeichnis auf dem Hostcomputer in einen Container eingebunden, sodass alle Änderungen, die im Dateiverzeichnis des Hostcomputers vorgenommen werden, automatisch im Container des Verzeichnisses verfügbar sind.