Warum wird mein Bindungs-Mount außerhalb seines Mount-Namespace angezeigt?

12

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-privateOptionen 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?

Fataler Fehler
quelle
Bereitstellungen sind systemweit und nicht spezifisch für eine Shell-Umgebung. geteilt, sklave, privat und unverbindlich sind nicht das, was du denkst. lesen man mount.
cas
3
@cas: Stimme zu, das --make-privateist nicht das, was ich will. Aber ist das nicht der Punkt, an dem Namespaces gemountet werden (dh sie sind nicht systemweit)?
FatalError

Antworten:

11

Wenn Sie eine systembasierte Distribution mit einer util-linuxVersion unter 2.27 verwenden, wird dieses unintuitive Verhalten angezeigt. Dies liegt daran, CLONE_NEWNSdass Flags wie sharedabhängig von einer Einstellung im Kernel propogiert werden . Diese Einstellung ist normalerweise private, aber systemd ändert dies in shared. Ab util-linuxVersion 2.27 wurde ein Patch erstellt , der das Standardverhalten des unshareBefehls so ändert , dass es privateals 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 den unshareBefehl ausgeführt haben:

# unshare --mount -- /bin/bash
# mount --make-private -o remount /

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 privateden unshareBefehl, um die Weitergabe des Mount-Namespace als privat zu erzwingen.

Dave
quelle
0

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

cat / proc / self / mountinfo | grep

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

Kennan
quelle