Daher versuche ich herauszufinden, wie der Mount-Namespace von Linux funktioniert. Also habe ich ein kleines Experiment durchgeführt, zwei Terminals geöffnet und folgendes ausgeführt:
Terminal 1
root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt
Terminal 2
root@goliath:~# ls b
foo.txt
Wie kommt es, dass die Montierung in Terminal 2 sichtbar ist? Da es nicht Teil des Mount-Namespace ist, habe ich erwartet, dass das Verzeichnis hier leer ist. Ich habe auch versucht -o shared=no
, --make-private
Optionen mit zu übergeben und zu verwenden mount
, aber ich habe das gleiche Ergebnis erzielt.
Was fehlt mir und wie kann ich es eigentlich privat machen?
linux
namespace
bind-mount
Fataler Fehler
quelle
quelle
man mount
.--make-private
ist nicht das, was ich will. Aber ist das nicht der Punkt, an dem Namespaces gemountet werden (dh sie sind nicht systemweit)?Antworten:
Wenn Sie eine systembasierte Distribution mit einer
util-linux
Version unter 2.27 verwenden, wird dieses unintuitive Verhalten angezeigt. Dies liegt daran,CLONE_NEWNS
dass Flags wieshared
abhängig von einer Einstellung im Kernel propogiert werden . Diese Einstellung ist normalerweiseprivate
, aber systemd ändert dies inshared
. Abutil-linux
Version 2.27 wurde ein Patch erstellt , der das Standardverhalten desunshare
Befehls so ändert , dass esprivate
als Standardverbreitungsverhalten verwendet wird, um intuitiver zu sein.Lösung
Wenn Sie sich auf einem systemd-System mit <2.27 befinden
util-linux
, müssen Sie das Root-Dateisystem erneut bereitstellen, nachdem Sie denunshare
Befehl ausgeführt haben:Wenn Sie sich auf einem systemd-System mit> = 2.27 befinden
util-linux
, sollte es wie in dem Beispiel, das Sie in Ihrer Frage angegeben haben, wörtlich funktionieren, ohne dass ein erneutes Einhängen erforderlich ist. Wenn nicht: übergeben Sie--propagation private
denunshare
Befehl, um die Weitergabe des Mount-Namespace als privat zu erzwingen.quelle
Dies funktionierte nicht in Ubuntu (15.04 und 14.04). Es funktionierte auf Fedora. und für Fedora. ob du --make-private brauchst oder nicht, kannst du auch überprüfen
Wenn sie gemeinsam genutzt werden, bedeutet dies, dass ein anderer Namespace diese Bereitstellungen weiterhin sehen kann. Dann ist es ein systembezogenes Problem. Sie können --make-private verwenden, damit es funktioniert
quelle