一种在线收缩EXT2/3文件系统的方法.pdf

上传人:00062****4422 文档编号:966371 上传时间:2018-03-21 格式:PDF 页数:29 大小:1.38MB
返回 下载 相关 举报
摘要
申请专利号:

CN200910084767.6

申请日:

2009.05.19

公开号:

CN101556607A

公开日:

2009.10.14

当前法律状态:

终止

有效性:

无权

法律详情:

未缴年费专利权终止IPC(主分类):G06F 17/30申请日:20090519授权公告日:20101103终止日期:20130519|||授权|||实质审查的生效|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

宋振华

发明人:

宋振华

地址:

102208北京市昌平区回龙观镇龙兴园东区北京人家小区28号楼3单元101室

优先权:

专利代理机构:

北京德琦知识产权代理有限公司

代理人:

牛 峥;王丽琴

PDF下载: PDF下载
内容摘要

本发明公开了一种在线收缩online shrink ext2/3文件系统的方法:标记所述文件系统收缩边界外的数据,将其中的某个数据作为当前数据;对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,防止所述当前数据被读进程或写进程访问,如果上锁成功,则将所述当前数据转移至文件系统收缩边界内;如果上锁失败,则继续对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,直至上锁成功后,再将所述当前数据转移至文件系统收缩边界内,并保证所有的数据都被转移至文件系统收缩边界内。应用本发明所述的方法,能够支持在对数据进行读写的同时对文件系统进行收缩,并且能够保证读写结果的正确性。

权利要求书

1、  一种在线收缩online shrink ext2/3文件系统的方法,其特征在于,该方法包括:
a1.标记所述文件系统收缩边界外的数据,将其中的某个数据作为当前数据;
b1.对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,防止所述当前数据被读进程或写进程访问,如果上锁成功,则将所述当前数据转移至文件系统收缩边界内;如果上锁失败,则继续对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,直至上锁成功后,再将所述当前数据转移至文件系统收缩边界内。

2、
  如权利要求1所述的方法,其特征在于,所述步骤b1中所述上锁失败时,读进程或写进程正在访问所述当前数据。

3、
  如权利要求2所述的方法,其特征在于,所述读进程访问所述当前数据包括:
a3.获取所述当前数据在硬盘中对应的块,并判断是否正在收缩文件系统,如果是,则执行步骤b3;否则执行步骤d3;
b3.判断所述当前数据是否在所述文件系统收缩边界外,如果在,则执行步骤c3;如果不在,则执行步骤d3;
c3.对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,防止所述当前数据被收缩进程访问,如果上锁成功,则执行步骤d3;否则,等待所述当前数据在硬盘中对应的块所对应的内存缓冲区被解锁后,返回执行步骤a3;
d3.判断所述当前数据是否在所述当前数据在硬盘中对应的块所对应的内存缓冲区中,如果是,则从所述内存缓冲区中读取当前数据;否则,将所述当前数据调入所述当前数据在硬盘中对应的块所对应的内存缓冲区中,再从所述内存缓冲区中读取当前数据;
e3.判断所述内存缓冲区是否被锁住,如果是,则解锁所述内存缓冲区,将下一个数据作为当前数据再返回执行步骤a3,直至所有数据被读完;否则直接将下一个数据作为当前数据,并返回执行步骤a3,直至所有数据被读完。

4、
  如权利要求2所述的方法,其特征在于,所述写进程访问所述当前数据包括:
a4.获取所述当前数据在硬盘中对应的块,如果没有获取到,则执行步骤b4;如果获取到,则执行步骤c4;
b4.在硬盘中为所述当前数据分配一个新块,并判断收缩模块是否正在收缩文件系统,如果没有,则执行步骤e4;如果是,则进一步判断所述新块是否在所述文件系统收缩边界外,如果在边界外,则在边界内为所述当前数据分配另一块作为新块,并执行步骤e4;否则,直接执行步骤e4;
c4.判断收缩模块是否正在收缩文件系统,如果没有,则执行步骤e4;如果是,则进一步判断所述当前数据在硬盘中对应的块是否在所述文件系统收缩边界外,如果在边界外,则执行步骤d4;如果不在,则执行步骤e4;
d4.对所述当前数据在硬盘中对应的块进行上锁,防止所述当前数据被收缩进程访问,如果上锁成功,则执行步骤e4;否则,等待所述当前数据在硬盘中对应的块所对应的内存缓冲区被解锁后,返回执行步骤a4;
e4.判断所述当前数据是否在所述当前数据在硬盘中对应的块所对应的内存缓冲区中,如果是,则将待写数据写入所述内存缓冲区中,并将所述内存缓冲区标记为脏缓冲区;否则,将所述当前数据调入所述当前数据在硬盘中对应的块所对应的内存缓冲区中,再将所述待写数据写入所述内存缓冲区中,并将所述内存缓冲区标记为脏缓冲区;
f4.判断所述内存缓冲区是否被锁住,如果是,则解锁所述内存缓冲区,将下一个数据作为当前数据再返回执行步骤a4,直至所有数据被写完;否则直接将下一个数据作为当前数据,并返回执行步骤a4,直至所有数据被写完;
g4.判断是否正在收缩文件系统,如果是,则等待收缩文件系统结束,并将所述脏缓冲区中的数据写回硬盘;否则,直接将所述脏缓冲区中的数据写回硬盘。

