張權(quán),胡曉勤
(四川大學(xué)計算機學(xué)院,成都 610065)
一種基于Linux 標(biāo)準(zhǔn)分區(qū)的快照方法
張權(quán),胡曉勤
(四川大學(xué)計算機學(xué)院,成都 610065)
目前Linux已有的快照大部分都是對于邏輯卷(LVM)實現(xiàn),而極少有對標(biāo)準(zhǔn)分區(qū)進(jìn)行快照的實現(xiàn),基于以上問題,提出一種基于虛擬重構(gòu)的快照方法,可以實現(xiàn)對標(biāo)準(zhǔn)分區(qū)的快照。通過在通用塊層截獲Bio對源卷進(jìn)行寫時拷貝COW(Copy-On-Write),以及構(gòu)造虛擬塊設(shè)備實現(xiàn)I/O重定向機制,對數(shù)據(jù)卷的快照對外看作是一個只可讀的塊設(shè)備從而實現(xiàn)對標(biāo)準(zhǔn)分區(qū)快照。通過實驗表明所提出的快照方法有效實現(xiàn)對標(biāo)準(zhǔn)分區(qū)進(jìn)行快照。
快照;寫時拷貝;虛擬塊設(shè)備;I/O重定向
目前隨著互聯(lián)網(wǎng)的飛速發(fā)展,隨之而來的是數(shù)據(jù)的爆炸式增長以及數(shù)據(jù)重要性的不斷提升。不管是對于企業(yè)來說,還是個人來說,數(shù)據(jù)的保護(hù)是很重要的財富,而如果這些數(shù)據(jù)一旦丟失或遭受損壞,由此帶來的經(jīng)濟(jì)損失是無法估計的。在操作系統(tǒng)中,快照(Snapshot)是整個系統(tǒng)在某個時間點上的狀態(tài)[1]。它存儲了系統(tǒng)映像,讓操作系統(tǒng)在出現(xiàn)故障時,可以快速恢復(fù)到未出問題前的狀況。不管是備份,還是持續(xù)數(shù)據(jù)保護(hù)(CDP),都是以快照為基礎(chǔ)實現(xiàn)的[2],所以快照技術(shù)對于數(shù)據(jù)保護(hù)領(lǐng)域至關(guān)重要。
Linux中常用的快照技術(shù)是基于邏輯卷管理器(LVM)基礎(chǔ)之上的,現(xiàn)階段的快照大多都只是針對邏輯卷來實現(xiàn)的。而如果我們希望對整個Linux系統(tǒng)進(jìn)行保護(hù),例如/boot目錄在安裝操作系統(tǒng)時就要求只能掛載于標(biāo)準(zhǔn)分區(qū)。同時一些用戶也會將其他的目錄,例如根目錄,/home目錄也可能會掛載于標(biāo)準(zhǔn)分區(qū)。那么針對于標(biāo)準(zhǔn)分區(qū),Linux下幾乎沒有實現(xiàn)快照。當(dāng)然,有一些軟件,例如TimeShift軟件,可以為各種目錄進(jìn)行快照,但其創(chuàng)建的快照不可讀,而且是基于文件系統(tǒng)的快照,這與我們要求的基于塊設(shè)備的快照要求不相符。
針對于Linux下標(biāo)準(zhǔn)分區(qū)缺少基于塊層快照的問題,本文提出了一種基于虛擬重構(gòu)的快照方法,可以對Linux下標(biāo)準(zhǔn)分區(qū)、邏輯分區(qū)都可以進(jìn)行快照,并能實現(xiàn)掛載、讀取數(shù)據(jù)、查看快照數(shù)據(jù)的功能,為用戶解決了對于標(biāo)準(zhǔn)分區(qū)無法快照的問題。
根據(jù)存儲網(wǎng)絡(luò)工業(yè)協(xié)會(Storage Networking Industry Association)對快照的定義:關(guān)于指定數(shù)據(jù)集合的一個完全可用的拷貝,該拷貝包括相應(yīng)數(shù)據(jù)在某個時間點的映像??煺湛梢哉f是數(shù)據(jù)的一個復(fù)制品,也可表示為數(shù)據(jù)的一個副本。
在進(jìn)行快照的時候,對原數(shù)據(jù)集合的寫入操作只可以發(fā)生于快照的創(chuàng)建之前或創(chuàng)建之后,在快照創(chuàng)建的這段時間內(nèi),必須保證原數(shù)據(jù)集合是不會被更新,從而可以保證快照數(shù)據(jù)的一致性。
在快照的發(fā)展歷程中,出現(xiàn)了寫時拷貝(Copy-On-Write,COW)技術(shù)[3]、寫重定向(Redirect On Write,ROW)技術(shù)、鏡像分離技術(shù)。
本文基于寫時拷貝技術(shù)實現(xiàn)快照。如圖1所示,寫時拷貝是每次在監(jiān)控到發(fā)現(xiàn)有新數(shù)據(jù)將要寫入時把將要被覆蓋的原數(shù)據(jù)拷貝出來之后再寫入,拷貝出的原數(shù)據(jù)放在劃分給快照使用的卷中,從而保證快照時間點之后對數(shù)據(jù)的更新不會影響到快照,也保證了快照的空間不會太大,也不用將分區(qū)中的所有數(shù)據(jù)都拷貝出來。在使用寫時拷貝的時候,需要先按照數(shù)據(jù)卷的大小來構(gòu)造一個位圖bitmap,每一位對應(yīng)數(shù)據(jù)卷上的一個數(shù)據(jù)塊,為1則表示已經(jīng)寫時拷貝過,為0則表示該塊是沒有拷貝到快照卷中的。
在監(jiān)控驅(qū)動截獲到寫操作的時候,判斷其寫入位置的數(shù)據(jù)塊對應(yīng)bitmap的位是的值。如果該位為1,則直接寫入原數(shù)據(jù)卷。如果為0,則需要將原數(shù)據(jù)塊以及元數(shù)據(jù)寫入到快照卷后再完成對數(shù)據(jù)卷的寫入操作,并修改bitmap,置對應(yīng)位為1。其中,元數(shù)據(jù)的內(nèi)容包括原數(shù)據(jù)卷的設(shè)備號、拷貝的數(shù)據(jù)塊在數(shù)據(jù)卷和快照卷中的偏移量、數(shù)據(jù)塊大小等內(nèi)容。
圖1 寫時拷貝快照示意圖
而鏡像分離技術(shù),一般是通過硬件實現(xiàn)的[4]。該技術(shù)需要在創(chuàng)建快照之前先為原始卷準(zhǔn)備一個或多個物理鏡像,這些鏡像與原始卷完全同步,類似于RAID0的方式。當(dāng)需要快照時,鏡像與原始卷分離,從而鏡像卷中的數(shù)據(jù)是當(dāng)時原始卷的一個快照。顯然,與寫時拷貝技術(shù)相比,此方法占用存儲空間極大,依賴于硬件,并且刪除快照和恢復(fù)比較麻煩,同時也無法創(chuàng)建超過鏡像數(shù)目的快照。故而,本文不選該方法。
對于寫重定向方法(ROW),其實現(xiàn)方法類似于寫時拷貝技術(shù),主要區(qū)別在于指針重映射技術(shù)對于原始數(shù)據(jù)的首次寫操作將被重新定向到預(yù)留的快照空間中。該快照維持的是指向所有源數(shù)據(jù)的指針以及數(shù)據(jù)拷貝。當(dāng)重寫數(shù)據(jù)時,就會為更新過的數(shù)據(jù)選擇一個新的位置,并將指向該數(shù)據(jù)的指針也重新映射,使其指向更新后的數(shù)據(jù)。雖然寫重定向?qū)τ诳煺盏腎/O性能來說,只需要一次寫操作,直接將新數(shù)據(jù)寫入快照空間并更新位圖映射指針,但是對于原數(shù)據(jù)的讀取來說,會變得更復(fù)雜并且降低讀取效率。同時,最大的缺陷在于:當(dāng)刪除快照時,我們需要將快照空間中的數(shù)據(jù)全部覆蓋寫入原數(shù)據(jù)卷中,這樣對于快照刪除的那一段時間內(nèi),原數(shù)據(jù)卷的I/O會變得效率底下,快照刪除困難。
綜上所述,選擇寫時拷貝技術(shù)作為本文的快照實現(xiàn)方法。
在創(chuàng)建對數(shù)據(jù)卷的快照后,監(jiān)控驅(qū)動會在Linux I/O棧的通用塊層截獲對數(shù)據(jù)卷的讀寫請求,并對寫請求進(jìn)行寫時拷貝操作。在創(chuàng)建快照的同時,在內(nèi)核層創(chuàng)建一個虛擬塊設(shè)備,從而對應(yīng)用層提供對快照的讀取等請求處理的操作。
通過創(chuàng)建虛擬重構(gòu)的方法,使得應(yīng)用層能夠?qū)⒖煺湛醋魇且粋€可讀可掛載的塊設(shè)備來進(jìn)行操作。如圖2,在內(nèi)核層創(chuàng)建一個塊設(shè)備所必須的通用磁盤描述結(jié)構(gòu)體gendisk,并初始化該結(jié)構(gòu)體的各種屬性和函數(shù),將該塊設(shè)備在內(nèi)核中注冊(register_blkdev)后,再添加磁盤成功,從而對應(yīng)用層可以映射出一個虛擬塊設(shè)備,在/dev目錄下可以找到該虛擬塊設(shè)備并可以對其進(jìn)行讀取等操作。在構(gòu)造虛擬塊設(shè)備的請求隊列的處理函數(shù),使用了I/O重定向的方法實現(xiàn)對快照內(nèi)容的讀取操作。
通過位圖bitmap和元數(shù)據(jù)來得到快照對應(yīng)的數(shù)據(jù)塊具體位置。當(dāng)應(yīng)用層對虛擬卷進(jìn)行讀取操作時根據(jù)其讀取數(shù)據(jù)塊的位置以及大小,再重定向I/O操作到對應(yīng)的卷中即可實現(xiàn)了快照的讀取操作。如圖3所示,在虛擬塊設(shè)備的請求隊列處理函數(shù)中可以截獲bio。如果該bio為寫時則結(jié)束請求;如果該bio為讀時,通過bio得到讀請求的數(shù)據(jù)塊位置和大小,通過該讀取請求的位置查找對應(yīng)的bitmap的位的值。當(dāng)bitmap對應(yīng)位為0時表示讀取快照的數(shù)據(jù)塊在原數(shù)據(jù)卷上,那么將bio中的設(shè)備號修改為原數(shù)據(jù)卷的設(shè)備號后下發(fā)到原數(shù)據(jù)卷的請求隊列中,從而實現(xiàn)重定向于原數(shù)據(jù)卷中完成讀??;當(dāng)bitmap對應(yīng)位為1時表示對應(yīng)的數(shù)據(jù)塊已經(jīng)經(jīng)過寫時拷貝,將查找元數(shù)據(jù)結(jié)構(gòu)體得到對應(yīng)數(shù)據(jù)塊在快照卷中的具體位置,根據(jù)元數(shù)據(jù)內(nèi)容修改bio將其下發(fā)到快照卷請求隊列后即可完成I/O重定向操作。
圖2 虛擬塊設(shè)備創(chuàng)建流程
圖3 I/O重定向示意圖
通過創(chuàng)建虛擬塊設(shè)備,我們可以對于快照來進(jìn)行讀取、掛載等操作。這里我們將禁用對快照的寫入操作。從而將快照模擬成一個普通的塊設(shè)備對外提供服務(wù)。
3.1 結(jié)構(gòu)定義
定義1數(shù)據(jù)塊(data block):對本地原數(shù)據(jù)卷按偏移量及大小分塊,以數(shù)據(jù)塊為單位記錄數(shù)據(jù)塊的寫時拷貝和I/O重定向。每一個數(shù)據(jù)塊用塊號block_num唯一標(biāo)識,block_num=vol_off/block_sz,其中vol_off為數(shù)據(jù)卷的位置偏移,block_sz為數(shù)據(jù)塊大小。
定義2元數(shù)據(jù)結(jié)構(gòu)體(sp_metadata):表示監(jiān)控驅(qū)動snapshot_bd在截獲寫入操作時,該寫入操作的數(shù)據(jù)塊的偏移量、大小、截獲時間戳以及保存到快照數(shù)據(jù)卷中的位置。
定義3位圖(bitmap):存儲原數(shù)據(jù)卷在創(chuàng)建快照之后,每個數(shù)據(jù)塊是否發(fā)生變化的標(biāo)志位。Bitmap的大小為vol_block_num/8字節(jié),其中vol_block_num為整個數(shù)據(jù)卷的數(shù)據(jù)塊的個數(shù)。每個字節(jié)的8個bit存儲8個塊的變化狀態(tài),數(shù)據(jù)塊在快照創(chuàng)建之后被寫入置該位為1,未被寫入該位為0。
3.2 快照的創(chuàng)建以及寫時拷貝過程
本文將在以下步驟講解創(chuàng)建快照,以及監(jiān)控驅(qū)動截獲對數(shù)據(jù)卷的寫操作并進(jìn)行寫時拷貝的過程,快照創(chuàng)建流程圖如圖4所示。具體步驟如下:
第1步創(chuàng)建快照服務(wù)驅(qū)動snapshot_server_bd,對外提供ioctl接口,通過對/dev/snapshot_server_bd進(jìn)行ioctl控制,可以實現(xiàn)創(chuàng)建對標(biāo)準(zhǔn)分區(qū)、邏輯卷等塊設(shè)備的快照服務(wù),以及刪除快照服務(wù)。
第2步創(chuàng)建快照,通過對/dev/snapshot_server_bd進(jìn)行ioctl接口的訪問,創(chuàng)建對指定分區(qū)的快照,snapshot_server_bd會生成對快照的數(shù)據(jù)卷進(jìn)行監(jiān)控I/O的虛擬塊設(shè)備驅(qū)動snapshot_bd。每針對一個數(shù)據(jù)卷創(chuàng)建快照都會生成一個監(jiān)控的虛擬塊設(shè)備驅(qū)動,其命名為snapshot_sdaN_XXX,其中sdaN表示的是進(jìn)行快照的數(shù)據(jù)卷設(shè)備名,XXX則表示為生成快照的時間戳。
第3步創(chuàng)建元數(shù)據(jù)鏈表,位圖bitmap,由于此時快照正處于創(chuàng)建期間元數(shù)據(jù)鏈表只有一個表頭,位圖bitmap每一位都置為0。
第4步修改數(shù)據(jù)卷的請求隊列(request queue)的處理函數(shù)make_request_fn,修改該函數(shù)從而實現(xiàn)截獲bio結(jié)構(gòu)體。如果該bio為讀取則按原I/O路徑下發(fā)。如果該bio為寫入操作,則找到該寫入位置對應(yīng)的bitmap的位是否為1,如果為1則直接寫入,如果為0則將進(jìn)行寫時拷貝操作。即,讀取該bio對應(yīng)的數(shù)據(jù)塊,并創(chuàng)建并填充元數(shù)據(jù)結(jié)構(gòu)體,將原數(shù)據(jù)塊和元數(shù)據(jù)結(jié)構(gòu)體均寫入快照數(shù)據(jù)卷后,再將新的數(shù)據(jù)寫入下去,同時修改bitmap置對應(yīng)的位為1。
圖4 快照創(chuàng)建流程圖
3.3 快照的讀取流程
對于應(yīng)用層,可以對/dev目錄下的快照進(jìn)行讀取操作,快照讀取流程圖如圖5所示。
對于快照的讀操作,本文在生成的監(jiān)控驅(qū)動的請求隊列的處理函數(shù)make_request_fn是這樣做的:當(dāng)有bio下發(fā)到隊列時,判斷其是否為讀,不是則直接結(jié)束操作。如果是讀的bio,則根據(jù)bio的偏移量來判斷bitmap對應(yīng)位置的值。如果為0,則讀取原數(shù)據(jù)卷的對應(yīng)數(shù)據(jù)塊;如果為1,則讀取快照存儲卷中的數(shù)據(jù)塊。本文以bitmap和元數(shù)據(jù)鏈表來將對生存的快照的虛擬塊設(shè)備的I/O重定向,從而實現(xiàn)快照的可讀可掛載等功能。
4.1 實驗環(huán)境
測試環(huán)境一臺服務(wù)器組成,具體配置如下表1所示。
測試工具:iozone3,一個文件系統(tǒng)的基準(zhǔn)工具,可以測試不同文件系統(tǒng)的讀寫性能,如可以連續(xù)讀寫、隨即讀寫,測試讀寫速度。
圖5 虛擬卷讀取流程圖
4.2 實驗結(jié)果
首先對標(biāo)準(zhǔn)分區(qū)進(jìn)行快照,在快照之前將分區(qū)數(shù)據(jù)進(jìn)行計算MD5的哈希值,然后在快照之后對標(biāo)準(zhǔn)分區(qū)數(shù)據(jù)進(jìn)行大量修改后,再對快照卷進(jìn)行讀取并計算MD5的哈希值。本實驗將以上步驟實驗了多次,其快照前的MD5值和快照的MD5值均相同。從而證明,本文的快照方法是有效的、可行的、無數(shù)據(jù)失效的。
表2 快照數(shù)據(jù)正確性測試結(jié)果
然后接下利用iozone3對于同樣大小的數(shù)據(jù)卷在進(jìn)行本文的快照方法snapshot_bd執(zhí)行快照后和LVM2的快照方法做了快照后測試原數(shù)據(jù)卷和快照卷的隨即讀寫速率。測試速度如表2和表3所示。
表3 LVM2快照和snapshot_bd快照的讀寫原數(shù)據(jù)卷速度對比表
表4 LVM2快照和snapshot_bd快照的讀快照卷速度對比表
對與本文提出的基于Linux標(biāo)準(zhǔn)分區(qū)的快照實現(xiàn)方法,經(jīng)過測試可以看出是可以實現(xiàn)存儲網(wǎng)絡(luò)工業(yè)協(xié)會對與快照的各項要求的,同時經(jīng)過測試其快照導(dǎo)致的磁盤速度也是和LVM2的速度快上一點,但在速度上差距不大。但本方法在保證邏輯卷可以快照的前提下,也可以對Linux下的標(biāo)準(zhǔn)分區(qū)進(jìn)行快照,對于企業(yè)和用戶來說都是急需的功能。
本文針對于Linux下缺乏對標(biāo)準(zhǔn)分區(qū)進(jìn)行快照的方法,或者對標(biāo)準(zhǔn)分區(qū)都只是基于文件系統(tǒng)層面且不可掛載和讀取的缺陷,設(shè)計了可以對標(biāo)準(zhǔn)分區(qū)、邏輯卷的基于塊設(shè)備層的可讀可掛載的快照方法。通過實驗驗證了本文提出的快照方法能夠?qū)崿F(xiàn)快照的數(shù)據(jù)一致性、可讀可掛載,從而解決了Linux下缺乏對標(biāo)準(zhǔn)分區(qū)進(jìn)行快照的問題。
[1]M.Rock,P.Poresky.Shorten Your Backup Window[J].Storage,Special Issue on Managing the Information that Drivers the Enterprise, 2005,6(9).
[2]LI,Xiao,Tan,Yu-An,LI,Yuan-Zhang,Snapshot Method for Continuous Data Protection Systems:Snapshot Method for Continuous Data Protection Systems[J].Journal of Software,10/20/2011,Vol.22(10):2523-2537.
[3]周煜,盧正添,易固武,葛亮.一種基于過濾驅(qū)動的寫時拷貝快照方法[J].四川大學(xué)學(xué)報:自然科學(xué)版,2010,Issue 3,pp.478-482.
[4]G.Duzy.Match Snaps to Apps[J].Storage,Special Issue on Managing the Information that Drives the Enterprise,2005,7(5).
A Method of Snapshot Based on Linux Disk Partition
ZHANG Quan ,HU Xiao-qin
(College of Computer Science,Sichuan University,Chengdu 610065)
Current snapshot based on Linux are mostly achieved by Logical Volume(LVM),and there is few implementations of snapshot regarding the disk partitions.Based on all above problems,proposes a method of snapshot based on virtual reconstruction,which can get the snapshots of disk partitions.Copy-On-Write is performed by intercepting Bio at the generic block layer to write the disk volume,and creating virtual block device to implement the redirection mechanism.In this process,the snapshots for the data volume can be seen as a readonly block device,thereby achieve the snapshots for the disk partitions.Verified by the experiments,this implementation of snapshot can guarantee the effectiveness of snapshot for disk partitions.
Snapshot;COW;Virtual Block Device;I/O Redirection
1007-1423(2017)07-0029-05
10.3969/j.issn.1007-1423.2017.07.008
張權(quán)(1991-),男,湖北棗陽人,碩士研究生,研究方向為網(wǎng)絡(luò)與信息安全
胡曉勤(1977-),男,四川內(nèi)江人,博士,講師,研究方向為網(wǎng)絡(luò)與信息安全
2016-12-22
2017-02-10
國家重點研發(fā)計劃(No.2016yfb00604、No.2016yfb00605)、國家自然科學(xué)基金項目(No.61572334)