刘飞飞
(国家信息中心,北京 100045)
所谓还原技术,就是指记录下以前某个时刻计算机系统的状态,并提供一种“回滚”手段使得计算机系统又能够回到那个时刻的状态,其间任何对系统的改动,如文件修改,注册表修改等全部消失,这样只要计算机用户能保证系统在之前的状态是“干净”的、可信赖的,利用这种“回滚”机制整个系统就可以一直保持“干净”状态。这里面最核心的技术是记录原先的状态和截获并存储新的改动,这就涉及到对操作系统I/O流程的干预。
图1 计算机操作系统存储栈
图1是计算机操作系统中存储栈(storage stack)关键组件的层次图,应用程序打开文件进行读写,I/O子系统则负责把用户的文件读写请求发给文件系统驱动,然后文件系统驱动把文件读写请求转化成块 (block)读写请求,并把块读写请求转发给卷(例如:在Windows操作系统中卷指的是C盘、D盘、E盘等)驱动程序,卷驱动修正一下块的偏移位置然后转发给磁盘(Windows磁盘管理中磁盘0、磁盘1、磁盘2等)驱动,磁盘驱动最后把该请求发到真实磁盘硬件上进行真正的处理(主要是中断处理、读写寄存器等)。所有的I/O(最终体现为对硬盘数据块内容的修改)都在这个存储栈上流动,因此尽管不同的还原软件有不同的实现方法,但是一定位于这个存储栈上的某个位置以监视数据块的改变。以WindowsXP自带的系统还原为例,其还原功能的核心组件实际上就是一个卷过滤驱动程序(又称卷影拷贝,volsnap.sys),位于文件系统驱动与卷驱动之间,这样,在卷一级数据块的修改会先被卷过滤驱动程序截获,卷过滤驱动然后就可以做些处理使得日后能够还原。图2描述了基于卷过滤驱动的还原软件的详细处理流程。
图2 卷过滤驱动还原原理
如图2所示,假设用户文件对应卷上的三个数据块a、b和c,然后用户启动了系统还原功能建立了一个还原点,那么卷影拷贝驱动就开始工作,接着用户修改了这个文件,导致对应的b数据块遭到修改,由于卷影拷贝驱动在卷驱动上方,对b数据块的修改被卷影拷贝驱动先截获,卷影拷贝驱动把改动写入其内部维护的“改动存储池”(用b'数据块代表),接着登记一个映射记录
以上描述的是各类还原软件如何在I/O路径上截获数据块的修改;对于“改动存储池”的实现,不同的还原软件也有不同的设计,最简单的莫过于在原来磁盘上划分出一块区域来作为独立存储改动后的数据块,比如可以把硬盘的最末尾一段未分配的存储空间拿出来作为存储池,这样的设计好处是实现简单,缺点是局限性比较大,比如存储池大小缺乏伸缩性,划分出来的硬盘区域容量决定了最大可以容纳多少变化的数据块;又比如无法适用于用户的硬盘已经被完全分区过了的情况;复杂一点的设计是把一个或若干文件作为“改动存储池”,缺点是实现变得复杂了,但存储池伸缩性很大,可动态适应各种需求,其原理是还原软件在创立一个还原点的时候也创建一个大文件来对应这个还原点,并且通过文件系统接口获知了这个大文件在卷(基于卷的还原技术)或者磁盘(基于磁盘的还原技术)上的分配位置,以Windows平台上的NTFS文件系统为例,NTFS文件系统提供了一些反碎片化(defragment)的接口,比如FSCTL_GET_VOLUME_BITMAP,FSCTL_GET_RETRIEVAL_POINTERS以及FSCTL_MOVE_FILE等等,这些接口原本是设计给碎片整理程序用的,让它们获得卷上的文件系统位图、文件数据块的分配位置及进行数据的搬迁功能等等(详见微软MSDN帮助);还原软件也可以受益于这些接口,而且其中最重要的接口就是 FSCTL_GET_RETRIEVAL_POINTERS,还原软件通过该接口可以获得之前创建的大文件在卷上的分配信息,从而获得有效的存储空间对变化的数据块进行存储;举例来讲,假设用户的D盘由0到99总共100个块组成,还原软件以30个块的大小创建了大文件,并且调用FSCTL_GET_RETRIEVAL_POINTERS接口从文件系统那里知道了<3-5>,<11-15><50-71>是对应这个大文件的数据块,还原软件就以这三个区间构成了“改动存储池”。假设上层应用改动了数据块8,还原驱动截获了这个改动,从“改动存储池”取出一个未使用的块,比如块3,把改动体现在块3上,添加映射项<8-3>,返回给上层应用;同理上层应用改动了数据块19,还原软件从“改动存储池”取得未使用的块4进行对应,<19-4>,上层应用读取块8时,还原软件返回块3内容,读取块19时,返回块4内容,其他没有修改的数据块则返回原来的块内容;当大文件的30个块都使用完后,如果文件系统还有剩余空间,还原软件可以适当进行文件大小调整,比如增长到40个块大小,同样通过FSCTL_GET_RETRIEVAL_POINTERS把新增10个块纳入“改动存储池”实现动态“扩容”;以后当用户进行还原的时候,只需要把大文件和映射表删除就回到了原来创建还原点的状态。
本文从操作系统层面对当前的还原软件进行了剖析并给出了详细的原理阐述;另外笔者还根据文中所述的还原原理开发了一个还原软件原型,在Windows平台上测试通过,充分证明了其可行性。
[1]David A.Solomon,Mark E.Russinovich.Microsoft Windows 2000技术内幕(第3版)(影印版)[J].北京大学出版社,2001.