5、
  如权利要求1所述的方法,其特征在于,所述数据为所述文件系统收缩边界外有效数据块DB中的数据或所述文件系统收缩边界外有效索引节点中的数据。

6、
  如权利要求5所述的方法,其特征在于,当所述数据为所述文件系统收缩边界外有效DB中的数据时,所述步骤b1包括:
a6.标记所述文件系统收缩边界外的有效DB,在所述文件系统中找到所述有效DB的索引块,并在所述文件系统边界内找到用于存放所述有效DB中的数据的空闲块,将其中的某个有效DB作为当前有效DB,将所述当前有效DB的索引块作为当前索引块,将用于存放所述当前有效DB中的数据的空闲块作为当前空闲块;
b6.对当前有效DB所对应的内存缓冲区进行上锁,如果上锁成功,则执行步骤c6;否则,重复执行步骤b6;
c6.将当前有效DB中的数据调入所述当前有效DB所对应的内存缓冲区中,并将所述当前有效DB所对应的内存缓冲区中的数据转移到所述当前空闲块所对应的内存缓冲区中,再将所述当前空闲块所对应的内存缓冲区中的数据写回到所述当前空闲块中;
d6.对所述当前索引块所对应的内存缓冲区进行上锁,将所述当前索引块索引到当前有效DB的位置修改为索引到所述当前空闲块,并将所述修改同步更新到硬盘和内存后,解锁当前索引块所对应的内存缓冲区;
e6.解锁所述当前有效DB所对应的内存缓冲区。

7、
  如权利要求5所述的方法,其特征在于,当所述数据为所述文件系统收缩边界外有效索引节点中的数据时,所述步骤b1包括:
a7.标记所述文件系统收缩边界外的有效索引节点,在所述文件系统中找到所述有效索引节点的硬链接块,并在所述文件系统边界内找到用于存放所述有效索引节点中的数据的空闲块,将其中的某个有效索引节点作为当前有效索引节点,将所述当前有效索引节点的硬链接块作为当前硬链接块,将用于存放所述当前有效索引节点中的数据的空闲块作为当前空闲块;
b7.对当前有效索引节点所对应的内存缓冲区进行上锁,如果上锁成功,则执行步骤c7;否则,继续对当前有效索引节点所对应的内存缓冲区进行上锁,直至上锁成功后,再执行步骤c7;
c7.将当前有效索引节点中的数据调入所述当前有效索引节点所对应的内存缓冲区中,并将所述当前有效索引节点所对应的内存缓冲区中的数据转移到所述当前空闲块所对应的内存缓冲区中,再将所述当前空闲块所对应的内存缓冲区中的数据写回到所述当前空闲块中;
d7.对所述当前硬链接块所对应的内存缓冲区进行上锁,将所述当前硬链接块索引到当前有效索引节点的位置修改为索引到所述当前空闲块,并将所述修改同步更新到硬盘和内存后,解锁当前硬链接块所对应的内存缓冲区;
e6.解锁所述当前有效索引节点所对应的内存缓冲区。

8、
  如权利要求1所述的方法,其特征在于,步骤a1之前该方法还包括:接收包括需要收缩的文件系统和所述需要收缩的文件系统需要收缩的大小的收缩参数,当所述需要收缩的文件系统需要收缩的大小与需要收缩的文件系统的当前空闲量相比小于阈值,则可以进行收缩所述需要收缩的文件系统;反之,则不可以进行收缩所述需要收缩的文件系统,其中,所述阈值根据实际情况来定。

9、
  如权利要求1所述的方法,其特征在于,步骤b1之后该方法还包括:
判断是否所有的数据都被转移至所述文件系统收缩边界内,如果是,则结束;否则,将所述当前数据的下一个数据作为当前数据,并返回执行步骤b1。

10、
  如权利要求9所述的方法,其特征在于,所述所有的数据都被转移至所述文件系统收缩边界内之后该方法进一步包括:
删除所述文件系统收缩边界外的部分。

说明书

