专利名称:细粒度快照实现方法
技术领域:
本发明涉及一种快照实现方法,特别涉及一种细粒度的快照实现方法,该方法可达到尽可能小的影响整个文件系统性能的目的,属于计算机技术领域。
背景技术:
在当今的计算机操作中,有许多的行为是并发发生的;例如,一个计算机可以在同一时刻运行多个程序,每个程序使用不同的数据;特别是在多用户的环境下,多个用户可以在同一时刻使用计算机的资源。
在上述多用户环境下,计算机系统不可能预知用户的行为,并且一个用户也很难知道其他用户当前正在使用哪些计算机资源,对哪些数据进行操作;比如一个用户想要对某个共享数据进行备份操作,但是这个用户很难得知其它的用户是否正在对备份的目标数据进行修改;因此计算机系统必须提供管理功能,保证一个用户的操作不会影响其他用户。
这样就产生了一个问题,当一个文件或目录正处在被修改的过程中时,其他进程或用户可能要求对目标数据进行备份,系统如何控制这种备份行为呢?如果系统没有提供保证一个用户的操作不会影响其他用户的管理功能,则备份文件有可能包含了其他进程对目标数据修改的内容,从而导致备份文件不能够正确反应备份时刻的数据状态。
为解决上述问题,计算机系统引入了快照技术(快照文件系统),在备份操作开始之前,对文件系统做一个快照,“冻结”当前文件系统的数据状态;如图1所示,任何修改文件系统数据的操作都会在目标数据被改变之前触发写入时拷贝(COPY-ON-WRITE,简称COW)操作,创建一个间接节点并同时拷贝目标文件的数据内容和元数据,备份操作如果发现目标数据有间接节点,就重定向备份目标到间接节点,从而保证备份数据的有效性和一致性,使备份文件能够正确的反应备份时刻的数据状态。
显而易见,快照文件系统在保证备份文件有效性的同时,降低了文件系统的写性能。如果一个用户只想备份当前文件系统的某个目录或者大文件,则对整个文件系统做快照对于系统的写性能有较大的降低;且其他进程对备份的目标目录或文件之外的数据的写操作同样会触发COW操作,既拷贝数据又拷贝元数据,更加降低了系统的写性能。因此需要一种快照方法保证其他进程在修改目标数据之外的文件系统数据不会触发COW,从而尽可能小地影响文件系统的性能。
名称为“Method for backing up consistent versions of open files”的美国专利(专利号6,484,186)公开了一种为打开文件作快照的方法;该专利用一个位图保存对应文件的逻辑块映像,来标识该逻辑块是否被修改并且有快照。当对一个文件作了快照之后,对文件的某个块进行修改,都会引起一系列的操作,首先建立一个新块,复制原块的内容,给位图的对应位置置标志,表示该块有快照,并且保存新块的块号;但是,该专利没有提出如何组织多个新建的复制块,同时对每一个被修改的块作COW还会影响系统的写性能,而且上述专利没有提出一种可靠的方法可以实现保存文件的多个快照。
发明内容
本发明的主要目的是提供一种细粒度快照的实现方法;用户可以对指定目录或者文件做快照,任何做快照之后的修改目标数据的操作都可以恢复到快照时刻的数据状态,同时不影响目标数据之外的文件系统数据的写性能。
本发明的另一目的在于能够在一个文件系统中获取并保存文件和目录的多个快照版本。
本发明的目的是通过以下技术方案实现的一种细粒度快照实现方法,应用该方法的文件系统进行的请求处理至少包含以下步骤步骤1、记录有节点快照信息的文件系统接收处理请求;步骤2、文件系统根据处理请求类型和处理请求中涉及的节点对象类型进行预处理;步骤3、文件系统根据修改后的处理请求进行处理操作。
上述细粒度快照实现方法中,所述文件系统符合虚拟节点/虚拟文件系统标准,例如可以为日志文件系统(JFS);在文件系统底层与虚拟文件系统层之间设有至少一个中间层,所述处理操作在文件系统底层进行。
所述请求处理的步骤2至少包括以下步骤步骤21、中间层接收虚拟文件系统层发来的处理请求;步骤22、中间层对处理请求的类型进行判断;如果是修改请求,则执行步骤24,如果是读请求,则执行步骤23;步骤23、判断是否进行节点的重定向和/或数组合的操作,如果是,则先进行数据重定向和/或数据组合,然后执行步骤25;否则直接执行步骤25;步骤24、判断是否对变化的数据做COW操作;如果是,则先进行COW操作并且复制间接节点的部分数据到主节点,再执行步骤25;否则直接执行步骤25;步骤25、中间层将文件处理请求发送到文件系统底层,由底层文件系统处理具体的请求。
步骤22所述的判断具体为步骤221对文件处理请求涉及的节点类型进行判断,如果该节点类型为目录,并且所述的文件处理请求中包含有对当前目录或者当前目录的任何子目录下创建/删除/修改节点的操作,则执行步骤24;否则执行步骤222;步骤222如果该节点类型为文件,并且所述的文件处理请求中包含对文件进行写操作或截断操作,则执行步骤24;否则执行步骤23。
步骤23所述的判断具体为步骤231、读出对应节点的所有逻辑块内容。
步骤232、读请求处理函数判断当前的节点是否有逻辑块为空,如果没有,则读出节点的所有块组成逻辑上连续的上下文,执行步骤25,如果有逻辑块为空,则表明此节点的主节点有快照间接节点;步骤233、根据该节点扩展属性中的双向链表查找距离此节点创建时间之前最近的快照节点,读出该节点对应的逻辑块;步骤234、判断该节点对应的逻辑块是否为空,如果不为空,则将该逻辑块与步骤231读出的块组成逻辑上连续的上下文,执行步骤25;如果为空,则执行步骤233。
上述细粒度快照实现方法所述的快照信息加入在文件系统的文件节点属性集合中,该快照信息至少包括快照标志和记录多个快照的双向链表。
对变化的数据做快照之前,文件系统判断节点类型,如果节点是文件,则在节点的扩展属性中通过输入输出控制系统调用加入快照信息,如果节点是目录,则遍历目标目录的所有节点,并且在该目录中的每个节点的扩展属性中通过输入输出控制系统调用加入快照信息。
上述细粒度快照实现方法中,所述COW操作至少包括以下步骤(一)、文件系统判断作COW的节点是否为一个有快照间接节点的主节点,并且是删除操作引起的COW,如果上述条件都满足,则转到步骤二,否则,转到步骤五;(二)、判断被删除的节点类型,如果是有快照的目录主节点,则转步骤四;如果不是则转步骤三;(三)、为这个节点创建一个临时节点,并将主节点的所有数据块转移到临时节点下,通过临时节点来释放主节点所占有的数据块空间,主节点仅保存快照节点的信息,即元数据,继续步骤四;
(四)、为主节点设置删除标记,标识此节点被删除,但是不删除真正的数据内容,转步骤九(五)、判断对象是否有间接节点,如果对象没有间接节点,则继续下面的步骤六,如果对象有间接节点,则提示错误信息,转步骤九;(六)、创建间接节点,初始化间接节点的元数据,并将此间接节点插入文件系统节点哈希(hash)表;(七)、判断主节点是否为目录,如果是目录,则在间接节点上复制目录的数据内容,否则,转移组织磁盘块的数据结构,使主节点的数据内容转移到间接节点上;(八)、设置主节点的扩展属性,将间接节点的节点号加入到主节点维护的所有的间接节点链表(双向链表)中去;(九)、正常退出。
通过上述技术方案可知,本发明有如下优点1、通过设在文件系统底层与VFS层之间的中间层对文件系统中的操作集合进行封装,加入是否需要对变化的数据做快照和进行COW操作的判断、以及重定向和数据组合等操作,使得用户可以对指定目录或者文件做快照,任何做快照之后的修改目标数据的操作都可以恢复到快照时刻的数据状态,同时不影响目标数据之外的文件系统数据的写性能。
2、通过在文件系统节点属性中加入扩展属性,使文件系统能够获取并保存文件和目录的多个快照版本,方便多用户环境下备份操作的进行。
图1为现有文件系统COW原理示意图;图2为本发明快照文件系统结构原理图;图3为本发明实施例快照文件系统结构原理图;
图4为本发明实施例jfs扩展属性块结构原理图;图5为本发明实施例利用jfs扩展属性实现多个快照节点的示意图;图6为本发明实施例数据重定向和数据组合流程图;图7为本发明实施例快照文件系统分发快照标志流程图;图8为本发明实施例快照文件系统COW操作流程图;图9为本发明实施例修改文件系统内容的事务处理流程图。
具体实施例方式
以下,结合具体实施例并参照附图,对本发明做进一步的详细说明。
本发明所述的备份方法是在符合UNIX虚拟节点/虚拟文件系统(vnode/VFS)标准的文件系统中实现一个中间层,该层位于文件系统底层与VFS层之间;当系统调用捕获到文件系统操作请求时,在VFS层的标准调用接口调用具体的文件系统操作之前通过封装的快照操作来重载原来具体文件系统实现的功能。
VFS层所提供的文件系统的标准接口主要是由节点操作集合、文件操作集合和地址空间操作集合组成的。所有的文件系统调用都是由具体的文件系统通过实现这三个操作集合来实现的。
当一个应用程序发起一个文件系统请求时,快照文件系统处理请求的流程如图2所示,包含以下步骤步骤一、应用程序对文件系统的请求通过系统调用接口传递给系统空间;步骤二、系统调用接口将请求提交给VFS层的事务处理函数;步骤三、VFS层确定下层文件系统层的处理函数,继续将请求提交给下一层处理,即交给快照夹层进行处理;步骤四、快照夹层根据处理请求类型和处理请求中涉及的节点对象类型进行预处理,调用文件系统(JFS,ext2,XFS等)底层的接口;
步骤五、底层文件系统完成真正的事务处理,如I/O请求等。
如图3所示,本发明的快照夹层作为文件系统的一个中间层,截获了VFS层向下提交的处理请求;如果是写请求,则判断是否需要做COW操作;如果是读请求,则判断是否需要重定向,进行相应的预处理后再将请求提交底层文件系统。
本实施例为应用于日志文件系统(Journal File System,简称JFS)的细粒度快照文件系统,它需要三个部分支持第一、修改系统的输入/输出控制操作,实现分发快照信息到目标节点;第二、修改JFS文件系统,在底层文件系统JFS实现关于快照的操作集合,提供给中间层应用接口,用于判断例如是否重定向或进行COW等操作,主要包括下表所列的函数
第三、在中间层中实现目录、文件以及链接的节点操作集合、文件操作集合和地址空间操作集合,要在这三个操作集合中对数据产生变化的函数中加入判断,判断是否需要对变化的数据做快照和进行COW操作,在读数据的函数中加入重定向和数据组合等操作,这些操作包括
目录
文件
实现输入输出控制系统调用和快照操作集合的基础是文件系统实现了文件的扩展属性。由于原有保存节点的磁盘结构没有足够的空间保存扩展的属性值,例如一个节点的多个间接节点的信息和是否需要做COW的标志都需要保存在磁盘节点结构的属性中,而原来定义的磁盘节点结构的空间无法满足需要,因此需要将这些属性设置在节点的扩展属性中。同时文件系统至少要实现扩展属性的设置和取扩展属性的操作(如下表所示),并且要在文件系统初始化的过程中初始化扩展属性块对应的缓存池。扩展属性以一个磁盘块的形式挂接在原有的节点属性上,扩展属性块的磁盘结构如图4所示。如果一个节点有多个扩展属性,则这些扩展属性可以共享一个扩展属性块。扩展属性块的上部是扩展属性的描述项,该描述项指示扩展属性值在扩展属性块中的偏移量。扩展属性描述项从扩展属性块顶部向下扩展,而扩展属性真正的值从块的底部向上延伸,描述项和扩展属性之间至少存在4个字节的空白分界区域。在本发明的快照文件系统中,需要两个扩展属性snap_flag(快照标志)和snap_ea(记录多个快照的双向链表)。
如图5所示,为有两个快照的主节点的例子。节点第一次做过快照1之后,用户对节点的逻辑数据块3,4块进行了修改。在新的节点中,第1、2、5块为空,表明这些块在做过快照之后没有发生过修改。在读当前主节点的操作发生时,间接节点1的第1、2、5块和主节点的第3、4块组成连续的上下文被读出;目标文件做过第二次快照后,用户修改了第5块;在读当前主节点的请求到来时,间接节点2的第3、4块加上间接节点1的第1、2块和主节点的第5块组成逻辑上连续的文件内容被读出来;当读第一次快照内容的操作发生时,读主节点的操作重定向到间接节点1,读出文件的内容。当请求读第二次快照的内容时,读操作发生重定向、同时组合数据,将间接节点1的1、2、5块和间接节点2的第3、4块组成连续的文件内容读出。
如图6所示,重定向和数据组合主要包括以下步骤
一、判断读请求是读快照节点还是主节点,将对应的节点作为参数提交给读请求处理函数;二、读请求处理函数判断当前的节点是否有逻辑块为空,如果没有,则读出节点的所有块组成逻辑上连续的上下文,返回给读操作,如果有逻辑块为空,则表明此节点的主节点有快照间接节点;三、根据该节点扩展属性中的双向链表查找距离此节点创建时间之前最近的快照节点,读出该节点对应的逻辑块;四、判断该节点对应的逻辑块是否为空,如果不为空,则将该逻辑块与之前读出的块组成逻辑上连续的上下文,返回读操作;如果为空,则执行步骤三。
对于文件系统的不同类型的数据,如目录和文件等,修改的含义是不一样的。对于目录而言,在当前目录下或子目录下、以及间接子目录下创建/删除节点和对目录下的节点的修改都意味着目录发生了修改;而对于文件而言,只有当文件发生写操作或者被截断时,才意味着文件发生了修改;因此要对文件和目录分别加以处理,而且很明显,对目录的处理要复杂的多。
如果用户对指定目录做快照,需要通知此目录下的所有对象包括间接对象它们的任何改变都会引起COW操作。具体的实现方法是做快照的时刻,利用输入输出控制系统调用,遍历目标目录的所有节点,并且在每个节点的扩展属性中加入快照的信息,例如快照时间或快照索引号。
如图7所示,为快照文件系统的输入输出控制(ioctl)系统调用分发快照标志的流程,包括以下步骤一、在目标节点的扩展属性中加入块照标志;二、判断目标节点是否目录,如果是目录,转步骤三;如果不是目录则转步骤七;三、读目录中的项,置扩展属性快照标志;四、判断该目录项是否是目录,如果是目录,转步骤五;如果不是目录则转步骤六;五、递归调用此流程设置此目录项的快照标志;六、本级目录的目录项是否已读完,如果是则转步骤七,否则转步骤三读下一项;七、函数返回。
对于目标节点是目录,目录系统通过调用readdir/getdents调用函数VFS_readdir,实现分发快照标志。VFS_readdir传递一个函数指针filldir_t作为参数,在这个filldir_t的函数中实现设置扩展属性快照标志的操作,当读目录操作读出一个目录项时,用设置快照标志的操作替代原来读目录的操作中将目录项拷贝到用户空间的操作。
所有会引起文件系统数据修改的操作在执行前,都会根据节点扩展属性中的快照属性判断是否需要做COW;如果是对做过快照的目录进行结构修改,如删除/添加节点,则系统拷贝所添加/删除节点的直接父目录的数据和元数据;如果是对节点的修改,COW的实现方法同下面所述做文件的快照后所进行COW操作一样;如果不是对目标目录下的对象作修改,就不会发生COW操作。
如图8所示,为文件系统COW的具体实现,jfs文件系统创建间接节点的程序流程如下(一)、文件系统判断作COW的节点是否为一个有快照间接节点的主节点,并且是删除操作引起的COW,如果上述条件都满足,则转到步骤二,否则,转到步骤五;(二)、判断被删除的节点类型,如果是有快照的目录主节点,则转步骤四;如果不是则转步骤三;(三)、为这个节点创建一个临时节点,并将主节点的所有数据块转移到临时节点下,通过临时节点来释放主节点所占有的数据块空间,主节点仅保存快照节点的信息,即元数据,继续步骤四;(四)、为主节点设置删除标记,标识此节点被删除,但是不删除真正的数据内容,转步骤九(五)、判断对象是否有间接节点,如果对象没有间接节点,则继续下面的步骤六,如果对象有间接节点,则提示错误信息,转步骤九;(六)、创建间接节点,初始化间接节点的元数据,并将此间接节点插入文件系统节点哈希(hash)表;(七)、判断主节点是否是目录,如果不是目录,则转移组织磁盘块的数据结构,使主节点的数据内容转移到间接节点上,对于以树形式组织文件磁盘块的文件系统,只需要转移树结构的根,特别对于JFS,则只需转移文件B+树的根,而对于以链表间接块组织磁盘块的文件系统、则转移所有逻辑块号对应的物理磁盘块号;如果主节点是目录,则在间接节点上复制目录的数据内容,对于JFS,就是复制目录的B+树;(八)、设置主节点的扩展属性,将间接节点的节点号加入到主节点维护的所有的间接节点链表(双向链表)中去;(九)、程序正常退出。
用户可以对一个目录或者文件做多个快照,文件系统维护一张快照列表,包括快照时间和快照对象。在每个做过COW操作的节点的扩展属性中保存着一个双向链表,用于维护这个对象的多个快照,链表中保存主节点的每个间接节点的节点号。
如图9所示,描述了修改文件系统内容的事务处理流程。
一、判断对于主节点是否需要进行COW操作,具体是检查目标节点的扩展属性是否有快照标志且快照的时间是否在文件最后一次被修改之后;如果条件成立则说明此节点或此节点的直接或间接父目录刚刚做过快照,修改操作将引起COW操作,转步骤二;否则转步骤五;二、为主节点作COW操作;三、判断被修改的目标主节点是否目录,如果是目录转步骤五,否则转步骤四;四、进行相应的复制操作,继续步骤五;五、修改主节点文件系统对象;六、处理结束。
对于步骤四需要说明的是,根据之前所述的COW操作流程可以知道,对于文件而言,进行COW之后,主节点的数据内容被截断了,即修改过的数据块内容被转移到间接节点中;当该文件再次被修改,例如在写操作之前,还要进行相应的复制操作以确保修改后的每一个数据块都是完整的,即先将主节点要修改的数据块对应的数据内容从间接节点复制回来,再进行修改;特别是对于某些数据块,如果不是修改全部内容,而只是修改部分内容,则为了确保被修改的数据块的内容完整,一定要进行上述复制操作。因为每次写文件的时候修改的内容不一定是以块为边界对齐的,即修改不是正好从块的起始位置开始或恰恰到块的终止位置结束,所以每次在真正修改数据之前最多复制2个磁盘块(修改的起始块和最后一块)的内容,以确保被修改的起始数据块和终止数据块的内容完整。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种细粒度快照实现方法,其特征在于应用该方法的文件系统进行的请求处理至少包含以下步骤步骤1、记录有节点快照信息的文件系统接收处理请求;步骤2、文件系统根据处理请求类型和处理请求中涉及的节点对象类型进行预处理;步骤3、文件系统根据处理请求进行处理操作。
2.根据权利要求1所述的细粒度快照实现方法,其特征在于所述文件系统符合虚拟节点/虚拟文件系统标准,在文件系统底层与虚拟文件系统层之间设有至少一个中间层,所述处理操作在文件系统底层进行。
3.根据权利要求2所述的细粒度快照实现方法,其特征在于所述的请求处理至少包括步骤21、中间层接收虚拟文件系统层发来的处理请求;步骤22、中间层对处理请求的类型进行判断;如果是修改请求,则执行步骤24,如果是读请求,则执行步骤23;步骤23、判断是否进行节点的重定向和/或数组合的操作,如果是,则先进行数据重定向和/或数据组合,然后执行步骤25;否则直接执行步骤25;步骤24、判断是否对变化的数据做COW操作;如果是,则先进行COW操作并且复制间接节点的部分数据到主节点,再执行步骤25;否则直接执行步骤25;步骤25、中间层将文件处理请求发送到文件系统底层,由底层文件系统处理具体的请求。
4.根据权利要求3所述的细粒度快照实现方法,其特征在于步骤22所述的判断具体为步骤221对文件处理请求涉及的节点类型进行判断,如果该节点类型为目录,并且所述的文件处理请求中包含有对当前目录或者当前目录的任何子目录下创建/删除/修改节点的操作,则执行步骤24;否则执行步骤222;步骤222如果该节点类型为文件,并且所述的文件处理请求中包含对文件进行写操作或截断操作,则执行步骤24;否则执行步骤23。
5.根据权利要求3所述的细粒度快照备份方法,其特征在于步骤23所述的判断具体为步骤231、读出对应节点的所有逻辑块内容;步骤232、读请求处理函数判断当前的节点是否有逻辑块为空,如果没有,则读出节点的所有块,组成逻辑上连续的上下文,执行步骤25,如果有逻辑块为空,则执行步骤233;步骤233、根据该节点扩展属性中的双向链表查找距离此节点创建时间之前最近的快照节点,读出该节点对应的逻辑块;步骤234、判断该节点对应的逻辑块是否为空,如果不为空,则将该逻辑块与步骤231读出的块组成逻辑上连续的上下文,执行步骤25;如果为空,则执行步骤233。
6.根据权利要求3所述的细粒度快照实现方法,其特征在于所述快照信息加入在文件系统的文件节点属性集合中,该快照信息至少包括快照标志和记录多个快照的双向链表。
7.根据权利要求6所述的细粒度快照实现方法,其特征在于对变化的数据节点做快照之前,文件系统判断节点类型,如果节点是文件,则在节点的扩展属性中通过输入输出控制系统调用加入快照信息,如果节点是目录,则遍历目标目录的所有节点,并且在该目录中的每个节点的扩展属性中通过输入输出控制系统调用加入快照信息。
8.根据权利要求3述的细粒度快照实现方法,其特征在于所述COW操作至少包括以下步骤(一)、文件系统判断作COW的节点是否为一个有快照间接节点的主节点,并且是删除操作引起的COW,如果上述条件都满足,则转到步骤(二),否则,转到步骤五;(二)、判断被删除的节点类型,如果是有快照的目录主节点,则转步骤四;如果不是则转步骤三;(三)、为这个节点创建一个临时节点,并将主节点的所有数据块转移到临时节点下,通过临时节点来释放主节点所占有的数据块空间,主节点仅保存快照节点的信息,即元数据,继续步骤四;(四)、为主节点设置删除标记,标识此节点被删除,但是不删除真正的数据内容,转步骤九(五)、判断对象是否有间接节点,如果对象没有间接节点,则继续下面的步骤六,如果对象有间接节点,则提示错误信息,转步骤九;(六)、创建间接节点,初始化间接节点的元数据,并将此间接节点插入文件系统节点哈希(hash)表;(七)、判断主节点是否为目录,如果是目录,则在间接节点上复制目录的数据内容,否则,转移组织磁盘块的数据结构,使主节点的数据内容转移到间接节点上;(八)、设置主节点的扩展属性,将间接节点的节点号加入到主节点维护的所有的间接节点链表(双向链表)中去;(九)、正常退出。
9.根据权利要求1或2或3或6或7或8所述的细粒度快照实现方法,其特征在于所述的文件系统为日志文件系统(JFS)。
全文摘要
本发明公开了一种细粒度快照实现方法,通过设在文件系统底层与VFS层之间的中间层对文件系统中的操作集合进行封装,加入是否需要对变化的数据做快照和进行COW操作的判断以及重定向和数据组合等操作,使得用户可以对指定目录或者文件做快照,任何做快照之后的修改目标数据的操作都可以恢复到快照时刻的数据状态,同时不影响目标数据之外的文件系统数据的写性能;通过在文件系统节点属性中加入扩展属性,使文件系统能够获取并保存文件和目录的多个快照版本,方便了多用户环境下备份操作的进行。
文档编号G06F17/30GK1553339SQ0313812
公开日2004年12月8日 申请日期2003年6月5日 优先权日2003年6月5日
发明者吴江, 唐杰, 李丽虹, 吴 江 申请人:联想(北京)有限公司