J'essaie donc de comprendre comment fonctionne l'espace de noms de montage de Linux. J'ai donc fait une petite expérience et ouvert deux terminaux et exécuté ce qui suit:
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
Comment se fait-il que la monture soit visible dans le terminal 2? Comme il ne fait pas partie de l'espace de noms de montage, je m'attendais à ce que le répertoire apparaisse vide ici. J'ai également essayé de passer -o shared=no
et d'utiliser des --make-private
options avec mount
, mais j'ai obtenu le même résultat.
Qu'est-ce qui me manque et comment puis-je le rendre réellement privé?
linux
namespace
bind-mount
Erreur fatale
la source
la source
man mount
.--make-private
n'est pas ce que je veux. Mais, n'est-ce pas le point de monter des espaces de noms (qu'ils ne sont pas à l'échelle du système)?Réponses:
Si vous êtes sur une distribution basée sur systemd avec une
util-linux
version inférieure à 2.27, vous verrez ce comportement peu intuitif. Cela est dû au fait queCLONE_NEWNS
propage des indicateurs, par exemple enshared
fonction d'un paramètre dans le noyau. Ce paramètre est normalementprivate
, mais systemd le remplace parshared
. Depuis la versionutil-linux
2.27, un correctif a été créé qui modifie le comportement par défaut de launshare
commande à utiliserprivate
comme comportement de propagation par défaut pour être plus intuitif.Solution
Si vous êtes sur un système systemd avec <2.27
util-linux
, vous devez remonter le système de fichiers racine après avoir exécuté launshare
commande:Si vous êtes sur un système systemd avec> = 2.27
util-linux
, cela devrait fonctionner comme prévu dans l'exemple que vous avez donné dans votre question, textuellement, sans avoir besoin de remonter. Sinon: passez--propagation private
à launshare
commande pour forcer la propagation de l'espace de noms de montage à être privée.la source
cela n'a pas fonctionné dans ubuntu, (15.04 et 14.04). cela a fonctionné sur fedora. et pour fedora. que vous ayez besoin de --make-private ou non, vous pouvez également vérifier
s'il est partagé, cela signifie qu'un autre espace de noms peut toujours voir ce montage. Ensuite, c'est un problème lié à systemd. Vous pouvez utiliser --make-private pour le faire fonctionner
la source