倪琴琴 孫衛真 劉 崢
摘要:快照是一種重要的存儲數據的技術,可以在不停止應用程序的情況下對數據進行備份。本文對Solaris平臺下的ZFS文件系統中的快照技術進行了分析,介紹了快照的工作原理、實現技術及數據結構,并在ZFS中進行快照創建、數據恢復的實例分析,結果表明ZFS文件系統中的快照技術能避免數據的丟失,可以有效地保護該系統下的數據,并且在操作系統的實驗教學中對文件系統的分析具有較大的實踐意義。
關鍵詞:快照;Copy-on-Write;ZFS;Solaris
中圖分類號:G642 文獻標識碼:B
1引言
隨著計算機技術在各個領域的廣泛應用,信息量迅速增長,越來越多的單位、公司以及個人對計算機數據的依賴性逐步增強,數據的損壞或者丟失將對用戶造成不可彌補的損失。為保護重要數據,用戶不得不頻繁地備份數據。傳統的數據備份是冷備份,需要停止系統運行才能進行,在備份期間,無法進行正常的數據訪問。但對于許多關鍵性的應用環境,如電子商務系統或者銀行系統等,系統需要連續不斷地運轉,停機就意味著業務的停頓和商業機會的丟失,停止系統來進行數據備份就會造成難以估量的損失。因此,如何在系統運行期間對系統數據進行備份,并保證數據版本的一致性就變得尤為重要。Snapshot技術正是為了解決該問題提出的。Snapshot能在不停止應用程序的情況下生成某一瞬間的數據映像,用戶可以對該數據映像進行保存備份,當系統出現問題或者數據丟失時,用戶可以安全方便地獲得快照創建時刻的數據映像。
2Snapshot技術介紹
Snapshot也稱為快照,是本地保留的按時間點保存的數據映像。產生一個文件系的Snapshot,并不是對所有數據塊進行拷貝,只是對文件系統當前點的信息記錄。快照不能被直接訪問,但是可以對它們執行克隆、備份、回滾等操作,通過這些操作,系統可以有效地保護數據。
Snapshot技術的實現方式目前有兩種:即寫即拷(Copy-on-Write)方式和分割鏡像(Split-Mirror)方式。Snapshot需要建立一個完整一致的映像,為了保證這一點,必須在某個特定的時刻完成全部數據的拷貝,通常這種拷貝不可能在一瞬間完成的。實際上在進行Snapshot操作時,并不是對所有的數據進行完全復制,而是使用Copy-on-Write技術或者Split-Mirror方式。建立一個Snapshot只需要極少的工作,在極短的時間內完成即可。
Copy-on-Write技術可以在每次輸入新數據或已有數據被更新時生成對存儲數據改動的Snapshot,這樣做可以在發生硬盤寫錯誤、文件損壞或程序故障時迅速恢復數據。但是,如果需要對網絡或存儲媒介上的所有數據進行完全的存檔或恢復時,所有以前的快照都必須可供使用。Copy-on-Write方式通常也被稱為“元數據”拷貝,即所有的數據并沒有被真正拷貝到另一個位置,只是指示數據所處位置指針被拷貝,從而使得實際用于保存Snapshot所需要的空間大大減少。
Split-Mirror快照引用鏡像硬盤組上所有數據。每次引用運行時,都生成整個卷的Snapshot,而不只是新數據或更新的數據。這種方式使離線訪問數據成為可能,并且簡化了恢復、復制或存檔一塊硬盤上的所有數據的過程。但是,這是個較慢的過程,而且每個快照需要占用更多的存儲空間。
3ZFS系統中Snapshot的實現分析
3.1ZFS中Snapshot的工作原理
ZFS是Solaris系統上一個全新的文件系統,它完全拋棄了傳統的文件系統+卷管理+存儲的架構,所有的存儲設備通過ZFS Pool進行管理,通過把各種存儲設備加入同一個ZFS Pool,可以輕松地在ZFS Pool文件系統下工作。Solaris ZFS文件系統通過快照可避免刪除數據時出現意外丟失,也可以通過適當權限把文件系統中的所有文件移動到遠程系統,以節省本地ZFS系統空間。ZFS通過使用Copy-on-Write的方式提供Snapshot功能,ZFS下的Snapshot為系統提供了更安全有效的數據保護方式,其工作原理如圖1所示。
圖1(b)是對圖1(a)所示的活動的文件系統得一個Snapshot。在創建一個新的Snapshot映像時,系統僅僅簡單地復制一個根節點,新的Snapshot節點與原始的根節點指向完全相同的數據塊,如圖1(b)所示。一段時間后,如果文件系統發生變化,如刪除了一個文件時,在活動的文件系統中,此文件已經丟失,但在磁盤上并沒有真正刪除此文件,Snapshot中仍然記錄此文件的信息,圖1(c)所示。也就是說,通過Snapshot仍然可以找到該文件。而修改文件系統中的某個數據塊時,系統在修改前復制該數據塊,然后修改根節點的相關數據的同時,對復制塊數據進行修改。這樣,僅僅那些修改了的數據塊才需要進行復制,不僅提高了復制效率,也提高了系統磁盤空間的利用率。需要備份時,從Snapshot根節點開始,可以讀取到該時間點的完整的存儲系統映像。而實際的操作仍從根節點開始,這樣可以正確地訪問到最新的數據。

