一种基于Linux 标准分区的快照方法
2017-04-22张权胡晓勤
张权,胡晓勤
(四川大学计算机学院,成都 610065)
一种基于Linux 标准分区的快照方法
张权,胡晓勤
(四川大学计算机学院,成都 610065)
目前Linux已有的快照大部分都是对于逻辑卷(LVM)实现,而极少有对标准分区进行快照的实现,基于以上问题,提出一种基于虚拟重构的快照方法,可以实现对标准分区的快照。通过在通用块层截获Bio对源卷进行写时拷贝COW(Copy-On-Write),以及构造虚拟块设备实现I/O重定向机制,对数据卷的快照对外看作是一个只可读的块设备从而实现对标准分区快照。通过实验表明所提出的快照方法有效实现对标准分区进行快照。
快照;写时拷贝;虚拟块设备;I/O重定向
0 引言
目前随着互联网的飞速发展,随之而来的是数据的爆炸式增长以及数据重要性的不断提升。不管是对于企业来说,还是个人来说,数据的保护是很重要的财富,而如果这些数据一旦丢失或遭受损坏,由此带来的经济损失是无法估计的。在操作系统中,快照(Snapshot)是整个系统在某个时间点上的状态[1]。它存储了系统映像,让操作系统在出现故障时,可以快速恢复到未出问题前的状况。不管是备份,还是持续数据保护(CDP),都是以快照为基础实现的[2],所以快照技术对于数据保护领域至关重要。
Linux中常用的快照技术是基于逻辑卷管理器(LVM)基础之上的,现阶段的快照大多都只是针对逻辑卷来实现的。而如果我们希望对整个Linux系统进行保护,例如/boot目录在安装操作系统时就要求只能挂载于标准分区。同时一些用户也会将其他的目录,例如根目录,/home目录也可能会挂载于标准分区。那么针对于标准分区,Linux下几乎没有实现快照。当然,有一些软件,例如TimeShift软件,可以为各种目录进行快照,但其创建的快照不可读,而且是基于文件系统的快照,这与我们要求的基于块设备的快照要求不相符。
针对于Linux下标准分区缺少基于块层快照的问题,本文提出了一种基于虚拟重构的快照方法,可以对Linux下标准分区、逻辑分区都可以进行快照,并能实现挂载、读取数据、查看快照数据的功能,为用户解决了对于标准分区无法快照的问题。
1 基于标准分区的快照方法技术原理
根据存储网络工业协会(Storage Networking Industry Association)对快照的定义:关于指定数据集合的一个完全可用的拷贝,该拷贝包括相应数据在某个时间点的映像。快照可以说是数据的一个复制品,也可表示为数据的一个副本。
在进行快照的时候,对原数据集合的写入操作只可以发生于快照的创建之前或创建之后,在快照创建的这段时间内,必须保证原数据集合是不会被更新,从而可以保证快照数据的一致性。
在快照的发展历程中,出现了写时拷贝(Copy-On-Write,COW)技术[3]、写重定向(Redirect On Write,ROW)技术、镜像分离技术。
本文基于写时拷贝技术实现快照。如图1所示,写时拷贝是每次在监控到发现有新数据将要写入时把将要被覆盖的原数据拷贝出来之后再写入,拷贝出的原数据放在划分给快照使用的卷中,从而保证快照时间点之后对数据的更新不会影响到快照,也保证了快照的空间不会太大,也不用将分区中的所有数据都拷贝出来。在使用写时拷贝的时候,需要先按照数据卷的大小来构造一个位图bitmap,每一位对应数据卷上的一个数据块,为1则表示已经写时拷贝过,为0则表示该块是没有拷贝到快照卷中的。
在监控驱动截获到写操作的时候,判断其写入位置的数据块对应bitmap的位是的值。如果该位为1,则直接写入原数据卷。如果为0,则需要将原数据块以及元数据写入到快照卷后再完成对数据卷的写入操作,并修改bitmap,置对应位为1。其中,元数据的内容包括原数据卷的设备号、拷贝的数据块在数据卷和快照卷中的偏移量、数据块大小等内容。
图1 写时拷贝快照示意图
而镜像分离技术,一般是通过硬件实现的[4]。该技术需要在创建快照之前先为原始卷准备一个或多个物理镜像,这些镜像与原始卷完全同步,类似于RAID0的方式。当需要快照时,镜像与原始卷分离,从而镜像卷中的数据是当时原始卷的一个快照。显然,与写时拷贝技术相比,此方法占用存储空间极大,依赖于硬件,并且删除快照和恢复比较麻烦,同时也无法创建超过镜像数目的快照。故而,本文不选该方法。
对于写重定向方法(ROW),其实现方法类似于写时拷贝技术,主要区别在于指针重映射技术对于原始数据的首次写操作将被重新定向到预留的快照空间中。该快照维持的是指向所有源数据的指针以及数据拷贝。当重写数据时,就会为更新过的数据选择一个新的位置,并将指向该数据的指针也重新映射,使其指向更新后的数据。虽然写重定向对于快照的I/O性能来说,只需要一次写操作,直接将新数据写入快照空间并更新位图映射指针,但是对于原数据的读取来说,会变得更复杂并且降低读取效率。同时,最大的缺陷在于:当删除快照时,我们需要将快照空间中的数据全部覆盖写入原数据卷中,这样对于快照删除的那一段时间内,原数据卷的I/O会变得效率底下,快照删除困难。
综上所述,选择写时拷贝技术作为本文的快照实现方法。
2 基于虚拟重构的快照方法
在创建对数据卷的快照后,监控驱动会在Linux I/O栈的通用块层截获对数据卷的读写请求,并对写请求进行写时拷贝操作。在创建快照的同时,在内核层创建一个虚拟块设备,从而对应用层提供对快照的读取等请求处理的操作。
通过创建虚拟重构的方法,使得应用层能够将快照看作是一个可读可挂载的块设备来进行操作。如图2,在内核层创建一个块设备所必须的通用磁盘描述结构体gendisk,并初始化该结构体的各种属性和函数,将该块设备在内核中注册(register_blkdev)后,再添加磁盘成功,从而对应用层可以映射出一个虚拟块设备,在/dev目录下可以找到该虚拟块设备并可以对其进行读取等操作。在构造虚拟块设备的请求队列的处理函数,使用了I/O重定向的方法实现对快照内容的读取操作。
通过位图bitmap和元数据来得到快照对应的数据块具体位置。当应用层对虚拟卷进行读取操作时根据其读取数据块的位置以及大小,再重定向I/O操作到对应的卷中即可实现了快照的读取操作。如图3所示,在虚拟块设备的请求队列处理函数中可以截获bio。如果该bio为写时则结束请求;如果该bio为读时,通过bio得到读请求的数据块位置和大小,通过该读取请求的位置查找对应的bitmap的位的值。当bitmap对应位为0时表示读取快照的数据块在原数据卷上,那么将bio中的设备号修改为原数据卷的设备号后下发到原数据卷的请求队列中,从而实现重定向于原数据卷中完成读取;当bitmap对应位为1时表示对应的数据块已经经过写时拷贝,将查找元数据结构体得到对应数据块在快照卷中的具体位置,根据元数据内容修改bio将其下发到快照卷请求队列后即可完成I/O重定向操作。
图2 虚拟块设备创建流程
图3 I/O重定向示意图
通过创建虚拟块设备,我们可以对于快照来进行读取、挂载等操作。这里我们将禁用对快照的写入操作。从而将快照模拟成一个普通的块设备对外提供服务。
3 基于Linux标准分区的快照方法的具体实现
3.1 结构定义
定义1数据块(data block):对本地原数据卷按偏移量及大小分块,以数据块为单位记录数据块的写时拷贝和I/O重定向。每一个数据块用块号block_num唯一标识,block_num=vol_off/block_sz,其中vol_off为数据卷的位置偏移,block_sz为数据块大小。
定义2元数据结构体(sp_metadata):表示监控驱动snapshot_bd在截获写入操作时,该写入操作的数据块的偏移量、大小、截获时间戳以及保存到快照数据卷中的位置。
定义3位图(bitmap):存储原数据卷在创建快照之后,每个数据块是否发生变化的标志位。Bitmap的大小为vol_block_num/8字节,其中vol_block_num为整个数据卷的数据块的个数。每个字节的8个bit存储8个块的变化状态,数据块在快照创建之后被写入置该位为1,未被写入该位为0。
3.2 快照的创建以及写时拷贝过程
本文将在以下步骤讲解创建快照,以及监控驱动截获对数据卷的写操作并进行写时拷贝的过程,快照创建流程图如图4所示。具体步骤如下:
第1步创建快照服务驱动snapshot_server_bd,对外提供ioctl接口,通过对/dev/snapshot_server_bd进行ioctl控制,可以实现创建对标准分区、逻辑卷等块设备的快照服务,以及删除快照服务。
第2步创建快照,通过对/dev/snapshot_server_bd进行ioctl接口的访问,创建对指定分区的快照,snapshot_server_bd会生成对快照的数据卷进行监控I/O的虚拟块设备驱动snapshot_bd。每针对一个数据卷创建快照都会生成一个监控的虚拟块设备驱动,其命名为snapshot_sdaN_XXX,其中sdaN表示的是进行快照的数据卷设备名,XXX则表示为生成快照的时间戳。
第3步创建元数据链表,位图bitmap,由于此时快照正处于创建期间元数据链表只有一个表头,位图bitmap每一位都置为0。
第4步修改数据卷的请求队列(request queue)的处理函数make_request_fn,修改该函数从而实现截获bio结构体。如果该bio为读取则按原I/O路径下发。如果该bio为写入操作,则找到该写入位置对应的bitmap的位是否为1,如果为1则直接写入,如果为0则将进行写时拷贝操作。即,读取该bio对应的数据块,并创建并填充元数据结构体,将原数据块和元数据结构体均写入快照数据卷后,再将新的数据写入下去,同时修改bitmap置对应的位为1。
图4 快照创建流程图
3.3 快照的读取流程
对于应用层,可以对/dev目录下的快照进行读取操作,快照读取流程图如图5所示。
对于快照的读操作,本文在生成的监控驱动的请求队列的处理函数make_request_fn是这样做的:当有bio下发到队列时,判断其是否为读,不是则直接结束操作。如果是读的bio,则根据bio的偏移量来判断bitmap对应位置的值。如果为0,则读取原数据卷的对应数据块;如果为1,则读取快照存储卷中的数据块。本文以bitmap和元数据链表来将对生存的快照的虚拟块设备的I/O重定向,从而实现快照的可读可挂载等功能。
4 实验结果
4.1 实验环境
测试环境一台服务器组成,具体配置如下表1所示。
测试工具:iozone3,一个文件系统的基准工具,可以测试不同文件系统的读写性能,如可以连续读写、随即读写,测试读写速度。
图5 虚拟卷读取流程图
4.2 实验结果
首先对标准分区进行快照,在快照之前将分区数据进行计算MD5的哈希值,然后在快照之后对标准分区数据进行大量修改后,再对快照卷进行读取并计算MD5的哈希值。本实验将以上步骤实验了多次,其快照前的MD5值和快照的MD5值均相同。从而证明,本文的快照方法是有效的、可行的、无数据失效的。
表2 快照数据正确性测试结果
然后接下利用iozone3对于同样大小的数据卷在进行本文的快照方法snapshot_bd执行快照后和LVM2的快照方法做了快照后测试原数据卷和快照卷的随即读写速率。测试速度如表2和表3所示。
表3 LVM2快照和snapshot_bd快照的读写原数据卷速度对比表
表4 LVM2快照和snapshot_bd快照的读快照卷速度对比表
对与本文提出的基于Linux标准分区的快照实现方法,经过测试可以看出是可以实现存储网络工业协会对与快照的各项要求的,同时经过测试其快照导致的磁盘速度也是和LVM2的速度快上一点,但在速度上差距不大。但本方法在保证逻辑卷可以快照的前提下,也可以对Linux下的标准分区进行快照,对于企业和用户来说都是急需的功能。
5 结语
本文针对于Linux下缺乏对标准分区进行快照的方法,或者对标准分区都只是基于文件系统层面且不可挂载和读取的缺陷,设计了可以对标准分区、逻辑卷的基于块设备层的可读可挂载的快照方法。通过实验验证了本文提出的快照方法能够实现快照的数据一致性、可读可挂载,从而解决了Linux下缺乏对标准分区进行快照的问题。
[1]M.Rock,P.Poresky.Shorten Your Backup Window[J].Storage,Special Issue on Managing the Information that Drivers the Enterprise, 2005,6(9).
[2]LI,Xiao,Tan,Yu-An,LI,Yuan-Zhang,Snapshot Method for Continuous Data Protection Systems:Snapshot Method for Continuous Data Protection Systems[J].Journal of Software,10/20/2011,Vol.22(10):2523-2537.
[3]周煜,卢正添,易固武,葛亮.一种基于过滤驱动的写时拷贝快照方法[J].四川大学学报:自然科学版,2010,Issue 3,pp.478-482.
[4]G.Duzy.Match Snaps to Apps[J].Storage,Special Issue on Managing the Information that Drives the Enterprise,2005,7(5).
A Method of Snapshot Based on Linux Disk Partition
ZHANG Quan ,HU Xiao-qin
(College of Computer Science,Sichuan University,Chengdu 610065)
Current snapshot based on Linux are mostly achieved by Logical Volume(LVM),and there is few implementations of snapshot regarding the disk partitions.Based on all above problems,proposes a method of snapshot based on virtual reconstruction,which can get the snapshots of disk partitions.Copy-On-Write is performed by intercepting Bio at the generic block layer to write the disk volume,and creating virtual block device to implement the redirection mechanism.In this process,the snapshots for the data volume can be seen as a readonly block device,thereby achieve the snapshots for the disk partitions.Verified by the experiments,this implementation of snapshot can guarantee the effectiveness of snapshot for disk partitions.
Snapshot;COW;Virtual Block Device;I/O Redirection
1007-1423(2017)07-0029-05
10.3969/j.issn.1007-1423.2017.07.008
张权(1991-),男,湖北枣阳人,硕士研究生,研究方向为网络与信息安全
胡晓勤(1977-),男,四川内江人,博士,讲师,研究方向为网络与信息安全
2016-12-22
2017-02-10
国家重点研发计划(No.2016yfb00604、No.2016yfb00605)、国家自然科学基金项目(No.61572334)