1. mount namespace

mount namespace 通过隔离文件系统挂载点对隔离文件系统提供支持。使用 unshare 构造 mount namespace 如下:

root@chunqiu:~/chunqiu/docker/mount# dd if=/dev/zero bs=1M count=32 of=./disk1.img
root@chunqiu:~/chunqiu/docker/mount# dd if=/dev/zero bs=1M count=32 of=./disk2.img
root@chunqiu:~/chunqiu/docker/mount# mkfs.ext4 ./disk1.img
root@chunqiu:~/chunqiu/docker/mount# mkfs.ext4 ./disk2.img root@chunqiu:~/chunqiu/docker/mount# ls
disk1 disk1.img disk2 disk2.img root@chunqiu:~/chunqiu/docker/mount# mount disk1.img disk1
root@chunqiu:~/chunqiu/docker/mount# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk1 root@chunqiu:~/chunqiu/docker/mount# readlink /proc/$$/ns/mnt
mnt:[4026531840]

开启另一个 shell 窗口,并创建 mount namespace:

root@chunqiu:~# unshare --mount /bin/bash
root@chunqiu:~# readlink /proc/$$/ns/mnt
mnt:[4026532206] root@chunqiu:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk1
root@chunqiu:~/chunqiu/docker/mount# mount disk2.img disk2
root@chunqiu:~/chunqiu/docker/mount# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk1
/dev/loop1 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk2 root@chunqiu:~/chunqiu/docker/mount# touch disk1/demo; touch disk2/demo

回到原 mount namespace:

root@chunqiu:~/chunqiu/docker/mount# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk1 root@chunqiu:~/chunqiu/docker/mount# ls disk1
demo
root@chunqiu:~/chunqiu/docker/mount# ls disk2

可以看到,通过 mount namespace 实现了文件系统的隔离:

  • 每个 mount namespace 都拥有一份自己的挂载点列表,创建新 mount namespace 时,新创建的 mount namespace 将拷贝一份老 mount namespace 的挂载点列表给自己。
  • 默认情况下所有挂载状态是私有的。
  • mount namespace 实现了文件系统的隔离。上例中子文件系统 disk2 不会映射到父 mount namespace,同样的文件系统下创的文件对父 mount namespace 隔离。

1.1 挂载传播

上例中介绍了默认情况下所有挂载状态是私有的。那么,如果父 mount namespace 挂载了一张硬盘,在子 mount namespace 是不可见的,需要在子 mount namespace 中重新 mount。而挂载传播(mount propagation) 解决了这个问题。它定义了挂载对象之间的关系,系统用这些关系决定了挂载对象中的挂载事件如何传播到其它挂载对象。

挂载传播的详细信息可参阅 man mount,这里以共享和私有挂载为例查看这两种挂载方式是如何影响子 mount namespace 的:

root@chunqiu:~/chunqiu/docker/mount# ls
disk1 disk1.img disk2 disk2.img root@chunqiu:~/chunqiu/docker/mount# mount --make-shared disk1.img ./disk1
root@chunqiu:~/chunqiu/docker/mount# mount --make-private disk2.img ./disk2
root@chunqiu:~/chunqiu/docker/mount# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 27M 383K 25M 2% /root/chunqiu/docker/mount/disk1
/dev/loop1 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk2 root@chunqiu:~/chunqiu/docker/mount# cat /proc/self/mountinfo |grep disk| sed 's/ - .*//'
54 25 7:0 / /root/chunqiu/docker/mount/disk1 rw,relatime shared:40
55 25 7:1 / /root/chunqiu/docker/mount/disk2 rw,relatime

开启另一个 shell 窗口,并创建 mount namespace:

root@chunqiu:~# unshare --mount --propagation unchanged /bin/bash
root@chunqiu:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 27M 383K 25M 2% /root/chunqiu/docker/mount/disk1
/dev/loop1 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk2 root@chunqiu:~# cat /proc/self/mountinfo |grep disk| sed 's/ - .*//'
/* disk1 是 shared 是因为 unshare 指明了 propagation unchanged,如果未指定,默认是私有的 */
116 63 7:0 / /root/chunqiu/docker/mount/disk1 rw,relatime shared:40
118 63 7:1 / /root/chunqiu/docker/mount/disk2 rw,relatime

在原 mount namespace 中创建“硬盘”并模仿挂载事件:

root@chunqiu:~/chunqiu/docker/mount# dd if=/dev/zero bs=1M count=32 of=./disk3.img
root@chunqiu:~/chunqiu/docker/mount# dd if=/dev/zero bs=1M count=32 of=./disk4.img
root@chunqiu:~/chunqiu/docker/mount# mkfs.ext4 ./disk3.img
root@chunqiu:~/chunqiu/docker/mount# mkfs.ext4 ./disk4.img root@chunqiu:~/chunqiu/docker/mount# mkdir disk2/disk4
root@chunqiu:~/chunqiu/docker/mount# mkdir disk1/disk3 root@chunqiu:~/chunqiu/docker/mount# mount disk3.img disk1/disk3/
root@chunqiu:~/chunqiu/docker/mount# mount disk4.img disk2/disk4/

