一种qcow2文件存储方法以及格式转换方法转让专利

申请号 : CN202211342140.8

文献号 : CN115454357B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李坤祥闵宇史伟

申请人 : 广东睿江云计算股份有限公司

摘要 :

本申请公开了一种qcow2文件存储方法以及格式转换方法,属于数据存储与格式转换技术领域,qcow2文件存储方法在存储qcow2文件时,会在元数据区中判断是否存放有L1表、L2表,若判断到没有,就会在元数据区中创建对应的处理单元用于存放L1表、L2表,然后在有效数据区中判断是否存放有目标处理单元,若判断到没有,就会在有效数据区中创建一个处理单元作为目标处理单元,并且将有效数据写入到目标处理单元中,这样,整个qcow2文件存储后元数据与有效数据可以分区存放,在进行格式转换时只需在有效数据区中提取所有的有效数据即可,无需安装专用的qcow2格式转换工具,可以减少硬盘资源占用。

权利要求 :

1.一种qcow2文件存储方法,其特征在于,包括:在接收到写入请求时,判断元数据区中是否存放有L1表,其中,所述L1表中包含写入请求中所指向的L2表地址;

若不存在,在元数据区中创建一个处理单元用于存放L1表,并且在L1表中写入写入请求中所指向的L2表地址;

若存在,进行下一步操作;

判断元数据区中是否存放有L2表,其中,所述L2表中包含写入请求中所指向的位于有效数据区中的目标处理单元地址;

若不存在,在元数据区中创建一个处理单元用于存放L2表,并且在L2表中写入写入请求中所指向的目标处理单元地址;

若存在,进行下一步操作;

判断有效数据区中是否存放有写入请求中所指向的目标处理单元;

若不存在,在有效数据区中创建一个处理单元作为目标处理单元,并且将有效数据写入到目标处理单元中;

若存在,直接向目标处理单元中写入有效数据。

2.根据权利要求1所述的qcow2文件存储方法,其特征在于,所述在接收到写入请求之前,还包括:预先将qcow2文件内的空间划分成元数据区以及有效数据区。

3.根据权利要求2所述的qcow2文件存储方法,其特征在于,所述预先将qcow2文件内的空间划分成元数据区以及有效数据区包括:计算最多需要的L1表总数量、L2表总数量以及计算头信息所占用的总空间大小,将最多需要的L1表总数量、最多需要的L2表总数量以及头信息所占用的总空间大小作为元数据区的空间,将剩余的空间划分成有效数据区。

4.根据权利要求3所述的qcow2文件存储方法,其特征在于,计算L2表总数量包括:设定每个处理单元的大小;

将qcow2文件大小除以每个处理单元的大小计算出qcow2文件中最多能够包含的处理单元总数量;

计算每个L2表中最多能够写入的用于存放有效数据的处理单元的地址数量;

将qcow2文件中最多能够包含的处理单元总数量除以每个L2表中最多能够写入的用于存放有效数据的处理单元地址数量得到最多需要的L2表总数量。

5.根据权利要求4所述的qcow2文件存储方法,其特征在于,所述计算最多需要的L1表总数量包括:将计算出的最多需要的L2表总数量除以每个L1表所能写入的L2表地址数量得到最多需要的L1表总数量。

6.根据权利要求5所述的qcow2文件存储方法,其特征在于,所述将最多需要的L1表总数量、最多需要的L2表总数量以及头信息所占用的总空间大小作为元数据区的空间包括:将最多需要的L1表总数量以及最多需要的L2表总数量相加得到第一数值;

将第一数值与每个处理单元大小相乘得到第二数值;

将第二数值与头信息所占用的总空间大小进行相加得到元数据区的空间大小。

7.一种qcow2与raw格式转换方法,用于转换权利要求1‑6任意一项所述qcow2文件存储方法所得到的qcow2文件,其特征在于,所述格式转换方法包括:在获取到转换命令时提取有效数据区的所有有效数据;

采用raw格式转换工具将有效数据区中的所有有效数据转换成raw文件。

说明书 :

一种qcow2文件存储方法以及格式转换方法

技术领域

[0001] 本发明属于数据存储与格式转换技术领域,尤其涉及一种qcow2文件存储方法以及格式转换方法。

背景技术

