Chroot

使綁定掛載僅在目前程序及其後代的上下文中生效

  • May 19, 2018

我有 2 個文件:/MyDir/a 和 /MyDir/MySubDir/b 並且正在執行一個 bash 腳本,我想向其中添加程式碼以使文件 /a 指向文件 /b,但僅限於目前程序及其後代.

為了讓 /MyDir/a 指向 /MyDir/MySubDir/b 僅在目前程序的上下文中(還不包括它的後代),我嘗試首先通過執行一個小程序使目前程序在其自己的掛載命名空間中執行我的腳本中執行的 C 程序

unshare(CLONE_NEWNS)

進而

mount --bind /MyDir/MySubDir/b /MyDir/a.

不幸的是,這並沒有像我預期的那樣工作,因為儘管系統呼叫報告成功,其他程序仍然可以看到掛載。

在另一次嘗試中,我嘗試通過呼叫 C 程式碼進行掛載

mount("/MyDir/a", "/MyDir/MySubDir/b", "ext3", MS_BIND, null)

但這不起作用,因為掛載根本沒有生效(儘管呼叫報告成功)。

有沒有辦法使 /MyDir/a 指向 /MyDir/MySubDir/b 僅在目前程序及其後代的上下文中使用 bash 腳本?

我還閱讀了一些關於 chroot 的資訊,但這僅適用於 / 目錄……有沒有類似於 chroot 的僅適用於特定子目錄的內容?

謝謝你的時間!

僅外殼的解決方案是:

對於互動式外殼:

# unshare --mount
# mount --bind /MyDir/MySubDir/b /MyDir/a
# 

以非互動方式,在不必知道這些設置的腳本之前:

# unshare --mount sh -c 'mount --bind /MyDir/MySubDir/b /MyDir/a; exec somethingelse'

unshare手冊頁還警告共享子樹掛載如果您必須禁用它們,請考慮添加例如--make-private掛載。

正如 Hauke 所說,您必須確保在創建命名空間後不要離開它,因為它會消失。

如果需要,有一種方法可以在沒有程序的情況下維護名稱空間。由於它涉及掛載,因此對於掛載命名空間來說有點棘手。這是一個互動式範例:

shell1# unshare --mount
shell1# echo $$
12345
shell1#

shell2# : > /root/mntreference
shell2# mount --bind /proc/12345/ns/mnt /root/mntreference

現在只要這個引用保持掛載,即使沒有程序使用它,命名空間也不會消失。使用nsenter --mount=/root/mntreference將進入它,因此您可以輕鬆地在其中執行其他腳本。

在 C 中使用等價物應該不是問題。

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