劉飛飛
(國(guó)家信息中心,北京 100045)
所謂還原技術(shù),就是指記錄下以前某個(gè)時(shí)刻計(jì)算機(jī)系統(tǒng)的狀態(tài),并提供一種“回滾”手段使得計(jì)算機(jī)系統(tǒng)又能夠回到那個(gè)時(shí)刻的狀態(tài),其間任何對(duì)系統(tǒng)的改動(dòng),如文件修改,注冊(cè)表修改等全部消失,這樣只要計(jì)算機(jī)用戶能保證系統(tǒng)在之前的狀態(tài)是“干凈”的、可信賴的,利用這種“回滾”機(jī)制整個(gè)系統(tǒng)就可以一直保持“干凈”狀態(tài)。這里面最核心的技術(shù)是記錄原先的狀態(tài)和截獲并存儲(chǔ)新的改動(dòng),這就涉及到對(duì)操作系統(tǒng)I/O流程的干預(yù)。
圖1 計(jì)算機(jī)操作系統(tǒng)存儲(chǔ)棧
圖1是計(jì)算機(jī)操作系統(tǒng)中存儲(chǔ)棧(storage stack)關(guān)鍵組件的層次圖,應(yīng)用程序打開文件進(jìn)行讀寫,I/O子系統(tǒng)則負(fù)責(zé)把用戶的文件讀寫請(qǐng)求發(fā)給文件系統(tǒng)驅(qū)動(dòng),然后文件系統(tǒng)驅(qū)動(dòng)把文件讀寫請(qǐng)求轉(zhuǎn)化成塊 (block)讀寫請(qǐng)求,并把塊讀寫請(qǐng)求轉(zhuǎn)發(fā)給卷(例如:在Windows操作系統(tǒng)中卷指的是C盤、D盤、E盤等)驅(qū)動(dòng)程序,卷驅(qū)動(dòng)修正一下塊的偏移位置然后轉(zhuǎn)發(fā)給磁盤(Windows磁盤管理中磁盤0、磁盤1、磁盤2等)驅(qū)動(dòng),磁盤驅(qū)動(dòng)最后把該請(qǐng)求發(fā)到真實(shí)磁盤硬件上進(jìn)行真正的處理(主要是中斷處理、讀寫寄存器等)。所有的I/O(最終體現(xiàn)為對(duì)硬盤數(shù)據(jù)塊內(nèi)容的修改)都在這個(gè)存儲(chǔ)棧上流動(dòng),因此盡管不同的還原軟件有不同的實(shí)現(xiàn)方法,但是一定位于這個(gè)存儲(chǔ)棧上的某個(gè)位置以監(jiān)視數(shù)據(jù)塊的改變。以WindowsXP自帶的系統(tǒng)還原為例,其還原功能的核心組件實(shí)際上就是一個(gè)卷過(guò)濾驅(qū)動(dòng)程序(又稱卷影拷貝,volsnap.sys),位于文件系統(tǒng)驅(qū)動(dòng)與卷驅(qū)動(dòng)之間,這樣,在卷一級(jí)數(shù)據(jù)塊的修改會(huì)先被卷過(guò)濾驅(qū)動(dòng)程序截獲,卷過(guò)濾驅(qū)動(dòng)然后就可以做些處理使得日后能夠還原。圖2描述了基于卷過(guò)濾驅(qū)動(dòng)的還原軟件的詳細(xì)處理流程。
圖2 卷過(guò)濾驅(qū)動(dòng)還原原理
如圖2所示,假設(shè)用戶文件對(duì)應(yīng)卷上的三個(gè)數(shù)據(jù)塊a、b和c,然后用戶啟動(dòng)了系統(tǒng)還原功能建立了一個(gè)還原點(diǎn),那么卷影拷貝驅(qū)動(dòng)就開始工作,接著用戶修改了這個(gè)文件,導(dǎo)致對(duì)應(yīng)的b數(shù)據(jù)塊遭到修改,由于卷影拷貝驅(qū)動(dòng)在卷驅(qū)動(dòng)上方,對(duì)b數(shù)據(jù)塊的修改被卷影拷貝驅(qū)動(dòng)先截獲,卷影拷貝驅(qū)動(dòng)把改動(dòng)寫入其內(nèi)部維護(hù)的“改動(dòng)存儲(chǔ)池”(用b'數(shù)據(jù)塊代表),接著登記一個(gè)映射記錄
以上描述的是各類還原軟件如何在I/O路徑上截獲數(shù)據(jù)塊的修改;對(duì)于“改動(dòng)存儲(chǔ)池”的實(shí)現(xiàn),不同的還原軟件也有不同的設(shè)計(jì),最簡(jiǎn)單的莫過(guò)于在原來(lái)磁盤上劃分出一塊區(qū)域來(lái)作為獨(dú)立存儲(chǔ)改動(dòng)后的數(shù)據(jù)塊,比如可以把硬盤的最末尾一段未分配的存儲(chǔ)空間拿出來(lái)作為存儲(chǔ)池,這樣的設(shè)計(jì)好處是實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是局限性比較大,比如存儲(chǔ)池大小缺乏伸縮性,劃分出來(lái)的硬盤區(qū)域容量決定了最大可以容納多少變化的數(shù)據(jù)塊;又比如無(wú)法適用于用戶的硬盤已經(jīng)被完全分區(qū)過(guò)了的情況;復(fù)雜一點(diǎn)的設(shè)計(jì)是把一個(gè)或若干文件作為“改動(dòng)存儲(chǔ)池”,缺點(diǎn)是實(shí)現(xiàn)變得復(fù)雜了,但存儲(chǔ)池伸縮性很大,可動(dòng)態(tài)適應(yīng)各種需求,其原理是還原軟件在創(chuàng)立一個(gè)還原點(diǎn)的時(shí)候也創(chuàng)建一個(gè)大文件來(lái)對(duì)應(yīng)這個(gè)還原點(diǎn),并且通過(guò)文件系統(tǒng)接口獲知了這個(gè)大文件在卷(基于卷的還原技術(shù))或者磁盤(基于磁盤的還原技術(shù))上的分配位置,以Windows平臺(tái)上的NTFS文件系統(tǒng)為例,NTFS文件系統(tǒng)提供了一些反碎片化(defragment)的接口,比如FSCTL_GET_VOLUME_BITMAP,FSCTL_GET_RETRIEVAL_POINTERS以及FSCTL_MOVE_FILE等等,這些接口原本是設(shè)計(jì)給碎片整理程序用的,讓它們獲得卷上的文件系統(tǒng)位圖、文件數(shù)據(jù)塊的分配位置及進(jìn)行數(shù)據(jù)的搬遷功能等等(詳見微軟MSDN幫助);還原軟件也可以受益于這些接口,而且其中最重要的接口就是 FSCTL_GET_RETRIEVAL_POINTERS,還原軟件通過(guò)該接口可以獲得之前創(chuàng)建的大文件在卷上的分配信息,從而獲得有效的存儲(chǔ)空間對(duì)變化的數(shù)據(jù)塊進(jìn)行存儲(chǔ);舉例來(lái)講,假設(shè)用戶的D盤由0到99總共100個(gè)塊組成,還原軟件以30個(gè)塊的大小創(chuàng)建了大文件,并且調(diào)用FSCTL_GET_RETRIEVAL_POINTERS接口從文件系統(tǒng)那里知道了<3-5>,<11-15><50-71>是對(duì)應(yīng)這個(gè)大文件的數(shù)據(jù)塊,還原軟件就以這三個(gè)區(qū)間構(gòu)成了“改動(dòng)存儲(chǔ)池”。假設(shè)上層應(yīng)用改動(dòng)了數(shù)據(jù)塊8,還原驅(qū)動(dòng)截獲了這個(gè)改動(dòng),從“改動(dòng)存儲(chǔ)池”取出一個(gè)未使用的塊,比如塊3,把改動(dòng)體現(xiàn)在塊3上,添加映射項(xiàng)<8-3>,返回給上層應(yīng)用;同理上層應(yīng)用改動(dòng)了數(shù)據(jù)塊19,還原軟件從“改動(dòng)存儲(chǔ)池”取得未使用的塊4進(jìn)行對(duì)應(yīng),<19-4>,上層應(yīng)用讀取塊8時(shí),還原軟件返回塊3內(nèi)容,讀取塊19時(shí),返回塊4內(nèi)容,其他沒(méi)有修改的數(shù)據(jù)塊則返回原來(lái)的塊內(nèi)容;當(dāng)大文件的30個(gè)塊都使用完后,如果文件系統(tǒng)還有剩余空間,還原軟件可以適當(dāng)進(jìn)行文件大小調(diào)整,比如增長(zhǎng)到40個(gè)塊大小,同樣通過(guò)FSCTL_GET_RETRIEVAL_POINTERS把新增10個(gè)塊納入“改動(dòng)存儲(chǔ)池”實(shí)現(xiàn)動(dòng)態(tài)“擴(kuò)容”;以后當(dāng)用戶進(jìn)行還原的時(shí)候,只需要把大文件和映射表刪除就回到了原來(lái)創(chuàng)建還原點(diǎn)的狀態(tài)。
本文從操作系統(tǒng)層面對(duì)當(dāng)前的還原軟件進(jìn)行了剖析并給出了詳細(xì)的原理闡述;另外筆者還根據(jù)文中所述的還原原理開發(fā)了一個(gè)還原軟件原型,在Windows平臺(tái)上測(cè)試通過(guò),充分證明了其可行性。
[1]David A.Solomon,Mark E.Russinovich.Microsoft Windows 2000技術(shù)內(nèi)幕(第3版)(影印版)[J].北京大學(xué)出版社,2001.