Linux Namespace : Mount

前端之家收集整理的这篇文章主要介绍了Linux Namespace : Mount前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

文件系统视图。简单点说就是,mount namespace 用来隔离文件系统的挂载点,这样进程就只能看到自己的 mount namespace 中的文件系统挂载点文件中找到。函数或 unshare 函数并传入 CLONE_NEWNS 标志创建新的 mount namespace 时, 新 mount namespace 中的挂载点其实是从调用者所在的 mount namespace 中拷贝的。但是在新的 mount namespace 创建之后,这两个 mount namespace 及其挂载点就基本上没啥关系了(除了 shared subtree 的情况),两个 mount namespace 是相互隔离的。

文件系统进行隔离,以及 shared subtree 在 mount namespace 中的使用方式。本文的演示环境为 ubuntu 16.04。

文件系统的隔离

文件的挂载来演示 mount namespace 对文件系统的隔离。下面先创建演示用的文件和目录:

$ /demo && /demo && -p iso1/ -p iso2/-o .iso ./-o .iso ./iso2

$ /mnt/iso1 /mnt/iso2

第一步,我们打开两个 bash shell,为了方便区分,分别把它们称为为 shell1 和 shell2。在 shell1 中执行挂载操作,把 1.iso 挂载到 /mnt/iso1 目录:

$ .iso /mnt/iso1

第二步,先在 shell2 中执行 sudo unshare -m,然后在两个 shell 中分别执行 readlink /proc/$$/ns/mnt 命令:

第三步,通过 mount 命令查看两个 mount namespace 中的挂载点信息:

第四步,我们在 shell2 中执行一些 mount 和 umount 操作:

$ .iso /mnt/ /mnt/iso1

文件系统是隔离的)。

功能

添加了一个磁盘设备,我们打算让所有的 mount namespace 都挂载它。过去的做法只能是在每个 mount namespace 中都挂载一遍,很显然,这太不方便了。于是在 Linux 内核 2.6.15 引入了 shared subtree 的概念来解决这个问题。Shared subtree 的核心是允许在 mount namespace 之间自动地或者是受控地传播 mount 和 umount 事件

内容,请参考 。关于 shared subtree 与 mount namespace 结合使用的详细信息,请参考

文件的挂载来演示 shared subtree 在 mount namespace 中的表现。下面先创建演示用的文件和目录:

$ /demo && /demo && =/dev/zero bs=1M count= of=./ =/dev/zero bs=1M count= of=./ =/dev/zero bs=1M count= of=./ =/dev/zero bs=1M count= of=.///// disk1 disk2

第一步,我们打开两个 bash shell,为了方便区分,分别把它们称为为 shell1 和 shell2。在 shell1 中执行挂载操作,分别以 shared 和 private 方式挂载 disk1 和 disk2:

第二步,在 shell2 中执行 sudo unshare -m --propagation unchanged,然后在两个 shell 中分别执行 readlink /proc/$$/ns/mnt 命令:

支持 private|shared|slave 类型,和 mount 命令的那些 --make-private 参数一样,它们实际上都是通过调用 mount 函数并传入不同的参数实现的。第三步,分别在 shell1 和 shell2 中执行 cat /proc/self/mountinfo |grep disk| sed 's/ - .*//' 命令查看挂载点信息:

显示为 shared。又因为在 shell2 中执行 unshare 命令时设置了 --propagation unchanged 参数,所以上图中 shell2 中 /demo/disk1 的挂载方式也显示为 shared()。第四步,在 shell2 中分别在 disk1 目录下创建 disk3 目录,在 disk2 目录下创建 disk4 目录,并把 disk3.img 挂载到 ./disk1/disk3 目录,把 disk4.img 挂载到 ./disk2/disk4 目录:

$ ./disk1/disk3 ./disk2/ disk3.img ./disk1/ disk4.img ./disk2/disk4

因为 /demo/disk1 的挂载方式为 shared,所以它的子挂载点 /demo/disk1/disk3 被传播到了 shell1 所在的 mount namespace 中。而 /demo/disk2 的挂载方式为 private,所以它的子挂载点 /demo/disk2/disk4 不会被传播。

功能演示,希望这个小 demo 可以帮助大家了解一点 shared subtree 相关的内容

加上最简单的 demo 来说明什么是 mount namespace、它可以用来干什么以及如何快速的实验一下。

猜你在找的Shell相关文章