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