劉飛飛
(國家信息中心,北京 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.