docker Thin Provisioning 实践

文章目录

  • docker Thin Provisioning 实践
    • 1. Thin Provisioning Snapshot 演示
    • 2. Docker devicemapper

1. Thin Provisioning Snapshot 演示

上一篇我们介绍了 Device Mapper 框架的技术原理及其核心概念,下面,我们用一系列的命令来演示一下 Device Mapper 的 Thin Provisioning Snapshot 是怎么玩的。

首先,我们需要先建两个文件,一个是data.img,一个是meta.data.img

$ dd if=/dev/zero of=/tmp/data.img bs=1K count=1 seek=10M1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 0.000621428 s, 1.6 MB/s$ dd if=/dev/zero of=/tmp/meta.data.img bs=1K count=1 seek=1G1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 0.000140858 s, 7.3 MB/s

注意命令中 seek 选项,其表示为略过 of 选项指定的输出文件的前 10G 个 output 的 bloksize 的空间后再写入内容。
因为 bs 是 1 个字节,所以也就是 10G 的尺寸,但其实在硬盘上是没有占有空间的,占有空间只有 1k 的内容。当向其写入内容时,才会在硬盘上为其分配空间。

我们可以用 ls 命令看一下,实际分配了 12K 和 4K。

$ ls -lsh /tmp/data.img12K -rw-r--r--. 1 root root 11G Aug 25 23:01 /tmp/data.img$ ls -slh /tmp/meta.data.img4.0K -rw-r--r--. 1 root root 101M Aug 25 23:17 /tmp/meta.data.img

然后,我们为这个文件创建一个 loopback 设备。(loop2015 和 loop2016 是我乱取的两个名字)

$ losetup /dev/loop2015 /tmp/data.img
$ losetup /dev/loop2016 /tmp/meta.data.img$ losetup -a/dev/loop2015: [64768]:103991768 (/tmp/data.img)
/dev/loop2016: [64768]:103991765 (/tmp/meta.data.img)

现在,我们为这个设备建一个 Thin Provisioning 的 Pool,用 dmsetup 命令:

$ dmsetup create hchen-thin-pool \--table "0 20971522 thin-pool /dev/loop2016 /dev/loop2015 \128 65536 1 skip_block_zeroing"

其中的参数解释如下(更多信息可参看 Thin Provisioning 的 man page):

  • dmsetup create 是用来创建 thin pool 的命令
  • hchen-thin-pool 是自定义的一个 pool 名,不冲突就好。
  • –-table 是这个 pool 的参数设置
  • 0 代表起的 sector 位置
  • 20971522 代表结尾的 sector 号,前面说过,一个 sector 是 512 字节,所以,20971522 个正好是 10GB
  • /dev/loop2016 是 meta 文件的设备(前面我们建好了)
  • /dev/loop2015 是 data 文件的设备
  • 128 是最小的可分配的 sector 数
  • 65536 是最少可用 sector 的 water mark,也就是一个 threshold
  • 1 代表有一个附加参数
  • skip_block_zeroing 是个附加参数,表示略过用 0 填充的块

然后,我们就可以看到一个 Device Mapper 的设备了:

接下来,我们的初始还没有完成,还要创建一个 Thin Provisioning 的 Volume:

$ dmsetup message /dev/mapper/hchen-thin-pool 0 "create_thin 0"$ dmsetup create hchen-thin-volumn-001 \--table "0 2097152 thin /dev/mapper/hchen-thin-pool 0"

其中:

  • 第一个命令中的 create_thin 是关键字,后面的 0 表示这个 Volume 的 device 的 id。
  • 第二个命令,是真正的为这个 Volumn 创建一个可以 mount 的设备,名字叫
    hchen-thin-volumn-001。2097152 只有 1GB。

好了,在 mount 前,我们还要格式化一下:

$ mkfs.ext4 /dev/mapper/hchen-thin-volumn-001mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=16 blocks, Stripe width=16 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

好了,我们可以 mount 了(下面的命令中,我还创建了一个文件)

$ mkdir -p /mnt/base$ mount /dev/mapper/hchen-thin-volumn-001 /mnt/base$ echo "hello world, I am a base" > /mnt/base/id.txt$ cat /mnt/base/id.txthello world, I am a base

接下来,我们来看看 snapshot 怎么搞:

