每个进程专用文件系统挂载点


24

我正在检查unshare命令,并根据它的手册页,

   unshare - run program with some namespaces unshared from parent

我还看到其中列出了一种名称空间,

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

装载名称空间的确切用途是什么?我试图借助一些示例来理解这个概念。



@吉尔斯,谢谢。我会看看。同时,请让我知道是否需要在答案中添加其他内容。
Ramesh 2014年

Answers:


29

运行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 ../

文件hellohelloagain都不可见,我什至以root用户身份登录以检查这些文件。因此优点是,此功能使我们可以创建一个私有的临时文件系统,即使其他root拥有的进程也无法查看或浏览。

在的手册页中unshare

mount名称空间装载和卸载文件系统不会影响系统的其余部分(CLONE_NEWNS标志),除非文件系统被显式标记为共享(使用mount --make-shared;有关共享标志,请参见/ proc / self / mountinfo)。

建议在取消共享--mount之后使用mount --make-rprivate或mount --make-rslave,以确保新名称空间中的安装点确实与父名称空间未共享。

用于命名空间的内存是来自内核的VFS。而且-如果我们首先进行设置-我们可以创建整个虚拟环境,在该虚拟环境中我们是没有root权限的root用户。

参考文献:

该示例使用此博客文章中的详细信息构成。另外,此答案的引文来自Mike的精彩解释。从这里的答案中可以找到关于这方面的另一篇精彩的读物。


1
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.与相比chrootchroot其他人可以看到文件。这太神奇了,该句子可能应该像答案的顶部一样。+1。
Sergiy Kolodyazhnyy

1
没有什么能逃脱根源! 使用,nsenter您可以输入名称空间并查看临时文件。假设只有一个取消共享(拥有sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -p
临时

2

如果您的系统上安装了bubblewrap,则只需一步即可轻松完成:

bwrap --dev-bind / / --tmpfs /tmp bash

在上面的示例中,inner bash在/ tmp上具有其自己的视图。

受@ Ramesh-s答案启发的解决方案-谢谢!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.