一种在线收缩ext2/3文件系统的方法
技术领域
本发明涉及计算机操作系统领域,特别涉及Linux操作系统中一种在线收缩(online shrink)ext2/3文件系统的方法。
背景技术
Linux操作系统中最主要的文件系统是ext2或ext3,以下简称ext2/3文件系统,它们的硬盘分区组织结构如图1所示。从图1中可以看出,ext2/3文件系统对硬盘分区进行组织如下:在分区开始设置一个用于描述分区硬件信息的引导块,在引导块之后又将其余部分划分成若干个块组(blockgroup),在每个block group中都保存了ext2/3文件系统的一个数据块位图块(BB)、一个索引节点位图块(IB)、若干个索引节点表(IT)和若干个数据块(DB),同时,在block group 0以及若干个用于故障恢复的blockgroup,如block group 1、block group 3等中还保存了ext2/3文件系统的一个超级块(SB)和若干个组描述符块(GDB)。其中,SB用于保存文件系统的元数据信息,如索引节点数、DB数、空闲的索引节点数、空闲的数据块数等等;GDB用于保存文件系统中所有block group的元数据信息,如每个block group的索引节点数,DB数,空闲的索引节点数,空闲的DB数,BB的位置,IB的位置,IT的起始位置等;BB用于描述block group中哪些DB是有效的;IB用于描述block group内IT中哪些索引节点是有效的;IT为block group中所有索引节点的集合,一个索引节点用于描述一个文件,且在每个索引节点中都有一个只包含了15个元素的数组,其中前12个元素用于保存文件中前12个DB的块号,后三个元素则用于保存文件中其余DB的索引块的块号,为了方便起见,后续将索引节点中保存的DB的块号以及其余DB的索引块的块号均称为索引节点中的数据,同时,将索引到DB的索引节点和所述索引到DB的索引节点的索引块均称为所述DB的索引块,也即DB都存在索引块;DB中保存的是数据,其中所述数据包含了目录项。
目前,Linux内核以及文件系统管理工具ext2online仅仅支持在线地(online)或者挂载地(mounted)扩展ext2/3文件系统,ext2resize仅仅支持非在线地(offline)或者卸载地(unmounted)收缩ext2/3文件系统。图2为采用现有工具offline收缩ext2/3文件系统的方法流程图,如图2所示,该方法包括以下步骤:
步骤201:扫描文件系统收缩边界外的部分,标记出边界外的有效DB和有效索引节点。
当前采用的收缩文件系统的工具即为前面所提到的ext2resize,采用该工具来收缩文件系统时,首先需要扫描待收缩的文件系统边界外的部分,查找到边界外的DB和索引节点,并分别根据保存在block group中的BB和IB在所述查找到的DB和索引节点中将其中的有效DB和有效索引节点标记出来,以便后续收缩时使用。
步骤202:扫描整个文件系统,找到有效DB的索引块和有效索引节点的硬链接块。
需要说明的是,前面已经指出了,在ext2/3文件系统中,索引到DB的索引节点和所述索引到DB的索引节点的索引块均称为所述DB的索引块,因此,在后面对DB进行索引的时候均指所述DB的索引块。
步骤203:找出收缩边界内的空闲位置,将边界外的有效DB中的数据和有效索引节点中的数据转移到边界内的空闲位置处。
在需要收缩的文件系统边界内找出空闲的位置用于存储原本在边界外的有效DB中的数据和有效索引节点中的数据,并将步骤201中标记出的所有有效DB中的数据和有效索引节点中的数据转移到所找到的边界内的空闲位置处。具体如何找出文件系统收缩边界内的空闲位置为现有技术,这里不再对其进行赘述。还需要说明的是,在这里对数据进行转移实际上就是对数据进行拷贝。
步骤204:更新有效DB的索引块到新位置处的DB、有效索引节点的硬链接块到新位置处的索引节点的索引关系,并更新block group中的相应参数。
在本步骤中,对block group中的相应参数进行更新是对文件系统SB中文件系统的大小、DB数、索引节点数、空闲的DB数、空闲的索引节点数等进行相应地修改。在完成对所有参数的更新操作后,就完成了对整个文件系统的收缩,也即减小了整个文件系统的大小。
由于ext2/3文件系统分区块组分配的特点,有效DB和有效索引节点可能分布在文件系统的任何部分,即有可能分布在文件系统要收缩的部分,如果此时对文件系统进行offline收缩的时候有读写请求,可能会产生硬盘中该部分的有效DB中的数据已经被转移成功,而内存中相应的部分仍为原来DB中的数据的情况;又由于现有Linux操作系统的读进程或写进程并不是直接通过硬盘中的元数据来查找DB中的数据的,而是通过硬盘中的元数据在内存中对应的元数据来查找DB中的数据的。因此,在读写该部分DB中的数据的时候,从内存中读出的DB中的数据与硬盘中相应部分的DB中的数据已经不一致了,从而造成读写错误。可见,现有offline收缩方法并不能保证在线收缩的正确性,因此,采用现有方法对文件系统进行收缩时,必须保证整个收缩过程是offline,若检测到文件系统仍然在线,则不会对文件系统进行收缩。
为了使得读写准确,必须保证硬盘中的元数据与其在内存中的元数据同步保持一致,也即保证它们之间是对应的,下面以ext2为例说明各元数据在硬盘与内存中的对应关系,如表1所示。
表1ext2文件系统中的各元数据在硬盘与内存中的对应关系

  对象名称  硬盘分区中的ext2对象  内存中的ext2对象  超级块  ext2_super_block  ext2_sb_info  目录项  ext2_dir_entry_2  ext2_dir_entry_2所读入到的内存页面  索引节点  ext2_inode  ext2_inode_info

