it-swarm.com.de

Was ist ein Bind Mount?

Was ist ein "Bind Mount"? Wie mache ich eine? Wozu ist es gut?

Mir wurde gesagt, dass ich für etwas ein Bind-Mount verwenden soll, aber ich verstehe nicht, was es ist oder wie man es verwendet.

Was ist ein Bind Mount?

Ein Bind Mount ist eine alternative Ansicht eines Verzeichnisbaums. Beim Mounten wird klassischerweise eine Ansicht eines Speichergeräts als Verzeichnisbaum erstellt. Ein Bind Mount nimmt stattdessen einen vorhandenen Verzeichnisbaum und repliziert ihn unter einem anderen Punkt. Die Verzeichnisse und Dateien im Bind-Mount entsprechen denen des Originals. Jede Änderung auf einer Seite wird sofort auf der anderen Seite wiedergegeben, da die beiden Ansichten dieselben Daten anzeigen.

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 Hardlink oder einem symbolischen Link hat ein Bind-Mount keinen Einfluss darauf, was im Dateisystem gespeichert ist. Es ist eine Eigenschaft des Live-Systems.

Wie erstelle ich ein Bind-Mount?

bindfs

Das Dateisystem bindfs ist ein Fuse Dateisystem, das eine Ansicht eines Verzeichnisbaums erstellt. Zum Beispiel der Befehl

bindfs /some/where /else/where

macht /else/where zu einem 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 als unterschiedliche Dateien für Anwendungen angezeigt (das bindfs-Dateisystem hat einen eigenen st_dev -Wert). Jede Änderung auf der einen Seite wird auf der anderen Seite „magisch“ wiedergegeben, aber die Tatsache, dass die Dateien identisch sind, wird nur sichtbar, wenn man weiß, wie bindfs funktioniert.

Bindfs kennt keine Mountpunkte. Wenn sich also unter /some/where ein Mountpunkt befindet, wird dieser nur als ein weiteres Verzeichnis unter /else/where angezeigt. Das Ein- oder Aushängen eines Dateisystems unter /some/where wird unter /else/where als Änderung des entsprechenden Verzeichnisses angezeigt.

Bindfs kann einige der Dateimetadaten ändern: Es kann gefälschte Berechtigungen und Eigentumsrechte für Dateien anzeigen. Einzelheiten finden Sie im Handbuch und Beispiele unten.

Ein bindfs-Dateisystem kann als Nicht-Root-Benutzer bereitgestellt werden. Sie benötigen lediglich die Berechtigung zum Bereitstellen von Fuse-Dateisystemen. Abhängig von Ihrer Distribution muss dies möglicherweise in der Gruppe Fuse sein oder allen Benutzern gestattet sein. Verwenden Sie zum Aufheben der Bereitstellung eines Fuse-Dateisystems fusermount -u anstelle von umount, z.

fusermount -u /else/where

nullfs

FreeBSD bietet das Dateisystem nullfs , mit dem eine alternative Ansicht eines Dateisystems erstellt wird. Die folgenden zwei Befehle sind äquivalent:

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

Nach dem Ausgeben eines der beiden Befehle wird /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 als unterschiedliche Dateien für Anwendungen angezeigt (das nullfs-Dateisystem hat einen eigenen st_dev -Wert). Jede Änderung auf der einen Seite wird auf der anderen Seite „magisch“ wiedergegeben, aber die Tatsache, dass die Dateien identisch sind, wird nur sichtbar, wenn man weiß, wie nullfs funktioniert.

Im Gegensatz zu den Fuse bindfs, die auf der Ebene des Verzeichnisbaums agieren, wirken die nullfs von FreeBSD tiefer im Kernel, sodass Mount-Punkte unter /else/where nicht sichtbar sind: nur der Baum, der Teil desselben Mount-Punkts ist wie /some/where wird unter /else/where wiedergegeben.