查看子 mount namespace 的挂载信息:

root@chunqiu:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 27M 384K 25M 2% /root/chunqiu/docker/mount/disk1
/dev/loop1 ext4 27M 396K 25M 2% /root/chunqiu/docker/mount/disk2
/dev/loop2 ext4 27M 395K 25M 2% /root/chunqiu/docker/mount/disk1/disk3

可以看到共享的挂载传播方式,文件系统内的挂载事件会映射到子 mount namespace 而私有的挂载传播方式则不会。

docker 原理之 mount namespace(下)的更多相关文章

  1. docker原理

    Docker原理11 Linux Namespace 11 AUFS文件系统17 重新理解Docker的各种命令18 Docker原理 Linux Namespace docker是一个容器引擎,容器 ...

  2. docker 深入理解之namespace

    namespace 名称空间 docker容器主要通过资源隔离来实现的,应该具有的6种资源隔 namespace 的六项隔离 namespace 系统调用参数 隔离的内容 UTS CLONE_NEWU ...

  3. Docker容器的原理与实践 (下)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Docker原理分析 Docker架构 镜像原理 镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容Docker以镜像和在镜 ...

  4. Docker原理:Namespace

    目录 Namespace UTS Namespae PID Namespace Mount Namespace User Namespace Network Namespace 参考 Namespac ...

  5. 一篇文章带你吃透 Docker 原理

    容器的实现原理 从本质上,容器其实就是一种沙盒技术.就好像把应用隔离在一个盒子内,使其运行.因为有了盒子边界的存在,应用于应用之间不会相互干扰.并且像集装箱一样,拿来就走,随处运行.其实这就是 Paa ...

  6. Docker原理(图解+秒懂+史上最全)

    背景:下一个视频版本,从架构师视角,尼恩为大家打造高可用.高并发中间件的原理与实操. 目标:通过视频和博客的方式,为各位潜力架构师,彻底介绍清楚架构师必须掌握的高可用.高并发环境,包括但不限于: 高可 ...

  7. 一篇不一样的docker原理解析

    转自:https://zhuanlan.zhihu.com/p/22382728 https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前do ...

  8. Docker原理探究

    问题思考:-------------------------------------Docker浅显原理理解-------------------------------------P1. ubunt ...

  9. docker原理(转)

    转自:https://zhuanlan.zhihu.com/p/22382728 https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前do ...

  10. Docker 容器资源隔离 namespace(十)

    目录 一.简介 Linux Namespace的6大类型 二.Mount Namespace 三.IPC Namespace 四.Network Namespace 五.UTS Namespace 六 ...

随机推荐

  1. JWT简单使用

    创建一个Maven项目,并导入jar包 <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  2. Bert-vits2-2.3-Final,Bert-vits2最终版一键整合包(复刻生化危机艾达王)

    近日,Bert-vits2发布了最新的版本2.3-final,意为最终版,修复了一些已知的bug,添加基于 WavLM 的 Discriminator(来源于 StyleTTS2),令人意外的是,因情 ...

  3. python tkinter 使用(八)

    python tkinter 使用(八) 本文主要讲下tkinter库中的其他的一些模块,如simpleDialog,scrollerText等. 1: simpleDialog simpledial ...

  4. vulnhub - tornado - wp

    coverY: 0 tornado 信息收集 目标开放了80,22端口. 访问80网页,是默认页面: 目录枚举 用dirsearch没有什么发现,换gobuster发现了一个bluesky目录.访问如 ...

  5. 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇)

    前言 书接上回,上回我们了解了 castle 代理的一些缺点,本文将开始操作整合 Microsoft.Extension.Dependency和Castle,以让默认的容器可以支持拦截器 我们将以进阶 ...

  6. IO流小结图片

  7. LFS - Linux From Scratch 从零开始全记录 - 1 准备篇

    上次折腾 LFS 已经是好几年前了,只记得最后用 VMware 引导成功了,好多技术细节已经不记得了.趁着最近有空,再来折腾一次.这一次用的一台新的 Win10 PC,目标是在一个 U 盘上构建 LF ...

  8. HDU 2709 Sumset DP 二进制

    原题链接 题意 给我们一个整数k,要求我们将k分成若干个二的整数幂(1, 2, 4, 8...)的加和形式,问我们所有的分法中,本质不同(即某个2的幂的数量不同)的形式有多少种,k最多为1000000 ...

  9. Flutter Getx 中的Dialog 以及改变主题

    设置应用程序入口 当我们导入依赖后,在应用程序顶层把 GetMaterialApp 作为顶层,如下所示 import 'package:flutter/material.dart'; import ' ...

  10. 如何上传你的组件到npm

    前言 以react为例子 webpack作为打包工具 准备工作 安装node npm上注册账号 https://www.npmjs.com/ 创建要上传组件 新建项目 生成package.json文件 ...