[0002] qcow2镜像格式是qemu支持的磁盘镜像格式之一,它可以使用一个文件来表示一个固定大小的块设备,其具有以下优点:
[0003] 1、更小的文件大小,即便不支持 holes (稀疏文件)的文件系统同样适用;
[0004] 2、支持写时拷贝(COW.Copyon‑write),QCOW2镜像只反映底层磁盘镜像所做的修改;
[0005] 3、支持快照,QCOW2镜像可以包含镜像伤史的多重快照;
[0006] 4、支持基于zlib的数据压缩;
[0007] 5、支持AES加密;
[0008] 然而现有的qcow2文件中元数据与有效数据是交叉存放的,因此在将qcow2文件转换成raw格式文件时需要采用专用的qcow2格式转换工具将有效数据进行提取才可以进行格式转换,这样就需要安装专用的qcow2格式转换工具,会占用较多的硬盘资源。

发明内容

[0009] (一)发明目的
[0010] 为了克服以上不足,本发明的目的在于提供一种qcow2文件存储方法以及格式转换方法,以解决现有的qcow2文件格式转换时需要采用专用的qcow2格式转换工具,需要安装专用的qcow2格式转换工具,导致硬盘资源被占用的的技术问题。
[0011] (二)技术方案
[0012] 为实现上述目的,本申请一方面提供的技术方案如下:
[0013] 一种qcow2文件存储方法,包括:
[0014] 在接收到写入请求时,判断元数据区中是否存放有L1表,其中,L1表中包含写入请求中所指向的L2表地址;
[0015] 若不存在,在元数据区中创建一个处理单元用于存放L1表,并且在L1表中写入写入请求中所指向的L2表地址;
[0016] 若存在,进行下一步操作;
[0017] 判断元数据区中是否存放有L2表,其中,L2表中包含写入请求中所指向的位于有效数据区中的目标处理单元地址;
[0018] 若不存在,在元数据区中创建一个处理单元用于存放L2表,并且在L2表中写入写入请求中所指向的目标处理单元地址;
[0019] 若存在,进行下一步操作;
[0020] 判断有效数据区中是否存放有写入请求中所指向的目标处理单元;
[0021] 若不存在,在有效数据区中创建一个处理单元作为目标处理单元,并且将有效数据写入到目标处理单元中;
[0022] 若存在,直接向目标处理单元中写入有效数据。
[0023] 本申请在存储qcow2文件时,会在元数据区中判断是否存放有L1表、L2表,若判断到没有,就会在元数据区中创建对应的处理单元用于存放L1表、L2表,然后在有效数据区中判断是否存放有目标处理单元,若判断到没有,就会在有效数据区中创建一个处理单元作为目标处理单元,并且将有效数据写入到目标处理单元中,这样,整个qcow2文件中的元数据与有效数据可以分区存放,在进行格式转换时只需在有效数据区中提取所有的有效数据即可,无需专用的qcow2格式转换工具,可以减少硬盘资源占用。
[0024] 进一步地,在接收到写入请求之前,还包括:预先将qcow2文件内的空间划分成元数据区以及有效数据区。
[0025] 进一步地,预先将qcow2文件内的空间划分成元数据区以及有效数据区包括:计算最多需要的L1表总数量、L2表总数量以及计算头信息所占用的总空间大小,将最多需要的L1表总数量、最多需要的L2表总数量以及头信息所占用的总空间大小作为元数据区的空间,将剩余的空间划分成有效数据区。
[0026] 进一步地,计算L2表总数量包括:
[0027] 设定每个处理单元的大小;
[0028] 将qcow2文件大小除以每个处理单元的大小计算出qcow2文件中最多能够包含的处理单元总数量;
[0029] 计算每个L2表中最多能够写入的用于存放有效数据的处理单元的地址数量;
[0030] 将qcow2文件中最多能够包含的处理单元总数量除以每个L2表中最多能够写入的用于存放有效数据的处理单元地址数量得到L2表总数量。
[0031] 进一步地,计算最多需要的L1表总数量包括:将计算出的最多需要的L2表总数量除以每个L1表所能写入的L2表地址数量得到最多需要的L1表总数量。
[0032] 进一步地,将最多需要的L1表总数量、最多需要的L2表总数量以及头信息所占用的总空间大小作为元数据区的空间包括:
[0033] 将最多需要的L1表总数量以及最多需要的L2表总数量相加得到第一数值;
[0034] 将第一数值与每个处理单元大小相乘得到第二数值;
[0035] 将第二数值与头信息所占用的总空间大小进行相加得到元数据区的空间大小。
[0036] 本申请另一方面提供一种qcow2与raw格式转换方法,用于转换上述qcow2文件存储方法所得到的qcow2文件,格式转换方法包括:
[0037] 在获取到转换命令时提取有效数据区的所有有效数据;
[0038] 采用raw格式转换工具将有效数据区中的所有有效数据转换成raw文件。

