Linux
為什麼我的綁定掛載在其掛載命名空間之外可見?
所以我試圖了解 Linux 的掛載命名空間是如何工作的。所以,我做了一個小實驗,打開了兩個終端並執行了以下命令:
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
用作預設傳播行為,以便更直覺。解決方案
如果您使用的是
util-linux
2.27 之前的 systemd 系統,則必須在執行命令後重新掛載根文件系統:unshare
# unshare --mount -- /bin/bash # mount --make-private -o remount /
如果您在具有
util-linux
2.27 或更高版本的 systemd 系統上,它應該按您在問題中給出的範例中的預期工作,逐字逐句,無需重新安裝。如果不是,則傳遞--propagation private
給unshare
命令以強制將掛載命名空間的傳播設為私有。