docker 原理之 mount namespace(下)
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(下)的更多相关文章
- docker原理
Docker原理11 Linux Namespace 11 AUFS文件系统17 重新理解Docker的各种命令18 Docker原理 Linux Namespace docker是一个容器引擎,容器 ...
- docker 深入理解之namespace
namespace 名称空间 docker容器主要通过资源隔离来实现的,应该具有的6种资源隔 namespace 的六项隔离 namespace 系统调用参数 隔离的内容 UTS CLONE_NEWU ...
- Docker容器的原理与实践 (下)
欢迎访问网易云社区,了解更多网易技术产品运营经验. Docker原理分析 Docker架构 镜像原理 镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容Docker以镜像和在镜 ...
- Docker原理:Namespace
目录 Namespace UTS Namespae PID Namespace Mount Namespace User Namespace Network Namespace 参考 Namespac ...
- 一篇文章带你吃透 Docker 原理
容器的实现原理 从本质上,容器其实就是一种沙盒技术.就好像把应用隔离在一个盒子内,使其运行.因为有了盒子边界的存在,应用于应用之间不会相互干扰.并且像集装箱一样,拿来就走,随处运行.其实这就是 Paa ...
- Docker原理(图解+秒懂+史上最全)
背景:下一个视频版本,从架构师视角,尼恩为大家打造高可用.高并发中间件的原理与实操. 目标:通过视频和博客的方式,为各位潜力架构师,彻底介绍清楚架构师必须掌握的高可用.高并发环境,包括但不限于: 高可 ...
- 一篇不一样的docker原理解析
转自:https://zhuanlan.zhihu.com/p/22382728 https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前do ...
- Docker原理探究
问题思考:-------------------------------------Docker浅显原理理解-------------------------------------P1. ubunt ...
- docker原理(转)
转自:https://zhuanlan.zhihu.com/p/22382728 https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前do ...
- Docker 容器资源隔离 namespace(十)
目录 一.简介 Linux Namespace的6大类型 二.Mount Namespace 三.IPC Namespace 四.Network Namespace 五.UTS Namespace 六 ...
随机推荐
- MVC:开发模式
1.jsp演变历史 1.早期只有servlet,只能使用response输出标签数据,非常麻烦. 2.后来有了jsp,简化了Servlet的开发,如果过度使用jsp中即写大量的Ja ...
- Napping - vulnhub - writeup
Napping - vulnhub - writeup 信息收集 目标开放了22和80. root@kali ~ » arp-scan -I eth1 -l Interface: eth1, type ...
- 部署堡垒机6——配置Nginx及其他组件
Lina部署 cd /opt wget https://github.com/jumpserver/lina/releases/download/v2.28.7/lina-v2.28.7.tar.gz ...
- MySQL|MySQL事物以及隔离级别
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如开单,需要添加给订单表增加记录,还需要增加订单的各种相关明细,操作复杂度高,这些操作语句需要构成一个事务.在 MySQL 命令行的默认设置下, ...
- zabbix 默认消息
故障事件: {TRIGGER.NAME}监控状态: {TRIGGER.STATUS}报警严重性: {TRIGGER.SEVERITY}触发结果: {TRIGGER.URL}告警时间:{EVENT.DA ...
- 微短剧市场暴涨267.65%,用微短剧场景AUI Kit精巧入局
微短剧,不仅上头,更要上心. 微短剧,深度"拿捏"了这个碎片化时代,也是刚过去的2023年绕不开的热词. 与传统影视剧制作精益求精.耗时长相反,门槛与耗时"双低" ...
- 详解GaussDB(DWS)用户监控原理及应用
摘要:本文将聚焦于用户监控的原理及应用进行介绍. 本文分享自华为云社区<GaussDB(DWS)监控工具指南(二)用户级监控>,作者:幕后小黑爪 . 前言 资源监控是整个运维乃至整个产品生 ...
- Mysql开发实践:error while loading shared libraries: libaio解决方案
摘要:Mysql出现问题:error while loading shared libraries: libaio解决方案. 本文分享自华为云社区<Mysql出现问题:error while l ...
- 华为云IoT设备接入服务全体验
摘要:华为云IoT设备接入服务,海量设备,一键接入,你值得拥有! 本文分享自华为云社区<[云驻共创]Huawei Mate 40产线直击之 华为云IoT设备接入服务全体验>,原文作者:启明 ...
- 数字化转型鸿沟如何消除?ROMA Connect融合集成,联接企业应用现在与未来
摘要:ROMA Connect平台正在以"联接和融合"的方式,重塑传统企业上云的路径--"条条大路"通向云端. 本文分享自华为云社区<[大厂内参]第13期 ...