Linux

為什麼我的綁定掛載在其掛載命名空間之外可見?

  • June 30, 2021

所以我試圖了解 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-linux2.27 開始,已經製作了一個更新檔來更改unshare命令的預設行為以private用作預設傳播行為,以便更直覺。

解決方案

如果您使用的是util-linux2.27 之前的 systemd 系統,則必須在執行命令後重新掛載根文件系統:unshare

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

如果您在具有util-linux2.27 或更高版本的 systemd 系統上,它應該按您在問題中給出的範例中的預期工作,逐字逐句,無需重新安裝。如果不是,則傳遞--propagation privateunshare命令以強制將掛載命名空間的傳播設為私有。

引用自:https://unix.stackexchange.com/questions/246312