Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 克隆和装载_Linux_Filesystems_Kernel_Linux Namespaces - Fatal编程技术网

Linux 克隆和装载

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:[

我目前正在寻找一些示例来了解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:[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,并且内存名称空间中的子级在内存中比父级受到更多的限制