7. 正确安装devicemapper
原料
devicemapper本身不是一种盘/设备, 跟 aufs不同, 我们梳理一遍:
从用户的角度出发他只关心/只需要一个设备, 来mount, 因此我们需要准备一个逻辑盘.
然后这个逻辑盘底层使用一个thinpool, 这两者全都是基于devicemapper框架, 映射在两个loopback设备上的,
梳理完了整个逻辑 我们需要如下原料:
两个设备, 分别用于存储数据 / 元数据
用这两个设备搭建出一个 thin-pool
创建出一个逻辑设备, 基于这个thin-pool
准备两个"文件"
既然thin-pool底层是用两个"设备", 那我们就搞两个loop-back设备交差, 以上命令首先创造出两个文件, 其中 /dev/zero
是零源, 代表我们一次从零源里读1K大小的数据, 而其中的seek=10M, 代表跳过前10M个块, 造成前10G内容都是被跳过的, 根据ls -lsh
的内容能看出, 他们表面上这么11G大, 实际只占据了4K的空间, 我理解这就造成了一种类似"磁盘"的效果 → 我提供10G的存储空间
把文件变成loopback设备
现在两个文件, 已经成为两个loopback设备了, 翻译成人话: 在linux看来, 这两个文件跟两个外挂磁盘是没有区别的, 你往这个loopback设备上写入, 在linux看来就是往磁盘里写入, 不管如何, 我们已经有 devicemapper框架下, thin-pool策略中, 底层要用到的两个设备了
基于这两个设备搭建thin-pool
dmsetup 命令就是device-mapper-setup, 创建出一个名为 xiaohan-thin-pool 的设备, 然后 --table
指参数表, 里面描述了, 创建的设备基于"thin-pool"策略, 分别使用 loop1/loop0 作为底层磁盘.
这个命令执行完, 我们去 dev 下就能看到一个名为 dm0 (device-mapper-0) 的设备, /dev/mapper 下记录了一个名为 xiaohan-thin-pool的东西, 通过软链指向 dm0
然后基于thin-pool创建逻辑盘
好. 一个基于thin-pool策略的 devicemapper 框架已经搭好了, 接下来我们只要基于这个框架, 分配出一个逻辑盘拿来用, 它就是天然的基于thin-pool, 并使用上devicemapper框架的特性了.
第一个+第二个 命令指, 基于xiaohan-thin-pool创建出一个名为xiaohan-vol的盘, 最后一个命令是把它格式化成ext4的文件格式, 这样我们就可以拿来直接当成正常的"设备" / "盘" 来使用了. 我们可以通过看看 /dev下. 能发现我们多出了一个名为 dm1的设备. 一个xiaohan-vol的设备(同一个东西)
这个盘, 就是我们心心念念的, 基于thin-pool的磁盘分配策略, 基于devicemapper框架下的块使用策略的, 一个可以直接拿来用的, 存文件的地方.
整活
到这一步, 我们才把devicemapper框架设置好. 然后才可以像 aufs 一样, 去mount 这个盘, 不可谓不复杂, 接下来我们可以一一去验证网上那些关于dm的特性, 什么snapshot之类的东西了
创建第一层
于是我们开始把刚刚创建的逻辑盘拿来用, 挂载到 /mnt/base 下, 换句话说如果现在对base做 siusiu 读写, 就是对 xiaohan-vol 做 siusiu 读写, 也就会走 devicemapper 哪一套了, 那我们就来做 siusiu 读写
然后创建第一层的snapshot
彳亍. 我们通过message命令里的 create-snap . 创建 xiaohan-thin-pool 下 xiaohan-vol 的 snapshot (我们没有用到xiaohan-vol的字眼. 但是在 create-snap后面跟着的1 0 是通过device-id指定了xiaohan-vol)
好! 很有精神! (小曲儿) 原来这个snapshot的本质是另外一个设备, 一个名为 dm2 的 devicemapper 设备. 然后同样可以被挂载. 那么我们基于这个(base设备的)snapshot创建一个挂载路径:
挂载 / 使用上这个快照
通过上面的两条命令, 我们把 base 层的镜像, 挂载到 mnt/snap0
目录中. 我们看看我们创造的快照都有啥内容. 有一个id.txt . lost+found. 基本上就是 base层里一模一样的东西
在快照的基础上做一些修改
先等等, 我们先捋一下, 我们现在的 /mnt/snap0. 是基于快照弄出来的文件系统, 而不是base本身, 是base的快照, 然后这一小节, 要做的是对快照进行修改
看来对快照进行修改, 并不会导致base本体被修改, 仔细思考这个现象:
我有什么: 我有一些文件
我做了什么:
我对这些文件做了快照
我拥有了一个基于这些快照而得到的目录
我在这个目录下做修改, 但文件本体没修改
想想这个现象, 这几乎跟镜像, 容器的表现是一模一样了. 文件, 对应着镜像里的源文件, 快照以及你挂载快照后得到的目录, 相当于容器内部的目录结构. 仔细想想, 我们已经很接近容器文件系统那些特性了
继续往上磊
我们继续对这一层做快照, 得到snap1
挂载snap1, 看到我们拿到了上一层中的文件, 所谓 devicemapper 是基于一层一层的快照, 就是基于这个原理
Last updated
Was this helpful?