内存文件系统的多版本控制方法

文档序号:10512372阅读:336来源:国知局
内存文件系统的多版本控制方法【专利摘要】本发明提供了一种内存文件系统的多版本控制方法,基于混合异构内存文件系统HMFS,包括如下步骤:数据修改更新步骤:采用写时复制方式对内存文件系统的节点地址树进行多版本备份,并复用地址树中的节点进行数据修改和更新;数据共享步骤:采用层次引用计数实现多版本文件系统的元数据共享,其中元数据指为描述数据的数据,是实现多文件系统版本的记录数据。本发明利用未被修改的文件将文件系统恢复到文件修改之前,层次引用计数实现了多版本文件系统之间的文件共享,使文件系统进行快照时不需要对原文件系统的所有文件进行备份,从而减少文件系统快照所需的时空开销,提高文件系统的性能。【专利说明】内存文件系统的多版本控制方法
技术领域
[0001]本发明涉及计算机内存管理
技术领域
,具体地,涉及一种内存文件系统的多版本控制方法。【
背景技术
】[0002]文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NANDFlash的固态硬盘)或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。文件系统的功能包括:管理和调度文件的存储空间,提供文件的逻辑结构、物理结构和存储方法;实现文件从标识到实际地址的映射,实现文件的控制操作和存取操作,实现文件信息的共享并提供可靠的文件保密和保护措施,提供文件的安全措施。针对不同的使用环境和目的,存在着多种文件系统,如目前流行的windows系统使用的NTFS,LINUX使用的EXT4JTFS文件系统是一个基于安全性的文件系统,是WindowsNT所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。Ext2是GNU/Linux系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。[0003]基于非易失性存储器件的新型存储级内存SCM(StorageClassMemory)与传统内存相结合组成混合内存,可以在保持成本和能耗优势的前提下大幅提升内存容量,为大数据的高效实时处理提供支持,但也对系统软件的设计提出了新的挑战。非易失存储技术的出现和快速发展,带动了内存文件系统的发展。内存文件系统是一类将内存当作分区来使用的文件系统,基于外存储器的文件系统与外存的操作都是基于块的,而内存文件系统可以实现基于字节的操作,即内存文件系统具有更细的操作粒度。例如,当用户修改了文件中一个字节的数据时,传统文件系统需要写一个块的数据,而内存文件系统只需要写一个字节。还有非易失性内存可由CPU直接访问,而外存储器需要经过内存的缓冲才能被CPU处理。这些使内存文件系统相比传统文件系统具有大幅度的性能提升。[0004]目前,各类文件系统一般为了保证自身的稳定性,防止系统突然因断电等原因而崩溃引发文件系统的不一致,一般都具有文件系统的备份功能。文件系统的备份功能,也称为文件系统快照,就是将文件系统当时的情形记录下来,如同照相一样,日后用户可以将其载入并查看。例如,目前文件系统中有十个文件,我们先使用文件系统快照功能建立一张快照。之后我们可以删除文件,在目前文件系统中已经没有东西了。但如果将其载入,还是可以看到这些文件。简单来说,文件系统快照的功能就是记录当时文件系统的状态。将文件系统生成快照和从快照中恢复文件系统等一系列操作统称为文件系统多版本控制技术。不同的文件系统使用不同的多版本控制技术,这些技术之间有既有一些联系,也有各自的特点。现在主流的方法是采用数据库中的日志方式。日志类文件系统每次进行文件修改和新建等操作之前都会将这些操作写一个日志文件,当操作完成之后再标记这些日志条目为已完成。当文件系统因故障停止并再次启动系统后,文件系统会根据日志文件进行恢复。该方法能够保证文件系统的一致性,但当频繁修改和新建文件时,会写日志上花费大量额外时间,造成系统性能下降。其它的方法还有FAT文件系统的双FAT表,其中一份主写一份备份。当一份FAT表出现问题时,用另一份FAT表恢复。这种方法能进行快速的文件系统修复,但其缺点是只能生成一个文件系统副本。ZFS文件系统使用写时复制技术和B树进行无限快照,但随着B树不断增长,文件系统性能会不断下降。现在的文件系统多版本控制技术由于传统文件系统的限制等原因都对文件系统性能有所影响,不适合用于新型的内存文件系统。【
发明内容】[0005]针对现有技术中的缺陷,本发明的目的是提供一种内存文件系统的多版本控制方法。[0006]根据本发明提供的内存文件系统的多版本控制方法,基于混合异构内存文件系统,简称HMFS文件系统,包括如下步骤:[0007]数据修改更新步骤:采用写时复制方式对HMFS文件系统的节点地址树NAT进行多版本备份,并复用节点地址树NAT中的节点进行数据修改和更新;[0008]数据共享步骤:采用层次引用计数实现多版本文件系统的元数据共享,其中元数据指为描述数据的数据,即用于实现HMFS文件系统多版本的记录数据。[0009]优选地,所述混合异构内存文件系统是指基于动态随机存取存储器DRAM和非易失性存储器NVM的一种文件系统,能够实现字节大小的存储数据修改和CPU的访问;HMFS文件系统使用写时复制方式进行数据修改更新,利用层次引用计数进行数据共享;[0010]具体地,HMFS文件系统将数据存储在NVM里,在NVM中,HMFS文件系统将NVM分为固定大小的段,段是HMFS文件系统的基本管理单元,每个段又由512个4KB的块组成;HMFS文件系统将NVM分为7个逻辑结构;[0011]其中,所述7个逻辑结构为:超级块、段信息表、块信息表、检查点、节点、数据块、节点地址树;其中,[0012]所述超级块记录了HMFS文件系统的基本信息,所述基本信息包括:HMFS文件系统有多少版本及版本位置,NVM已经使用了多少空间;[0013]所述段信息表、块信息表分别记录了NVM中段、块是否已经存储了信息;[0014]所述检查点是HMFS文件系统的版本的记录点,一个检查点象征一个HMFS文件系统的版本;[0015]所述节点包括:索引节点、直接索引节点和间接索引节点三种类型,其中,间接节点又分为一级间接节点和二级间接节点;节点都有唯一的节点ID,节点ID能通过节点地址树NAT转换成节点的块地址;[0016]所述数据块是存储用户数据的基本存储单元;[0017]所述节点地址树NAT用于将节点的唯一节点ID与该节点的实际存储地址的映射关系存储到节点地址树NAT中。[0018]优选地,当HMFS文件系统需要读取某已知目录下的某文件时,还包括读取步骤:[0019]I)从目录中找出该文件的索引节点的节点ID;其中,所述索引节点是指:节点中的一种,记录了文件名、文件的最后修改时间、文件的最后访问时间,每个文件有且仅有一个索引节点。[0020]2)通过节点地址树NAT将节点ID转换成数据块地址;块是指:NVM最小储存单元,数据块是存储用户数据的块;[0021]3)读取索引节点;[0022]4)从索引节点中的直接指针直接获得内联数据或数据块,或者从间接指针经节点地址树数次转换,最后获得数据块。[0023]优选地,还包括数据写入步骤:[0024]当需要写数据时,先将更新数据写入一个新的数据块,当更新数据写入成功之后,再将更新数据块地址插入到原文件的索引地址列表中。[0025]优选地,当新建或修改一个叶节点后,生成检查点以及一颗新树,所述检查点简称CP,每一个CP代表了一个HMFS文件系统的版本;所述新树除新建或修改叶节点到根节点路径上的节点外的所有节点与旧树共享原有的节点;则不同的HMFS文件系统的版本通过不同CP中的节点地址树NAT,能够将同一个节点ID映射到不同的数据块,从而实现了HMFS文件系统的多版本控制。[0026]优选地,还包括文件系统生成快照步骤:[0027]步骤il:HMFS文件系统发出产生文件系统快照的命令;[0028]步骤i2:根据内存中修改和新建的文件,生成节点地址树节点和相应的节点地址树NAT;[0029]步骤i3:HMFS文件系统在主区域生成相应的CP块,CP块中有节点地址树根节点地址信息;[0030]步骤i4:将该CP加入超级块的CP列表。[0031]与现有技术相比,本发明具有如下的有益效果:[0032]1、根据本发明提供的HMFS内存文件系统的多版本控制方法,利用未被修改的文件将文件系统恢复到文件修改之前,层次引用计数实现了多版本文件系统之间的文件共享,使文件系统进行快照时不需要对原文件系统的所有文件进行备份,从而减少文件系统快照所需的时空开销,提高文件系统的性能。[0033]2、根据本发明提供的内存文件系统的多版本控制方法能够同时拥有并控制多个不同时间产生的多个文件系统版本,并能够快速实现文件系统不同版本之间的切换;由于使用了COW技术,大大减少了文件系统快照所需时间,不仅减少了文件系统的快照对存储空间的占用,而且提高了文件系统的性能。【附图说明】[0034]通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:[0035]图1是HMFS文件系统的平面布局示意图。[0036]图2是HMFS文件系统的索引节点结构示意图。[0037]图3是层次引用计数技术的引用树示意图。[0038]图4是层次引用计数技术修改节点后的引用树示意图。[0039]图5是层次引用计数技术删除一颗树后的引用树示意图。[0040]图6是HMFS文件系统的抽象结构示意图。[0041]图7是HMFS文件系统结合层次引用的结构示意图。[0042]图8是文件系统生成快照的流程示意图。【具体实施方式】[0043]下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。[0044]本发明是基于混合异构内存文件系统(HybridMemoryFileSystem,HMFS),文件系统的多版本控制技术不能脱离文件系统而单独存在。HMFS是基于动态随机存取存储器(DynamicRandomAccessMemory,DRAM)和非易失性存储器(Non-VolatileMemory,NVM)的一种新型文件系统。HMFS将数据存储在NVM里,能够实现字节大小的存储数据修改和CPU的快速访问。HMFS使用写时复制技术进行数据修改更新,层次引用计数技术进行数据共享。[0045]HMFS的多版本控制技术应用了HMFS的写时复制(Copy-On-Write,C0W)和层次引用计数技术。COW技术保证了当我们对一个文件进行修改时,不会直接修改到原数据,只是修改文件的一个副本,然后在一块新的存储区域保存修改后的文件。如果原数据属于一个某时刻创建的文件系统版本,修改不会对原数据产生不可恢复的影响。[0046]具体地,HMFS是一种基于DRAM和NVM(非易失性存储器)混合文件系统。在NVM中,文件系统将整个存储器分为固定大小的段。段是HMFS文件系统的基本管理单元,并决定了文件系统的元数据布局。每个段又由512个4KB的块组成。HMFS将整个存储器分为7个逻辑结构。其中3个是文件系统的元数据:[0047]超级块(superblock,SB):超级块如图1所示,是固定于文件系统开始的位置。文件系统拥有两个超级块,两个超级块轮流使用。这是因为当操作系统启动后,系统内核会把超级块中的内容复制到内存中,并周期性地利用内存里的最新内容去更新硬盘上的超级块中的内容。由于这个更新存在一个时间差,为此内存中的超级块信息与硬盘中的超级块信息往往只有在开机与关机的某个特定时刻是同步的;而在其他时间都是不同步的。假设当操作系统意外关机或者因为断电而造成的意外事故时,内存中的超级块信息没有及时保存到存储介质中,此时文件系统的完整性就会受到破坏。两块保证了文件系统故障导致当前超级块无法使用时,文件系统可以使用另一个超级块。形象的说,超级块就是文件系统的心脏。它包含了文件系统的所有基本信息,包括系统已用空间,段的总数量,块的总数量,检查点列表等。文件系统挂载就是从超级块开始读取信息。当操作系统启动后,系统内核会把超级块中的内容复制到内存中,并周期性的利用内存里的最新内容去更新硬盘上的超级块中的内容。[0048]段信息表(segmentinformat1ntable,SIT):它包含了段管理的相关信息,包括段的有效块数量和段最后修改的时间戳。这些信息能用来进行段分配和垃圾回收。[0049]块信息表(blockinformat1ntable,BIT):它包含块管理的相关信息,包括block的父节点的nodeID号。[0050]这三个结构的位置是固定的,如图1中的超级块、段信息表、块信息表。另外的四个段随机分布于主区域内。这四个结构如下:[0051]检查点(checkpoint,CP):每一个检查点代表了一个文件系统的版本。它包括该文件系统版本的时间和索引节点(inode)等信息。检查点是通过超级块中的检查点列表来定位,可以通过检查点来定位与它相应的NAT树。[0052]节点(node):HMFS文件系统的节点包括索引节点、直接索引节点和间接索引节点三种类型,其中间接节点又可分为一级间接和二级间接。节点都有唯一的节点ID,该ID能通过节点地址树转换成节点的块地址。其中索引节点保存了文件修改时间、拥有者等属性。每个索引节点如图2所示都有数个指向数据块的指针、一个指向直接索引节点的指针、一个指向一级间接索引节点的指针和一个指向二级间接索引节点的指针。直接索引节点中的数据直接指出下级数据块的块地址,而间接索引节点保存了下级节点的节点ID,对于一级间接索引节点下级节点是直接节点,二级间接索引节点下级节点是一级间接索引节点。在文件很小的情况下,该文件相应的索引节点内直接指向数据块的指针空间可以直接存放数据,称该数据为内联数据。该方法节省了为文件分配数据块的空间,在读取数据是也不用再通过指针去访问数据块,提高了小文件的访问速度。[0053]数据块(datablock):数据块保存了文件内容,数据块只能由索引节点内的直接指针和直接索引节点定位。[0054]节点地址树(NodeAddressTree,NAT):它的作用是将节点ID转换为块地址。节点地址树逻辑结构是B树。节点地址树是固定使用4层的树结构,树的前三层是中间节点,用于索引处于第四层的叶子节点。叶子节点存储着节点ID和块地址的映射。节点地址树用了其中27位来定位到叶子节点,即树中前三层节点固定有512个子节点,占用9位。但节点地址树中的节点只有在文件系统用到相应的节点ID才会为叶子节点和中间节点实际分配空间。所以节点地址树有多节点不存在,不会占用大量空间。[0055]当HMFS文件系统需要读取某已知目录下的某文件时,需要以下步骤:[0056]I)从目录中找出该文件的索引节点的节点ID;[0057]2)经节点地址树,将节点ID转换成块地址;[0058]3)读取索引节点;[0059]4)从索引节点中的直接指针直接获得内联数据或数据块,从间接指针经节点地址树数次转换,最后获得数据块。[0060]下面介绍多版本控制的两个核心技术:写时复制(COW)和层次应用计数。COW是一个被使用在程式设计领域的最佳化策略。其基础的观念是,如果有多个调用者同时要求相同资源,他们会共同取得相同的指标指向相同的资源,直到某个调用者尝试修改资源时,系统才会真正复制一个副本给该调用者,以避免被修改的资源被直接察觉到,这过程对其他的调用只都是透明的。此作法主要的优点是如果调用者并没有修改该资源,就不会有副本被建立。具体到文件系统,即每次写数据时,先将更新数据写入一个新的块,当新数据写入成功之后,再更新相关的数据结构指向新块。使用COW技术后,对文件进行修改后,原文件数据不会被破坏。如果原文件数据不被系统回收,可以通过适当的方法,将原文件保存下来。[0061]层次引用计数就是在COW技术下保存修改文件的原文件的一种机制。由于文件系统存在多给版本,给每个文件块一个计数变量,表示这个数据块存在于多个文件系统版本中,但该计量数不等价于文件存在的文件系统版本数。当一个文件块的引用数为O时,文件系统的垃圾回收机制就会回收该块和该块下级的数据块。层次引用计数使多个版本文件系统能够共用大部分文件,减少了文件系统快照的时空消耗。为了实现高效率的引用数修改,层次引用计数有一套相应的引用计数的修改方法。[0062]层次引用计数是基于B树的,所以所有文件操作都来源于叶节点。当新建或修改一个叶节点后,做CP时会产生一颗新树。新树除该叶节点到根节点路径上所有节点外与旧树共享其它节点。引用数的更新从下到上,方法类似于递归。首先新产生的节点的引用数为I,然后原树中修改的节点的兄弟节点引用数加I。然后相同的递归处理其新节点的新父节点。[0063]当删除一个版本时时,我们从上向下处理。从版本根CP块开始,如果一个节点的引用数为I,该节点数引用数改为0,递归处理该节点的子节点。如果一个节点的引用数大于I,则该节点引用数减I,由于该节点仍然在被使用,它的子节点不需要再处理。[0064]更进一步地,如图3所示,该树代表一个文件系统的NAT树,每个节点内前一个字母代表该节点名称,后一个数字代表该节点的引用数。图3中的所有节点的引用数都为I表示,该文件系统版本是独立存在的,与其它文件系统无共享文件。图4是修改图1中D节点后的结果。可以看出,产生了以Q节点为根节点的新树。图5是删除以P为根节点的树后的结果。删除该树,首先根节点引用置零。其子节点为处理时E引用为2,F引用为I。所以E引用减一为1,不需处理其子节点A和B;F引用减一为0,在处理其子节点C和D,最后C的引用为I,D的引用为O。[0065]本发明中的文件系统的多版本控制技术就是将层次引用计数功能应用在NAT树。如图6所示,NAT从根节点到叶子节点总共四层。NAT树固定为四层,一个nodeID占32位。NAT树用了其中27位来定位到叶子节点,即树中前三层节点固定有512个子节点,占用9位。但NAT中的节点只有在文件系统用到相应的NodeID才会实际分配空间,所以NAT树中很大一部分不存在的。不同的文件系统版本通过不同CP中的NAT树,可以将同一个nodeID映射到不同的块,从而实现了文件系统的多版本控制。不同的文件系统版本可以相互之间共用NAT树中的节点。如图7所示,两棵NAT树共用了大部分的NAT节点。[0066]文件系统生成快照的流程如图8所示。首先文件系统发出产生文件系统快照的命令。第二部,根据内存中修改和新建的文件,生成节点地址树节点和相应的节点地址树。第三步,文件系统在主区域生成相应的CP块,CP块中有节点地址树根节点地址信息。最后,将该CP加入超级块的CP列表。[0067]—个节点地址树代表一个文件系统版本,当文件系统进行快照时,系统生成并存储一个新的节点地址树。通常情况下,文件系统的变化是一个持续而缓慢的过程,每次生成的节点地址树会与前一个版本的节点地址树节点共享大量的节点,只会产生少量的新节点,所以新增一个文件系统快照所需消耗的时间和空间都很少。当文件系统需要恢复某个文件系统版本时,文件系统只需要将正在使用的节点地址树换成恢复版本的节点地址树。更换节点地址树主要是更换节点地址树的根节点,然后缓存部分节点地址树节点。使用新的节点地址树后,每次打开一个文件目录,都会根据节点地址树去寻找对应的文件。由于文件系统的恢复只是对节点地址树的替换,所以文件系统可以实现快速恢复。[0068]快照的建立通过在fsync系统调用时自动产生,而后台进程会自动删除时间戳在一天之前建立的快照,只保留下用户声明需要长期保存的快照。这些存留下来的快照通常是用户所急切需要的,同时也能满足用户对于系统短期和长期恢复的需求。[0069]本发明是一个基于HMFS文件系统功能和特性的文件系统的多版本控制技术,实现了高效的文件系统多版本控制功能。通过后台进程的创建和清理,系统中保存了大量有效的快照。同时由于快照间的结构为相对独立的树结构,文件系统能快速恢复至某个快照。[0070]以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。【主权项】1.一种内存文件系统的多版本控制方法,其特征在于,基于混合异构内存文件系统,简称HMFS文件系统,包括如下步骤:数据修改更新步骤:采用写时复制方式对HMFS文件系统的节点地址树NAT进行多版本备份,并复用节点地址树NAT中的节点进行数据修改和更新;数据共享步骤:采用层次引用计数实现多版本文件系统的元数据共享,其中元数据指为描述数据的数据,即用于实现HMFS文件系统多版本的记录数据。2.根据权利要求1所述的内存文件系统的多版本控制方法,其特征在于,所述混合异构内存文件系统是指基于动态随机存取存储器DRAM和非易失性存储器NVM的一种文件系统,能够实现字节大小的存储数据修改和CPU的访问;HMFS文件系统使用写时复制方式进行数据修改更新,利用层次弓I用计数进行数据共享;具体地,HMFS文件系统将数据存储在NVM里,在NVM中,HMFS文件系统将NVM分为固定大小的段,段是HMFS文件系统的基本管理单元,每个段又由512个4KB的块组成;HMFS文件系统将NVM分为7个逻辑结构;其中,所述7个逻辑结构为:超级块、段信息表、块信息表、检查点、节点、数据块、节点地址树;其中,所述超级块记录了HMFS文件系统的基本信息,所述基本信息包括:HMFS文件系统有多少版本及版本位置,NVM已经使用了多少空间;所述段信息表、块信息表分别记录了NVM中段、块是否已经存储了信息;所述检查点是HMFS文件系统的版本的记录点,一个检查点象征一个HMFS文件系统的版本;所述节点包括:索引节点、直接索引节点和间接索引节点三种类型,其中,间接节点又分为一级间接节点和二级间接节点;节点都有唯一的节点ID,节点ID能通过节点地址树NAT转换成节点的块地址;所述数据块是存储用户数据的基本存储单元;所述节点地址树NAT用于将节点的唯一节点ID与该节点的实际存储地址的映射关系存储到节点地址树NAT中。3.根据权利要求2所述的内存文件系统的多版本控制方法,其特征在于,当HMFS文件系统需要读取某已知目录下的某文件时,还包括读取步骤:1)从目录中找出该文件的索引节点的节点ID;其中,所述索引节点是指:节点中的一种,记录了文件名、文件的最后修改时间、文件的最后访问时间,每个文件有且仅有一个索引节点;2)通过节点地址树NAT将节点ID转换成数据块地址;块是指:NVM最小储存单元,数据块是存储用户数据的块;3)读取索引节点;4)从索引节点中的直接指针直接获得内联数据或数据块,或者从间接指针经节点地址树数次转换,最后获得数据块。4.根据权利要求2所述的内存文件系统的多版本控制方法,其特征在于,还包括数据写入步骤:当需要写数据时,先将更新数据写入一个新的数据块,当更新数据写入成功之后,再将更新数据块地址插入到原文件的索引地址列表中。5.根据权利要求2所述的内存文件系统的多版本控制方法,其特征在于,当新建或修改一个叶节点后,生成检查点以及一颗新树,所述检查点简称CP,每一个CP代表了一个HMFS文件系统的版本;所述新树除新建或修改叶节点到根节点路径上的节点外的所有节点与旧树共享原有的节点;则不同的HMFS文件系统的版本通过不同CP中的节点地址树NAT,能够将同一个节点ID映射到不同的数据块,从而实现了HMFS文件系统的多版本控制。6.根据权利要求2所述的内存文件系统的多版本控制方法,其特征在于,还包括文件系统生成快照步骤:步骤il:HMFS文件系统发出产生文件系统快照的命令;步骤i2:根据内存中修改和新建的文件,生成节点地址树节点和相应的节点地址树NAT;步骤i3:HMFS文件系统在主区域生成相应的CP块,CP块中有节点地址树根节点地址信息;步骤i4:将该CP加入超级块的CP列表。【文档编号】G06F17/30GK105868396SQ201610244082【公开日】2016年8月17日【申请日】2016年4月19日【发明人】黄林鹏,朱燕民,沈艳艳,梅宏,郑圣安,金伟潼【申请人】上海交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1