3.2Snapshot結構分析
ZFS文件系統的Snapshot是文件系統的只讀副本。Snapshot幾乎可以即時創建,而且最初不占用池中的其他磁盤空間。但是當活動數據集中的數據發生更改時,Snapshot通過繼續引用數據占用磁盤空間,從而阻止釋放該空間。ZFS Snapshot的特征有以下幾點:
? 在系統重新引導前后保持不變;
? 用戶理論上可以創建的最大快照數為264,且可以根據用戶需求為Snapshot重命名;
? 不使用單獨的后備存儲,Snapshot直接占用存儲池(從中創建這些快照的文件系統所在的存儲池)中的磁盤空間。
文件系統中的Snapshot的存在不會影響系統的效率,ZFS中Snapshot的實現主要是在ZFS的DSL(Dataset and Snapshot Layer)層。
ZFS文件系統在磁盤上可以被描繪成包含諸多葉子節點樹形結構,葉子節點包含數據和含有元數據的內部數據塊,數據塊為dnode_phys類型。在該文件系統中,修改磁盤上的一個數據塊,并不是直接覆蓋磁盤上的原始數據塊,而是創建一個新的數據塊。然后通過修改數據塊父節點的指針,使其指向新數據塊的內容。通過持續該操作,直到到達文件系統的根節點,來實現數據的更新,如圖2所示。
Snapshot也是一種數據塊類型,在ZFS中用dsl_dataset_ phys結構描述。ZFS為維護Snapshot技術主要維護兩種數據結構: blkptr結構體,其中的blk_birth記錄每個數據塊創建的時間;dsl_dataset_phys結構體,維護每個文件系統的“dead”數據塊列表和Snapshot結構,各數據結構的內部關系如圖3所示。dsl_dataset_phys通過dsl_dataset指針鏈接到dsl目錄中,由dsl目錄結構維護整個文件系統中Snapshot以及數據集的關系;blkptr結構體記錄每個數據塊創建的時間,并通過blk_dva所保存的128位虛地址指向具體的數據塊結構。

系統通過dsl_dataset_snapshot_sync()執行創建快照的功能。創建快照時,會生成一個新的dsl_dataset_phys節點,并將該節點加入到dsl目錄中。新的快照節點的與當前的文件系統根節點指向相同的數據集。當文件系統的數據被修改時,如刪除某個數據塊時,需要判斷該數據塊是否可以被完全釋放。此時系統調用dsl_dataset_block_born()來進行判斷,通過比較該數據塊的創建時間(blk_birth)與文件系統中所有的Snapshot的創建時間,如果數據塊是在Snapshot之前創建,該數據塊不能被釋放,而是將其加入到文件系統的dead list中;如果數據塊是在Snapshot之后創建的,則必須釋放該數據塊。通過該方法,當文件系統回滾到Snapshot創建點時,文件系統才能找回創建點的所有數據。當Snapshot被刪除時,系統調用dsl_dataset_destroy_sync()函數,并在該函數中決定哪些數據塊需被釋放,并以此維護文件系統的dead list。
3.3Snapshot實例
在ZFS文件系統中,Snapshot的創建可以隨時進行,當用戶為文件系統創建一個新的Snapshot時,它的初始大小為0KB。如圖4所示,為文件系統fs001創建快照fs_snapshot01,其初始大小為0。因為新創建Snapshot時,沒有進行數據更新,系統只是創建了一個Snapshot節點指向文件系統的數據塊。