要保证文件系统在线收缩的正确性,必须在转移每个有效DB中的数据和有效索引节点中的数据的同时,保证对应的内存中的这些有效DB中的数据和有效索引节点中的数据也要同时得到正确地更新。由于在读写数据时的具体操作是不完全一致的,下面分别对现有读数据和写数据的过程进行简单地描述。
图3为现有读数据时的方法流程图。如图3所示,该方法包括以下步骤:
步骤301:根据读系统调用参数,获取需要读取的数据在硬盘中对应的块。
步骤302:判断该块中的数据是否已经在该块对应的内存缓冲区中,如果数据已经在内存缓冲区中,则执行步骤304;否则,执行步骤303。
步骤303:把数据调入硬盘中的块对应的内存缓冲区中。
步骤304:对内存缓冲区中的数据进行相应的读操作。
步骤305:判断是否已经读完所有的数据,如果已经读完,则成功退出读过程;否则,重复执行步骤301及其以后的步骤,直至所有的数据全部被读完。
图4为现有写数据时的方法流程图。如图4所示,该方法包括以下步骤:
步骤401:根据写系统调用参数,获取要写的数据在硬盘中对应的块。
步骤402:判断是否找到该数据在硬盘中对应的块,如果是,则执行步骤404;否则执行步骤403。
步骤403:为数据分配一个新的块。
步骤404:判断块中的数据是否已经在该块对应的内存缓冲区中,如果是,则直接执行步骤406及其以后的步骤;否则执行步骤405。
步骤405:把硬盘的块中的数据调入该块对应的内存缓冲区中。
步骤406:对该块对应的内存缓冲区进行相应的写数据操作,也即将该块对应的内存缓冲区中的数据修改为现在正在写入的数据。同时,将该块对应的内存缓冲区标记为脏缓冲区,以便后续将修改了的数据写回硬盘。
步骤407:判断是否所有的数据都被写完,如果已经被写完,则将所有标记为脏缓冲区中的数据直接写回硬盘后成功退出即可;否则,重复执行步骤401及其以后的步骤,直至所有数据全部被写完后再将其写回硬盘。
通过上面的描述可以看出,现有offline收缩ext2/3文件系统时,如果有读进程或写进程访问待收缩的文件系统边界外的数据,则可能会出现硬盘中有效DB中的数据已经被转移,而读写时却仍按照原来内存中未转移的数据进行,从而使得硬盘中的数据与内存中的数据不一致,从而造成读写错误。也即现有offline收缩不能保证收缩时对数据进行正确地读写。
发明内容
有鉴于此,本发明提供了一种online shrink ext2/3文件系统的方法,能够支持在读写数据的同时对文件系统进行收缩,并且能够保证读写结果的正确性。
为达到上述目的,本发明的技术方案具体是这样实现的:
一种在线收缩online shrink ext2/3文件系统的方法,该方法包括:
a1.标记所述文件系统收缩边界外的数据,将其中的某个数据作为当前数据;
b1.对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,防止所述当前数据被读进程或写进程访问,如果上锁成功,则将所述当前数据转移至文件系统收缩边界内;如果上锁失败,则继续对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,直至上锁成功后,再将所述当前数据转移至文件系统收缩边界内。
由上述的技术方案可见,本发明所采用的online shrink ext2/3文件系统的方法,是通过将所述文件系统收缩边界外的数据转移到所述文件系统收缩边界内来实现的,并且,在转移数据之前,首先对所述数据在硬盘中对应的块所对应的内存缓冲区进行上锁,从而使得在转移其中的某个数据时,其它进程如读进程或写进程不能访问该数据,直至该数据被转移完之后,读进程或写进程才能对其进行访问,也就保证了能对文件系统进行在线收缩。
附图说明
图1为现有ext2/3文件系统的硬盘分区组织结构示意图。
图2为采用现有工具offline收缩ext2/3文件系统的方法流程图。
图3为现有读数据时的方法流程图。
图4为现有写数据时的方法流程图。
图5为本发明online shrink ext2/3文件系统方法中收缩文件系统部分的方法流程图。
图6为本发明online shrink ext2/3文件系统方法中读数据部分的方法流程图。
图7为本发明online shrink ext2/3文件系统方法中写数据部分的方法流程图。
具体实施方式
为解决现有技术中存在的问题,本发明提出一种online shrink ext2/3文件系统的方法,即在对文件系统进行收缩时采用了将所述文件系统收缩边界外的数据转移到所述文件系统收缩边界内,并且,在转移每个数据之前,都要对所述数据在硬盘中对应的块所对应的内存缓冲区进行上锁,以防读进程或写进程对该数据进行读写;同样地,在对数据进行读写的时候,也要判断所要读写的数据在硬盘中对应的块是否位于所述文件系统收缩边界外,并进一步地对可以进行读写的数据在硬盘中对应的块所对应的内存缓冲区进行上锁,以防收缩进程对其进行收缩。因此,本发明采用的方法能够支持在对数据进行读写的同时对文件系统进行收缩,并且能够保证读写结果的正确性。
在介绍具体的实现方案之前,首先介绍一下文件系统对象的概念。文件系统对象也即文件系统SB中的各个参数,例如DB数、索引节点数、空闲的数据块数以及空闲的索引节点数等等,硬盘中的文件系统对象与内存中的文件系统对象需要保持一致,当其中某一个参数改变时,另一个中相应的参数也要进行相应的改变。
经过上述介绍可以看出,本发明所述方案主要由文件系统中虚拟的两大模块组成,一是收缩ext2/3文件系统的收缩模块,二是与收缩部分相对应的读写模块。这两大模块是为了描述收缩文件系统与读写数据时文件系统所虚拟出来的,是两种虚拟模块,目的是为了更好地列举实施例,并不是真实存在的。
本发明所述方案的具体实现包括:
标记所述文件系统收缩边界外的数据,将其中的某个数据作为当前数据;对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,防止所述当前数据被读进程或写进程访问,如果上锁成功,则将所述当前数据转移至文件系统收缩边界内;如果上锁失败,则继续对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,直至上锁成功后,再将所述当前数据转移至文件系统收缩边界内。
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。
图5为本发明online shrink ext2/3文件系统方法中收缩文件系统部分的方法流程图。如图5所示,该方法包括以下步骤:
步骤501~502:收缩模块接收收缩参数,并根据所述接收到的收缩参数判断是否可以收缩文件系统,如果不可以,则结束整个流程;如果可以,则执行步骤503。
在本实施例中,收缩模块接收到的收缩参数包括需要收缩的文件系统以及所述需要收缩的文件系统需要收缩的大小,然后从所述需要收缩的文件系统的SB中获得所述需要收缩的文件系统的当前空闲量,并进一步根据所述需要收缩的大小以及所述需要收缩的文件系统的当前空闲量来判断是否可以收缩文件系统:当所述需要收缩的大小与所述需要收缩的文件系统的当前空闲量相比小于某个阈值时,则可以对文件系统进行收缩;反之,则不能收缩所述文件系统。
需要说明的是,所述阈值是根据实际需要人为设定的,通过设置该阈值,不仅可以方便地完成对文件系统是否可以进行收缩的判断,而且通过对阈值的调整能够避免收缩后不久文件系统当前空闲量不足又需要扩展的情况。
步骤503:设置收缩标识和收缩大小。
本实施例是通过在Linux文件系统的SB中增加一个标识字段(field)来设置收缩标识的,该标识field设置为0时,表示不收缩或收缩过程已经结束;反之,则表示收缩系统需要收缩的大小。并且,读写模块在读写每一个数据时都要访问这一标识field来判断文件系统是否正被收缩,在整个收缩过程结束后,这一项需要清零。
在设置了收缩标识和收缩大小后,即可对文件系统进行收缩,对文件系统进行收缩的过程实际是将待收缩的文件系统边界外的数据转移至文件系统边界内空闲位置处的过程,具体为:
首先,检查文件系统边界外,找到并标记出所述文件系统边界外的数据,将其中的某个数据作为当前数据,同时,还需扫描整个文件系统边界内,在其中找出空闲位置用于存放文件系统边界外的数据;
然后,将所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,如果上锁成功,则将所述当前数据转移至已找到的文件系统边界内的空闲位置处;如果上锁失败,则说明读写模块正在对该数据进行相应的读写操作,此时需要继续对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,直至上锁成功后,再将所述当前数据转移至已找到的文件系统边界内的空闲位置处;
最后,判断是否所有的数据都已被转移至文件系统边界内,如果是,则结束收缩过程;否则,将当前数据的下一个数据作为当前数据,并对其重复执行上锁、转移或上锁、继续上锁以及转移的操作。
需要说明的是,硬盘中的每一个块,在内存中都有唯一的一个缓冲区与其相对应。在将硬盘的块中的数据进行转移时,都要先将待转移的块中的数据读到该块对应的内存缓冲区中,再将该块对应的内存缓冲区中的数据拷贝到目的位置的块所对应的内存缓冲区中,然后再写回到硬盘中的目的位置处。并且,在将数据进行转移时,还需要将待转移的块所对应的内存缓冲区进行上锁,以保证转移不会影响到可能正在对该块中的数据进行读写的读写操作,也保证了可能的读写操作不会影响到后续进行的转移操作。
在本实施例中,对内存缓冲区进行上锁是通过Linux操作系统中固有的函数来实现的,该函数的应用保证了在同一时间只能有收缩模块或读写模块中的一个来对数据进行操作。
其中,所述数据包括所述文件系统收缩边界外的有效DB中的数据和所述文件系统收缩边界外的有效索引节点中的数据两种,步骤504~511为对文件系统收缩边界外的有效DB中的数据进行处理的过程;步骤512~519为对文件系统收缩边界外的有效索引节点中的数据进行处理的过程,它们之间是没有先后次序之分的。首先详细描述对有效DB中的数据进行处理的过程。
步骤504:标记边界外有效DB及其索引块,在边界内查找空闲块作为目的位置。
在本步骤中,首先需要遍历文件系统边界外的部分,也即要删除的部分,标记出其中的有效DB;再从文件系统开始处遍历,找到索引到这些有效DB的索引块,并在所述文件系统边界内查找空闲块作为有效DB中的数据转移的目的位置,将其中的某个有效DB作为当前有效DB,将所述当前有效DB的索引块作为当前索引块,将用于存放所述当前有效DB中的数据的空闲块作为当前空闲块。
步骤505~506:对当前有效DB所对应的内存缓冲区进行上锁,并判断上锁是否成功,如果上锁成功,则执行步骤507;否则,继续执行步骤505~506。
在本步骤中对内存缓冲区进行上锁也是通过Linux操作系统中国有的函数来体现的,当上锁成功时,即可进行后续的相关操作;当上锁失败时,说明有读写模块正在访问该内存缓冲区中的数据,此时,需要等待一段时间后继续对该内存缓冲区进行上锁,直至上锁成功。
需要说明的是,前后两次上锁之间的时间间隔大约为几个微秒,在本实施例中也可认为是持续地对该内存缓冲区进行上锁的。
步骤507:将当前有效DB中的数据转移至当前空闲块所对应的内存缓冲区中,并将其写回当前空闲块。
通过前面的描述可以知道,要转移当前有效DB中的数据,首先要将该有效DB中的数据调入该有效DB所对应的内存缓冲区中,然后将该内存缓冲区中的数据拷贝到空闲块所对应的内存缓冲区中,最后将空闲所对应的内存缓冲区中的数据写回到空闲块中。
步骤508:对当前索引块所对应的内存缓冲区进行上锁,将索引的位置进行修改,将所述修改更新到硬盘后,并将所述修改同步更新到内存,再对上锁的内存缓冲区进行解锁。
将当前有效DB中的数据进行转移之后,索引到当前有效DB的当前索引块的位置也要进行相应地修改,以保证索引的正确性,在对索引的位置进行修改时,也要将当前索引块所对应的内存缓冲区进行上锁后再修改,这样也是为了保证读写模块不能对该部分进行读写操作。
同时,还需将修改后的索引的新位置更新到硬盘中,并将所述修改后的索引的新位置同步更新到内存中,再对上锁的当前索引块的所对应的内存缓冲区进行解锁。这样就保证了文件系统在硬盘中的对象与在内存中的对象的一致性,使得读写模块在对数据进行读写时能从内存缓冲区中读取到正确的数据。
步骤509~511:解锁当前有效DB所对应的内存缓冲区,并判断是否所有有效DB中的数据都被转移完成,如果是,则执行步骤520;否则,将下一个有效DB作为当前有效DB,并返回执行步骤505。
在将当前有效DB中的数据转移完成并将当前索引块中索引的位置更新后,即完成了对当前有效DB中的数据的操作,也就可以解锁当前有效DB所对应的内存缓冲区,以便读写模块可以对当前有效DB中的数据进行相应的读写操作。解锁之后还需进一步判断是否所有有效DB中的数据都被转移完成,如果是的话,执行步骤520;否则,将下一个有效DB作为当前有效DB,并返回步骤505,对当前有效DB进行相同的操作,直至所有有效DB中的数据都被转移完。
由此,即完成了对文件系统收缩边界外有效DB中的数据进行处理的过程,下面对有效索引节点中的数据进行处理的过程作具体的说明,如步骤512~步骤519。
步骤512:标记边界外索引节点及其硬链接块,在边界内查找空闲块作为目的位置。
同步骤504中的操作一样,在本步骤中,首先需要遍历文件系统边界外的部分,标记出其中的有效索引节点;再从文件系统开始处遍历,找到索引到这些有效索引节点的所有硬链接块,并在边界内查找空闲块作为有效索引节点中的数据转移的目的位置。进一步地,将其中的某个有效索引节点作为当前有效索引节点,将所述当前有效索引节点的硬链接块作为当前硬链接块,将用于存放所述当前有效索引节点中的数据的空闲块作为当前空闲块。
步骤513~514:对当前有效索引节点所对应的内存缓冲区进行上锁,并判断上锁是否成功,如果上锁成功,则执行步骤515;否则,继续执行这两个步骤的操作。
在本步骤中,上锁机制的实现以及判断同步骤505~506。
步骤515:将当前有效索引节点中的数据转移至当前空闲块所对应的内存缓冲区中,并将其写回当前空闲块。
步骤516:对当前硬链接块所对应的内存缓冲区进行上锁,将索引的位置进行修改,将所述修改更新到硬盘后,并将所述修改同步更新到内存,再对上锁的内存缓冲区进行解锁。
在本步骤中,对文件系统在硬盘中的对象进行修改与所述文件系统在内存中的对象进行修改保持一致,也是为了后续读写模块对数据读写时能从内存缓冲区中得到正确的数据。
步骤517~519:解锁当前有效索引节点所对应的内存缓冲区,并判断是否所有有效索引节点中的数据都被转移完成,如果是,则执行步骤520;否则,将下一个有效索引节点作为当前有效索引节点,并返回执行步骤513。
可以看出,对当前有效索引节点和当前有效DB的处理过程是一样的,因此,在步骤513~519中没有对其进行详细的阐述。
还需说明的是,上述步骤504~511与步骤512~519是不能同时进行的,一般的操作是先将有效DB处理完后,再对有效索引节点进行相应的操作,并且,当所有有效DB和所有有效索引节点都处理完后,才可以执行步骤520的操作。
步骤520:修改内存缓冲区中文件系统各对象的参数,并将所述修改同步更新到硬盘和内存。
在将文件系统收缩边界外有效DB中的数据和收缩边界外有效索引节点中的数据全部处理完后,即可删除所述文件系统边界外的部分了,具体是先对内存缓冲区中文件系统各对象的参数进行修改,如SB中索引节点的个数、DB的个数、空闲的索引节点个数以及空闲的DB个数等等;将上述作的修改更新到硬盘中的文件系统中后,并将所述修改同步更新到内存,以保证文件系统在硬盘中的对象和所述文件系统在内存中的对象的一致。
步骤521:将收缩标识和收缩大小清零。
在本实施例,若在步骤503的标识field设置的是非零值,也即需要对文件系统进行收缩,在执行完收缩操作后,需要将该标识field清零,以免影响读写操作。
至此,即完成了本发明所述收缩文件系统的整个过程。
为了在收缩文件系统的同时保证读写结果的准确性,本实施例对现有的读写模块对数据进行读写的过程也进行了改进。图6即为本发明online shrinkext2/3文件系统方法中读数据部分的方法流程图。如图6所示,该方法包括以下步骤:
步骤601~602:读模块获取当前数据在硬盘中对应的块,并判断收缩模块是否正在收缩文件系统,如果是,则执行步骤603;否则执行步骤607。
将需要读取的数据作为当前数据,读模块在读写当前数据时,并不是在硬盘中对当前数据进行读取的,而是通过当前数据在硬盘中的块所对应的内存缓冲区中来读取的。当获取到当前数据在硬盘中对应的块后,还需进一步判断文件系统是否正在被收缩,如果是,则执行步骤603;否则,执行步骤607。
在本实施例中,对收缩模块是否正在收缩文件系统的判断是通过在SB中增加的标识field来判断的,当该标识field中的值为非零时,表示正在收缩文件系统;如果为零值,则表示没有收缩文件系统或已经结束收缩文件系统,此时,可以对当前数据进行相应的其它操作。具体如何获取当前数据已为现有技术,这里不再赘述。
步骤603:判断所述当前数据是否在文件系统收缩边界外,如果是,则执行步骤604;否则,执行步骤607。
文件系统SB中记录的整个文件系统的大小减去SB中增加的标识field中文件系统需要收缩的大小即可得到收缩后的文件系统的大小,将所述当前数据在硬盘中的块所对应的块号与收缩后的文件系统的大小进行比较,如果所述当前数据在硬盘中的块所对应的块号大,则说明所述当前数据在文件系统收缩边界外,则执行步骤604;否则,所述当前数据就在文件系统收缩边界内,并执行步骤607。
步骤604~605:对当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,并判断上锁是否成功,如果是,则执行步骤607;否则,步骤606。
在本实施例中,对内存缓冲区进行上锁的具体操作同收缩模块中对文件进行收缩时上锁的操作一致,都是通过Linux系统中固有的函数来实现的。
步骤606:等待所述当前数据在硬盘中对应的块所对应的内存缓冲区进行解锁。
如果对当前数据在硬盘中对应的块所对应的内存缓冲区上锁失败,则表示收缩模块正在对该数据进行处理,因此,需要等待所述当前数据在硬盘中对应的块所对应的内存缓冲区被解锁后,返回执行步骤601。内存缓冲区是否被解锁是根据所述当前数据在硬盘中的块所对应的内存缓冲区中的固有的标识位来进行判断的,该标识位是Linux操作系统的内存缓冲区中固有的。
这里同对文件系统进行收缩时是不一样的,对文件系统收缩时,如果上锁不成功,则会继续对当前有效DB或当前有效索引节点对应的内存缓冲区进行上锁,而读写数据时如果上锁失败,则会等待该内存缓冲区被解锁后,再对当前数据进行读写。这里等待该内存缓冲区被解锁,是为了保证后续读取数据的准确。
步骤607:判断当前数据是否在内存缓冲区中,如果是,则执行步骤609;否则,执行步骤608。
如果当前数据已经在当前数据在硬盘中对应的块所对应的内存缓冲区中,则直接执行步骤609;否则,执行步骤608。
步骤608:将当前数据调入内存缓冲区中。
由于读取数据时是从内存缓冲区中读取的,因此,在当前数据不在内存缓冲区中时,需要先将当前数据调入所述当前数据在硬盘中对应的块所对应的内存缓冲区中。
步骤609~610:从内存缓冲区中读取当前数据,并判断当前数据的内存缓冲区是否被上锁,如果是,则执行步骤611;否则,执行步骤612。
从当前数据在硬盘中对应的块所对应的内存缓冲区中读取完数据后,还需进一步判断该内存缓冲区是否被上锁,如果是,则执行步骤611;否则,直接执行步骤612。
步骤611:解锁当前数据的内存缓冲区。
当读取完当前数据后,需要将上锁的内存缓冲区进行解锁,使得其它进程可以对该数据进行访问。
步骤612~613:判断是否所有数据都被读完,如果是,则结束;否则,将当前数据的下一个数据作为当前数据,并返回步骤601。
当所有数据都被读取完后,即可结束读数据过程;否则,还需将当前数据的下一个数据作为当前数据,并返回执行步骤601,直至所有数据都被读完。
至此,即完成了本发明所述读数据的整个过程。
下面对写数据的过程进行详细描述,图7为本发明online shrink ext2/3文件系统方法中写数据部分的方法流程图。如图7所示,该方法包括以下步骤:
步骤701~702:写模块获取当前数据在硬盘中对应的块,并判断是否获取到所述块,如果没有获取到,执行步骤703;如果获取到,则执行步骤707。
步骤703~704:为当前数据分配一个新块,并进一步判断是否正在收缩文件系统,如果是,执行步骤705;否则,执行步骤712。
当在硬盘中没有获取到所需的块时,写模块会为当前数据在硬盘中分配一个新块,之后会对文件系统是否正在收缩进行判断,并根据是否在收缩文件系统进行不同的处理,当判断出正在收缩文件系统时,执行步骤705;否则,执行步骤712。
需要说明的是,在本实施例中,对文件系统是否正在收缩判断的依据也是文件系统SB中增加的标识field,当该标识field为非零值时,文件系统正在被进行收缩,其它进程不能访问该当前数据;当标识field为零时,表示不收缩文件系统或文件系统收缩结束。
步骤705:判断所述新块是否在文件系统边界外,当在文件系统边界外时,执行步骤706;否则,执行步骤712。
步骤706:在文件系统收缩边界内为当前数据分配一个新块。
在为当前数据分配的新块在文件系统收缩边界外时,为了避免在边界外的数据还要再转移至边界内的复杂情况,需要在文件系统收缩边界内为当前数据重新分配一个新块,之后,再执行步骤712。
步骤707~711:具体操作同步骤602~606,此处不再进行赘述。
需要说明的是,步骤703~706与步骤707~711是对是否获取到数据的两种不同的处理方法,在处理完任何一个流程后,都要执行步骤712。
步骤712:判断判断当前数据是否在内存缓冲区中,如果是,则执行步骤714;否则,执行步骤713。
步骤713:将当前数据调入内存缓冲区中。
同对数据进行读取时一样,在写数据时,也是将数据写入内存缓冲区中的,在当前数据不在内存缓冲区中时,需要先将当前数据调入所述当前数据在硬盘中对应的块所对应的内存缓冲区中。
步骤714~715:将待写数据写入内存缓冲区,并将所述内存缓冲区标记为脏缓冲区,再进一步判断当前数据的内存缓冲区是否上锁,如果是,执行步骤716;否则,执行步骤717。
在本步骤中,将内存缓冲区标记为脏缓冲区是为了服务后续写回硬盘。
步骤716:解锁当前数据的内存缓冲区。
同读数据时的步骤611,在本步骤中,当写完数据后,也需要将上锁的内存缓冲区进行解锁,使得其它进程可以对该数据进行访问。
步骤717~718:判断是否所有数据都被写完,如果是,执行步骤719;否则,将当前数据的下一个数据作为当前数据,并返回执行步骤701。
步骤719:判断是否正在收缩文件系统,如果是,执行步骤720;否则,执行步骤721。
当所有数据都被写完后,还需进一步判断文件系统是否正在进行收缩,如果是的话,执行步骤720的操作;否则,执行步骤721。
在本步骤中,对是否正在收缩文件系统的判断也是通过文件系统SB中增加的标识field,具体判断过程同前面描述,不再赘述。
步骤720:如果文件系统正在被收缩,则等待文件系统的收缩过程,直至收缩过程结束。
步骤721:将步骤714中标记的脏缓冲区中的数据写回到硬盘中。
这里需要说明的是,一般情况下,需要马上写回硬盘,但有时需要等待正在进行收缩的文件系统,等文件系统被收缩完毕后,再将标记的脏缓冲区中的数据写回硬盘。
至此,即完成了本发明所述写数据的全部过程。同时也完成了本发明所述收缩文件系统和读写数据的全部过程。
通过上述实施例可以看出,本发明在读写数据时若需要读写文件系统收缩边界外的数据,则首先会试图获取该数据在硬盘中对应的块所对应的内存缓冲区上的锁,若获取不到,则说明收缩进程正在对该数据进行转移,需要等到该内存缓冲区上的锁被解开后,再重新查找该数据在硬盘中对应的新的块,并重新对该数据进行读写;如果获取到了该数据在硬盘中对应的块所对应的内存缓冲区上的锁,则可以直接对该数据进行相应的读写操作,与此同时,收缩进程若要转移该数据,则需要等到该数据被读写完毕之后再重新对其进行转移,从而保证了数据的一致性,也就保证了读写的正确性,只是略微牺牲了读写进程的性能。
但是,本实施例以下几个方面的特点又保证了读写进程的性能不会牺牲很大:1)Linux操作系统中的预读策略,使得相当一部分的数据已经在内存中,从而使得收缩与读写同一个数据这样的情况机率比较低;2)转移一个数据的时间不会很长,这样由收缩造成的读写延迟也就较小;3)若写进程需要新的数据块保存数据,则新的数据块要保证在文件系统收缩边界内分配,这样就避免了在边界外分配后还要将数据再转移至界内的复杂过程;4)写进程最后要写回硬盘时,要等到收缩进程结束再进行,这样也延续了Linux操作系统延迟写的思想。
总之,本发明所采用的online shrink ext2/3文件系统的技术方案,在对文件系统进行收缩时采用了将所述文件系统收缩边界外的数据转移到所述文件系统收缩边界内,并且,在转移每个数据之前,都要对所述数据在硬盘中对应的块所对应的内存缓冲区进行上锁,以防读进程或写进程对该数据进行读写;同样地,在对数据进行读写的时候,也要判断所要读写的数据在硬盘中对应的块是否位于所述文件系统收缩边界外,并进一步地对可以进行读写的数据在硬盘中对应的块所对应的内存缓冲区进行上锁,以防收缩进程对其进行收缩。因此,本发明采用的方法能够支持在对数据进行读写的同时对文件系统进行收缩,并且能够保证读写结果的正确性。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

一种在线收缩EXT2/3文件系统的方法.pdf_第1页
第1页 / 共29页
一种在线收缩EXT2/3文件系统的方法.pdf_第2页
第2页 / 共29页
一种在线收缩EXT2/3文件系统的方法.pdf_第3页
第3页 / 共29页
点击查看更多>>
资源描述

《一种在线收缩EXT2/3文件系统的方法.pdf》由会员分享,可在线阅读,更多相关《一种在线收缩EXT2/3文件系统的方法.pdf(29页珍藏版)》请在专利查询网上搜索。

本发明公开了一种在线收缩online shrink ext2/3文件系统的方法:标记所述文件系统收缩边界外的数据,将其中的某个数据作为当前数据;对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,防止所述当前数据被读进程或写进程访问,如果上锁成功,则将所述当前数据转移至文件系统收缩边界内;如果上锁失败,则继续对所述当前数据在硬盘中对应的块所对应的内存缓冲区进行上锁,直至上锁成功后,再将所述当。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1