运行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 ../
文件hello
和helloagain
都不可见,我什至以root用户身份登录以检查这些文件。因此优点是,此功能使我们可以创建一个私有的临时文件系统,即使其他root拥有的进程也无法查看或浏览。
在的手册页中unshare
,
mount名称空间装载和卸载文件系统不会影响系统的其余部分(CLONE_NEWNS标志),除非文件系统被显式标记为共享(使用mount --make-shared;有关共享标志,请参见/ proc / self / mountinfo)。
建议在取消共享--mount之后使用mount --make-rprivate或mount --make-rslave,以确保新名称空间中的安装点确实与父名称空间未共享。
用于命名空间的内存是来自内核的VFS。而且-如果我们首先进行设置-我们可以创建整个虚拟环境,在该虚拟环境中我们是没有root权限的root用户。
参考文献:
该示例使用此博客文章中的详细信息构成。另外,此答案的引文来自Mike的精彩解释。从这里的答案中可以找到关于这方面的另一篇精彩的读物。