在文件系统保持活动状态的同时转换文件系统的方法

文档序号:6654865阅读:173来源:国知局
专利名称:在文件系统保持活动状态的同时转换文件系统的方法
技术领域
本发明涉及计算机文件系统,更具体地,涉及将一种文件系统类型转换成另一种文件系统类型。
背景技术
随着计算机及其相关存储能力的进步,其底层文件系统结构可以在操作系统的性能和可靠性方面起到重要作用。通常,文件系统包括如文件的许多对象,这些文件连同与这些文件的布置和位置有关的元数据一起存储在计算机系统上。在UNIX变体(variant)系统中,通常将文件系统视为从根目录生长出的多个目录和文件的层级布置。通常将这种布置视为倒置树,其中多个目录、子目录以及文件从根目录向下延伸,最终延伸到叶节点。在基于现代图形用户界面的操作系统内,通常将文件系统视为多个文件夹的布置,其可以是或者可以不是分层布置的。
文件系统的实际内部结构及其实现通常对计算机系统的用户来说是隐藏的。例如,早期的UNIX文件系统包括这样的目录结构,即,其类似于具有名称与信息节点编号(inode)的多个匹配对的表。信息节点编号本身指向信息节点表中的相应的条目,该信息节点表使得操作系统可以从物理存储介质中查找并检取该文件。因此,文件和目录实际上并不是分级地布置在存储这些文件和目录的物理介质上;而是文件系统结构给用户提供了这种表象。因此,通常,将目录视为具有多个条目的表,每个条目都包括对象名和“锚定(anchor)”点。通过访问该锚定点,操作系统可以定位到目录条目中的所指对象。
随着操作系统和文件系统的发展和变化,已经产生了用户对能够改变文件系统结构(即,从一种类型的文件系统改变成另一种类型)以获得这种发展的好处的需求。例如,在一个流行的操作系统的发展过程中,文件系统类型已从FAT16变化到FAT32,再到NTFS。虽然当引入一种新的文件系统类型时,能够要求客户对它们的所有软件和文件进行彻底的重新安装,但是这会存在许多缺点。这种任务的成本、耗时以及复杂性可能会使得许多客户避免进行升级处理,即使这可能是有益的。
因此,已对用于将文件系统从一种类型更新成另一类型的自动方法进行了开发,以使得转换处理对用户来说更容易。每个不同的操作系统都具有它自己的已开发出的文件系统转换处理。例如,HP-UX、Solaris、AS/400以及Windows均支持这样的特定文件系统和目录结构,即,当对它们进行更新时,它们需要特定的转换程序来对文件系统类型或结构进行更新。在过去,所有这些不同的文件系统转换处理都存在重大的缺点它们要求用户在升级文件系统时关闭文件系统。因此,当对文件系统进行转换时,用户不能使用受影响的计算机系统来执行其他操作,这导致了操作停机期,并且往往会增加成本。
一种用于转换文件系统的另选方式被称为“第一触摸(firsttouch)”转换。该文件系统转换方法避免了如上所述的关闭整个文件系统,但是带来了它自己的一系列问题。在第一触摸处理中,在提供了新文件系统类型之后操作系统辨识到何时第一次“触摸”到一文件对象。然后操作系统停止其处理并将该文件系统对象转换成新文件系统类型。该类型的转换处理会导致在访问某些文件对象时产生很大的延迟,并且可能出错。例如,如果打开具有大量文件的目录以进行读取,则该打开处理会暂停,直到已将该整个目录转换成新文件系统类型。因此,每当第一次遇到需要被转换的文件系统对象时,用户都会看到劣化的性能。其次,该处理逻辑并不确保对文件系统内的所有文件对象进行转换。只有那些被触摸了的文件对象才会被转换。因此,操作系统必须继续支持两种类型的文件系统结构,即使一种类型比另一类型低效。
因此,存在对文件系统结构和操作系统的未得到满足的以下需求,即,允许在文件系统保持活动的同时,对文件系统类型进行转换,以使得不中断对文件系统的操作和访问。

发明内容
因此,本发明的实施例涉及一种文件系统转换处理,其不要求关闭文件系统以执行该转换,确保了对该文件系统内的所有对象进行转换,并且,从用户的观点来看,不会影响文件系统的性能和操作。
本发明的一个方面涉及一种用于将文件系统从第一类型转换成第二类型的方法。根据该方面,在将所述文件系统保持为活动状态的同时,执行转换处理,以将所述文件系统中的每个第一类型目录转换成第二类型,然后在已将所述文件系统中的每个第一类型目录转换成第二类型时结束所述转换处理。
本发明的另一方面涉及用于将文件系统从第一类型转换成第二类型的另一方法。根据该方面,创建待转换的所述文件系统中的第一类型目录的列表;然后在将所述文件系统保持为活动状态的同时将所述列表中的每个目录转换成第二类型。