$ dmsetup message /dev/mapper/hchen-thin-pool 0 "create_snap 1 0"$ dmsetup create mysnap1 \--table "0 2097152 thin /dev/mapper/hchen-thin-pool 1"$ ll /dev/mapper/mysnap1lrwxrwxrwx. 1 root root 7 Aug 25 23:49 /dev/mapper/mysnap1 -> ../dm-5

上面的命令中:

第一条命令是向 hchen-thin-pool 发一个 create_snap 的消息,后面跟两个 id,第一个是新的 dev id,第二个是要从哪个已有的 dev id 上做 snapshot(0 这个 dev id 是我们前面就创建了了)
第二条命令是创建一个 mysnap1 的 device,并可以被 mount。
下面我们来看看:

$ mkdir -p /mnt/mysnap1$ mount /dev/mapper/mysnap1 /mnt/mysnap1$ ll /mnt/mysnap1/total 20
-rw-r--r--. 1 root root 25 Aug 25 23:46 id.txt
drwx------. 2 root root 16384 Aug 25 23:43 lost+found$ cat /mnt/mysnap1/id.txthello world, I am a base

我们来修改一下 /mnt/mysnap1/id.txt,并加上一个 snap1.txt 的文件:

$ echo "I am snap1" >> /mnt/mysnap1/id.txt$ echo "I am snap1" > /mnt/mysnap1/snap1.txt$ cat /mnt/mysnap1/id.txthello world, I am a base
I am snap1$ cat /mnt/mysnap1/snap1.txtI am snap1

我们再看一下 /mnt/base,你会发现没有什么变化:

$ ls /mnt/baseid.txt      lost+found$ cat /mnt/base/id.txthello world, I am a base

好了,我相信你看到了分层镜像的样子了。

2. Docker devicemapper

$ losetup -a/dev/loop0: [64768]:38050288 (/var/lib/docker/devicemapper/devicemapper/data)
/dev/loop1: [64768]:38050289 (/var/lib/docker/devicemapper/devicemapper/metadata)

其中 data 100GB,metadata 2.0GB

$ ls -alsh /var/lib/docker/devicemapper/devicemapper506M -rw-------. 1 root root 100G Sep 10 20:15 data
1.1M -rw-------. 1 root root 2.0G Sep 10 20:15 metadata

下面是相关的 thin-pool。其中,有个当一大串 hash 串的 device 是正在启动的容器:

$ ll /dev/mapper/dock*lrwxrwxrwx. 1 root root 7 Aug 25 07:57 /dev/mapper/docker-253:0-104108535-pool -> ../dm-2
lrwxrwxrwx. 1 root root 7 Aug 25 11:13 /dev/mapper/docker-253:0-104108535-deefcd630a60aa5ad3e69249f58a68e717324be4258296653406ff062f605edf -> ../dm-3

我们可以看一下它的 device id(Docker 都把它们记下来了):

$ cat /var/lib/docker/devicemapper/metadata/deefcd630a60aa5ad3e69249f58a68e717324be4258296653406ff062f605edf

device_id 是 24,size 是 10737418240,除以 512,就是 20971520 个 sector。

我们用这些信息来做个 snapshot 看看(注:我用了一个比较大的 dev id – 1024):

$ dmsetup message "/dev/mapper/docker-253:0-104108535-pool" 0 \"create_snap 1024 24"$ dmsetup create dockersnap --table \"0 20971520 thin /dev/mapper/docker-253:0-104108535-pool 1024"$ mkdir /mnt/docker$ mount /dev/mapper/dockersnap /mnt/docker/$ ls /mnt/docker/id lost+found rootfs$ ls /mnt/docker/rootfs/
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

我们在 docker 的容器里用 findmnt 命令也可以看到相关的 mount 的情况(因为太长,下面只是摘要):

$ findmntTARGET                SOURCE
/                 /dev/mapper/docker-253:0-104108535-deefcd630a60[/rootfs]
/etc/resolv.conf  /dev/mapper/centos-root[/var/lib/docker/containers/deefcd630a60/resolv.conf]
/etc/hostname     /dev/mapper/centos-root[/var/lib/docker/containers/deefcd630a60/hostname]
/etc/hosts        /dev/mapper/centos-root[/var/lib/docker/containers/deefcd630a60/hosts]

