Read only Bind-Mount?

9

Ich benutze mount -o bind, um Verzeichnisse in chroots zu mounten, was sehr gut funktioniert. Das Problem ist, dass ich möchte, dass einige dieser bindgebundenen Verzeichnisse nur in chroot gelesen werden.

Ist es möglich? Wenn nicht - auf andere Weise?

Ich habe darüber nachgedacht, NFS für Localhost-Mounts zu verwenden, aber es sieht nach Overkill aus.


quelle

Antworten:

6

Nach diesem Artikel ist es möglich. Sie benötigen einen aktuellen Kernel.

mount --bind -o ro /vital_data /untrusted_container/vital_data
Zoredache
quelle
16

Direkte Antwort aus dem LWN-Artikel :

mount --bind /vital_writable_data /untrusted_container/vital_data
mount -o bind,remount,ro /untrusted_container/vital_data

Unterstützt seit Linux 2.6.26.

blau gefärbt
quelle
4

In Squeeze funktionierte es früher nur mit:

mount --bind /src /dst

dann

mount -o remount,ro /dst

Jetzt müssen Sie in Debian Wheezy Folgendes tun:

mount -o remount,ro,bind /dst

um die Nachricht zu entfernen: Ressource beschäftigt.

Bearbeiten: Jetzt in Debian Jessie versucht mount klug zu sein und mounten Unterverzeichnisse, die rekursiv werden und schlimme Dinge passieren :)

Es gibt eine spezielle Option, die Util-Linux dazu zwingt, wieder 'dumm' zu sein. Lösungen ist dies:

mount --bind --make-rprivate /sbin/ $prefix/sbin/
mount -o remount,ro,bind $prefix/sbin/

Anschließend können Sie --bind $ prefix / sbin in ein anderes Verzeichnis einbinden.

Von der Manpage:

Die gemeinsam genutzten Teilbaumoperationen. Seit Linux 2.6.15 ist es möglich, ein Mount und seine Submounts als gemeinsam genutzt, privat, Slave oder nicht bindend zu markieren. Ein gemeinsam genutzter Mount bietet die Möglichkeit, Spiegel dieses Mount zu erstellen, sodass das Ein- und Aushängen innerhalb eines der Spiegel auf den anderen Spiegel übertragen wird. Ein Slave-Mount empfängt die Weitergabe von seinem Master, aber nicht umgekehrt. Ein privates Reittier besitzt keine Ausbreitungsfähigkeiten. Ein nicht bindbarer Mount ist ein privater Mount, der nicht durch einen Bindevorgang geklont werden kann. Die detaillierte Semantik ist in der Datei Documentation / filesystems / sharedsubtree.txt im Kernel-Quellbaum dokumentiert. Unterstützte Operationen sind:

     mount --make-shared mountpoint
     mount --make-slave mountpoint
     mount --make-private mountpoint
     mount --make-unbindable mountpoint

Mit den folgenden Befehlen kann der Typ aller Mounts unter einem bestimmten Mountpunkt rekursiv geändert werden.

     mount --make-rshared mountpoint
     mount --make-rslave mountpoint
     mount --make-rprivate mountpoint
     mount --make-runbindable mountpoint

mount (8) liest fstab (5) nicht, wenn eine --make- * -Operation angefordert wird. Alle notwendigen Informationen müssen in der Kommandozeile angegeben werden. Beachten Sie, dass der Linux-Kernel nicht zulässt, dass mehrere Propagierungsflags mit einem einzigen Mount (2) -Syscall geändert werden, und dass die Flags nicht mit anderen Mount-Optionen gemischt werden können.

Seit util-linux 2.23 können mit dem Befehl mount mehrere Propagierungsflags zusammen und auch zusammen mit anderen Mount-Operationen verwendet werden. Diese Funktion ist EXPERIMENTELL. Die Propagierungsflags werden von zusätzlichen Mount (2) -Syscalls angewendet, wenn die vorhergehenden Mount-Vorgänge erfolgreich waren. Beachten Sie, dass dieser Anwendungsfall nicht atomar ist. Es ist möglich, die Ausbreitungsflags in fstab (5) als Mount-Optionen anzugeben (privat, Slave, gemeinsam genutzt, nicht bindend, privat, rslave, rshared, runbindable).

Anton Valqk
quelle
2

mount --bind / vital_data / untrusted_container / vital_data

mount -o remount, ro, bind / untrusted_container / vital_data

Im zweiten Mount musst du "remount, ro, bind" verwenden, sonst werden auch alle anderen Instanzen von / vital_data schreibgeschützt.

rexo
quelle
Nein, das tust du nicht (zumindest nicht unter Linux 3.19). Wo haben Sie die Notwendigkeit erlebt, die bindOption hinzuzufügen ?
Karl Richter
1
@KarlRichter - Ich habe es nicht getestet, gebe aber man 2 mountan, dass dies binderforderlich ist: "Seit Linux 2.6.26 kann das MS_REMOUNTFlag verwendet werden MS_BIND, um nur die Flags pro Mount-Punkt zu ändern. Dies ist besonders nützlich, um den Lesevorgang zu setzen oder zu löschen." -only "Flag auf einem Mount-Punkt, ohne das zugrunde liegende Dateisystem zu ändern. Wenn Sie Mount-Flags wie folgt angeben, MS_REMOUNT | MS_BIND | MS_RDONLYwird der Zugriff über diesen Mount-Punkt schreibgeschützt, ohne dass andere Mount-Punkte betroffen sind." (Ab Ubuntu 19.10, Linux man-pagesRelease 5.0.2 vom 02.08.2019.)
mpb
1
@KarlRichter - Update: Laut unix.stackexchange.com/a/128388libmount rufen neuere Versionen von die mount()Funktion zweimal während eines einzelnen Aufrufs des /usr/bin/mountProgramms auf. Es ist also eher die Version von libmountals die Kernel-Version, die bestimmt, ob zwei Aufrufe von /usr/bin/mountbenötigt werden oder nicht .
mpb