每個程序私有文件系統掛載點
我正在檢查
unshare
命令,根據它的手冊頁,unshare - run program with some namespaces unshared from parent
我還看到有一種命名空間被列為,
mount namespace mounting and unmounting filesystems will not affect rest of the system.
這個掛載命名空間的目的到底是什麼?我試圖借助一些範例來理解這個概念。
Running
unshare -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 ../
這些文件不可見
hello
,helloagain
我什至以 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 的這個精彩的解釋。可以從此處的答案中找到有關此的另一篇精彩讀物。