以下仅以示例的方式参照附图对本发明的优选实施例进行描述,在附图中图1例示了其上可以实现本发明的实施例的示例性计算机系统;图2示出了作为树形图的示例性文件系统结构;图3示出了根据本发明一优选实施例的用于在文件系统保持活动的同时对文件系统进行转换的示例性算法的流程图;图4示出了根据本发明一优选实施例的用于运行图3的转换处理的示例性方法的更详细的流程图;图5示出了根据本发明一优选实施例的用于建立文件系统中的待转换目录的列表的示例性算法;
图6A示出了另一示例性文件系统;图6B示出了图6A的文件系统的目录列表,由根据本发明一优选实施例的图5的示例性算法生成该目录列表;图7示出了本发明一示例性实施例的用于将文件系统从一种类型转换成另一类型的流程图;图8示出了在文件系统转换过程中激活新目录的示例性方法的详细流程图;图9A到9F示出了在根据图7和图8的算法对示例性文件系统进行转换时该示例性文件系统的一系列快照(snapshot);图10示出了与文件对象相对应的示例性数据结构;以及图11示出了与目录对象相对应的示例性数据结构。
具体实施例方式
如上所述,以下讨论的实施例使用了一种支持在文件系统保持运行的同时将文件系统从一种类型自动转换成另一类型的文件系统转换处理或软件应用。以下对能够按与本发明优选实施例相一致的方式支持该功能的这种转换处理的具体实现进行更为详细的讨论。然而,在讨论这种具体实现之前,针对其中可能应用这种处理的示例性硬件和软件环境进行简要的讨论。
下面参照附图,其中在几个图中相似的标号表示相似的部分,图1例示了适合于实现与本发明优选实施例相一致的文件系统转换处理的设备10的示例性硬件和软件环境。设备10实际上可以代表任何类型的计算机、计算机系统或其他可编程电子设备,包括客户计算机、服务器计算机、便携式计算机、手持计算机、嵌入式控制器等。此外,例如,在机群(cluster)或其他分布式计算系统中,可以使用一个或更多个网络计算机来实现设备10。以下也将设备10称为“计算机”,但是应当理解术语“设备”也可以包括其他合适的可编程电子设备。
典型地,计算机10包括耦合到存储器14的至少一个处理器12。处理器12可以代表一个或更多个处理器(例如,微处理器),存储器14可以代表随机存取存储器(RAM)设备,包括计算机10的主存储装置(storage),以及任何补充级别的存储器,例如,高速缓冲存储器、非易失性或备用存储器(例如,可编程或闪速存储器)、只读存储器等。此外,可以认为存储器14包括在物理上位于计算机10的其他位置的存储装置(例如,位于处理器12中的任何高速缓冲存储器),以及用作虚拟存储器的任何存储容量,例如,存储在大容量存储装置16上或存储在通过网络18耦合到计算机10的另一计算机(例如,客户机20)上的存储容量。
典型地,计算机10还接收许多输入和输出,以与外部交流信息。对于与用户或操作员的接口,典型地,计算机10包括一个或更多个用户输入装置22(例如,键盘、鼠标、跟踪球、操纵杆、触摸垫和/或麦克风等)和显示器24(例如,CRT监视器、LCD显示板和/或扬声器等)。或者,可以通过在网络18上或经由专用工作站接口等与计算机10相连接的另一计算机(例如,计算机20)来接收用户输入。
作为附加存储器,计算机10还可以包括一个或更多个大容量存储装置16,例如,软盘或其他可移除硬盘、硬盘驱动器、直接访问存储装置(DASD)、光驱(例如,CD驱动器、DVD驱动器等)和/或磁带机等。此外,计算机10可以包括与一个或更多个网络18(例如,LAN、WAN、无线网络和/或因特网等)的接口,以允许与耦合到网络的其他计算机交流信息。应当理解,如在现有技术中公知的,典型地,计算机10包括在处理器12与组成部分14、16、18、22以及24中的每一个之间的合适的模拟和/或数字接口。
计算机10在操作系统30的控制下进行操作,并执行或依靠各种计算机软件应用、组件、程序、对象、模块、数据结构等(例如,数据库管理系统32和数据库34等)。此外,各种应用、组件、程序、对象、模块等也可以在例如分布式或客户机服务器计算环境中,在通过网络18耦合到计算机10的另一计算机中的一个或更多个处理器上执行,由此可以将实现计算机程序的功能所需的处理分配给网络上的多个计算机。操作系统30的一部分是对定义了在系统的物理存储介质上如何存储和布置数据的文件系统类型的实现。将操作系统30视为在文件系统上运行并利用关于该实现的知识来正确地访问文件系统内的数据。文件系统数据是指操作系统30可以访问的数据,而文件系统类型是指对如何并且在何处存储和布置数据的规定。如以下更详细讨论的,本发明的实施例涉及用于将一个文件系统实现类型改变成另一类型的处理。
如与其他软件应用一样,可以将其他硬件组件并入系统10中。通常,这里将被执行以实现本发明的实施例的例程(可以被实现为操作系统的一部分或特定应用、组件、程序、对象、模块或指令序列,甚至是其子集)称为“计算机程序代码”或简称为“程序代码”。典型地,程序代码包括在不同的时间驻留在计算机的各种存储器和存储装置中的一个或更多个指令,并且,当由计算机中的一个或更多个处理器来读取和执行时,这些指令使得该计算机执行对于执行实现了本发明的各个方面的步骤或要素所需的步骤。此外,尽管已经并且以下还将在全功能计算机和计算机系统的情境下对本发明的多个优选实施例进行描述,但是本领域的技术人员将理解,可以采用各种形式将发布本发明的各种实施例发布为程序产品,并且无论用于实际执行该发布的信号承载介质的具体类型如何,这些技术都同样适用。信号承载介质的示例包括但是并不限于可记录型介质(如易失性和非易失性存储装置、软盘和其他可移除盘、硬盘驱动器、磁带、光盘(例如,CD-ROM、DVD等)等),和传输型介质,如数字和模拟通信链路。
此外,基于其中在本发明的具体实施例中实现了稍后描述的各种程序代码的应用,可以识别这些程序代码。然而,应当理解,仅仅出于方便的目的而使用以下任何具体的程序术语,因此这些技术并不限于仅在由这种术语表示并且/或者蕴涵的任何特定应用中使用。此外,鉴于存在可以将计算机程序组织成例程、过程、方法、模块、对象等的通常的无数种方式,并且存在可以在位于典型计算机内的各种软件层(例如,操作系统、库、API、应用、小应用程序等)之间分配程序功能的各种方式,应当理解,本发明的多个优选实施例并不限于对这里描述的程序功能的特定组织和分配。
本领域的技术人员将认识到,图1所例示的示例性环境并不是限制性的。实际上,本领域的技术人员将认识到,可以使用其他另选硬件和/或软件环境。
图2示出了如图1中的计算机的示例性文件系统树200。按层级方式表示该示例性文件系统的文件和对象。树200的顶端是具有两个子目录DirA 204和DirD 206的根目录202。DirA 204包括2个子对象文件B 208和子目录DirC 210。另一方面,DirD 206包括一个直接子对象DirE 212,DirE 212本身包括子对象FileF 214。根据本发明一实施例,有利地,文件系统将每个目录(202、204、206、210以及212)都实现为直接子对象和锚定位置的列表。由此,目录包括与它的子对象是什么有关的信息和指向各位置的相应指针。本领域的普通技术人员将认识到, 也可以包括其他对象属性,如文件修改时间、安全属性等。例如,如果子对象本身是目录,则可能存在的一个属性可以涉及其父目录的位置或名称;如果子对象是诸如文件的非目录对象,则不一定要存储这种属性。
在图2以及随后的文件系统树结构图中,通常将目录标签和文件标签示为在对象本身上或在对象本身中。该约定有利于使图不会看起来混乱,并有利于清楚地表示哪个对象与哪个标签相关联。然而,更合适的约定是将各标签布置成靠近树中的父对象与子对象之间的链接(或线)。换句话说,图2的根目录202并不实际地包含DirA 204和DirD 206,而是包含到DirA的链接和到DirD的另一链接。因此,如这里所描述的,当对DirA或DirC进行了“重命名”时,这是指对它们的相应父目录中的适当的链接进行了重命名,而不是对对象本身的名称进行了重命名。
文件系统类型规定为文件系统对象(例如,文件、目录)存储什么信息,该信息的格式如何,以及如何布置该信息;通常将该信息称为元数据。在计算机系统的正常操作过程中,操作系统与应用程序一起工作,以调用了解底层文件系统类型和可用元数据的进程和例程,以正确地创建、删除、打开以及修改文件系统内的对象。从一个文件系统类型变成另一文件系统类型包括改变伴随着文件系统内的各个对象的元数据(或其内部结构)。如前所述,存在从一个文件系统类型转换成另一文件系统类型的多个常规方法,它们都要求在转换过程中停止对文件系统的访问。因此,对从一个文件系统类型到另一文件系统类型的转换的以下描述并不关注于对元数据的转变的实际机制;而是详细描述如何在保持对文件系统的完全操作能力的同时对元数据进行转变。然而,元数据转换的一个这种示例涉及将目录条目从一般数据库结构改变成专用目录对象。
根据上述示例,其中目录条目是一般数据库记录的操作系统可能使用通用数据库访问和处理逻辑来处理文件系统操作。该逻辑在本质上必定是通用的,以相同地处理操作系统遇到的目录条目和操作系统遇到的其他非文件系统对象。然而,一种不同的文件系统类型可以将目录条目实现为专用对象,该对象采用适当的格式并被适当地布置,以便于可靠和高效的处理。操作系统将包括专用逻辑,该专用逻辑用于处理该专用目录条目,同时还保持一般数据库处理逻辑,以对在操作过程中遇到的较不专用的对象进行处理。因此,可以对专用目录对象进行设计,以获得高效性、可靠性、安全性、可访问性等。
转到图3,示出了用于在文件系统继续进行操作并可由用户使用的同时将文件系统从一个类型转换成另一类型的示例性算法的流程图。根据图3的具体流程图,在没有明显地从用户接收到应当开始进行转换处理的确认的情况下,系统自动地将文件系统从旧型式转换成新型式。本领域的普通技术人员将认识到,在图3的流程图中可以包括允许用户对是否激活转换处理进行控制或进行手动实施的可选步骤。
在步骤302中,计算机系统执行初始程序装入或重启。在安装或装入了新版本的操作系统之后通常需要进行这种操作。作为初始程序装入的一部分或者作为随后的步骤,在步骤304中启动一进程,该进程对文件系统是否包括旧文件系统类型的对象进行检测。当更新操作系统版本时大部分当前的系统都会在文件系统内具有旧型式的目录和对象。但是,新的、出厂安装的操作系统可能默认地只具有新文件系统类型的已创建对象。此外,如果计算机系统(尤其是在转换处理完成之前)遭受了崩溃,那么当重启该系统时图3的算法将从在发生崩溃之前的某个时间点起自动重新启动转换例程。
与在步骤304中对旧型式文件系统对象的检测同时地,在步骤306中,操作系统保持文件系统系统的可用性和操作,如正常提供的那样。在文件系统可操作并且可用的同时,在步骤308中启动转换处理,以将文件系统从旧类型或旧型式转换成新类型或新型式。术语“旧”和“新”是将一种类型与另一种类型区别开的一般性描述,如在这里使用的,它们并不一定将文件系统转换限制为总是从较旧的文件系统类型转换成较新的文件系统类型。这里所描述的转换处理的实施例也可以使操作系统从较新近的文件系统类型回到较旧的类型。
通过在保持文件系统的可用性的同时运行文件系统转换处理,避免了将文件系统关闭为非活动状态的需要。由此,即使正在执行文件系统转换,用户也可以继续访问并使用文件系统。常规多任务操作系统包括用于设置一进程相对于可能正在同时执行的其他进程的优先级的机制。因此,可以将用于转换文件系统的进程的优先级设置为低优先级,以不对操作系统的性能造成明显的影响;或者,如果用户可以接受一定的可能的性能劣化,则可以将该优先级设置成较高。在一示例性实施例中,转换处理以最低可能优先级作为单线程运行。本发明的另选实施例可以基于系统的系统级或文件级活动来动态地改变执行转换处理的优先级。例如,如果正在超过某个预定级地使用文件系统的特定目录,那么转换处理可以按较低优先级进行操作,或者甚至跳过该繁忙文件系统对象,直到它的活动级降低。因此,可以利用文件系统对象的使用率来确定是否将对该对象的转换推迟到某个较晚的时间。转换处理还可以确定在转换了一目录之后将该目录转换回它的初始型式可能是有益的。可以基于性能问题、数据完整性问题等来进行该确定。类似地,可以认为某些系统活动与文件系统转换不兼容,如对若干新文件的访问和/或创建的活动。尽管可以容易地允许在不修改图3的算法的情况下同时执行这些活动,但是在这些处理是活动的同时停止文件系统转换是有益的。示例性处理是对新软件应用的安装或出于备份和存档的目的对数据进行的保存或恢复。因此,本发明的实施例设想在这些类型的其他处理中的任一处理正在执行时停止文件系统转换处理。
图4给出了图3中的转换处理308的更详细的示图。更具体地,图4示出了用于实现文件系统转换处理(其将与正常的文件系统和操作系统活动同时地进行操作)的示例性方法的流程图。参照图4的流程图,该转换处理开始于在步骤402中建立在文件系统中存在的任何旧型式目录的列表。一旦建立了该列表,则该处理遍历该列表并在步骤404中将各条目从旧型式目录转换为新型式目录,并在步骤406中激活新型式目录。作为激活新型式目录的步骤的一部分,转换处理还可以清除到文件系统对象的旧型式链接并删除旧型式目录。针对旧型式目录的列表中的每个条目重复步骤404和406。
图5示出了用于建立旧型式目录的列表的示例性算法。该示例性算法按非递归方式来创建列表,与递归处理通常消耗的时间量和存储量相比,该非递归方式使目录保持打开以进行读取的时间量最小化,并且使存储量最小化。然而,应当理解,也可以使用对文件系统的另选但是等效的扫描方法(包括递归处理)来建立旧型式目录的列表。
根据图5,通过在步骤502中最初添加根目录来开始该列表。在步骤504中,访问旧型式目录列表,并读取和识别该列表中的下一条目。当在步骤504中首次读取列表时根目录是该列表中的唯一目录,因此,在步骤506中,对该根目录的直接、旧型式子目录进行识别。在步骤504的随后的执行中,读取列表中的下一条目并在步骤506中识别其旧型式子目录。如果在执行步骤504时在列表中没有剩余条目,则可以在步骤508中结束该处理。此外,如果在步骤506中没有识别出旧型式子目录,则完成了对该特定条目的处理,并且逻辑流程回到步骤504以检取列表中的下一条目。然而,如果在步骤506中识别出旧型式子目录,则在步骤510中将它和它的类似兄弟加入该列表。然后回到步骤504以重复该处理,在步骤504中,读取列表中的下一条目以确定是否需要将其他条目加入列表。由此,图5的示例性算法非递归地遍历了文件系统树,并建立了所有旧型式目录的列表,在文件系统转换处理过程中,这些旧型式目录将被转换成新型式目录。
图6A的示例性文件系统树600描述了图5的算法的操作以及将要建立的旧型式目录列表。对于图6A和6B,假设所有目录都是旧型式目录。通过执行图5的算法,根目录602被添加到列表的顶部,然后在读取根目录602时,将其子目录DirA 604和DirB 606添加到该列表。通过读取列表中的下一条目来继续进行该处理,当读取DirA 604时,将其子目录DirC 608添加到该列表。由于DirC 608是DirA 604的唯一子目录,因此下一步从该列表读取DirB 606,使得DirD 610和DirE 612被添加到该列表。然后从该列表读取DirC 608,其没有子目录。处理继续以对作为DirD 610的唯一子目录的DirF 614进行识别,并将其添加到列表。然后从该列表读取DirE 612,其没有子目录。然后从该列表读取DirF 614,其没有子目录。图6B示出了所得目录列表650。
图7示出了用于在文件系统保持完全可操作和可访问的同时将在文件系统中识别出的各旧型式目录(例如,图6B的列表650)转换成新型式目录的示例性算法的流程图。由于该文件系统在转换处理过程中保持活动,因此支持新文件系统类型的新操作系统将也包括对旧文件系统类型的支持。因此,通过正在执行的应用可以访问甚至删除旧型式文件系统对象。然而,为了避免在转换处理过程中向文件系统加入其他旧型式文件系统对象,有利地,操作系统在新型式文件系统实现中创建任何新对象。然而,本领域的普通技术人员将认识到,可以采用能够创建旧型式文件系统对象的另选方法,如将旧型式对象的日志保持为针对稍后的转换创建的日志。
在步骤702中,创建新型式根目录,作为文件系统中的对象,该目录初始时是空的。该新型式根目录将暂时充当新创建的新型式目录的父目录,并将在将文件系统完全转换成新型式时最终成为根目录。如果先前(如由于系统崩溃而)中断了转换处理,那么在重新启动该转换处理时,将已存在新型式根目录,因此可以跳过步骤702。在另选实现中,在转换处理过程中使用新型式根目录,但是随后丢弃它。然后在最终对旧型式根目录进行了转换时创建与旧型式根目录相对应的不同的新型式根目录。
在步骤704中,从旧型式目录的列表中检取最后一个目录条目,以进行处理。由于文件系统是活动的,因此该目录可能已被删除或移动,因此,该目录可能不再存在。因此,在步骤706中,进行检查以确定该目录是否仍然存在。如果不存在,则删除该条目,并从该列表检取新底端条目,以进行处理。
然而,假设该旧型式目录不存在,那么在步骤708中在文件系统中创建与旧型式目录相对应的新型式目录。该新型式目录最初是空的,并且将需要利用到旧型式目录中的各子对象的链接来填充。由此,在步骤712中,读取旧型式目录,以检取其子对象。子对象可以是目录(714、718)或文件722。此外,由于文件系统是活动的,因此子目录可以是新型式目录714或旧型式目录718。新型式目录可能通过先前的转换步骤或通过在转换处理过程中创建的目录而产生。旧型式目录可能通过这样的操作而产生旧型式目录该操作导致将现有的旧型式目录作为子目录移动到正在处理的当前旧型式目录中。
有利地,图6B中的示例性目录列表650的格式将文件系统600中的目录排列成从根目录602往下到文件系统的叶节点。因此,如果通过从列表650的底端开始并向上移动,对文件系统进行转换,则在转换父目录之前转换父目录的所有子目录。转换文件的顺序结合对关于目录的某些特性的设置提供了这样的好处确保了在无法进行检测的情况下,在文件系统转换处理过程中没有目录被添加到一目录中。
由于文件系统是活动并且操作的,因此存在如下可能性在建立了列表650之后但是在实际转换父目录之前,将旧型式目录移动到旧型式父目录中。在正常的文件系统操作中,当将目录或其他对象添加到父目录中时,父目录找出可用条目并添加到该新对象的链接或引用。由于经常从目录中删除对象,因此第一个可用条目空间可能并不总是位于目录的末端,而是位于目录结构的中间。有些文件系统在目录内包括强制将新条目添加到目录的末端的属性。本发明的实施例使用该属性,或者可以将其实现为附加特征,以使得放入正在被转换的目录中的任何新条目添加到该目录的末端。由此,在步骤708中,在读取各旧型式目录之前,标记该目录,以使得要添加到该目录的任何新条目被附加在末端而不是使用中间空闲空间。
如果在转换处理过程中在父目录内遇到了旧型式目录,则只可能在以下情况下才会出现该事件在已建立了列表650之后旧型式目录被移动到父目录中。当出现该事件时,转换处理可能回到图5的列表建立例程,并将新检测到的目录添加到列表的末端。返回到转换处理将以新添加的条目重新启动转换处理,并使得转换处理可以继续进行。
由此,当在步骤712中遇到作为子对象的旧型式目录718时,将该子对象返回给图5的列表建立例程,作为列表中的最后一个条目。例程402将接着照常执行步骤506和510,以确定是否要将任何附加子目录添加到列表中。一旦完成了该列表,则可以重新启动图7的转换处理。在步骤704中检取该列表的新底端条目,并且文件系统转换处理如前所述地继续进行。
当遇到新型式目录714时,则在步骤716中将其链接重命名到在步骤708中创建的新型式目录中。如果遇到诸如文件的非目录对象722,则在步骤724中将其链接到在步骤708中创建的新型式父目录。对子对象的处理继续进行,直到在步骤726确定在当前目录中不存在其他子对象。
此时,新型式目录具有到在正在转换的旧型式父目录中存在的每个子对象的链接。由此,在步骤728中,使旧型式目录去激活(deactive)并使新型式目录激活。在步骤730中,执行清除处理,以删除在新型式文件系统中不再使用的任何链接或文件系统对象(如旧型式目录)。然后在步骤732中通过删除刚刚完成了转换的当前底端条目,来更新旧型式目录的列表。如果在列表中存在其他条目,则步骤734将逻辑流程返回到步骤704,以获得列表中的下一底端条目。否则,转换处理完成。
如刚刚描述的,从最远端叶节点向上到根目录,对旧型式文件系统的目录进行转换。因此,根目录是所转换的最后一个目录。如已说明的,用于转换目录的该示例性方法允许对可能在建立了旧型式目录的列表之后引入的旧型式目录进行检测。本领域的普通技术人员将认识到,可以使用另选方法来完成该相同的功能。例如,可以从上向下地转换文件系统,并且文件系统可以包括对文件系统进行扫描的扫描逻辑,以检测是否在转换处理过程中添加或移动了需要转换的文件。可以在文件系统内的中间节点处使用这种扫描逻辑,或者在声称已转换了所有目录时使用该扫描逻辑作为最终步骤。
图8示出了如在步骤728中执行的从旧型式目录到新型式目录的激活的更详细的图示。该流程图例示了用于激活新型式目录的示例性算法。该示例性算法假设文件系统和操作系统利用类似于vnode的结构来工作。类似于vnode的结构是由操作系统创建的临时数据结构,其引用了打开的或者活动的文件系统对象。典型地,当进程首次打开一文件系统对象时,将vnode标识符返回给该进程。需要访问文件系统对象的应用或系统进程使用该标识符来引用vnode,该标识符进而引用该文件系统对象本身。无论有多少应用正在使用一文件系统对象,对于该文件系统对象只存在一个vnode;因此,典型地,vnode包括作为正在使用该vnode的进程数量的计数的属性。由于在转换处理过程中文件系统是活动的,因此除转换进程以外多个不同的进程可能正在使用要被去激活的旧型式目录。使用新型式目录的新vnode和删除旧型式目录的vnode会对正在使用该文件系统对象的任何进程带来有害影响。因此,目录激活处理的示例性实施例将有利地按如下方式改变用于引用新型式目录对象标识符的旧型式目录vnode(打开了旧型式目录的)多个进程将无缝地从旧型式目录切换到新型式目录,而无需知道已进行了切换。
下面考虑图8的算法,在步骤802中,锁定文件系统,使得不能改变旧型式文件系统对象的vnode。通过对旧型式文件系统对象声明锁定,转换处理防止在激活/去激活处理过程中改变vonde。在步骤804中,执行重命名,删除到新型式目录的临时链接,删除到旧型式目录的链接,并添加到新型式目录的永久链接。这使得新型式目录对于应用来说是活动的和可见的。
接着,在步骤806中,将vnode更新为指向新型式文件系统对象。由此,vnode数量保持相同,但是将vnode修改成引用不同的文件系统对象(即,新型式文件系统对象)。还可以改变vnode的其他属性;例如,vnode中的目录大小可能会不同。此外,可以在vnode中改变文件系统对象的“类型”,以反映该vnode现在引用新型式对象而非旧型式对象。一旦进行了该改变,打开了旧型式文件系统对象的任何运行进程仍将使用现在指向了新型式文件系统对象的vnode。
步骤808是可选步骤,当遇到也在被称为安装控制块的数据结构内的旧型式文件系统时执行该步骤。安装控制块是典型地由操作系统保持的另一临时数据结构,其含有关于文件系统的信息。例如,当激活的新型式目录是根目录时,则步骤808将针对该文件系统修改该安装控制块中的某些信息。这种修改例如可以包括将根目录的指针改变成指向新型式根目录标识符;将一标记改变成表示该文件系统完全是新型式文件系统;以及其他属性,如允许到文件系统中的一对象的最大链接数量。例如,如前所述,操作系统可以支持两种类型的文件系统,因此包括如下逻辑当访问特定文件系统对象时,对该对象进行测试以确定要使用哪个版本的对象处理程序(handler)。一旦将文件系统标记为完全是新型式的,则操作系统可以省去对旧型式文件系统的支持。一旦完成了可选步骤808,就可以在步骤810中通过转换处理解除锁定。此时,使用新型式目录条目,并且转换处理如在图7的算法中概述的那样继续执行。
图9A到9F中的一系列图示出了正在经受根据图7的算法的转换处理的文件系统的快照。文件系统900足够复杂以例示在转换过程中可能会遇到的不同的文件系统结构,同时也足够简单以使得可以进行简要描述。由于示例性转换处理的许多活动对文件系统900的链接执行操作,因此对这些链接赋予标签和编号(与前面的图不同),以使得可以区分文件系统对象和到文件系统对象的链接。
文件系统900包括根目录902,该根目录902具有被标记为“A”的链接904。由链接904指向的目录905包括两个链接到文件907的链接906,和指向目录909的链接908。将链接906标记为“B”,将链接908标记为“C”。目录909包括被标记为“D”的单个链接910,该链接910指向文件911。图9A还示出了在创建了新型式根目录912之后的文件系统900。
针对文件系统900建立的旧型式目录的列表将以DirC 909为其底端条目,因此这将是被转换的第一个目录。图9B例示了在完成了对DirC 909进行转换的多个步骤中的一些步骤之后的文件系统900。
作为起始步骤,在文件系统900中创建新型式目录920。使用该示例性算法进行的一个假设是所创建的任何目录都将具有相同类型的父目录。因此,通过在新型式根目录912内创建链接916来完成对新型式目录的创建。到新型式目录920的链接916将具有系统范围内唯一的名称,因此它与其他文件系统对象是可区分的。当读取DirC 909时,那么将返回FileD 911作为其子对象。因此,在新型式目录920内创建引用FileD 911的链接918。作为中间步骤,创建另一链接914,此时该链接914位于DirA 905与新型式目录920之间。将链接914标记为C′,并且它为临时链接,它使得在稍后的步骤中可以进行简单的名称交换。创建链接914的一种示例性方式是在DirA 905中创建也被标记为“C”但是使用不同的标识符(如“200”)的链接。这种命名约定将在DirA 905内创建两个唯一的链接,但是在删除到“C”的原始链接908之前第二个链接914对于用户应用来说是不可见的。
此时,DirC 909的所有属性都被反映(mirror)到新型式目录920,以准备激活新型式目录920。图9C例示了在激活了新型式目录920之后的文件系统900。为了达到该阶段,在DirA 905内将链接914从C′重新标记为“C”。其操作的副作用是删除了链接908。将DirC 909的vnode内的对象指针改变成指向文件系统对象920(新型式目录)。不再需要链接910,此时可以删除它。在此阶段,访问DirC的用户将使用新型式目录920,而不是此时可能已被删除的旧型式目录909。
一旦转换了DirC 909,就删除它,然后从旧型式目录的列表中删除它,并且对列表上的下一底端条目进行转换。在示例性文件系统900中,下一目录是DirA 905。图9D示出了根据图7和图8的算法对DirA进行转换的步骤。起始步骤是创建唯一地命名的新型式目录926,其经由链接924链接到新型式根目录912。
读取DirA 905,并将FileB 907和DirC 920识别为子对象。因此,在新型式目录926中创建了到FileB 907的链接930。将DirC 920识别为新型式目录,因此在DirC 920与新型式根912之间存在链接916。将该链接916重命名为链接928,此时它从新型式目录926指向DirC920。还在DirA 905的父目录中添加链接922,这使得稍后可以执行简单的重命名。具体来说,在根目录902中创建被标记为A′的链接922。此时可以激活新型式目录926。
图9E示出了在激活了新型式目录926之后的文件系统900。具体地,将来自DirA 905的所有属性都转移到新型式目录926,并将链接922重命名为“A”。其副作用是删除了链接904。旧型式目录905的vnode被改变成引用新型式目录926并且此时它是活动的。删除任何剩余的旧型式文件和链接。旧型式根目录902是待转换的剩余目录。
将DirA 926识别为旧型式根902的唯一子对象。由于DirA 926是新型式目录,因此在新型式DirA 926与新型式根912之间已存在链接924。将链接924从其文件系统范围内唯一的名称重命名为“A”。因此,破坏了从旧型式根902起始的链接922。将vnode改变成引用新型式根912。剩余的步骤是将安装控制块修改成指向新型式根912而不是指向旧型式根。由此,图9F示出了转换后的文件系统950。
在这些图中示出的和以上描述的示例性算法并未明显地包括错误检查例程,以不使这些算法的创造性方面变模糊。然而,本领域的普通技术人员将认识到,在各种不同的阶段中,可以执行合适的错误检查,以确定系统状况是否准许停止正在执行的转换处理。例如,如果遇到了已被破坏的文件系统或者发生了辅助存储装置的溢出,则可以停止转换处理。当一旦再次重新启动系统时,可以再次开始转换处理(见图3)并重新启动转换处理。
在上述转换处理过程中,存在多个如下时期有利地,文件系统支持对象的两个并行的实现,即,按新型式文件系统方式和旧型式文件系统方式。这里将文件系统和操作系统描述为提供这种支持。然而,所述处理和结构并不将应用限制为文件系统转换应用,而是提供用于支持文件系统内的多个、不同的、同时的对象实现的通用解决方案。为了提供这种支持,文件系统可能需要解决多个问题,诸如如何将同一文件链接到具有不同文件系统实现的两个不同的目录中,以及如何将一个实现的目录链接到具有另一实现的父目录中。
往回参考先前对文件系统的讨论,将目录视为多个条目的列表,其中每个条目都包括一名称和一引用指针。如本领域的普通技术人员将理解的,在每个条目中还可能包括其他属性。目录条目中的引用指针指向由操作系统保持的数据结构。是该数据结构描述了文件系统对象并指向其在物理存储介质内的存储位置。由操作系统和文件系统来规定该数据结构,并且该数据结构使得应用和处理可以访问文件系统的数据。
上述的目录布置和其他数据结构在本质上是示例性的,而不应仅限制于完全相同地与上述描述匹配的文件系统和操作系统。本领域的普通技术人员容易认识到,实际上可以使用不同的虚拟文件系统和文件系统结构,并且未来将开发其他虚拟文件系统和文件系统结构。这种文件系统可以具有更少的或者甚至更多的间接引用级,并且可以按等效数据结构保持不同的信息。因此,在其最广泛的意义上说,本发明的实施例涉及按如下方式对描述文件系统对象的数据结构进行组织,即,文件系统可以同时支持具有不同文件系统实现的对象。
图10例示了包括两个不同锚定点1010、1012的文件的示例性数据结构1002。存在到该数据结构1002的两个不同链接1007、1009。第一个链接1007是旧型式目录1006,并被标记为“FileA”,第二个链接1009是新型式目录1004,并被标记为“FileB”。这两个目录1004、1006链接到同一对象,因为两个链接都指向同一数据结构1002。
数据结构1002包括引用它的各不同类型目录的锚定点。在图10的示例性结构中,假设存在两个不同类型的文件系统,因此数据结构1002可以具有两个不同类型的锚定点1010、1012;不过,在另选实施例中可以具有其他数量个可用文件系统类型。各数据结构1002可以具有这两种类型的锚定点,但是当没有合适类型的目录引用该数据结构时,这些锚定点可能是NULL(或某些其他值)。第一个锚定点1010往后指向旧型式目录1006,另一锚定点1012指向新型式目录1004。按此方式,使得操作系统知道两个不同的文件系统实现引用了该文件。
在使用中,操作系统可能想要确定与具有相对应的数据结构1002的文件的链接(例如,1007、1009)有关的信息。在这种情况下,操作系统可能想要唯一的信息,这取决于要在新型式文件系统还是在旧型式文件系统的环境下使用该信息。因此,操作系统使用锚定点1010、1012来追溯到合适的型式的目录中的合适的链接(例如,1007、1009)。
在上述示例性文件系统转换处理的某些实施例中,一个假设是子目录链接到具有相同类型的文件系统实现的父目录中;因此,每个目录都包括在相同文件系统类型的父目录内的锚定点。此外,存在如下情况子目录链接到可能为不同文件系统实现的其他引用目录中。图11的示例性数据结构1102例示了新型式目录的数据结构。具有不同文件系统实现的两个目录1100、1101引用了该目录。该数据结构1102是其中目录链接到具有不同文件系统实现的不同父目录的更一般情况的特定示例。因此,也可以相应地对以下描述进行修改,以描述链接到具有两种型式的文件系统实现的目录中的旧型式目录的数据结构。
类似于文件数据结构1002,目录数据结构1102包括往回引用合适型式的目录的两个不同的锚定点1106、1108。在许多操作系统和文件系统中,到目录的链接与到文件的链接的不同之处的一个方面是目录链接的多个属性中的一个是“点-点”链接。该属性指向或链接到目录的父目录。根据示例性数据结构1102,点-点链接1110指向相同型式的父目录新型式目录1100。从不同型式的目录1101起始的链接1104类似于文件链接,因为它不包括点-点链接。因此,数据结构1102包括各文件系统实现的锚定点1106、1008,并被从不同实现型式的引用目录1101起始的文件型链接1104所引用。然而,该数据结构被从具有相同型式的实现的引用目录1100起始的目录链接所引用。
在以上示例性文件系统转换处理中,有时在具有不同类型的父目录中创建到子目录的链接。例如,参照图9C,创建新型式目录920,其包括到新型式根912和旧型式DirA 905的链接。在对数据结构1102进行说明时参照该示例,新型式目录920链接到具有相同实现类型的父目录912。到目录920的链接916的名称对于文件系统来说是唯一的。创建唯一名称的一种方式可以是按照新目录920正在取代的旧型式目录909的文件ID和可能的生成ID对新目录920进行命名。这些ID在整个文件系统上是唯一的,并且可能得到被标记为“21837F42”的链接916。由于新根目录912尚未活动,因此链接916对于用户和操作系统来说是不可见的。然而,与目录DirC 920相关联的点-点链接指向新型式根912。在DirA 905中还存在引用新型式目录920的链接914。该链接914对于终端用户来说是可见的,但是它与文件链接的类似之处是不存在与该链接914相关联的点-点信息。因此,链接914与链接916在它们的相应目录905和912中是不同结构的条目。在新型式目录920的数据结构内,到新型式实现的锚定点往回引用新型式根912,而到旧型式实现的锚定点往回引用DirA 905。结果,创建了从旧型式目录可见的新型式目录,而且在具有相同文件系统实现类型的父目录中同时正确地实现了该新型式目录。
由于在上述示例性文件系统转换处理中文件系统保持活动,因此存在如下情况在一个文件系统实现的目录中可能创建了到不同实现的目录的链接。其中可能会出现该情况的两个特殊情况是在旧型式目录中创建了新型式目录,和将旧型式目录移动到已转换的新型式目录中。利用参照图10和11描述的数据结构,提供了这样一种示例性方法,即,通过该方法,文件转换处理可以将新创建的目录实现成可以从相同类型的目录和不同类型的目录引用这些新创建的目录。
在其中在旧型式目录中创建新型式目录的情况下,创建新型式目录的处理与刚刚参照对新目录920的创建描述的处理相同,因此不再重复描述。然而,为了复述最终结果,通过类似文件的链接从旧型式目录链接新型式目录,还从具有新型式文件系统实现的隐藏根目录链接新型式目录。表示新型式目录的数据结构包括与两个链接和父目录有关的信息。
当将旧型式目录移动到新型式文件系统中时,在新型式文件系统中创建引用旧型式目录的链接。在旧型式根目录中创建引用移动后的目录的另一链接。该链接使用唯一名称来引用移动后的目录。此外,有利地,该链接对于用户来说是隐藏的,并且包括将旧型式根标识为移动后的目录的父目录的相关联的点-点信息。因此,新型式目录中的链接是文件型链接,而旧型式目录中的链接是具有与其相关联的合适的点-点信息的目录链接。
权利要求
1.一种用于将文件系统从第一类型转换成第二类型的方法,该方法包括以下步骤生成步骤,生成待转换的所述文件系统中的所述第一类型的目录的列表;和转换步骤,在将所述文件系统保持为活动状态的同时将所述列表中的每个目录转换成所述第二类型。
2.根据权利要求1所述的方法,还包括以下步骤当对使用所述文件系统的计算机系统进行初次程序装入时,顺序地启动所述生成和转换步骤。
3.根据权利要求1所述的方法,所述转换步骤还包括以下步骤检取所述列表中的目录的标识符;将所述目录转换成第二类型目录;和激活所述第二类型目录。
4.根据权利要求3所述的方法,还包括以下步骤针对所述列表中的每个目录重复根据权利要求3所述的步骤。
5.根据权利要求1所述的方法,其中,所述列表表示所述文件系统的从根目录往下到最远叶节点的自顶向下图。
6.根据权利要求5所述的方法,其中,按与所述列表的顺序相反的顺序针对每个目录执行转换每个目录的所述转换步骤。
7.根据权利要求1所述的方法,其中,所述生成步骤还包括以下步骤a)在所述列表中添加根目录作为当前条目;b)对所述列表中的所述当前条目的子目录进行识别;c)将所识别出的子目录附加到所述列表;d)针对所述当前条目内的每个子目录重复步骤b)和c);e)如果在所述列表中存在紧接着所述当前条目的下一目录,则将所述列表中的所述下一目录变成当前条目;以及f)重复步骤b)到e),直到在所述列表中不存在下一目录为止。
8.根据权利要求1所述的方法,还包括以下步骤一旦某一特定目录在所述列表中,就将所述特定目录标记为正在经受转换处理。
9.根据权利要求8所述的方法,其中,将添加到所述特定目录的新对象附加在所述特定目录的末端处。
10.根据权利要求1所述的方法,其中,所述转换步骤还包括以下步骤a)创建第二类型根目录;b)创建与所述列表中的特定目录相对应的第二类型目录;c)在所述第二类型目录中针对所述特定目录的每个子对象生成相应的链接;d)激活所述第二类型目录;以及e)从所述列表移除所述特定目录;f)删除第一类型目录。
11.根据权利要求10所述的方法,还包括以下步骤创建与所述第二类型目录相关联的数据结构,所述数据结构包括与所述目录的父目录相关联的第一锚定点,和与所述第二类型目录的父目录相关联的第二锚定点。
12.根据权利要求1所述的方法,还包括以下步骤对暂停所述转换步骤的情况进行检测;和响应于所述情况,暂停所述转换步骤。
13.根据权利要求12所述的方法,其中,所述情况是以下情况中的一个在所述文件系统上的产品安装;涉及所述文件系统的恢复操作;以及涉及所述文件系统的备份操作。
14.根据权利要求1所述的方法,还包括以下步骤在对特定目录进行转换之前,确定所述目录的使用率;和基于所述使用率,推迟对所述特定目录的转换。
15.根据权利要求1所述的方法,还包括以下步骤对停止所述转换步骤的情况进行检测;和响应于所述情况,停止所述转换步骤。
16.根据权利要求15所述的方法,其中,所述情况是以下情况中的一个系统崩溃;在所述文件系统内遇到被破坏了的对象;以及可用存储装置不足。
17.根据权利要求15所述的方法,其中,当随后进行涉及所述文件系统的初始程序装入时,重新启动所述转换步骤。
18.根据权利要求3所述的方法,其中,所述激活步骤还包括以下步骤对与所述目录相关联的数据结构进行识别;将所述数据结构改变为与所述第二类型目录相关联;以及移除所述目录。
19.根据权利要求18所述的方法,还包括以下步骤在执行所述改变步骤的同时,施加对第一数据结构的锁定。
20.一种用于将文件系统从第一类型转换成第二类型的方法,该方法包括以下步骤执行步骤,在将所述文件系统保持为活动状态的同时,执行转换处理,以将所述文件系统中的所述第一类型的每个目录转换成所述第二类型;和结束步骤,在已将所述文件系统中的所述第一类型的每个目录转换成所述第二类型时,结束所述转换处理。
21.根据权利要求20所述的方法,还包括以下步骤当对使用所述文件系统的计算机系统进行初次程序装入时,启动所述执行步骤。
22.根据权利要求20所述的方法,还包括以下步骤生成待转换的所述文件系统中的所述第一类型的目录的列表。
23.根据权利要求22所述的方法,其中,对每个目录进行转换的步骤包括以下步骤检取所述列表中的一目录的标识符;将所述目录转换成第二类型目录;以及激活所述第二类型目录。
24.一种程序产品,其包括程序代码,其被配置成在执行时生成待转换的文件系统中的第一类型的目录的列表;和在将所述文件系统保持为活动状态的同时,将所述列表中的每个目录转换成第二类型;和信号承载介质,其承载所述程序代码。
25.一种设备,其包括至少一个处理器;与所述至少一个处理器相耦合的存储器;以及程序代码,其驻留在存储器中并由所述至少一个处理器来执行,所述程序代码被配置成在将文件系统保持为活动状态的同时,启动转换处理,以将所述文件系统中的所述第一类型的每个目录转换成所述第二类型;并且在已将所述文件系统中的所述第一类型的每个目录转换成所述第二类型时,结束所述转换处理。
26.根据权利要求25所述的设备,其中,所述程序代码还被配置成非递归地建立所述第一类型的目录的列表。
27.根据权利要求25所述的设备,其中,所述程序代码还被配置成对正在被转换的特定目录进行修改,以使得将所述特定目录中的任何新条目附加在所述特定目录的末端。
28.根据权利要求25所述的设备,其中,所述程序代码还被配置成如果检测到正在对所述文件系统执行预定操作,则暂停所述转换处理。
29.根据权利要求25所述的设备,其中,所述程序代码还被配置成针对正在被转换的特定目录,保持具有所述第一类型的第一版本和具有所述第二类型的第二版本;并且在使所述第一版本去激活的同时激活所述第二版本。
30.根据权利要求25所述的设备,其中,所述程序代码还被配置成在检测到异常系统状况的特定点,停止所述转换处理;并且在所述特定点重新启动所述转换处理。
31.根据权利要求25所述的设备,其中,所述程序代码还被配置成对于正在被转换的特定目录,确定对所述特定目录的使用是否超过了预定量;并且在对所述特定目录的使用超过了所述预定量时,推迟对所述特定目录的转换。
32.根据权利要求31所述的设备,其中,所述程序代码还被配置成在对所述特定目录的使用超过了所述预定量时,对与所述特定目录不同的另一目录进行转换。
33.根据权利要求25所述的设备,其中,所述程序代码还被配置成对于已被转换了的特定目录,将所述特定目录转换回所述第一类型。
34.根据权利要求25所述的设备,其中,所述程序代码还被配置成按可调优先级执行。
全文摘要
一种在文件系统保持活动和完全可访问的同时将文件系统从一种实现类型转换成另一类型的文件系统转换处理。该转换处理建立旧文件系统类型的文件系统中的目录的列表,然后对每个目录进行转换,直到转换了整个文件系统。不是关闭文件系统以执行转换,而是转换处理可以作为不干扰正常文件系统操作的后台线程运行。
文档编号G06F17/30GK1910579SQ200580002258
公开日2007年2月7日 申请日期2005年1月21日 优先权日2004年2月12日
发明者丹尼斯·S.·德洛梅, 玛格丽特·R.·芬龙, 罗伯特·T.·金托特, 艾伦·L.·利弗林, 托马斯·M.·麦克布里德, 迈克尔·J.·奥伯霍尔特泽, 杰弗里·J.·派克, 理查德·M.·瑟伊斯, 杰里·L.·范·伯格 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1