Linuxのマウント名前空間がどのように機能するかを理解しようとしています。そこで、少し実験を行って2つのターミナルを開き、次のコードを実行しました。
ターミナル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
ターミナル2
root@goliath:~# ls b
foo.txt
マウントがターミナル2に表示されるのはなぜですか?これはマウント名前空間の一部ではないため、ここではディレクトリが空であると想定していました。また、-o shared=no
を渡して--make-private
オプションをmount
とともに使用してみましたが、同じ結果が得られました。
何が欠けていますか?実際にプライベートにする方法はありますか?
util-linux
バージョンが2.27未満のsystemdベースのディストリビューションを使用している場合は、この直感的でない動作が見られます。これは、CLONE_NEWNS
がカーネルの設定に応じてshared
などのフラグを伝播するためです。この設定は通常private
ですが、systemdはこれをshared
に変更します。 util-linux
2.27の時点で、 パッチが作成されました これにより、unshare
コマンドのデフォルトの動作が変更され、デフォルトの伝播動作としてprivate
が使用されます。より直感的。
ソリューション
<2.27 util-linux
のsystemdシステムを使用している場合は、ルートファイルシステムを再マウントする必要がありますafterunshare
コマンドを実行します。
# unshare --mount -- /bin/bash
# mount --make-private -o remount /
> = 2.27 util-linux
のsystemdシステムを使用している場合は、質問で示した例で、再マウントすることなく、逐語的に期待どおりに機能するはずです。そうでない場合:--propagation private
をunshare
コマンドに渡して、マウント名前空間の伝播を非公開にします。
これはubuntuでは機能しませんでした(15.04および14.04)。それはFedoraで動作しました。 Fedoraの場合。 --make-privateが必要かどうかにかかわらず、確認することもできます
猫/ proc/self/mountinfo | grepが共有しました
共有されている場合は、他の名前空間がまだそのマウントを認識できることを意味します。次に、systemd関連の問題です。 --make-privateを使用して機能させることができます