Linux 克隆和装载
我目前正在寻找一些示例来了解linux中的CLONE_NEWNS,因此我做了以下实验: 在shell1中:Linux 克隆和装载,linux,filesystems,kernel,linux-namespaces,Linux,Filesystems,Kernel,Linux Namespaces,我目前正在寻找一些示例来了解linux中的CLONE_NEWNS,因此我做了以下实验: 在shell1中: $ mkdir mnt $ sudo unshare -m /bin/bash # mount /dev/sda5 mnt/ # ls mnt lost+found # readlink /proc/$$/ns/mnt mnt:[4026532353] 其中,如shell2所示: $ ls mnt lost+found $ readlink /proc/$$/ns/mnt mnt:[
$ mkdir mnt
$ sudo unshare -m /bin/bash
# mount /dev/sda5 mnt/
# ls mnt
lost+found
# readlink /proc/$$/ns/mnt
mnt:[4026532353]
其中,如shell2所示:
$ ls mnt
lost+found
$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
我希望shell2中的输出应该是空的,因为CLONE_NEWNS将创建一个新的挂载名称空间,如文档所述
首先,我认为child的名称空间挂载将传播到parents',所以我在parent中挂载,child也请参见挂载
然后,我从同一个父级创建两个独立的子命名空间,在一个子级中装载也会影响另一个子级
我很困惑
在我的第一次实验中
在shell1中:
$ mkdir mnt
$ sudo unshare -m /bin/bash
# mount /dev/sda5 mnt/
# ls mnt
lost+found
# readlink /proc/$$/ns/mnt
mnt:[4026532353]
在Shell 2中:
$ ls mnt
lost+found
$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
显然,它们位于不同的装载命名空间中。不同的装载命名空间只意味着子命名空间中的[u]装载操作在父命名空间中不可见。这并不意味着父级中的挂载在子级中不可见,也不意味着所有挂载都消失
要尝试它,您可以在子名称空间中[un]挂载某些内容,并查看它是否[仍然]存在于父名称空间中。Linux似乎完全落后于此,我不完全确定原因 但是如果您在shell2中装载/dev/sda5 mnt/,那么shell1中的
ls mnt
应该不会显示丢失+找到。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,并且内存名称空间中的子级在内存中比父级受到更多的限制