Linux

每個程序私有文件系統掛載點

  • February 5, 2022

我正在檢查unshare命令,根據它的手冊頁,

  unshare - run program with some namespaces unshared from parent

我還看到有一種命名空間被列為,

mount namespace
             mounting and unmounting filesystems will not affect rest of the system.

這個掛載命名空間的目的到底是什麼?我試圖借助一些範例來理解這個概念。

Runningunshare -m為呼叫程序提供了其掛載命名空間的私有副本,並取消共享文件系統屬性,使其不再與任何其他程序共享其根目錄、目前目錄或 umask 屬性。

那麼上面這段話是怎麼說的呢?讓我們嘗試使用一個簡單的例子來理解。

1號航站樓:

我在第一個終端中執行以下命令。

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

最後一個命令給了我輸出,

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

現在,我也執行了以下命令。

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls -lFa

ls命令的輸出是,

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

那麼做這一切有什麼大不了的呢?我為什麼要這樣做?

我現在打開另一個終端(終端 2)並執行以下命令。

cd /tmp/tmp.7KtrAsd9lx
ls -lFa

輸出如下。

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

這些文件不可見hellohelloagain我什至以 root 身份登錄以檢查這些文件。所以好處是,這個特性使我們可以創建一個私有的臨時文件系統,即使是其他 root 擁有的程序也無法看到或瀏覽。

從手冊頁unshare

mount namespace 掛載和解除安裝文件系統不會影響系統的其餘部分(CLONE_NEWNS 標誌),但明確標記為共享的文件系統除外(使用 mount –make-shared;有關共享標誌,請參見 /proc/self/mountinfo)。

建議在 unshare –mount 之後使用 mount –make-rprivate 或 mount –make-rslave 以確保新命名空間中的掛載點確實與父命名空間不共享。

用於命名空間的記憶體是來自核心的 VFS。而且 - 如果我們一開始就設置正確 - 我們可以創建整個虛擬環境,在其中我們是沒有 root 權限的 root 使用者。

參考:

該範例是使用此部落格文章中的詳細資訊建構的。此外,這個答案的引用來自 Mike 的這個精彩的解釋。可以從此處的答案中找到有關此的另一篇精彩讀物。

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