附图说明

[0039] 图1是现有的qcow2文件存储方法的原理图;
[0040] 图2是本申请的qcow2文件存储方法的原理图;
[0041] 图3是本申请的qcow2文件存储方法的流程图。

具体实施方式

[0042] 为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
[0043] 如图3所示,本发明提供的一种qcow2文件存储方法,包括:
[0044] 在接收到写入请求时,判断元数据区中是否存放有L1表,其中,L1表中包含写入请求中所指向的L2表地址;
[0045] 若不存在,在元数据区中创建一个处理单元用于存放L1表,并且在L1表中写入写入请求中所指向的L2表地址;
[0046] 若存在,进行下一步操作;
[0047] 判断元数据区中是否存放有L2表,其中,L2表中包含写入请求中所指向的位于有效数据区中的目标处理单元地址;
[0048] 若不存在,在元数据区中创建一个处理单元用于存放L2表,并且在L2表中写入写入请求中所指向的目标处理单元地址;
[0049] 若存在,进行下一步操作;
[0050] 判断有效数据区中是否存放有写入请求中所指向的目标处理单元;
[0051] 若不存在,在有效数据区中创建一个处理单元作为目标处理单元,并且将有效数据写入到目标处理单元中;
[0052] 若存在,直接向目标处理单元中写入有效数据。
[0053] 具体的,qcow2文件在存放数据时内层逻辑如下:
[0054] 将qcow2文件平均拆分成多个处理单元(cluster),每个处理单元可以存放一个L1表、一个L2表或一个有效数据;
[0055] 一个L1表的大小就是一个处理单元(cluster)大小(64KB),L1表内每8个字节就是一个L2表地址;
[0056] 一个L2表的大小就是一个处理单元(cluster)大小(64KB),里面每8个字节就是一个有效数据块地址;
[0057] 一个有效数据块的大小就是处理单元(cluster)大小(64KB)。
[0058] 这里的地址指的是qcow2文件内的偏移,根据这个地址可以在qcow2文件内找到用户数据。
[0059] 写入请求中包含目标L2表地址以及目标处理单元名称,查找目标处理单元时,通过在L1表中查找目标L2表的地址并且定位到目标L2表,然后根据目标处理单元名称在目标L2表中查找目标处理单元地址,最后定位到目标处理单元,将数据写入到目标处理单元中。
[0060] 具体的,现有的qcow2文件数据存储方式具体如下:
[0061] 初始化一个qcow2文件;
[0062] 在qcow2文件中创建一个处理单元存放一个L1表,创建一个处理单元存放一个L2表,将L2表地址写入到L1表中;
[0063] 当接收到有效数据的写入请求时,直接在存放L2表的处理单元后侧创建一个处理单元用于写入有效数据,然后将写有有效数据的处理单元地址写入到L2表中,如此类推直到整个L2表被写满,当上一个L2表(图1中L2表1)被写满并且接收到新的有效数据写入请求时,在写有有效数据的处理单元后侧重新创建一个处理单元用于存放新的L2表(图1中L2表2),并且将存放有新的L2表的处理单元地址写入到L1表中,如此类推。对于L1表也是如此,当上一个L1表被写满,会重新创建一个处理单元用于存放下一个新的L1表,这样整个qcow2文件内部可能会存在左边是元数据,中间一段是刚写入的有效数据,然后右边又是元数据这样交叉存放方式,在进行格式转换时需要采用专用的qcow2格式转换工具将有效数据挑选出来,然后将多个有效数据进行组合,最后才能将所有的有效数据转换成其他格式的文件。
[0064] 本申请可以将qcow2文件内的元数据和有效数据进行分区存放,在进行格式转换时只需在有效数据区提取对应的有效数据即可,删除元数据区中的元数据,无需专用的qcow2格式转换工具,可以减少硬盘资源占用。
[0065] 具体的,在接收到写入请求之前,需要预先将qcow2文件内的空间划分成元数据区以及有效数据区,如图2中MaxmetaSize以上为元数据区,MaxmetaSize以下为有效数据区。
[0066] 具体的,预先将qcow2文件内的空间划分成元数据区以及有效数据区包括:计算最多需要的L1表总数量、L2表总数量以及计算头信息所占用的总空间大小,将最多需要的L1表总数量、最多需要的L2表总数量以及头信息所占用的总空间大小作为元数据区的空间,将剩余的空间划分成有效数据区。
[0067] 具体的,计算L2表总数量包括:
[0068] 设定每个处理单元的大小;
[0069] 将qcow2文件大小除以每个处理单元的大小计算出qcow2文件中最多能够包含的处理单元总数量;
[0070] 计算每个L2表中最多能够写入的用于存放有效数据的处理单元的地址数量;
[0071] 将qcow2文件中最多能够包含的处理单元总数量除以每个L2表中最多能够写入的用于存放有效数据的处理单元地址数量得到L2表总数量。
[0072] 具体的,计算最多需要的L1表总数量包括:将计算出的最多需要的L2表总数量除以每个L1表所能写入的L2表地址数量得到最多需要的L1表总数量。
[0073] 具体的,将最多需要的L1表总数量、最多需要的L2表总数量以及头信息所占用的总空间大小作为元数据区的空间包括:
[0074] 将最多需要的L1表总数量以及最多需要的L2表总数量相加得到第一数值;
[0075] 将第一数值与每个处理单元大小相乘得到第二数值;
[0076] 将第二数值与头信息所占用的总空间大小进行相加得到元数据区的空间大小。
[0077] 具体的,在计算L1表、L2表总数量之前需要:
[0078] 初始化一个qcow2文件:
[0079] qcow2文件可以看作是一个虚拟磁盘,虚拟磁盘最大容量(DiskSize);
[0080] 每个处理单元大小(ClusterSize);
[0081] 元数据区最大占用空间(MaxMetaSize);
[0082] 处理单元地址大小:(PtrSize),64位系统盘一般是8个字节;
[0083] 具体的,计算最多需要的L1表、L2表总数量详细过程如下:
[0084] (1)计算qcow2最多能够包含的处理单元总数量(NrMaxCluster):
[0085] NrMaxCluster(最多能够包含的处理单元总数量) = DiskSize(磁盘最大容量) ÷ ClusterSize(每个处理单元大小);
[0086] (2)计算每个L2表中最多能够写入的用于存放有效数据的处理单元地址数量(NrAddrPerCluster):
[0087] NrAddrPerCluster = ClusterSize(处理单元大小) ÷ PtrSize(地址大小);
[0088] (3)计算最多需要的L2表总数量(NrMaxL2):
[0089] NrMaxL2=  NrMaxCluster(最多能够包含的处理单元总数量)  ÷ NrAddrPerCluster(每个L2表中最多能够写入的用于存放有效数据的处理单元地址数量);
[0090] (4)计算最多需要L1表总数量(NrMaxL1):
[0091] NrMaxL1= NrMaxL2(最多需要的L2表总数量)÷ NrAddrPerCluster(每个L1表中能够写入的处理单元的地址数量);
[0092] (5)计算MaxMetaSize(元数据区最大占用空间):
[0093] MaxMetaSize= (NrMaxL2 (最多需要的L2表总数量)+ NrMaxL1(最多需要L1表总数量)) × ClusterSize(处理单元大小) + 头信息。
[0094] 具体的,头信息主要是记录qcow2文件大小,加载文件时会读出来缓存到内存的,要寻址时直接从内存中读取。
[0095] 本申请另一方面提供了一种qcow2与raw格式快速格式转换方法,用于转换上述qcow2文件存储方法所得到的qcow2文件,格式转换方法包括:
[0096] 在获取到转换命令时提取有效数据区的有效数据;
[0097] 采用raw格式转换工具将有效数据区中的数据转换成raw文件。
[0098] 应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。