2013-03-28 37 views
0

我目前尋找一些例子來理解在linux CLONE_NEWNS,所以我做了以下實驗:CLONE_NEWNS和掛載傳播

在抽殼:

$ mkdir mnt 
$ sudo unshare -m /bin/bash 
# mount /dev/sda5 mnt/ 
# ls mnt 
lost+found 

,其中在shell2:

​​

我期待shell2中的輸出應該是空的,因爲CLONE_NEWNS會像文檔所說的那樣創建一個新的掛載名稱空間。

首先,我以爲孩子的名字空間mount會傳播給父母的,所以我在父母身上掛載,而孩子也是看到掛載!

然後,我從同一個父項創建兩個獨立的子名稱空間,在一個子項中掛載也會影響其他。

我很困惑。

ps。在抽殼我的第一個實驗 :

# readlink /proc/$$/ns/mnt 
mnt:[4026532353] 
在shell2

$ readlink /proc/$$/ns/mnt 
mnt:[4026531840] 

顯然,它們在不同的坐騎命名空間。

回答

0

不同的掛載名稱空間只是意味着子名稱空間中的[u]掛載操作在父項中不可見。這並不意味着,在父母身上的坐騎不會在孩子身上看到,也不意味着所有的坐騎都消失了。

要試試它,你可以[un]在子命名空間中掛載一些東西,看它是否存在於父命名空間中。

0

Linux似乎已經完全落後了,我不完全確定爲什麼。

但是,如果您在0123中使用mount /dev/sda5 mnt/,那麼shell1中的ls mnt應該不會顯示LOST + FOUND。 shell1中的子命名空間可以有效地保護它免受其父命名空間中的任何更改,但父命名空間由子更改。有點像反向沙盒,其中父命名空間是可以由孩子更改的父命名空間,但反之亦然。

我不知道這是爲什麼,可能有不同的情況,但我不知道它們。我可能在這方面錯了,但是我測試了上述動作,並且似乎阻止mnt /被掛載在shell2中。

問題的一個可能的解決方案可能是使用unshare創建一種特權掛載名稱空間,在其中執行所有根操作,它是您用於普通非特權帳戶和操作的父命名空間。所以,像...

[shell1] # unshare -m bash 
[shell2] # sudo -u normal-user startx 
[shell1] # mount /dev/privatesecret /mnt/secretplace 

...這樣的事情。顯然,如果任何人獲得root權限,他們可以追蹤你的進程,但是如果你在做任何事情之前放棄正常的用戶權限,那麼子名稱空間將會使[shell1]中的私有掛載完全隱藏在[shell2]或其他地方的任何操作中可能會攪亂它。

這個反向沙盒的東西只適用於掛載命名空間,我很確定。 PID命名空間將被正確地沙箱化,以使得孩子不會看到父母的PID,並且內存命名空間的孩子在內存中比父母更受限制。