CN111143285A - 一种小文件存储文件***以及小文件处理方法 - Google Patents
一种小文件存储文件***以及小文件处理方法 Download PDFInfo
- Publication number
- CN111143285A CN111143285A CN201811314092.5A CN201811314092A CN111143285A CN 111143285 A CN111143285 A CN 111143285A CN 201811314092 A CN201811314092 A CN 201811314092A CN 111143285 A CN111143285 A CN 111143285A
- Authority
- CN
- China
- Prior art keywords
- block
- file
- index
- data block
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种小文件存储文件***以及小文件处理方法,其中,该小文件存储文件***包括:超级块区域、索引节点表区域、可用数据块区域和预留数据块区域,在数据块中设置内部数据块,将小文件存储在内部数据块中,避免了超级块信息和块组描述符表的冗余,简化了文件***结构,采用直接寻址方式,缩短了磁盘访问次数和时长,从而减少文件在磁盘中的碎片化处理和管理。
Description
技术领域
本发明涉及小文件存储技术领域,特别是涉及一种小文件存储文件***以及小文件处理方法。
背景技术
现有的文件***如图1所示,以索引方式存储小文件,如EXT系列,在多个块组中都存有冗余的超级块信息以及块组描述符表,造成存储空间的浪费,并且该文件***结构复杂;另外,格式化分区的过程其实就是创建文件***的过程,现有的文件***对于一个超大的磁盘,需要在每一个块组中写入相应的数据,导致访问速度很慢,如:现有文件***针对文件是一个链表的形式,且数据不连续,在访问文件的时,需要先通过寻址方式定位到第一块数据,访问第二块数据的时候,再次寻址到新的磁盘地址进行访问。
发明内容
本发明的目的在于提出一种小文件存储文件***以及小文件处理方法,以实现简化文件***结构,使用方便,减少对磁盘的寻址次数和时间,减少文件在磁盘中的碎片化处理和管理。
为达到上述目的,本发明提供了以下技术方案:
一种小文件存储的文件***,包括:超级块区域、索引节点表区域、可用数据块区域和预留数据块区域,其中:
所述超级块区域包括超级块区域信息、索引区域信息和数据块区域信息,用于记录文件***的整体信息;
所述索引节点区域用于存储所述可用数据块区域中每个数据块所对应的索引节点,所述索引节点包括:逻辑块号、物理块号、写文件数、删文件数、总共余块、尾部余块以及文件索引的列表;
所述可用数据块区域和所述预留数据块区域以数据块为单位进行分割,其中:
所述可用数据块区域按照所述数据块的大小进行划分,且与所述索引节点一一对应,并按照预设规则进行编号,用于存储数据;
所述预留数据块区域与所述可用数据块区域的结构相同,所述预留数据块区域中的数据块个数按照磁盘格式化时设定的预设比例进行划分的,用于作为所述文件***后续数据块操作;
所述数据块按照预设规则划分为若干个内部数据块,且各个所述内部数据块的大小相同。
进一步的,所述超级块区域信息包括:磁盘总空间、磁盘剩余空间、超级块偏移地址以及超级块分配空间。
进一步的,所述索引节点信息包括:索引信息偏移地址、索引信息预留空间和单个索引接点大小。
进一步的,所述数据块区域信息包括:数据块偏移地址、预留数据块偏移地址、数据块大小、数据块总个数、可用数据块个数、可用数据块空间、预留数据块个数、预留数据块空间、预留块比例、内部数据块大小以及内部数据块个数。
进一步的,所述文件索引的结构包括:文件索引、文件标志、文件大小、校验信息以及占用标志。
一种小文件的写入方法,应用于小文件存储的文件***,该方法包括:
遍历索引节点列表,查找一个未占位的文件节点,并获取待写入小文件的文件索引节点;
预先根据预设公式确定待写入小文件是否能存储至所述文件索引节点所对应的可用数据块;
若是,根据第一预设公式确定索引块中的索引信息,所述第一预设公式为:X=a-b,其中,X为索引块中的索引信息,a为内部数据个数,b为索引节点中的尾部余块;
根据第二预设公式计算数据的偏移位置,所述第二预设公式为:Y=c+d*e+f*X,其中,c为数据块偏移地址,d为数据块大小,e为索引节点中描述的物理块号,f为内部数据块大小;
将所述待写入小文件写入到所述可用数据块中对应的所述数据的偏移位置,并对应的更新所述索引节点中的尾部余块和总共余块;
所述待写入小文件写入后,将所述文件索引节点写入到磁盘。
一种小文件的删除方法,应用于小文件存储的文件***,该方法包括:
确定待删除小文件在磁盘上的索引节点以及所述待删除小文件的索引块;
将所述待删除小文件对应的索引块中的文件占位标志为0;
将所述索引节点中的删文件数自增1,并对所述索引节点进行更新。
一种数据块的碎片整理方法,应用于小文件存储的文件***,该方法包括:
当确定数据块内部需要进行碎片整理时,遍历所有索引块,获取所述索引块中所有的有效文件以及所有的所述有效文件对应的数据块大小;
将所有的所述有效文件的数据按照预设规则进行移动整理,并对所述索引节点进行更新。
进一步的,还包括:
根据索引节点中的总共余块和尾部余块确定数据块内部是否需要进行碎片整理;
当所述总共余块大于所述尾部余块时,则确定所述数据块内部需要进行碎片整理。
经由上述的技术方案可知,与现有技术相比,本发明公开了一种小文件存储文件***以及小文件处理方法,其中,该小文件存储文件***包括:超级块区域、索引节点表区域、可用数据块区域和预留数据块区域,在数据块中设置内部数据块,将小文件存储在内部数据块中,避免了超级块信息和块组描述符表的冗余,简化了文件***结构,采用直接寻址方式,缩短了磁盘访问次数和时长,从而减少文件在磁盘中的碎片化处理和管理。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为现有技术中提供的EXT系列文件***结构图;
图2为本发明实施例提供的一种小文件存储文件***结构图;
图3为本发明实施例提供的一种小文件的写入方法流程图;
图4为本发明实施例提供的一种小文件的删除方法流程图;
图5为本发明实施例提供的一种数据块的碎片整理方法流程图。
具体实施方式
术语解释:
文件***:是操作***用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作***中负责管理和存储文件信息的软件机构称为文件管理***,简称文件***。文件***由三部分组成:文件***的接口,对对象操纵和管理的软件集合,对象及属性。从***角度来看,文件***是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的***。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
磁盘:是计算机的外部存储器中也采用了类似磁带的装置,比较常用的一种叫磁盘,将圆形的磁性盘片装在一个方的密封盒子里,这样做的目的是为了防止磁盘表面划伤,导致数据丢失。
磁盘格式化:是指对磁盘或磁盘中的分区(partition)进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。
直接寻址:是一种基本的寻址方法,其特点是:在指令格式的地址的字段中直接指出操作数在内存的地址。由于操作数的地址直接给出而不需要经过某种变换,所以称这种寻址方式为直接寻址方式。
间接寻址:是相对于直接寻址而言的,指令地址字段的形式地址D不是操作数的真正地址,而是操作数地址的指示器,或者说是D单元的内容才是操作数的有效地址。间接寻址是在直接寻址的基础上面建立起来的,也就是直接寻址得到的数据是一个地址,通过这个地址找到最终的数据,也就是两次寻址,第一次得到的是地址,第二次才是目标数据。
超级块(superblock):是硬盘分区开头——开头的第一个byte是byte0,从byte1024开始往后的一部分数据。由于block size最小是1024bytes,所以super block可能是在block1中(此时block的大小正好是1024bytes),也可能是在block0中。超级块中的数据其实就是文件卷的控制信息部分,也可以说它是卷资源表,有关文件卷的大部分信息都保存在这里。例如:硬盘分区中每个block的大小、硬盘分区上一共有多少个blockgroup、以及每个block group中有多少个inode。
索引节点:是指在许多类Unix文件***中的一种数据结构。每个索引节点保存了文件***中的一个文件***对象的元信息数据,但不包括数据内容或者文件名。
数据块:是一组按顺序连续排列在一起的几组记录,是主存储器与输入、输出设备或外存储器之间进行传输的一个数据单位。是数据的物理记录,与数据的逻辑记录(逻辑上有联系,在存储器上占有一组邻接单元的数据单位)之间的对应关系有3种方式:①一个块即为一个记录;②一个块包含若干个逻辑记录;③一个逻辑记录占有几个块。数据块的大小可以是固定的或是可变的,块与块之间有间隙。设计数据块大小,受到多方面因素的影响,包括输入、输出效率,存储空间代价以及计算机应用特点等。每一个数据块都有对应的一个索引节点,索引节点中保存有数据块的索引号,文件***根据索引号来读取该数据块的数据。
偏移地址:就是计算机里的内存分段后,在段内某一地址相对于段首地址(段地址)的偏移量。本文中所提到的偏移地址一般是指相对于磁盘起始地址的偏移地址。
大文件数据:包含图片或者影像数据,一般会是电影或者电视,一般大文件数据是指比较大的数据文件,如64M以上的数据文件。
小文件数据:相对于大文件数据而言的,小文件数据一般都小于等于64M(或者比64M更小的数据),一般小文件可以包括jpg文件、txt文件、普通的doc文档文件、html文件、js文件等,将小于等于64M的内容的文件统统称为小文件。
注意:上述的64M是一个相对值,根据规定文件的界限,以某一个数据大小为界限,大于64M的文件为大文件,小于等于64M的文件为小文件,但也可以定义为大于32M的文件为大文件,小于等于32M的文件为小文件。这个根据业务场景来定义,确定文件小于等于某一个界定的值即为小文件;否则为大文件。一般通常小文件的大小定义为小于等于64M。
如图1所示,为现有技术中文件***布局结构图,由引导块和多份块组组成,每一个块组都由超级块、块组标识符表、预留块组描述表、数据块位图、节点表以及多个数据块组成,各个组成结构的具体描述为:
超级块(Super Block)描述整个分区的文件***信息,如索引/数据块的大小、总量、使用量、剩余量以及文件***的格式与相关信息,超级块在每个块组的开头都有一份拷贝。
块组描述符表(GDT,Group Descriptor Table)由很多块组描述符组成,整个分区分成多个块组就对应有多少个块组描述符,每个块组描述符存储一个块组的描述信息,如在这个块组中从哪里开始是索引表,从哪里开始是数据块,空闲的索引和数据块还有多少个等等。块组描述符在每个块组的开头都有一份拷贝。
预留块组描述表类似块组描述符表,由很多预留块组描述符组成,整个分区分成多个预留块组就对应有多少个预留块组描述符,每个预留块组描述符存储一个预留块组的描述信息,如在这个预留块组中从哪里开始是索引表,从哪里开始是数据块,空闲的索引和数据块还有多少个等等。预留块组描述符在每个块组的开头都有一份拷贝。
数据块位图(Block Bitmap)用来描述整个块组中哪些块已用哪些块空闲,块位图本身占一个块,其中的每个bit代表本块组的一个数据块,这个bit为1代表该块已用;为0表示空闲可用。假设格式化时block大小为1KB,这样大小的一个块位图就可以表示1024*8个块的占用情况,因此一个块组最多可以有1024*8个块。
节点表由一个块组中的所有索引组成。一个文件除了数据需要存储之外,一些描述信息也需要存储,如文件类型,权限,文件大小,创建、修改、访问时间等,这些信息存在索引中而不是数据块中,索引表占多少个块在格式化时就要写入块组描述符中。
因此,超级块以及块组描述符表都是有冗余的,造成一定的空间浪费,并且该***结构较复杂,对于文件***访问很慢,需要在每一个块组中存写相应的数据。
另外,现有的文件***,以EXT***的寻址方式主要是间接寻址,假设该文件***的块的大小为1KB(1*1024B),以EXT3文件***为例,索引表中,每一个索引占128字节,其中,60个字节用于指向存放文件内容的数据块指针,每个指针4字节,那么有15个指针,最后3个指针需要用分级间接寻址。12个直接寻址,可以直接获取文件数据块位置,可以有12条记录;一级间接寻址:该指针指向一个1K的块,块内有1024/4=256条记录,这256个指针记录,每条指针记录的是数据块的指针;二级间接寻址:该指针指向一个1K的块,块内有1024/4=256条记录,这256个指针记录,每条指针记录的是数据块指针的指针。可以有256*256条数据块的指针;三级间接寻址:以此类推,可以有256*256*256条数据块的指针记录。
所以,对于1KB的块大小最大可以表示(256^3+256^2+256+12)*1KB≈16GB的文件。如果要读取16G的文件那么就需要根据以上庞大的数据指针来获取数据,访问磁盘的次数会陡增,势必降低读写性能。
对于1KB的块大小的文件***,存储文件12KB的文件读取效率还是很高的,但是对于存储大于12K的文件,就要涉及到间接寻址,对于三级间接寻址,读取一个数据块1kB最多需要读取五次磁盘,即,读索引信息、读一级间接寻址块、读二级间接寻址块、读三级间接寻址块、读寻址到的数据块,才可以获取到数据块中的数据,可见,读写文件效率明显较低。
而EXT4索引采用的办法是使用extent来保存<文件逻辑块号,磁盘块号>的映射关系:一个extent对应一系列连续的块号,EXT4中一个索引可以直接存放4个extent。对于很大的文件,EXT4采用extent_tree的方式,其本质同样是一种间接寻址的关系,同样会影响读写性能。
因此,为了实现简化文件***结构,使用方便,减少磁盘访问次数和缩短磁盘的访问时长。提出了一种小文件存储的文件***,使用直接寻址方式访问文件数据。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图2所示,本发明实施例提供了一种小文件存储的文件***,该文件***具体包括:超级块区域11、索引节点表区域12、可用数据块区域13和预留数据块区域14,其中:
上述超级块区域11包括超级块区域信息111、索引区域信息112和数据块区域信息113,用于记录文件***的整体信息;上述索引节点区域12用于存储所可用数据块区域13中每个数据块所对应的索引节点,该索引节点包括:逻辑块号、物理块号、写文件数、删文件数、总共余块、尾部余块以及文件索引的列表;上述可用数据块区域13和上述预留数据块区域14以数据块为单位进行分割,其中:可用数据块区域13按照数据块的大小进行划分,且与索引节点一一对应,并按照预设规则进行编号,用于存储数据;预留数据块区域14与可用数据块区域13的结构相同,预留数据块区域14中的数据块个数按照磁盘格式化时设定的预设比例进行划分的,用于作为文件***后续数据块操作;具体的,数据块按照预设规则划分为若干个内部数据块,且各个内部数据块的大小相同。
进一步的,上述超级块区域信息包括:磁盘总空间(total_size)、磁盘剩余空间(left_size)、超级块偏移地址(super_block_offset)以及超级块分配空间(super_block_size)。
其中,磁盘总空间(total_size)是整个文件***存储介质磁盘的总大小,磁盘剩余空间(left_size)是磁盘剩余的能够写入数据的大小,超级块偏移地址(super_block_offset)为文件***超级块相对于磁盘起始地址的偏移大小,超级块大小(super_block_size)分配空间是文件***为超级块所占磁盘空间分配的总大小,该空间可以设置为4KB或者8KB或者其他大小,是可以扩展增加其他字段的,一般为4KB的倍数,一般超级块的信息量在8KB以内,能够描述磁盘所有需要的信息。
进一步的,上述索引节点信息包括:索引信息偏移地址(index_table_offset)、索引信息预留空间(index_table_size)和单个索引接点大小。
其中,从文件***结构可以得知,索引信息偏移地址(index_table_offset)等于超级块的地址加上超级块分配空间(super_block_size),即第一个索引节点的起始地址。索引信息预留空间(index_table_size)是索引节点表所占的空间的大小,这个是由文件***格式化时根据磁盘大小来预留设定的,一个数据块空间对应一个索引节点信息,索引节点表信息的预留空间会预留很大一块连续的区域,计算方法为:如一个4T的磁盘,数据块大小为64M,那么,总的数据块个数大约为4T/64M=65K,若每一个索引节点信息占64K空间,那么该盘索引节点表占空间为64K*65K=4160M大小,因此文件***可以设置大于4160M的数值来设定索引信息预留空间的大小,这样做是为了当数据块变小时,需要分配更多的空间给索引信息预留空间,如可以设置为10G。预先分配较大的索引预留空间,可以有利于文件***对于磁盘数据块大小的改变进行自动适应。单个索引节点的大小是为每一个索引节点分配的空间,如上面的示例,为单个索引节点分配的空间大小为64K,该大小是可以根据需要设定的,但是如果太大会浪费存储空间,可以根据需要来设定。
进一步的,上述数据区域信息包括:数据块偏移地址(data_block_offset)、预留数据块偏移地址(reserved_block_offset)、数据块大小(block_size)、数据块总个数(total_block_nums)、可用数据块个数(block_nums)、可用数据块空间(data_block_size)、预留数据块个数(reservered_block_nums)、预留数据块空间(reserved_block_size)、预留块比例(rate)、内部数据块大小(inner_block_size)以及内部数据块个数(inner_block_nums)。
其中,数据块大小(block_size)和预留块比例(rate)是在文件***格式化时设定的;数据块总空间=磁盘总空间(total_size)-超级块分配空间(super_block_size)-索引信息预留空间(index_table_size),那么数据块总个数(total_block_nums)=数据块总空间/数据块大小(block_size);
那么,预留数据块个数(reservered_block_nums)=数据块总个数*预留块比例(rate);可用数据块个数(block_nums)=数据块总个数-预留数据块个数(reservered_block_nums);由该文件***结构可知,数据块偏移地址(data_lock_offset)=超级块起始地址+超级块分配空间(super_block_size)+索引信息预留空间(index_table_size);预留数据块偏移地址(reserved_block_offset)=数据块的偏移地址(data_block_offset)+可用数据块空间(data_block_size)。
内部数据块大小(inner_block_size)在初始化的时候就设定,本发明以下实施例均设置参考值为32K,但不限于这个值。内部数据块个数(inner_block_nums)=数据块大小(block_size)/内部数据块大小(inner_block_size),必须整除,若不能整除,会导致每一个数据块的尾部块无法利用而浪费。
以上是超级块中文件***的主要描述字段,超级块分配空间(super_block_size)设置的大小如果为8K,足以满足以上数据字段所需要的空间,如果需要记录负载信息等,那么可以根据需要在超级块中扩展添加其他字段。
需要说明的是,每一个数据块都对应一个索引节点,一个文件最大只能存储在一个数据块中,一个数据块中可以存储多个文件。对于所述文件可以直接根据索引的地址+内部文件索引来访问所述文件内容信息。
具体的,索引节点结构包括:逻辑块号、物理块号、写文件数、删文件数、总共余块、尾部余块以及文件索引列表组成,其中:
逻辑块号为对应数据块从0开始编号的块号;物理块号为数据实际存储的数据块号;写文件数为当前这个数据块中写入的文件个数。当写入一个文件的时候,该值+1;删文件数为当用户删除了这个数据块中的文件,这个删文件数就会+1,其中,删除文件的时候,只是记录删除文件的个数,不会修改写入文件的个数大小,只有当删除文件个数达到一定数量的时候,***会对该文件对应的数据块进行整理,整理后,写文件数=写文件数-删文件数;删文件数=0,同时会对其他的字段进行整理,下面一一描述。
总共余块:一般***格式化的时候针对一个大的数据块进行更小的划分。一般一个大的数据块为64M,可能根据用户需要进行更改,可能是4M、8M、16M、32M、64M、128M等,根据用户需求小文件的最大大小是多少。本发明实施例中的文件***使用64M为参考。数据块中分配若干个内部数据块,本发明实施例中的文件***使用32K为参考,可以是4K、16K、32K、64K等一个数据块。64M/32K等于2048个数据块。那么总的余块个数在本发明实施例中的文件***初始化的时候设定总共余块个数等于数据块大小除以内部数据块大小。在使用过程中,总共余块个数是除了实际文件数据块占用的块的个数外的剩余数据块个数,删文件个数标记已经删除的文件块实际上是被文件占用的,统计不会进入到总共余块个数中。
尾部余块:表示数据块尾部连续的剩余数据块的个数,***格式化的时候和总共余块数相同。在使用过程中,尾部余块个数等于数据块中尾部连续未使用内部数据块的个数。这个原因是:用户写入的文件可能存在删除,删除后数据块中内部存储的文件就不连续了,就是所谓的空洞。这个空洞只能记录在总余块数中,尾部余块个数只是包含尾部连续剩余数据块的个数,不包含数据块中的空洞剩余数据块。
文件索引列表:用来记录文件以及文件信息。文件索引列表中包含(数据块大小除以内部数据块)这么多个数的文件索引结构。本发明实施例中参考是2048个这样的数据结构,即,这个数据块中最多能够存储2048个32K以及32K以内大小的文件。所述索引列表中的每一个索引结构称为索引块。索引块个数=数据块大小除以内部数据块大小,磁盘格式化的时候索引块的个数就确定了,并且格式化的时候,索引列表中的每一个块都初始化为默认值,在本发明实施例中默认为全0。
具体的,如图2所示,上述文件索引的结构包括:文件索引、文件标志、文件大小、校验信息以及占用标志,其中:
文件索引:该索引记录文件在数据块中的内部数据块的起始索引,即记录数据块中的内部数据块的第几个数据块作为该文件的起始块;
文件标志:该标志用来确定用户请求的文件是用户需要的文件,一般用来存储文件的id,在用户读取文件的时候,确保用户读取的文件是该id相匹配的文件;
文件大小:以字节为单位,保存文件的大小,这里文件的大小的作用可以确定该文件在这个数据块中连续占用的内部数据块的个数,确定方法为:(文件大小+内部数据块大小-1)/内部数据块大小,“/”在本发明中都是作为除号,得出的结果去掉余数部分取整数部分,一个文件最大能够存储一个数据块的大小,即一个数据块仅被一个文件占用,文件在内部数据块中必须连续一致;
校验信息:用来校验文件的完整性,可以是MD5、也可以是奇偶校验、循环校验等占用标志:表示这个文件已经被使用,且有效,对应文件的数据块占用有效,文件所占用的连续块占用有效,若删除文件,该占位标志清0即可。
索引节点的结构中的字段也是可以根据业务需要扩展增加的,一个索引节点结构在磁盘中存储的空间是由超级块中单个索引节点大小来设定的,每一个索引节点所占的空间是相同的。
上面可知,数据块结构分为可用数据块区域和预留数据块区域。二者都是以数据块为单位分割的,除了预留数据块区域中的数据块外,每一个可用数据块区域中的数据块对应索引节点表中一个索引节点信息。索引节点表中索引节点的个数与可用数据块的个数相同。一般情况下,在数据存储时,数据存储在可用数据块部分,其中:
可用数据块区域中的数据块:该数据块和索引节点一一对应,一个可用数据块对应一个索引节点信息,在***格式化的时候,就确定了索引节点和可用数据块的一一对应的关系,0号索引节点对应0号可用数据块,1号索引节点对应1号可用数据块,以此类推。
预留数据块区域中的数据块:按照磁盘格式化的时候设定的一定比例划分出来的数据块,该数据块用来作为磁盘后续数据块操作,在磁盘格式化的时候,没有对应的索引节点一一对应,该块只是作为***预留使用。
数据块的结构:每个数据块统一划分成若干过内部数据块,内部数据块的大小是一样的,本发明实施例参考64M为一个数据块大小,32K为一个内部数据块大小,本发明实施例的数据块大小能够整除内部数据块大小,这样可以不浪费磁盘的空间,本发明实施例将一个数据块划分为2048个内部数据块,但不限于数据块的大小,也不限于内部数据块的大小以及内部数据块的个数,内部数据块从0开始顺序编号,最大到内部数据块的个数-1(本发明实施例设置为2047),数据块编号是针对索引块的“文件索引”进行快速定位使用。
本发明实施例提供的一种小文件存储文件***,该***包括:超级块区域、索引节点表区域、可用数据块区域和预留数据块区域,在数据块中设置内部数据块,将小文件存储在内部数据块中,避免了超级块信息和块组描述符表的冗余,简化了文件***结构,采用直接寻址方式,缩短了磁盘访问次数和磁盘的访问时长,从而减少文件在磁盘中的碎片化处理和管理。
如图3所示,本发明实施例提供了一种小文件的写入方法,应用于小文件存储的文件***,该方法具体包括如下步骤:
S301、遍历索引节点列表,查找一个未占位的文件节点,并获取待写入小文件的文件索引节点。
S302、预先根据预设公式确定待写入小文件是否能存储至文件索引节点所对应的可用数据块。
S303、当确定待写入小文件能存储至文件索引节点所对应的可用数据块中,则根据第一预设公式确定索引块中的索引信息,该第一预设公式为:X=a-b,其中,X为索引块中的索引信息,a为内部数据个数,b为索引节点中的尾部余块。
S304、根据第二预设公式计算数据的偏移位置,该第二预设公式为:Y=c+d*e+f*X,其中,c为数据块偏移地址,d为数据块大小,e为索引节点中描述的物理块号,f为内部数据块大小。
S305、将待写入小文件写入到可用数据块中对应的数据的偏移位置,并对应的更新索引节点中的尾部余块和总共余块。
S306、待写入小文件写入后,将文件索引节点写入到磁盘。
例如:假设写入文件的大小为48K,文件***的数据块的大小为64M,内部数据块大小为32K。
获取到文件索引节点信息,将文件写入到文件索引节点中的索引节点,获取方法,遍历这个索引节点列表,查找一个没有占位的文件节点,并标记该节点占位。索引块中的索引信息为=(内部数据块个数inner_block_nums-索引节点中尾部余块),文件大小为48K。将该文件的数据内容按照下面的方式计算。数据的偏移位置=数据块偏移地址data_block_offset+block_size*索引节点中描述的物理块号+内部数据块大小inner_block_size*(内部数据块个数inner_block_nums-索引节点中的尾部余块)。写入实际的数据大小。然后将索引节点中的尾部余块=尾部余块+(文件大小48K+inner_block_size-1)/inner_block_size。总共余块=总共余块+(文件大小48K+inner_block_size-1)/inner_block_size。
另外,在写文件的时候,需要预先计算这个数据块是否能够装下这个文件。计算方法为:该索引节点的尾部余块*inner_block_size。若这个值比文件大小大,即可以保证能够连续存储这个文件了。否则就要另外换一个数据块存储该文件内容了。
文件内容写入后,然后将索引信息写入到磁盘。索引的寻址方法:index_table_offset+索引节点的序号*(索引节点的大小或扇区大小)。
本发明实施例中对于所有数据的寻址方式为直接寻址,是根据超级块中的记录的索引节点信息以及数据块的偏移地址来计算出数据存储的地址。如:用户要读取第i个索引节点第j个文件所对应的的数据的过程:
1、获取第i个索引节点信息,本发明实施例不限于上面的预读取,也可以按照下面的方法直接寻址获取第i个索引节点的信息。
根据超级块中存储的索引信息偏移地址(index_table_offset)与单个索引节点的大小比如为64k,计算出第i个索引节点信息的偏移地址,并将该索引节点读取出来。计算方式为:index_table_offset+i*64K,但不限于该算法,索引的存储也可以是根据扇区的大小进行存储的。具体的,按照扇区方式存储:一个索引节点占用一个扇区,一般一个扇区的大小为512KB,那么若按照扇区存储,这里的计算方式为index_table_offset+i*扇区的大小。
2、获取该索引节点中的第j个索引块,j大于等于0,且小于总的索引块,本发明实例中总的索引块个数为2048。
3、获取该索引节点中的物理块号,同时获取该索引块中的文件索引以及文件的大小,并计算数据的偏移地址,直接读取数据块中的数据。
根据该索引节点中的物理块号x和文件索引y,和超级块中记录的数据块偏移地址(data_block_offset),数据块的大小(block_size)以及内部数据块大小(inner_block_size),计算出该数据块的偏移量,读取数据,其中,数据的偏移地址计算方式如下:data_block_offset+block_size*x+inner_block_size*y,读取大小是根据索引块中的文件的大小来读取。
文件数据的读取与写入都是基于此寻址方式进行的,根据文件对应的索引节点和索引块信息,计算得到数据存放的地址,即可读取或写入数据。
可以看出,寻址方式简单,它是一种直接寻址方式,相较于现有的文件***对于小文件的间接寻址尤其是三级间接寻址,本发明实施例对于小文件的直接寻址速度要快很多,进而加快了文件***的读写的性能。
如图4所示,本发明实施例还公开了一种小文件的删除方法,应用于小文件存储的文件***,该方法具体包括如下步骤:
S401、确定待删除小文件在磁盘上的索引节点以及待删除小文件的索引块;
S402、将待删除小文件对应的索引块中的文件占位标志为0;
S403、将索引节点中的删文件数自增1,并对索引节点进行更新。
如图5所示,本发明实施例提供了一种数据块的碎片整理方法,应用于小文件存储的文件***,该方法具体包括如下步骤:
S501、根据索引节点中的总共余块和尾部余块确定数据块内部是否需要进行碎片整理。
S502、当总共余块大于尾部余块时,确定数据块内部需要进行碎片整理,遍历所有索引块,获取索引块中所有有效文件以及所有有效文件对应的数据块大小;
S503、将所有的有效文件的数据按照预设规则进行移动整理,并对索引节点进行更新。
针对本设计磁盘不会大面积产生碎片。所有的碎片都是在数据块内部的碎片。当文件存在文件添加、文件删除、这个数据块内部就会存在可以腾出来使用的空洞。首先我们使用索引节点中的总共余块-尾部余块可以确定数据块内部是否需要整理。若该值大于0,则表示需要碎片整理,否则不需要碎片整理。
该碎片整理不需要额外的磁盘空间来备份数据,只需要一个大小和磁盘数据开大小相同的内存空间,本发明的实例为64M的空间。
假设获取到了一个索引节点以及该索引节点下的索引块列表。
首先计算该数据块内部是否存在碎片,若无,退出,否则继续。
遍历索引块,获取到所有索引块中有效的文件,即该文件没有被删除。获取所有文件的所有的数据块大小,将所有的文件的内容挨个向前移动。并重新将文件的索引更新。更新完毕后,索引节点中的写文件数-删文件数,记录为写文件数,删文件数设置为0,尾部余块和总共余块重新进行设置。最后将这个数据块重新写入到该数据块的对应位置即可。
具体的碎片整理方法如下:
假设数据块大小为64M,内部数据块大小为32K,总共余块为2037,尾部余块为2028,首先使用一个表格来说明,加深理解:
索引块ID | 文件索引 | 文件大小 | 内部数据块数量 | 占用的内部数据块 |
1 | 1 | 11K | 1 | 1 |
3 | 4 | 40K | 2 | 4、5 |
5 | 6 | 102K | 4 | 6、7、8、9 |
10 | 10 | 65K | 3 | 10、11、12 |
11 | 20 | 1K | 1 | 20 |
以上是整理之前的索引节点信息和索引块列表信息。
整理这个表首先我们的索引块的ID是固定的,即索引块列表中索引块序号。在碎片整理的时候,只需要整理索引块ID中的文件内容,使得文件在数据块中是连续存储的即可。
第一步:移动索引ID为1的数据内容,将内部数据块1的数据移动到内部数据块0上面,然后修改文件索引为0。得出下面的结果:
索引块ID | 文件索引 | 文件大小 | 内部数据块数量 | 占用的内部数据块 |
1 | 0 | 11K | 1 | 0 |
第二步:移动索引ID为3的数据内容,将内部数据块4移动到内部数据块1上,内部数据块5的数据移动到内部数据块2上,然后修改文件索引为该文件占用的内部数据块1,得出下面的结果:
索引块ID | 文件索引 | 文件大小 | 内部数据块数量 | 占用的内部数据块 |
1 | 0 | 11K | 1 | 0 |
3 | 1 | 40K | 2 | 1、2 |
第三步:移动索引ID为5的数据内容,将内部数据块6,7,8,9分别移动到对应的内部数据块3,4,5,6上,然后修改文件索引为该文件占用的内部数据块3,得出下面的结果:
索引块ID | 文件索引 | 文件大小 | 内部数据块数量 | 占用的内部数据块 |
1 | 0 | 11K | 1 | 0 |
3 | 1 | 40K | 2 | 1、2 |
5 | 3 | 102K | 4 | 3、4、5、6 |
以此类推,索引ID为10和11的内部数据块内容,将内部数据块10,11,12,20的内容分别移动到内部数据块7,8,9,10上面,并分别更新对应的文件索引为7和10,具体的参见下表:
索引块ID | 文件索引 | 文件大小 | 内部数据块数量 | 占用的内部数据块 |
1 | 0 | 11K | 1 | 0 |
3 | 1 | 40K | 2 | 1、2 |
5 | 3 | 102K | 4 | 3、4、5、6 |
10 | 7 | 65K | 3 | 7、8、9 |
11 | 10 | 1K | 1 | 10 |
将索引块整理完毕后,所有的文件的数据在数据块中是完全连续的,中间的空洞也因此被移动到后面。接下来更新该索引节点中的写文件数为5、删文件数为0、总共余块为2037以及尾部余块为2037。
最后,将该数据块的内容写入到对应的磁盘数据块中,同时将该索引节点的信息写入到对应的索引区域中。
需要说明的是,文件***格式化需要重置超级块部分以及对索引节点表信息进行初始化,索引节点表的信息初始化操作为:将索引节点中的索引块列表清除为0,逻辑块号从0开始序列化,物理块号也从0开始序列化,写文件数设置为0,删文件数设置为0,总共余块设置为inner_block_nums,尾部余块设置为inner_block_nums。只需要写这两部分到磁盘上即可完成格式化,格式化过程简单,快速。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括上述要素的物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (9)
1.一种小文件存储的文件***,其特征在于,包括:超级块区域、索引节点表区域、可用数据块区域和预留数据块区域,其中:
所述超级块区域包括超级块区域信息、索引区域信息和数据块区域信息,用于记录文件***的整体信息;
所述索引节点区域用于存储所述可用数据块区域中每个数据块所对应的索引节点,所述索引节点包括:逻辑块号、物理块号、写文件数、删文件数、总共余块、尾部余块以及文件索引的列表;
所述可用数据块区域和所述预留数据块区域以数据块为单位进行分割,其中:
所述可用数据块区域按照所述数据块的大小进行划分,且与所述索引节点一一对应,并按照预设规则进行编号,用于存储数据;
所述预留数据块区域与所述可用数据块区域的结构相同,所述预留数据块区域中的数据块个数按照磁盘格式化时设定的预设比例进行划分的,用于作为所述文件***后续数据块操作;
所述数据块按照预设规则划分为若干个内部数据块,且各个所述内部数据块的大小相同。
2.根据权利要求1所述的文件***,其特征在于,所述超级块区域信息包括:磁盘总空间、磁盘剩余空间、超级块偏移地址以及超级块分配空间。
3.根据权利要求1所述的文件***,其特征在于,所述索引节点信息包括:索引信息偏移地址、索引信息预留空间和单个索引接点大小。
4.根据权利要求1所述的文件***,其特征在于,所述数据块区域信息包括:数据块偏移地址、预留数据块偏移地址、数据块大小、数据块总个数、可用数据块个数、可用数据块空间、预留数据块个数、预留数据块空间、预留块比例、内部数据块大小以及内部数据块个数。
5.根据权利要求1所述的文件***,其特征在于,所述文件索引的结构包括:文件索引、文件标志、文件大小、校验信息以及占用标志。
6.一种小文件的写入方法,其特征在于,应用于小文件存储的文件***,该方法包括:
遍历索引节点列表,查找一个未占位的文件节点,并获取待写入小文件的文件索引节点;
预先根据预设公式确定待写入小文件是否能存储至所述文件索引节点所对应的可用数据块;
若是,根据第一预设公式确定索引块中的索引信息,所述第一预设公式为:X=a-b,其中,X为索引块中的索引信息,a为内部数据个数,b为索引节点中的尾部余块;
根据第二预设公式计算数据的偏移位置,所述第二预设公式为:Y=c+d*e+f*X,其中,c为数据块偏移地址,d为数据块大小,e为索引节点中描述的物理块号,f为内部数据块大小;
将所述待写入小文件写入到所述可用数据块中对应的所述数据的偏移位置,并对应的更新所述索引节点中的尾部余块和总共余块;
所述待写入小文件写入后,将所述文件索引节点写入到磁盘。
7.一种小文件的删除方法,其特征在于,应用于小文件存储的文件***,该方法包括:
确定待删除小文件在磁盘上的索引节点以及所述待删除小文件的索引块;
将所述待删除小文件对应的索引块中的文件占位标志为0;
将所述索引节点中的删文件数自增1,并对所述索引节点进行更新。
8.一种数据块的碎片整理方法,其特征在于,应用于小文件存储的文件***,该方法包括:
当确定数据块内部需要进行碎片整理时,遍历所有索引块,获取所述索引块中所有的有效文件以及所有的所述有效文件对应的数据块大小;
将所有的所述有效文件的数据按照预设规则进行移动整理,并对所述索引节点进行更新。
9.根据权利要求8所述的方法,其特征在于,还包括:
根据索引节点中的总共余块和尾部余块确定数据块内部是否需要进行碎片整理;
当所述总共余块大于所述尾部余块时,则确定所述数据块内部需要进行碎片整理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811314092.5A CN111143285A (zh) | 2018-11-06 | 2018-11-06 | 一种小文件存储文件***以及小文件处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811314092.5A CN111143285A (zh) | 2018-11-06 | 2018-11-06 | 一种小文件存储文件***以及小文件处理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111143285A true CN111143285A (zh) | 2020-05-12 |
Family
ID=70515887
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811314092.5A Pending CN111143285A (zh) | 2018-11-06 | 2018-11-06 | 一种小文件存储文件***以及小文件处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111143285A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111723056A (zh) * | 2020-06-09 | 2020-09-29 | 北京青云科技股份有限公司 | 小文件的处理方法、装置、设备和存储介质 |
CN112256650A (zh) * | 2020-10-20 | 2021-01-22 | 广州市百果园网络科技有限公司 | 存储空间管理方法、装置、设备及存储介质 |
CN112463724A (zh) * | 2020-11-05 | 2021-03-09 | 苏州浪潮智能科技有限公司 | 一种轻量级文件***的数据处理方法和*** |
CN112558873A (zh) * | 2020-12-14 | 2021-03-26 | 上海创米科技有限公司 | 嵌入式音视频数据存储、检索、删除方法及装置、存储器 |
CN113986838A (zh) * | 2021-12-28 | 2022-01-28 | 成都云祺科技有限公司 | 基于文件***的海量小文件处理方法、***及存储介质 |
CN114064588A (zh) * | 2021-11-24 | 2022-02-18 | 建信金融科技有限责任公司 | 存储空间调度方法及*** |
CN114327290A (zh) * | 2021-12-31 | 2022-04-12 | 科东(广州)软件科技有限公司 | 一种磁盘分区的结构、格式化方法和访问方法 |
-
2018
- 2018-11-06 CN CN201811314092.5A patent/CN111143285A/zh active Pending
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111723056A (zh) * | 2020-06-09 | 2020-09-29 | 北京青云科技股份有限公司 | 小文件的处理方法、装置、设备和存储介质 |
CN111723056B (zh) * | 2020-06-09 | 2024-04-30 | 北京青云科技股份有限公司 | 小文件的处理方法、装置、设备和存储介质 |
WO2022083287A1 (zh) * | 2020-10-20 | 2022-04-28 | 百果园技术(新加坡)有限公司 | 存储空间管理方法、装置、设备及存储介质 |
CN112256650A (zh) * | 2020-10-20 | 2021-01-22 | 广州市百果园网络科技有限公司 | 存储空间管理方法、装置、设备及存储介质 |
CN112256650B (zh) * | 2020-10-20 | 2024-05-31 | 广州市百果园网络科技有限公司 | 存储空间管理方法、装置、设备及存储介质 |
CN112463724A (zh) * | 2020-11-05 | 2021-03-09 | 苏州浪潮智能科技有限公司 | 一种轻量级文件***的数据处理方法和*** |
CN112463724B (zh) * | 2020-11-05 | 2022-07-12 | 苏州浪潮智能科技有限公司 | 一种轻量级文件***的数据处理方法和*** |
CN112558873A (zh) * | 2020-12-14 | 2021-03-26 | 上海创米科技有限公司 | 嵌入式音视频数据存储、检索、删除方法及装置、存储器 |
US11250888B1 (en) | 2020-12-14 | 2022-02-15 | Shanghai Imilab Technology Co., Ltd. | Flash memory and method for storing and retrieving embedded audio video data |
CN114064588A (zh) * | 2021-11-24 | 2022-02-18 | 建信金融科技有限责任公司 | 存储空间调度方法及*** |
CN114064588B (zh) * | 2021-11-24 | 2023-04-25 | 建信金融科技有限责任公司 | 存储空间调度方法及*** |
CN113986838A (zh) * | 2021-12-28 | 2022-01-28 | 成都云祺科技有限公司 | 基于文件***的海量小文件处理方法、***及存储介质 |
CN114327290A (zh) * | 2021-12-31 | 2022-04-12 | 科东(广州)软件科技有限公司 | 一种磁盘分区的结构、格式化方法和访问方法 |
CN114327290B (zh) * | 2021-12-31 | 2022-12-02 | 科东(广州)软件科技有限公司 | 一种磁盘分区的结构、格式化方法和访问方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11068455B2 (en) | Mapper tree with super leaf nodes | |
CN111143285A (zh) | 一种小文件存储文件***以及小文件处理方法 | |
US8315995B1 (en) | Hybrid storage system | |
US9063877B2 (en) | Storage system, storage controller, and method for managing mapping between local address and physical address | |
US9659047B2 (en) | Data deduplication utilizing extent ID database | |
CN108984420B (zh) | 管理非易失性存储器(nvm)中的多个名称空间 | |
US9727452B2 (en) | Distributing metadata across multiple different disruption regions within an asymmetric memory system | |
US10565125B2 (en) | Virtual block addresses | |
US7761648B2 (en) | Caching method for NAND flash translation layer | |
KR101813786B1 (ko) | Ssd 상의 기록-시-복사를 위한 시스템 및 방법 | |
US8793290B1 (en) | Metadata management for pools of storage disks | |
US9639275B2 (en) | Managing data within a storage device based on file system metadata | |
CN110678836A (zh) | 用于键值存储的持久性存储器 | |
US6697795B2 (en) | Virtual file system for dynamically-generated web pages | |
CN107239526B (zh) | 文件***实现方法、碎片整理方法、操作位置定位方法 | |
US8694563B1 (en) | Space recovery for thin-provisioned storage volumes | |
TW201301030A (zh) | 在一記憶體裝置中減少次要位址表檢查之快速轉譯指示器 | |
CN111522507B (zh) | 一种低延迟的文件***地址空间管理方法、***及介质 | |
US9355121B1 (en) | Segregating data and metadata in a file system | |
CN107016100A (zh) | 一种基于非易失性内存文件***的元数据管理方法 | |
CN111142780A (zh) | 一种大文件存储文件***以及大文件处理方法 | |
CN106844584B (zh) | 元数据结构和基于其的操作方法、定位方法、切分方法 | |
CN113568582B (zh) | 数据管理方法、装置和存储设备 | |
US8239427B2 (en) | Disk layout method for object-based storage devices | |
EP4336336A1 (en) | Data compression method and apparatus |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20200512 |
|
WD01 | Invention patent application deemed withdrawn after publication |