0

我目前正在寻找一些示例来理解 linux 中的 CLONE_NEWNS,所以我做了以下实验:

在 shell1 中:

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

如在 shell2 中:

$ ls mnt
lost+found

我期望 shell2 中的输出应该是空的,因为 CLONE_NEWNS 将创建一个新的挂载命名空间,如文档所述。

首先,我认为孩子的命名空间挂载会传播到父母的,所以我在父母身上挂载,孩子也看到了挂载!

然后,我从同一个父级创建两个单独的子命名空间,安装在一个子级中也会影响另一个子级。

我很困惑。

附言。在我在 shell1 中的第一个实验中:

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

在 shell2 中:

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

显然,它们位于不同的挂载命名空间中。

4

2 回答 2

0

不同的挂载命名空间仅意味着子命名空间中的 [u] 挂载操作在父命名空间中不可见。这并不意味着,父项中的挂载在子项中不可见,也不意味着所有挂载都消失了。

要尝试它,您可以 [un] 在子命名空间中挂载一些东西,看看它是否 [仍然] 存在于父命名空间中。

于 2013-04-06T12:51:17.377 回答
0

Linux 似乎完全倒退了,我不完全确定为什么。

但是如果你mount /dev/sda5 mnt/在 shell2 中,那么ls mnt在 shell1 中应该不会显示 LOST+FOUND。shell1 中的子命名空间有效地保护它免受其父命名空间的任何更改,但父命名空间由子命名空间更改。有点像反向沙盒,其中父命名空间是可以被子命名空间更改的命名空间,反之则不行。

我不知道为什么会这样,并且可能在某些情况下会有所不同,但我不知道。我对此可能大错特错,但我测试了上述操作,它似乎确实阻止了 mnt/ 安装在 shell2 中。

您的问题的一个可能解决方案可能是使用 unshare 创建一种特权挂载命名空间,您可以在其中执行所有根操作,并且它是您用于正常非特权帐户和操作的父命名空间。所以,就像...

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

……类似的东西。显然,如果有人获得 root 权限,他们可以 ptrace 您的进程,但子命名空间将使 [shell1] 中的私有挂载对 [shell2] 或其他任何地方的任何操作完全隐藏,前提是您在执行任何操作之前降低到正常用户权限可以弄乱它。

我很确定,反向沙箱仅适用于挂载命名空间。PID 命名空间将被正确沙盒化,这样子级就看不到父级的 PID,并且内存命名空间的子级在内存中的限制比父级更大。

于 2016-11-06T07:23:31.253 回答