1. Device mapper和thinprovison
1) Devicemapper简介
Devicemapper是内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,它包含三个重要的对象概念,Mapped Device、Mapping Table、Target device。
图1devicemapper映射机制
Mapped Device是一个抽象的逻辑设备,通过MappingTable描述的映射关系(Mapped Device 逻辑的起始地址、范围、和表示在 Target Device 所在物理设备的地址偏移量以及Target 类型等信息)和Target Device建立映射,Target Device表示的是Mapped Device所映射的物理空间段。DeviceMapper在内核中通过一个一个模块化的 Target Driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的插件包括软 Raid、加密、多路径、镜像、快照等。在这诸多“插件”中,有一个东西叫Thin Provisioning,这是Docker使用DeviceMapper中最重要的模块。Thin Provisoning就是精简分配,就是逻辑上给你分配了足够的空间,但是实际上是实报实销的,真正占用了多少空间就给你分配多少空间。Thin provison具备以下特点:
a. 允许多个虚拟设备存储在相同的数据卷中,从而达到共享数据,节省空间的目的;
b. Thin snapshot支持任意深度的快照。之前的实现的性能为O(n),新的实现通过一个单独的数据避免了性能随快照深度的增加而降低。
c. 支持元数据存储到单独的设备上。这样就可以将元数据放到镜像设备或者更快的SSD上。
Dm-thin的这些特点满足了Docker的存储驱动需要: 1.COW的功能 2. 镜像分层共享
2) dm thin演示
2. docker怎样用devicemapper
2.1 daemon第一次启动:创建thin-pool,thin-pool(名字是docker-dev-inode-pool,dev是/var/lib/docker/devicemapper所在块设备的设备号,inode是这个目录的inode),是基于块设备或者loop设备创建,块设备需要两个一个存放data,一个存放metadata(通过--storage-opt dm.datadev和--storage-optdm.metadatadev指定块设备)。如果没有块设备,就创建2个稀疏文件,用loop挂载的方式模拟成一个块设备。之后从thin-pool中创建.一个base设备,对这个base设备做mkfs。块设备的元数据存放在/var/lib/docker/devicemapp/metadata目录下。
2.2创建镜像,基于base做snapshot创建一个新的dm设备,将这个dm设备挂载到/var/lib/docker/devicemapper/mnt目录下,将层的数据解压到该目录下。第二层基于第一层做snapshot。所有的新镜像都是基于base设备做snapshot,然后一层一层做snapshot生成最终镜像的dm设备。
图1 image
2.3 创建容器,容器基于镜像的dm设备做snapshot先生成init设备(init设备是容器的初始层,会在该层里生成一些运行时需要的文件和目录,比如/dev/pts /dev/shm /proc /sys 等)。真正容器的dm设备基于init设备做snapshot。