lvm分析之快照

来源:互联网 发布:混响软件 编辑:程序博客网 时间:2024/05/17 07:23

1.             

1.          

1.1.         用户态实现

       对lv1创建一个快照卷时,有前面章节可知会创建多个dm设备,如下图所示:


       以上几个设备的创建过程如下:

1.       创建snap_lv1,其类型为linear,分配其存储空间,与磁盘映射关系如上图所示;

2.       创建lv1-real,其类型为linear,其映射的磁盘空间和lv1原有的映射一致;

3.       更改lv1的类型为origin,此时lv1被标记为只读,并且把io操作都重定向到lv1-real设备;

4.       创建snap_lv1-cow,其类型为linear,将其映射到snap_lv1分配的磁盘空间上,也即是和snap_lv1的映射一致;

5.       更改snap_lv1的类型为snapshot,此时将会创建一个lv1原有磁盘空间的写时复制的表格,并且将lv1-real和snap_lv1-cow绑定,因为以后更改lv1的内容将会保存到snap_lv1-cow中,而未修改的内容仍然在lv1-real中,这两者一起构成了snap_lv1,即是snap_lv1的映射范围为两者的和。

       当然在做以上工作之前需要先冻结lv1,完成以上动作之后,元数据将被更新,同时lv1将被激活,io将正常进行。

 

 

1.2.         内核态实现

在内核态主要涉及dm下的linear、snapshot-origin、shnapshot几个target的驱动。


其中最重要的几个函数就是ctr和map的实现,下面简单介绍以上三个target的ctr和map实现。

linear_ctr:将设备添加到dm_table的设备列表中,并记录在该设备上的起始位置。

linear_map:更改bio的设备,并将bio的偏移量加上该线性卷在物理设备上的起始偏移量,然后重新提交bio,由真正的设备驱动来处理。

origin_ctr:这个很简单,将real设备保存起来,方便后续的io重定向。

origin_map:重新映射io,如果是读io,直接重定向到real设备,如果是写io,则需查找保存shanshot的设备,并获取标记写时复制的表格,在其中查询是否本次io位于范围之内,如果该io地址范围内已经发生过一次写时复制,则直接重定向到real设备,如果还没有,则将本次io缓存起来,同时开启kcopy内核线程,从real设备上拷贝本次io地址范围内的数据到snap cow设备上,完成之后再将缓存的io重定向到real设备。

snapshot_ctr:在snap cow设备的前8k上建立写时复制的映射表,并建立real设备和snap cow设备的映射关系。

snapshot_map:如果为读io,且io对应地址没有发生写时复制,则从重定向到real设备,否则重定向到snap cow设备;如果为写io,则直接写入到snap cow设备,禁止写时复制。


0 0