劉斌
(克拉瑪依職業(yè)技術(shù)學院,新疆維吾爾自治區(qū) 克拉瑪依 838600)
基于linux系統(tǒng)的文件實時備份系統(tǒng)
劉斌
(克拉瑪依職業(yè)技術(shù)學院,新疆維吾爾自治區(qū) 克拉瑪依 838600)
本文從企業(yè)的實際需求出發(fā),總結(jié)當前備份軟件存在的一些問題,根據(jù)這些備份軟件備份過程中的關(guān)鍵技術(shù),設計出一種linux下基于inotify機制以及Rsync算法的文件備份軟件。實現(xiàn)不同類型同步事件的實時觸發(fā)和事件類型識別,以及系統(tǒng)自動完成對不同文件同步事件的相應處理。利用Rsync算法計算文件差異,減少傳輸數(shù)據(jù),減輕帶寬壓力。
linux;inotify;rsync;文件備份
目前數(shù)據(jù)安全對企業(yè)以及個人用戶越來越重要,因此容災和遠程備份技術(shù)正成為目前研究的熱點。當前l(fā)inux下較成熟的文件同步軟件rsync等提供了文件同步功能,但他們的問題也很明顯:首先,不能實時監(jiān)控文件系統(tǒng)來判斷文件的更新變化,而只能通過守護進程或者手動的方式進行指定文件的同步;其次,未能考慮到企業(yè)中的一些特別的需求,對主機兩端實時數(shù)據(jù)文件的同步?jīng)]有實現(xiàn);再次,傳統(tǒng)的軟件都是利用定點備份的方法,設置一個時間段,每隔一個時間段備份一次,數(shù)據(jù)實時性較低。
本文提出了一種基于文件操作時間的差異備份方法,利用linux下的inotify機制對文件進行實時監(jiān)控,當用戶對所監(jiān)控文件進行修改后,捕獲文件的變化信息,轉(zhuǎn)化為程序可識別時間,對文件操作進行記錄,然后利用rsync經(jīng)典算法計算出差異數(shù)據(jù),通過網(wǎng)路進行傳輸。
inotify的API都使用文件描述符,這樣可以將監(jiān)控粒度控制到單個文件,而dnotify機制的控制粒度則為單個目錄。使用文件描述符更大的優(yōu)勢在于對inotify的操作也可以使用read()、close()、select()等這些傳統(tǒng)的文件操作函數(shù)。
2.1 int inotify_init(void)
創(chuàng)建并初始化一個inotify實例,該函數(shù)返回一個文件描述符。可以認為這個函數(shù)是打開一個inotify類型的文件并返回該類型文件的描述符。
2.2 intinotify_add_watch (int__fd,constchar *__name,uint32_t__mask)
增加監(jiān)視文件(監(jiān)視器),fd用于指明該文件被添加于哪個inotify實例,name用于指名該文件的路徑,mask則指明了該文件所有的監(jiān)控事件。該函數(shù)調(diào)用成功后返回一個監(jiān)視器的描述符。
2.3 int inotify_rm_watch(int__fd,int__wd)
從fd中刪除一個監(jiān)視器,wd指名具體的監(jiān)視器。
表1 常用的事件觸發(fā)掩碼
rsync是unix/linux下同步文件的一個高效算法,它能同步更新兩處計算機的文件與目錄,并適當利用查找文件中的不同塊以減少數(shù)據(jù)傳輸。rsync中一項與其他大部分類似程序或協(xié)定中所未見的重要特性是鏡像只對有變更的部分進行傳送。rsync可拷貝/顯示目錄屬性,以及拷貝文件,并可選擇性地壓縮以及遞歸拷貝。rsync利用由Andrew Tridgell發(fā)明的算法。rsync的算法如下:(假設我們同步源文件名為fileSrc,同步目的文件叫fileDst)
(1)分塊Checksum算法。首先,我們會把fileDst的文件平均切分成若干個小塊,比如每塊512個字節(jié)(最后一塊會小于這個數(shù)),然后對每塊計算兩個checksum,一個叫rolling checksum,是弱checksum,32位的checksum,其使用的是Mark Adler發(fā)明的adler-32算法,另一個是強checksum,128位的,用md5 hash算法,checksum算法定義如下:
a(k,l)=(∑Xi)mod M
b(k,l)=(∑(l-i+1)Xi)mod M
s(k,l)=a(k,l)+216b(k,l)
上面公式中,s(k,l)表示數(shù)據(jù)塊Xk,...,Xl的滾動校驗值,為了簡化計算,M取值為216。這種校驗計算公式具有一個非常關(guān)鍵的特性,就是后續(xù)校驗值可以通過遞推關(guān)系高效地計算獲得。
a(k+1,l+1)=(a(k,l)-Xk+Xl+1))mod M
b(k+1,l+1)=(b(k,l)-(l-k+1)Xk+a(k+1,l+1))mod M
s(k+1,l+1)=a(k+1,l+1)+216b(k+1,l+1)
因此,給定X1,...,Xn的校驗值,X1以及Xn+1,我們就可以快速地計算出X2,...,Xn+1校驗值。這樣,利用這種性質(zhì)我們就可以高效地計算數(shù)據(jù)塊連續(xù)校驗值,大幅減少checksum計算量。
(2)傳輸算法。同步目標端會把fileDst的一個checksum列表傳給同步源,這個列表里包括了三個東西,rolling checksum(32bits),md5 checksume(128bits),文件塊編號。
(3)checksum查找算法。同步源端拿到fileDst的checksum數(shù)組后,會把這個數(shù)據(jù)存到一個hash table中,用rolling checksum做hash,以便獲得O(1)時間復雜度的查找性能。這個hash table是16bits的,所以,hash table的尺寸是2的16次方,對rolling checksum的hash會被散列到0到2^16-1中的某個整數(shù)值。
(4)比對算法。這是最關(guān)鍵的算法,細節(jié)如下:
a.取fileSrc的第一個文件塊(我們假設的是512個長度),也就是從fileSrc的第1個字節(jié)到第512個字節(jié),取出來后進行rolling checksum計算。計算好的值再到hash表中進行查找。
b.如果查到了,說明發(fā)現(xiàn)在fileDst中有潛在相同的文件塊,于是就再比較md5的checksum,因為rolling checksume太弱了,可能發(fā)生碰撞。于是還要算md5的128bits的checksum,這樣一來,我們就有2^-(32+128)=2^-160的概率發(fā)生碰撞,這個值太小了可以忽略。如果rolling checksum和md5 checksum都相同,這說明在fileDst中有相同的塊,我們需要記下這一塊在fileDst下的文件編號。
c.如果fileSrc的rolling checksum沒有在hash table中找到,那就不用算md5 checksum了。表示這一塊中有不同的信息??傊?,只要rolling checksum或md5 checksum其中有一個在fileDst的checksum hash表中找不到匹配項,那么就會觸發(fā)算法對fileSrc的rolling動作。于是,算法會住后step 1個字節(jié),取fileSrc中字節(jié)2-513的文件塊要做checksum,go to(a).
本系統(tǒng)的服務端運行在linux系統(tǒng)下,隨系統(tǒng)啟動。主要功能模塊包括inotify監(jiān)控模塊,控制模塊,文件數(shù)據(jù)處理模塊,網(wǎng)絡通信模塊,日志記錄模塊和異常處理模塊。
控制模塊:監(jiān)控管理備份系統(tǒng)的各個模塊,協(xié)調(diào)各個模塊的運行。并統(tǒng)一管理備份系統(tǒng)中的日志信息和異常信息。
靜態(tài)文件數(shù)據(jù)備份模塊:靜態(tài)文件數(shù)據(jù)備份模塊主要完成對文件的完全備份。
實時文件數(shù)據(jù)備份模塊:實現(xiàn)文件的差異備份,采用經(jīng)典的Rsync算法計算出更新文件的差量數(shù)據(jù),并通過網(wǎng)絡傳輸模塊完成對數(shù)據(jù)的傳輸。
圖1 服務端結(jié)構(gòu)和功能模塊設計
網(wǎng)絡傳輸模塊:主要任務是完成服務器端與客戶端的鏈接,并且完成對數(shù)據(jù)的傳輸。
日志記錄模塊:以特定的格式記錄每個模塊中的狀態(tài)信息,在備份任務創(chuàng)建和完成以及由于某種原因中斷時,記錄下狀態(tài)信息。
異常處理模塊:負責對備份系統(tǒng)異常信息的處理方法。
靜態(tài)文件備份流程詳細描述:
(1)程序開始接受客戶端數(shù)據(jù);
(2)分析接受到的客戶端數(shù)據(jù)對進行備份初始化;
(3)分析接受到的客戶端數(shù)據(jù),取得客戶端發(fā)送來的需要備份的路徑列表記錄;
(4)在路徑記錄列表中讀取到一條記錄以后獲取路徑信息,并且將路徑信息返回給客戶端;
(5)若路徑為文件路徑,則按行讀取文件的內(nèi)容,將其送往發(fā)送緩沖區(qū),之后數(shù)據(jù)通過網(wǎng)絡發(fā)往客戶端,遇到EOF后返回;
(6)判斷源列表記錄是否還有記錄,若有則返回步驟4,若無則將結(jié)束標志發(fā)往客戶端,結(jié)束數(shù)據(jù)傳輸;
(7)若路徑為目錄,則遞歸的讀取此目錄下的所有文件,將文件數(shù)據(jù)發(fā)往數(shù)據(jù)緩沖區(qū),通過網(wǎng)絡將數(shù)據(jù)發(fā)往客戶端,若目錄中沒有未處理文件或者目錄,則返回6。
靜態(tài)文件的備份主要是在客戶端設置備份的周期,若備份周期為一周,則在第一次備份完一周以后再執(zhí)行一次靜態(tài)文件的備份。
圖2 靜態(tài)文件備份模塊流程圖
6.1 實時監(jiān)控模塊流程圖(如圖3)
6.2 實時文件備份模塊中文件數(shù)據(jù)處理流程圖(如圖4)
實時文件備份模塊中文件數(shù)據(jù)處理詳細流程:
(1)等待文件更新變化的發(fā)生,從事件隊列中讀取事件,判斷事件的類型;
(2)有新建的文件或者有復制過來的文件,則對文件內(nèi)容劃分數(shù)據(jù)塊,放入緩沖區(qū),并進行數(shù)據(jù)傳輸;
(3)讀取更新文件,按照RSYNC算法計算兩種校驗碼,并與校驗碼附加文件中的校驗碼進行對比后計算出差量數(shù)據(jù),構(gòu)建好完整的數(shù)據(jù)包后放入緩沖區(qū),通過網(wǎng)絡傳輸?shù)娇蛻舳??;赗SYNC算法的文件內(nèi)容更新步驟如下:
a.在服務器端,當為指定的文件進行監(jiān)控初始化時,建立一個校驗碼附加文件,將原始文件filesrc平均分成大小為b字節(jié)的若干個小塊Bi,針對每個數(shù)據(jù)塊bi,計算出兩個校驗碼ri和mi,即滾動校驗碼和MD5哈希函數(shù),在實際的對比過程中,滾動校驗碼用來區(qū)別不同,而MD5哈希函數(shù)是用來確認相同。將這兩個校驗碼和文件相關(guān)信息存儲為附加校驗碼文件checksum.txt。
b.在有更新事件發(fā)生后,讀取舊文件的checksum.txt文件中的校驗列表,并為該校驗列表建立哈希表,針對校驗碼序列,遍歷新文件,按照同樣的方式對新文件進行分塊,從第一塊開始,先計算出滾動校驗碼,在哈希表中查找,若有匹配,且之后計算出的MD5校驗碼也匹配,則將索引號組織為更新包放到緩沖區(qū),然后后移一塊,對比下一塊;如果在哈希表中找不到相應的滾動校驗碼或者找到滾動校驗碼之后對應的MD5碼不匹配,則表示這一塊中有不同的信息,后移一個字節(jié)后分塊,再計算滾動校驗碼,重復這樣的過程直到比較完整個文件。
c.通過網(wǎng)絡傳輸數(shù)據(jù)更新包。
d.在客戶端,通過服務器傳輸過來的更新同步數(shù)據(jù)包和舊文件來構(gòu)建新文件。
圖3 實時監(jiān)控模塊流程圖
圖4 實時文件備份模塊中文件數(shù)據(jù)處理流程圖
本系統(tǒng)服務器端采用Cent OS6.2系統(tǒng),功能實現(xiàn)主要采用c語言和shell腳本來完成,分別實現(xiàn)了靜態(tài)文件備份和實時文件備份。為了簡化用戶操作步驟,縮短用戶熟練使用軟件的周期,客戶端采用MS windows server2003系統(tǒng),用c語言集合面向?qū)ο笳Z言c++完成了人機交互界面和相應代碼程序??蛻舳撕头掌鞑捎胹oket方式連接。
本文介紹了一種新的linux下遠程文件同步模型——基于Rsunc算法的遠程文件同步系統(tǒng)。該遠程文件同步系統(tǒng)提高了系統(tǒng)運行效率和提供較高的可擴展性,彌補了當前l(fā)inux下遠程同步軟件所存在的特殊要求不可達、帶寬占用多等問題。
[1]彭勇,劉曉潔,鄧洪敏.《基于差異的遠程文件備份與恢復方法》[J].四川大學學報,2009.
[2]李波,朱坤.《基于局域網(wǎng)的數(shù)據(jù)庫文件備份》[J].農(nóng)業(yè)網(wǎng)絡信息, 2007,(10).
[3]李夷苒,李濤,胡曉勤,馬曉旭.《基于事件的文件備份方法研究與實現(xiàn)》[J].計算機工程與設計,2010,(21).
[4]林國慶,王靜,陳汝偉.《基于索引的文件備份方案》[J].電子設計工程,19(19).
Real-Time Backup System Based on Linux System
Liu Bin
(Karamay Vocational&Technical College,Karamay 838600,Xinjiang)
Starting from the actual needs of enterprises,this paper summarizes the problem and the key technologies of software backup,and designs the file backup software based on the inotify mechanisms and Rsync algorithm in linux.It implements the realtime synchronization events trigger of different types and event type recognition,as well as the automatic synchronization events procession of different file.Rsync algorithm is used to calculate the file differences,to reduce the transmitting data size and the pressure of the bandwidth.
linux;inotify;rsync;file backup
劉斌,男,甘肅酒泉人,碩士,研究方向:嵌入式系統(tǒng)。