参考:

  • Device Mapper系列基础教程:Thin Provisioning 实践

Device Mapper系列基础教程:Thin Provisioning 实践相关推荐

  1. WPF入门学习----系列基础教程

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  2. STM32CubeMX和Keli5系列基础教程——GPIO输入输出的实现

    STM32CubeMX的配置 因为CubeMX是英文界面,所以我们首先学习一个技巧.英文不好的同学(比如我)可以使用vx的翻译功能(一切前提都是我们电脑要登录vx啊). 以下面第一张图为例. alt+ ...

  3. 导航属性没有被赋值_excel编程系列基础:操作对象RANDE的属性介绍

    编按: 哈喽,大家好!在上篇的VBA文章中,我们提到了RANGE属性,简单介绍了它在选中单元格区域,以及对单元格区域赋值时的作用,但这仅仅是最基础的应用,今天我们继续来讲解RANGE属性. [前言] ...

  4. DirectX12(D3D12)基础教程(外篇一)——编译Assimp

    目录 1.前言 2.Assimp库简介 3.编译Assimp库的准备工作 4.下载Assimp源码并编译 1.前言   D3D12系列教程因为我转移精力学习Nodejs.VueJs等技能,暂时中断了一 ...

  5. 《Python程序设计与算法基础教程(第二版)》江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究

    (还在更新中-) 这篇博客花费了我的大量时间和精力,从创作到维护:若认可本篇博客,希望给一个点赞.收藏 并且,遇到了什么问题,请在评论区留言,我会及时回复的 这本书对Python的知识点的描述很详细, ...

  6. SwiftUI Device Management 基础教程

    Device Management 远程管理组织的设备. 使用教程 部署移动设备管理(MDM)解决方案可使管理员安全地和远程地配置已注册的设备. 管理员使用Apple School Manager或A ...

  7. python平稳性检验_时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)...

    时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python) 发布时间:2019-01-10 00:02, 浏览次数:620 , 标签: Python 导读: 本文介绍了数据平稳 ...

  8. MongoDB基础教程系列--目录结构

     MongoDB基础教程系列--目录结构

  9. java拷贝文件目录结构_Java如何复制目录_Java基础教程系列

    Java如何复制目录,Java基础教程系列,如果要将目录及其包含的所有子文件夹和文件从一个位置复制到另一个位置,请使用下面的代码,该代码使用递归遍历目录结构,然后使用Files.copy()函数复制文 ...

最新文章

  1. Halcon 彩色图片通道分割处理
  2. 【 C 】const 学习笔记
  3. 完全分布式部署Hadoop
  4. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
  5. 解决MSDTC 53258故障
  6. django2连接mysql_Django2.2连接MySQL问题解决
  7. JAVA核心知识总结
  8. 简书 c语言 指针,C语言-指针
  9. Codeforces #105 DIV2 ABCDE
  10. LeetCode算法扫题系列19
  11. 戴尔公司大中华区总裁黄陈宏 要烧哪三把火
  12. Cocoa动画编程指南
  13. lasermaker海绵宝宝图纸
  14. 怎样在PDF文件上添加印章
  15. Python开发指南[1]之程序员计时小时钟(附源码)
  16. void 和 void *区别(c++)
  17. 黄大成:中国浙江的“盖茨神话”
  18. html页面虚化,css实现背景虚化效果的示例代码
  19. 墨客-投票系统程序设计缺陷分析-大飞
  20. 车内看车头正不正技巧_【交通安全提示】科二曲线行驶技巧图解,蜀黍手把手教你过关!...

热门文章

  1. 菜鸟学python之乒乓球比赛排单
  2. oracle数据库创建实例
  3. 符号常量与常变量的区别
  4. 你知道光棍节男生该唱什么歌么?
  5. FreeRTOS学习---“信号量”篇
  6. UCOS-Ⅲ:信号量
  7. 计算机二级考试非选择题攻略,计算机二级考试:题库抽的不是题是“命”!附赠考试通关全攻略!...
  8. U盘被分区后恢复方法
  9. 怎样批量自动上传图片
  10. Unity零基础到进阶 ☀️| UGUI布局组件介绍 Vertical Layout Group、Horizontal Layout Group 和 Grid Layout Group