當進行文件更新時,如在fs001文件系統中創建了一個新的文件test002.txt,并刪除原來的test001.txt文件,此時再觀察fs_snapshot01,其大小已經變為18.5K,而在文件系統fs001中已經找不到文件test001.txt(圖5所示)。

為觀察Snapshot是否保存有test001.txt文件,我們通過mdb進入系統內核,查看ZFS文件系統的信息。從mdb中可以看到為fs001文件系統創建的Snapshot路徑的信息,命令如下所示:
#mdb –k /*進入mdb*/
>::walk vfs |::fsinfo –v !grep zfs/*查看名為zfs的文件信息*/
fffffffffbacad650zfs /
ffffff00c9cd8690zfs /rpool
ffffff0e84c679c0zfs /rpool/fs001
ffffff00d5c7f358 zfs/rpool/fs001/.zfs/snapshot/fs_snapshot01
從圖6可以看出,進入/rpool/fs001/.zfs/snapshot/fs_ snapshot01文件夾,可以看到,在該文件夾中保存有fs_snapshot01創建時fs001文件中完全相同的數據信息。創建文件系統的快照時,每個文件系統會在自身的根目錄下創建.zfs/snapshot的文件夾,該系統的所有快照信息數據均被保存在這個目錄下。創建Snapshot后,對文件系統中的數據進行修改或刪除,并沒有真正地從磁盤上刪掉修改或刪除的文件,只是改變了文件系統數據塊的指針指向,原始的數據仍然保存在磁盤上,而通過快照回滾,仍然可以找回快照創建點的數據。通過Snapshot可以避免因不正當操作誤刪數據等,能有效地保護系統的數據。

5結束語
本文主要分析了Solaris平臺下ZFS文件系統中Snapshot技術,詳細闡述了在ZFS系統中Snapshot的工作原理,主要功能及數據結構,并通過具體的實例分析了Snapshot保護數據的有效性。Snapshot技術提供了一種高效的地址映射機制,使得用戶在不停止應用程序的前提下,利用較小的空間保護數據,具有極大的靈活性和廣泛的應用性。由于Solaris系統使用的廣泛,該平臺下基于ZFS的Snapshot技術也會有廣闊的應用前景。
快照技術在我校操作系統分析與實踐的課程中作為文件系統的實驗課題,對學生的實踐教學具有實際意義。它不僅在教學過程中引入了OS新技術,也加深學生對文件與IO系統的理解,為后續“UNIX高級編程技術”和“系統編程技術”課程的學習提供了前導幫助。近二年的實踐課程和學生報告表明,利用Solaris操作系統中的新技術(例如Snapshot等),對促進和提高OS的教學具有較現實的意義。
參考文獻:
[1] 董歡慶,李戰懷,王彥龍,等. Linux卷管理系統Snapshot技術的分析與研究[J]. 計算機工程,2004,30(2):55-57.
[2] 胡風華,游智勇, 李恪. 存儲系統中Snapshot技術研究[J]. 計算機工程,2004(01):103-105.
[3] Ahrens. Snapshot, is it magic?[EB/OL]. [2009-04-10]. http://blogs.sun.com/ahrens/entry/is_it_magic.
[4] Richard McDougall. Solaris內核結構 [M]. 2版.北京:機械工業出版社,2007.
[5] BigAdmin. ZFS源代碼概覽[EB/OL]. [2009-04-05]. http://www.sun.com/bigadmin/hubs/ multilingual/simp_chinese/content/ zfs-source.jsp.
[6] 呂爍,羅宇. 基于設備的容災備份方案的研究[J]. 計算機工程與科學,2007(04):142-145.
[7] 李曉林. 存儲網格面面觀[J]. 計算機教育,2004(11):30-32.