Das nullfs-Dateisystem kann unter anderen BSD-Varianten (OS X, OpenBSD, NetBSD) verwendet werden, wird jedoch nicht als Teil des Standardsystems kompiliert.

Linux Bind Mount

Unter Linux sind Bindungs-Mounts als Kernel-Funktion verfügbar. Sie können eine mit dem Befehl mount erstellen, indem Sie entweder die Befehlszeilenoption --bind oder die Mount-Option bind übergeben. Die folgenden zwei Befehle sind äquivalent:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

Hier ist das "Gerät" /some/where keine Festplattenpartition wie im Fall eines On-Disk-Dateisystems, sondern ein vorhandenes Verzeichnis. Der Einhängepunkt /else/where muss wie gewohnt ein vorhandenes Verzeichnis sein. Beachten Sie, dass in beiden Fällen kein Dateisystemtyp angegeben ist: Für die Erstellung eines Bind-Mount ist kein Dateisystemtreiber erforderlich, sondern es werden die Kernel-Datenstrukturen vom ursprünglichen Mount kopiert.

mount --bind unterstützt auch das Mounten eines Nichtverzeichnisses in ein Nichtverzeichnis: /some/where kann eine reguläre Datei sein (in diesem Fall muss /else/where auch eine reguläre Datei sein ).

Ein Linux-Bind-Mount ist vom Original meist nicht zu unterscheiden. Der Befehl df -T /else/where zeigt dasselbe Gerät und denselben Dateisystemtyp wie df -T /some/where. Die Dateien /some/where/foo und /else/where/foo sind nicht zu unterscheiden, als wären sie feste Links. Es ist möglich, die Bereitstellung von /some/where aufzuheben. In diesem Fall bleibt /else/where gemountet.

Bei älteren Kerneln (ich weiß nicht genau wann, glaube ich bis zu 3.x) waren Bind-Mounts wirklich nicht vom Original zu unterscheiden. Neuere Kernel verfolgen Bindungs-Mounts und machen die Informationen über PID/mountinfo verfügbar, wodurch findmnt das Bind-Mount als solches angeben kann .

Sie können Bind-Mount-Einträge in /etc/fstab einfügen. Fügen Sie einfach bind (oder rbind usw.) zusammen mit allen anderen gewünschten Optionen in die Optionen ein. Das "Gerät" ist der vorhandene Baum. Die Dateisystemspalte kann none oder bind enthalten (wird ignoriert, aber die Verwendung eines Dateisystemnamens wäre verwirrend). Zum Beispiel:

/some/where /readonly/view none bind,ro

Wenn sich unter /some/where Einhängepunkte befinden, ist deren Inhalt unter /else/where nicht sichtbar. Anstelle von bind können Sie rbind verwenden und auch Mountpunkte unter /some/where replizieren. Wenn beispielsweise /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

Darüber hinaus ermöglicht Linux die Deklaration von Mounts als Shared , Slave , Private oder unverbindlich . Dies wirkt sich darauf aus, ob dieser Mount-Vorgang unter einem Bind-Mount wiedergegeben wird, der den Mount-Punkt repliziert. Weitere Informationen finden Sie unter Kernel-Dokumentation .

Linux bietet auch eine Möglichkeit, Mounts zu verschieben: wobei --bind kopiert, --move einen Mountpunkt verschiebt.

Es ist möglich, unterschiedliche Mount-Optionen in zwei Bind-Mounted-Verzeichnissen zu haben. Es gibt jedoch eine Besonderheit: Das Binden des Mount und das Festlegen der Mount-Optionen können nicht atomar erfolgen, sondern müssen zwei aufeinanderfolgende Operationen sein. (Ä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 schreibgeschützt wird:

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

Ich kann keine Bindungshalterungen zum Arbeiten bringen!

Wenn Ihr System Fuse nicht unterstützt, besteht ein klassischer Trick, um den gleichen Effekt zu erzielen, darin, einen NFS-Server auszuführen, die anzuzeigenden Dateien zu exportieren (Zugriff auf localhost zu ermöglichen) und sie auf demselben zu mounten Maschine. Dies hat einen erheblichen Overhead in Bezug auf Speicher und Leistung, sodass Bindungs-Mounts, sofern verfügbar, einen deutlichen Vorteil haben (was bei den meisten Unix-Varianten dank Fuse der Fall ist).

Anwendungsfälle

Schreibgeschützte Ansicht

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 der einfache Weg:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

Dies lässt ein kurzes Zeitintervall, in dem /mnt/readonly gelesen und geschrieben wird. Wenn dies ein Sicherheitsrisiko darstellt, erstellen Sie zuerst den Bind-Mount in einem Verzeichnis, auf das nur Root zugreifen kann, machen Sie ihn schreibgeschützt und verschieben Sie ihn dann an einen öffentlichen Mount-Punkt. Beachten Sie im folgenden Snippet, dass es wichtig ist, dass /root/private (das Verzeichnis über dem Einhängepunkt) 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

Benutzer und Gruppen neu zuordnen

Dateisysteme erfassen Benutzer und Gruppen anhand ihrer numerischen ID. 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 von einem System zu einem anderen auf einer Festplatte ü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 die Festplatte direkt bereitstellen, werden Alices Dateien als Eigentum von Bob angezeigt (da die Benutzer-ID 1001 ist) und Bobs Dateien werden als Eigentum von Alice angezeigt (weil die Benutzer-ID ist 1000).

Sie können bindfs verwenden, um Benutzer-IDs neu zuzuordnen. Hängen Sie zuerst die Festplattenpartition in ein privates Verzeichnis ein, auf das nur root zugreifen kann. Erstellen Sie dann eine bindfs-Ansicht in einem öffentlichen Bereich mit einer Neuzuordnung von Benutzer-ID und Gruppen-ID, bei der die Benutzer-IDs und Gruppen-IDs von Alice und Bob ausgetauscht 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 zulässig auf Dateien im Home-Ordner des Benutzers eines nicht gebooteten Systems zugreifen? und Mount - Binden Sie einen anderen Benutzer als mich selbst weitere Beispiele.

Montage in einem Gefängnis oder Container

Ein chroot jail oder container führt einen Prozess in einem Teilbaum des Verzeichnisbaums des Systems aus. Dies kann nützlich sein, um ein Programm mit eingeschränktem Zugriff auszuführen, z. Führen Sie einen Netzwerkserver aus, der nur auf seine eigenen Dateien und die von ihm bereitgestellten Dateien zugreifen kann, jedoch nicht auf andere Daten, die auf demselben Computer gespeichert sind. Eine Einschränkung von chroot besteht darin, dass das Programm auf einen Teilbaum beschränkt ist: Es kann nicht auf unabhängige Teilbäume zugreifen. Bindungshalterungen ermöglichen das Pfropfen anderer Teilbäume auf diesen Hauptbaum. Dies macht sie grundlegend für die praktischste Verwendung von Containern unter Linux.

Angenommen, ein Computer führt einen Dienst /usr/sbin/somethingd aus, der nur unter /var/lib/something Zugriff auf Daten haben soll. Der kleinste Verzeichnisbaum, der diese beiden Dateien enthält, ist das Stammverzeichnis. Wie kann der Service eingeschränkt werden? Eine Möglichkeit besteht darin, unter /usr/sbin/somethingd feste Links zu allen Dateien zu erstellen, die der Dienst benötigt (mindestens /var/lib/something und mehrere gemeinsam genutzte Bibliotheken). Dies ist jedoch umständlich (die Hardlinks müssen bei jedem Upgrade einer Datei aktualisiert werden) und funktioniert nicht, wenn sich /var/lib/something und /usr auf verschiedenen Dateisystemen befinden. Eine bessere Lösung besteht darin, ein Ad-hoc-Stammverzeichnis zu erstellen und es mit Mounts 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 &

Linux Mount Namespaces verallgemeinern Chroots. Mit Bind Mounts können Namespaces auf flexible Weise gefüllt werden. Ein Beispiel finden Sie unter Einen Prozess dazu bringen, eine andere Datei für denselben Dateinamen zu lesen .

Ausführen einer anderen Distribution

Eine andere Verwendung von chroots besteht darin, eine andere Distribution in einem Verzeichnis zu installieren und Programme daraus auszuführen, selbst wenn sie Dateien in fest codierten Pfaden benötigen, 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 keine gemischten Pakete unterstützt, um ältere Versionen einer Distribution oder anderer Distributionen zu installieren, um die Kompatibilität zu testen, und um eine neuere Version zum Testen 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? Ein Beispiel für Debian/Ubuntu.

Angenommen, Sie haben eine Installation der neuesten Pakete Ihrer Distribution unter dem Verzeichnis /f/unstable, in dem Sie Programme ausführen, indem Sie mit chroot /f/unstable in dieses Verzeichnis wechseln. Um Home-Verzeichnisse aus diesen Installationen verfügbar zu machen, binden Sie sie in die Chroot ein:

mount --bind /home /f/unstable/home

Das Programm schroot erledigt dies automatisch.

Zugriff auf Dateien, die hinter einem Einhängepunkt versteckt sind

Wenn Sie ein Dateisystem in ein Verzeichnis einbinden, wird dadurch verborgen, was sich hinter dem Verzeichnis befindet. Auf die Dateien in diesem Verzeichnis kann erst zugegriffen werden, wenn die Bereitstellung des Verzeichnisses aufgehoben wird. Da BSD-Nullfs- und Linux-Bindungs-Mounts auf einer niedrigeren Ebene als die Mount-Infrastruktur ausgeführt werden, macht ein Nullfs-Mount oder ein Bind-Mount eines Dateisystems Verzeichnisse verfügbar, die im Original hinter Submounts versteckt waren.

Angenommen, Sie haben ein tmpfs-Dateisystem unter /tmp gemountet. Wenn sich beim Erstellen des tmpfs-Dateisystems Dateien unter /tmp befanden, bleiben diese Dateien möglicherweise weiterhin unzugänglich, beanspruchen jedoch Speicherplatz. Lauf

mount --bind / /mnt

(Linux) oder

mount -t nullfs / /mnt

(FreeBSD), um eine Ansicht des Root-Dateisystems unter /mnt zu erstellen. Das Verzeichnis /mnt/tmp stammt aus dem Root-Dateisystem.

NFS exportiert auf verschiedenen Wegen

Einige NFS-Server (z. B. der Linux-Kernel-NFS-Server vor NFSv4) geben beim Exportieren eines Verzeichnisses immer den tatsächlichen Verzeichnisstandort an. Das heißt, wenn ein Client server:/requested/location anfordert, bedient der Server den Baum am Speicherort /requested/location. Es ist manchmal wünschenswert, Clients zu erlauben, /request/location anzufordern, aber tatsächlich Dateien unter /actual/location bereitzustellen. Wenn Ihr NFS-Server das Bereitstellen eines alternativen Speicherorts nicht unterstützt, können Sie einen Bind-Mount für die erwartete Anforderung erstellen, z.

/requested/location *.localdomain(rw,async)

in /etc/exports und folgendes in /etc/fstab:

/actual/location /requested/location bind bind

Ein Ersatz für symbolische Links

Manchmal möchten Sie einen symbolischen Link erstellen, damit eine Datei /some/where/is/my/file unter /else/where angezeigt wird, aber die Anwendung, die file verwendet, erweitert symbolische Links und lehnt /some/where/is/my/file. Ein Bind-Mount kann dies umgehen: Bind-Mount /some/where/is/my an /else/where/is/my und dann realpath meldet /else/where/is/my/file unter /else/where sein, nicht unter /some/where.

Nebenwirkungen von Bindemontagen

Rekursive Verzeichnisdurchläufe

Wenn Sie Bindungs-Mounts verwenden, müssen Sie sich um Anwendungen kümmern, die den Dateisystembaum rekursiv durchlaufen, z. B. Sicherungen und Indizierung (z. B. zum Erstellen einer lokalisieren Datenbank).

In der Regel sollten Bindungs-Mounts 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-Bindungs-Mounts können nicht als solche erkannt werden: Der neue Speicherort entspricht dem ursprünglichen. Bei Linux-Bindungs-Mounts oder bei Tools, die nur Pfade und keine Dateisystemtypen ausschließen können, müssen Sie die Mount-Punkte für die Bind-Mounts ausschließen.

Durchläufe, die an Dateisystemgrenzen anhalten (z. B. find -xdev, rsync -x, du -x,…), werden automatisch angehalten, wenn sie auf einen bindfs- oder nullfs-Mount-Punkt stoßen, da dieser Mount erfolgt point ist ein anderes Dateisystem. Bei Linux-Bind-Mounts ist die Situation etwas komplizierter: Es gibt nur dann eine Dateisystemgrenze, wenn der Bind-Mount ein anderes Dateisystem pfropft, nicht, wenn er einen anderen Teil desselben Dateisystems pfropft.

Über das Binden von Reittieren hinausgehen

Bindungs-Mounts bieten eine Ansicht eines Verzeichnisbaums an einem anderen Speicherort. Sie machen dieselben Dateien verfügbar, möglicherweise mit unterschiedlichen Mount-Optionen und (mit bindfs) unterschiedlichen Besitzverhältnissen 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 der Fuse-Dateisysteme .

Sichtbare Dateien filtern

  • clamfs - Dateien beim Lesen über einen Virenscanner ausführen
  • filterfs - Teile eines Dateisystems ausblenden
  • rofs - eine schreibgeschützte Ansicht. Ähnlich wie bindfs -r, nur etwas leichter.
  • nion mounts - Präsentieren Sie mehrere Dateisysteme (genannt Zweige ) in einem einzigen Verzeichnis: wenn tree1foo und enthält tree2 enthält bar, dann enthält ihre Vereinigungsansicht sowohl foo als auch 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:

    • aufs - Linux-Kernel-Implementierung, aber oft stromaufwärts abgelehnt
    • funionfs - Sicherungsimplementierung
    • mhddfs - Fuse, schreibe Dateien in einen Zweig basierend auf freiem Speicherplatz
    • Overlay - Linux-Kernel-Implementierung, die in Linux v3.18 vorgelagert zusammengeführt wurde
    • nionfs-Fuse - Sicherung mit Caching- und Copy-on-Write-Funktionen

Ändern Sie Dateinamen und Metadaten

  • ciopfs - Dateinamen ohne Berücksichtigung der Groß-/Kleinschreibung (kann nützlich sein, um Windows-Dateisysteme bereitzustellen)
  • convmvfs - Dateinamen zwischen Zeichensätzen konvertieren ( Beispiel )
  • posixovl - Speichern Sie Unix-Dateinamen und andere Metadaten (Berechtigungen, Besitz,…) in eingeschränkteren Dateisystemen wie VFAT ( Beispiel )

Geänderten Dateiinhalt anzeigen

Ändern Sie die Art und Weise, wie Inhalte gespeichert werden

  • chironfs - Dateien auf mehrere zugrunde liegende Speicher replizieren ( RAID-1 auf Verzeichnisbaumebene )
  • copyfs - Kopien aller Versionen der Dateien aufbewahren
  • encfs - Dateien verschlüsseln
  • pcachefs - Cache-Schicht auf der Festplatte für langsame Remote-Dateisysteme
  • simplecowfs - Speichern Sie Änderungen über die bereitgestellte Ansicht im Speicher, wobei die Originaldateien intakt bleiben
  • Wayback - Kopien aller Versionen der Dateien aufbewahren