專利名稱:一種文件系統(tǒng)中實時刪除重復數(shù)據(jù)的方法
技術領域:
本發(fā)明涉及一種文件系統(tǒng)中實時刪除重復數(shù)據(jù)的方法,屬于計算機數(shù)據(jù)存儲技術 領域。
背景技術:
隨著數(shù)碼設備日新月異的發(fā)展,人類社會正全面在進入數(shù)字化時代,需要存儲的 數(shù)據(jù)量也正呈現(xiàn)出爆炸式增長的態(tài)勢。在此背景下,為了降低存儲成本和提高存儲系統(tǒng)的 可擴展性,如何能以盡可能少的空間儲存盡可能多的數(shù)據(jù)就成為存儲領域最炙手可熱的問 題。重復數(shù)據(jù)刪除技術興起于本世紀初期,近年來得到廣泛普及和應用。重復數(shù)據(jù)刪 除的基本思想可概述如下首先將存儲系統(tǒng)中的文件都切分成若干數(shù)據(jù)塊,用數(shù)據(jù)塊內(nèi)容 的哈希值為數(shù)據(jù)塊集合建立索引,每個哈希值對應的數(shù)據(jù)塊內(nèi)容都僅被存儲一份;然后,存 儲系統(tǒng)并不是直接記錄每個文件的具體內(nèi)容,而是記錄每個文件由那些數(shù)據(jù)塊組成,以及 這些數(shù)據(jù)塊在每個文件中的位置信息;根據(jù)這些信息,存儲系統(tǒng)就能由適當?shù)臄?shù)據(jù)塊內(nèi)容 重構出每個文件的內(nèi)容。目前,重復數(shù)據(jù)刪除技術主要被應用于數(shù)據(jù)的同步、備份或歸檔階段,典型的代表 有同步備份工具Dropbox以及EMC公司的磁盤備份、歸檔和災難恢復產(chǎn)品Data Domain系 統(tǒng)等。在上述這些方法中,重復數(shù)據(jù)刪除都不是實時進行的。在Dropbox中,只有當每個 文件被關閉后,才會對整個文件進行切塊,然后再將變化的數(shù)據(jù)塊傳輸?shù)椒掌鞫?。而?DataDomain系統(tǒng)中,由于每次重復數(shù)據(jù)刪除都需要掃描整個磁盤,因此只能以較低的頻率 周期性進行。不難理解,這種非實時的重復數(shù)據(jù)刪除方法存在以下明顯缺點一、重復數(shù)據(jù) 刪除與數(shù)據(jù)的讀、寫操作在不同階段各自獨立進行,存儲系統(tǒng)為了支持隨機讀寫文件中的 數(shù)據(jù),必須在第一級存儲階段保存全部完整數(shù)據(jù),而僅能在備份和歸檔的第二級存儲階段 發(fā)揮節(jié)省存儲空間的作用;二、切塊效率低下,即使只修改極小一部分數(shù)據(jù),也需要對一個 文件甚至磁盤中的全部數(shù)據(jù)都重新進行切塊。
發(fā)明內(nèi)容
本發(fā)明的目的是提出一種文件系統(tǒng)中實時刪除重復數(shù)據(jù)的方法,通過文件系統(tǒng)驅(qū) 動模塊截獲來自應用程序的創(chuàng)建文件和向文件中寫入數(shù)據(jù)的操作命令,然后根據(jù)操作命令 提供的信息和數(shù)據(jù),實時進行數(shù)據(jù)切塊和重復數(shù)據(jù)刪除,并只將新產(chǎn)生的數(shù)據(jù)塊存儲到磁 盤上,從而在根本上實現(xiàn)以數(shù)據(jù)塊為基本存儲單元的文件系統(tǒng)及其存儲和組織結構,達到 節(jié)省存儲空間的目的。本發(fā)明提出的文件系統(tǒng)中實時刪除重復數(shù)據(jù)的方法,包括以下步驟(1)采用嵌入式數(shù)據(jù)庫存儲文件系統(tǒng)中的元數(shù)據(jù)信息,在該嵌入式數(shù)據(jù)庫中設置 文件元數(shù)據(jù)表、數(shù)據(jù)塊索引表和文件組成表;所述的文件元數(shù)據(jù)表記錄文件系統(tǒng)中每個文 件的元數(shù)據(jù),該元數(shù)據(jù)包括文件標識、文件名、文件所在文件夾的標識、文件大小、文件類型、訪問權限以及文件的創(chuàng)建、修改和訪問時間;所述的數(shù)據(jù)塊索引表記錄文件系統(tǒng)中文件 的數(shù)據(jù)塊的標識以及與標識相對應的數(shù)據(jù)塊的引用次數(shù),其中數(shù)據(jù)塊的標識為該數(shù)據(jù)塊內(nèi) 容的哈希值;所述的文件組成表記錄組成文件系統(tǒng)中的文件的數(shù)據(jù)塊的信息,包括上述文 件標識、數(shù)據(jù)塊起始位置、數(shù)據(jù)塊大小和數(shù)據(jù)塊標識,由其中的數(shù)據(jù)塊起始位置和數(shù)據(jù)塊大 小決定數(shù)據(jù)區(qū)域;(2)通過文件系統(tǒng)的驅(qū)動模塊,接收和響應應用程序?qū)ξ募到y(tǒng)發(fā)起的操作命令, 該操作命令包括創(chuàng)建新文件、向已有文件寫入數(shù)據(jù)、從已有文件讀取數(shù)據(jù)和刪除已有文件, 具體過程如下(2-1)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的創(chuàng)建新文件的操作命令時, 在文件元數(shù)據(jù)表中記錄被創(chuàng)建文件的元數(shù)據(jù);(2-2)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的向已有文件寫入數(shù)據(jù)的操作 命令時,進行以下操作(2-2-1)根據(jù)操作命令中被寫文件的文件標識、寫入位置和寫入數(shù)據(jù)大小,從上述 文件組成表中檢索屬于該被寫文件的兩個數(shù)據(jù)塊標識,且滿足與該兩個數(shù)據(jù)塊標識相對應 的兩個數(shù)據(jù)塊為與被寫入數(shù)據(jù)區(qū)域相互重疊的首、尾兩個數(shù)據(jù)塊;(2-2-2)根據(jù)檢索到的數(shù)據(jù)塊標識,從存儲設備中讀取與該數(shù)據(jù)塊標識相對應的 數(shù)據(jù)塊內(nèi)容;(2-2-3)將讀出的數(shù)據(jù)塊內(nèi)容中與被寫入數(shù)據(jù)區(qū)域不重疊的數(shù)據(jù)拼接到被寫入數(shù) 據(jù)的兩側,得到拼接后的數(shù)據(jù)及數(shù)據(jù)區(qū)域;(2-2-4)從上述文件組成表中檢索與屬于該被寫文件、且數(shù)據(jù)塊起始位置位于上 述步驟(2-2-3)數(shù)據(jù)區(qū)域之內(nèi)的數(shù)據(jù)塊相對應的數(shù)據(jù)塊標識;(2-2-5)將與從上述數(shù)據(jù)塊索引表中檢索到的數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用 次數(shù)減1,當引用次數(shù)不為O時,進行步驟(2-2-6),當引用次數(shù)成為0時,從數(shù)據(jù)塊索引表 中刪除該數(shù)據(jù)塊標識及與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊引用次數(shù),并從存儲設備上刪除該 數(shù)據(jù)塊內(nèi)容,進行步驟(2-2-6);(2-2-6)將上述步驟(2-2-3)拼接后的數(shù)據(jù)切分成一組新數(shù)據(jù)塊;(2-2-7)從上述數(shù)據(jù)塊索引表中分別搜索與上述一組新數(shù)據(jù)塊相對應的每個數(shù)據(jù) 塊標識若該數(shù)據(jù)塊標識已存在,則在數(shù)據(jù)塊索引表中將與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊 的引用次數(shù)加1,若該數(shù)據(jù)塊標識為新標識,則在數(shù)據(jù)塊索引表中添加該新數(shù)據(jù)塊標識,并 將與該新數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用次數(shù)設置為1,并將與該新數(shù)據(jù)塊標識相對應 的新數(shù)據(jù)塊內(nèi)容存儲到存儲設備上;在上述文件組成表中記錄被寫文件的文件標識、該新 數(shù)據(jù)塊的起始位置、該新數(shù)據(jù)塊的大小以及該新數(shù)據(jù)塊的標識;(2-2-8)根據(jù)向已有文件寫入數(shù)據(jù)的操作命令更新上述文件元數(shù)據(jù)表中被寫文件 的元數(shù)據(jù);(2-3)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的從文件系統(tǒng)中的已有文件中 讀取數(shù)據(jù)的操作命令時,進行以下操作(2-3-1)根據(jù)操作命令,在計算機內(nèi)存中分配與待讀取數(shù)據(jù)的大小相等的內(nèi)存空 間,并將該內(nèi)存空間初始化為空白;(2-3-2)根據(jù)操作命令中的被讀文件的文件標識和讀取位置,從上述文件組成表
5中檢索屬于該被讀文件的數(shù)據(jù)塊標識,且滿足與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊是起始位置 處于讀取位置之前的最后一個數(shù)據(jù)塊,若檢索到該數(shù)據(jù)塊標識,且該數(shù)據(jù)塊區(qū)域與待讀取 數(shù)據(jù)區(qū)域存在重疊,則讀取該數(shù)據(jù)塊內(nèi)容,并將該讀取的內(nèi)容與待讀取數(shù)據(jù)區(qū)域的重疊部 分寫入上述步驟(2-3-1)的內(nèi)存空間的頭部,進行步驟(2-3-3),若檢索不到該數(shù)據(jù)塊標 識,或者與檢索到的數(shù)據(jù)標識相對應的數(shù)據(jù)塊區(qū)域與待讀取數(shù)據(jù)區(qū)域不存在重疊,則進行 步驟(2-3-3);(2-3-3)根據(jù)操作命令,從上述文件組成表中檢索屬于該被讀文件的數(shù)據(jù)塊標識, 且滿足與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的起始位置處于待讀取數(shù)據(jù)區(qū)域內(nèi);讀取與檢索到 的所有數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的內(nèi)容,并將讀出的數(shù)據(jù)塊內(nèi)容中與待讀取數(shù)據(jù)區(qū)域的 重疊部分寫入上述步驟(2-3-1)的內(nèi)存空間中;(2-3-4)根據(jù)操作命令,更新上述文件元數(shù)據(jù)表中被讀文件的元數(shù)據(jù);(2-3-5)將上述步驟(2-3-1)的內(nèi)存空間中的數(shù)據(jù)通過文件系統(tǒng)的驅(qū)動模塊返回 給應用程序;(2-4)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的刪除文件系統(tǒng)中的已有文件 的操作命令時,進行以下操作(2-4-1)從上述文件組成表中檢索屬于被刪除文件的數(shù)據(jù)塊標識;(2-4-2)在上述數(shù)據(jù)塊索引表中將與檢索到的每個數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的 引用次數(shù)減1,當引用次數(shù)變?yōu)?時,從數(shù)據(jù)塊索引表中刪除該數(shù)據(jù)塊標識及與該數(shù)據(jù)塊標 識相對應的數(shù)據(jù)塊引用次數(shù),從存儲設備上刪除該數(shù)據(jù)塊內(nèi)容,并進行步驟(2-4-3),當引 用次數(shù)未變?yōu)?時,進行步驟(2-4-3);(2-4-3)從上述文件組成表中刪除被刪除文件的所有記錄;(2-4-4)從上述文件元數(shù)據(jù)表中刪除被刪除文件的元數(shù)據(jù)。本發(fā)明提出的文件系統(tǒng)中實時刪除重復數(shù)據(jù)的方法,具備以下優(yōu)點1、利用本發(fā)明的方法,可以刪除文件系統(tǒng)中的重復數(shù)據(jù),因此節(jié)省存儲空間。2、利用本發(fā)明的方法,將在進行文件讀取、寫入的同時,對被修改的文件數(shù)據(jù)進行 切塊與拼接操作,而無須處理未被修改的數(shù)據(jù),因此極大提高了文件處理的效率。3、本發(fā)明方法同時支持定長和不定長的文件分塊方法,能夠顯著改善重復數(shù)據(jù)的 去除效果,提高存儲空間的利用效率。4、與已有技術相比,本發(fā)明方法使得重復數(shù)據(jù)的刪除過程對應用程序和用戶完全 透明,對新打開的文件可立即實現(xiàn)隨機讀、寫操作,無須等候拼接臨時文件,因此能夠無縫 兼容現(xiàn)有各種應用程序的文件操作,幾乎不會對用戶感受造成任何負面影響。5、由于本方法能夠刪除文件系統(tǒng)中的重復數(shù)據(jù),因此能夠在備份文件系統(tǒng)中的數(shù) 據(jù)時,能夠減少需要復制的數(shù)據(jù)量,縮短備份時間,并節(jié)省備份計算和存儲資源開銷。
圖1是本發(fā)明方法的系統(tǒng)結構圖。圖2是本發(fā)明方法中文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的向已有文件寫 入數(shù)據(jù)的操作命令時的流程框圖。圖3是本發(fā)明方法中向已有文件寫入數(shù)據(jù)的過程示意圖。
圖4是本發(fā)明方法中文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的從文件系統(tǒng)中 的已有文件中讀取數(shù)據(jù)的操作命令時的流程框圖。圖5是本發(fā)明方法中計算待讀取數(shù)據(jù)區(qū)域及計算向內(nèi)存空間的起始寫入位置示 意圖。圖6是本發(fā)明方法中從已有文件讀取數(shù)據(jù)的過程示意圖。圖7是本發(fā)明方法中文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的刪除文件系統(tǒng) 中的已有文件的操作命令時的流程框圖。
具體實施例方式下面結合附圖,詳細介紹本發(fā)明提出的文件系統(tǒng)中數(shù)據(jù)的實時去重和傳輸方法(1)如圖1所示,本方法通過在操作系統(tǒng)的文件系統(tǒng)虛擬層之下注冊文件系統(tǒng)驅(qū) 動模塊,接收和響應應用程序?qū)ξ募到y(tǒng)發(fā)起的操作命令,由文件系統(tǒng)實時重復數(shù)據(jù)刪除 管理進程負責將元數(shù)據(jù)信息和數(shù)據(jù)塊內(nèi)容存儲到存儲設備中。具體地,本方法在存儲設備 中采用嵌入式數(shù)據(jù)庫存儲文件系統(tǒng)中的元數(shù)據(jù)信息。在該嵌入式數(shù)據(jù)庫中設置文件元數(shù)據(jù) 表、數(shù)據(jù)塊索引表和文件組成表;所述的文件元數(shù)據(jù)表記錄文件系統(tǒng)中每個文件的元數(shù)據(jù), 該元數(shù)據(jù)包括文件標識、文件名、文件所在文件夾的標識、文件大小、文件類型、訪問權限以 及文件的創(chuàng)建、修改和訪問時間;所述的數(shù)據(jù)塊索引表記錄文件系統(tǒng)中文件的數(shù)據(jù)塊的標 識以及與標識相對應的數(shù)據(jù)塊的引用次數(shù),其中數(shù)據(jù)塊的標識為該數(shù)據(jù)塊內(nèi)容的哈希值; 所述的文件組成表記錄組成文件系統(tǒng)中的文件的數(shù)據(jù)塊的信息,包括上述文件標識、數(shù)據(jù) 塊起始位置、數(shù)據(jù)塊大小和數(shù)據(jù)塊標識,由其中的數(shù)據(jù)塊起始位置和數(shù)據(jù)塊大小決定數(shù)據(jù) 區(qū)域。(2)通過文件系統(tǒng)的驅(qū)動模塊,接收和響應應用程序?qū)ξ募到y(tǒng)發(fā)起的操作命令, 該操作命令包括創(chuàng)建新文件、向已有文件寫入數(shù)據(jù)、從已有文件讀取數(shù)據(jù)和刪除已有文件, 具體過程如下(2-1)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的創(chuàng)建新文件的操作命令時, 在文件元數(shù)據(jù)表中記錄被創(chuàng)建文件的元數(shù)據(jù)。(2-2)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的向已有文件寫入數(shù)據(jù)的操作 命令時,參見圖2所示的流程框圖,進行以下操作(2-2-1)根據(jù)操作命令中被寫文件的文件標識、寫入位置和寫入數(shù)據(jù)大小,從上述 文件組成表中檢索屬于該被寫文件的兩個數(shù)據(jù)塊標識,且滿足與該兩個數(shù)據(jù)塊標識相對應 的兩個數(shù)據(jù)塊為與被寫入數(shù)據(jù)區(qū)域相互重疊的首、尾兩個數(shù)據(jù)塊,具體過程可參見圖3。從 圖3中,可以看出,文件系統(tǒng)中存在文件標識分別為1和2的兩個文件,文件標識為1的文 件由5個數(shù)據(jù)塊組成,該5個數(shù)據(jù)塊對應的數(shù)據(jù)塊標識分別為A、B、C、D、E,文件標識為2的 文件由3個數(shù)據(jù)塊組成,該3個數(shù)據(jù)塊對應的數(shù)據(jù)塊標識分貝為A、D、F,文件組成表中記錄 了文件的組成信息。上述兩個文件存在重復數(shù)據(jù),導致該兩個文件都含有數(shù)據(jù)塊標識分別 為A和D的兩個數(shù)據(jù)塊,由于這兩個數(shù)據(jù)塊的內(nèi)容只被存儲一次,因此實現(xiàn)了數(shù)據(jù)去重的目 的。如圖3所示,操作命令中被寫文件的文件標識為1,根據(jù)該文件標識,同時根據(jù)操作命令 中的寫入位置和寫入數(shù)據(jù)大小可計算出被寫入數(shù)據(jù)區(qū)域,在文件組成表中檢索屬于該被寫 文件的兩個數(shù)據(jù)塊標識,且滿足與該兩個數(shù)據(jù)塊標識相對應的兩個數(shù)據(jù)塊為與被寫入數(shù)據(jù)區(qū)域相互重疊的首、尾兩個數(shù)據(jù)塊,就會得到數(shù)據(jù)塊標識B和數(shù)據(jù)塊標識D。(2-2-2)根據(jù)檢索到的數(shù)據(jù)塊標識,從存儲設備中讀取與該數(shù)據(jù)塊標識相對應的 數(shù)據(jù)塊內(nèi)容;對應圖3,就是讀出數(shù)據(jù)塊標識分別為B和D的兩個數(shù)據(jù)塊的內(nèi)容。(2-2-3)將讀出的數(shù)據(jù)塊內(nèi)容中與被寫入數(shù)據(jù)區(qū)域相不重疊的數(shù)據(jù)拼接到被寫入 數(shù)據(jù)的兩側,得到拼接后的數(shù)據(jù)及拼接后的數(shù)據(jù)區(qū)域;拼接過程、拼接后的數(shù)據(jù)及拼接后的 數(shù)據(jù)區(qū)域,如圖3所示。(2-2-4)從上述文件組成表中檢索與屬于該被寫文件、且數(shù)據(jù)塊起始位置位于上 述步驟(2-2-3)數(shù)據(jù)區(qū)域之內(nèi)的數(shù)據(jù)塊相對應的數(shù)據(jù)塊標識;在如圖3所示例中,該檢索將 得到的3個數(shù)據(jù)塊標識,分別為B、C和D。(2-2-5)將與從上述數(shù)據(jù)塊索引表中檢索到的數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用 次數(shù)減1,當引用次數(shù)不為0時,進行步驟(2-2-6),當引用次數(shù)成為0時,從數(shù)據(jù)塊索引表 中刪除該數(shù)據(jù)塊標識及與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊引用次數(shù),并從存儲設備上刪除該 數(shù)據(jù)塊內(nèi)容,進行步驟(2-2-6)。(2-2-6)將上述步驟(2-2-3)拼接后的數(shù)據(jù)切分成一組新數(shù)據(jù)塊;數(shù)據(jù)切分的方 法可以使用基于用戶或系統(tǒng)設定的數(shù)據(jù)塊大小的定長切分和基于內(nèi)容指紋的不定長切分, 本發(fā)明的一個實施例中,使用了 Muthitacharoen等人提出的基于Rabin指紋的可變長切分 方法;如圖3所示,拼接后的數(shù)據(jù)被切分成兩個新的數(shù)據(jù)塊,根據(jù)數(shù)據(jù)塊內(nèi)容的哈希值,該 兩個數(shù)據(jù)塊的數(shù)據(jù)塊標識分別為G和H。(2-2-7)從上述數(shù)據(jù)塊索引表中分別搜索與上述一組新數(shù)據(jù)塊相對應的每個數(shù)據(jù) 塊標識若該數(shù)據(jù)塊標識已存在,則在數(shù)據(jù)塊索引表中將與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊 的引用次數(shù)加1,若該數(shù)據(jù)塊標識為新標識,則在數(shù)據(jù)塊索引表中添加該新數(shù)據(jù)塊標識,并 將與該新數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用次數(shù)設置為1,并將與該新數(shù)據(jù)塊標識相對應 的新數(shù)據(jù)塊內(nèi)容存儲到存儲設備上;在上述文件組成表中記錄被寫文件的文件標識、該新 數(shù)據(jù)塊的起始位置、該新數(shù)據(jù)塊的大小以及該新數(shù)據(jù)塊的標識。(2-2-8)根據(jù)向已有文件寫入數(shù)據(jù)的操作命令,更新上述文件元數(shù)據(jù)表中被寫文 件的元數(shù)據(jù)。(2-3)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的從文件系統(tǒng)中的已有文件中 讀取數(shù)據(jù)的操作命令時,參見圖4所示的流程框圖,進行以下操作(2-3-1)根據(jù)操作命令,在計算機內(nèi)存中分配與待讀取數(shù)據(jù)的大小相等的內(nèi)存空 間,并將該內(nèi)存空間初始化為空白;如圖5所示。(2-3-2)根據(jù)操作命令中的被讀文件的文件標識和讀取位置,從上述文件組成表 中檢索屬于該被讀文件的數(shù)據(jù)塊標識,且滿足與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊是起始位置 處于讀取位置之前的最后一個數(shù)據(jù)塊,若檢索到該數(shù)據(jù)塊標識,且該數(shù)據(jù)塊區(qū)域與待讀取 數(shù)據(jù)區(qū)域存在重疊,則讀取該數(shù)據(jù)塊內(nèi)容,并將該讀取的內(nèi)容與待讀取數(shù)據(jù)區(qū)域的重疊部 分寫入上述步驟(2-3-1)的內(nèi)存空間的頭部,進行步驟(2-3-3),具體過程可參見圖6。從圖 6中,可以看出,文件系統(tǒng)中存在文件標識分別為1和2的兩個文件,文件標識為1的文件由 5個數(shù)據(jù)塊組成,該5個數(shù)據(jù)塊對應的數(shù)據(jù)塊標識分別為A、B、C、D、E,文件標識為2的文件 由3個數(shù)據(jù)塊組成,該3個數(shù)據(jù)塊對應的數(shù)據(jù)塊標識分貝為A、D、F,文件組成表中記錄了文 件的組成信息。在圖6中,操作命令中被讀文件的文件標識為1,根據(jù)該文件標識,同時根據(jù)操作命令中的讀取位置,從文件組成表中檢索屬于該被讀文件的數(shù)據(jù)塊標識,且滿足與該 數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊是起始位置處于讀取位置之前的最后一個數(shù)據(jù)塊,就會得到數(shù) 據(jù)塊標識B,而且與數(shù)據(jù)塊標識B相對應的數(shù)據(jù)塊區(qū)域與待讀取數(shù)據(jù)區(qū)域存在重疊,因此, 就要從存儲設備中讀取與B相對應的數(shù)據(jù)塊的內(nèi)容,并將讀取的數(shù)據(jù)塊內(nèi)容與待讀取數(shù)據(jù) 區(qū)域的重疊部分寫入圖6中所示的內(nèi)存空間的頭部。若檢索不到該數(shù)據(jù)塊標識,或者與檢 索到的數(shù)據(jù)標識相對應的數(shù)據(jù)塊區(qū)域與待讀取數(shù)據(jù)區(qū)域不存在重疊,則進行步驟(2-3-3)。(2-3-3)根據(jù)操作命令,從上述文件組成表中檢索屬于該被讀文件的數(shù)據(jù)塊標識, 且滿足與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的起始位置處于待讀取數(shù)據(jù)區(qū)域內(nèi)。在圖5和圖6 所示例中,將會檢索得到數(shù)據(jù)塊標識C和D。讀取與檢索到的所有數(shù)據(jù)塊標識相對應的數(shù)據(jù) 塊的內(nèi)容,并將讀出的數(shù)據(jù)塊內(nèi)容中與待讀取數(shù)據(jù)區(qū)域的重疊部分寫入上述步驟(2-3-1) 的內(nèi)存空間中。在該內(nèi)存空間的中的起始寫入位置等于該數(shù)據(jù)塊的起始位置減去讀取位置 等到的差,以圖6中將數(shù)據(jù)塊標識為C的數(shù)據(jù)塊內(nèi)容寫入該內(nèi)存空間為例,由于讀取位置為 r,與C相對應的數(shù)據(jù)塊的起始位置為b,因此,與C相對應的數(shù)據(jù)塊內(nèi)容將以b-r為起始寫 入位置被寫入該內(nèi)存空間中。(2-3-4)根據(jù)操作命令,更新上述文件元數(shù)據(jù)表中被讀文件的元數(shù)據(jù),即修改被讀 文件的最近訪問時間。(2-3-5)將上述步驟(2-3-1)的內(nèi)存空間中的數(shù)據(jù)通過文件系統(tǒng)的驅(qū)動模塊返回
給應用程序。(2-4)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的刪除文件系統(tǒng)中的已有文件 的操作命令時,參見圖7所示的流程框圖,進行以下操作(2-4-1)從上述文件組成表中檢索屬于被刪除文件的數(shù)據(jù)塊標識。(2-4-2)在上述數(shù)據(jù)塊索引表中將與檢索到的每個數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的 引用次數(shù)減1,當引用次數(shù)變?yōu)?時,從數(shù)據(jù)塊索引表中刪除該數(shù)據(jù)塊標識及與該數(shù)據(jù)塊標 識相對應的數(shù)據(jù)塊引用次數(shù),從存儲設備上刪除該數(shù)據(jù)塊內(nèi)容,并進行步驟(2-4-3),當引 用次數(shù)未變?yōu)?時,進行步驟(2-4-3)。(2-4-3)從上述文件組成表中刪除被刪除文件的所有記錄。(2-4-4)從上述文件元數(shù)據(jù)表中刪除被刪除文件的元數(shù)據(jù)。
9
權利要求
一種文件系統(tǒng)中實時刪除重復數(shù)據(jù)的方法,其特征在于該方法包括以下步驟(1)采用嵌入式數(shù)據(jù)庫存儲文件系統(tǒng)中的元數(shù)據(jù)信息,在該嵌入式數(shù)據(jù)庫中設置文件元數(shù)據(jù)表、數(shù)據(jù)塊索引表和文件組成表;所述的文件元數(shù)據(jù)表記錄文件系統(tǒng)中每個文件的元數(shù)據(jù),該元數(shù)據(jù)包括文件標識、文件名、文件所在文件夾的標識、文件大小、文件類型、訪問權限以及文件的創(chuàng)建、修改和訪問時間;所述的數(shù)據(jù)塊索引表記錄文件系統(tǒng)中文件的數(shù)據(jù)塊的標識以及與標識相對應的數(shù)據(jù)塊的引用次數(shù),其中數(shù)據(jù)塊的標識為該數(shù)據(jù)塊內(nèi)容的哈希值;所述的文件組成表記錄組成文件系統(tǒng)中的文件的數(shù)據(jù)塊的信息,包括上述文件標識、數(shù)據(jù)塊起始位置、數(shù)據(jù)塊大小和數(shù)據(jù)塊標識,由其中的數(shù)據(jù)塊起始位置和數(shù)據(jù)塊大小決定數(shù)據(jù)區(qū)域;(2)通過文件系統(tǒng)的驅(qū)動模塊,接收和響應應用程序?qū)ξ募到y(tǒng)發(fā)起的操作命令,該操作命令包括創(chuàng)建新文件、向已有文件寫入數(shù)據(jù)、從已有文件讀取數(shù)據(jù)和刪除已有文件,具體過程如下(2 1)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的創(chuàng)建新文件的操作命令時,在文件元數(shù)據(jù)表中記錄被創(chuàng)建文件的元數(shù)據(jù);(2 2)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的向已有文件寫入數(shù)據(jù)的操作命令時,進行以下操作(2 2 1)根據(jù)操作命令中被寫文件的文件標識、寫入位置和寫入數(shù)據(jù)大小,從上述文件組成表中檢索屬于該被寫文件的兩個數(shù)據(jù)塊標識,且滿足與該兩個數(shù)據(jù)塊標識相對應的兩個數(shù)據(jù)塊為與被寫入數(shù)據(jù)區(qū)域相互重疊的首、尾兩個數(shù)據(jù)塊;(2 2 2)根據(jù)檢索到的數(shù)據(jù)塊標識,從存儲設備中讀取與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊內(nèi)容;(2 2 3)將讀出的數(shù)據(jù)塊內(nèi)容中與被寫入數(shù)據(jù)區(qū)域不重疊的數(shù)據(jù)拼接到被寫入數(shù)據(jù)的兩側,得到拼接后的數(shù)據(jù)及數(shù)據(jù)區(qū)域;(2 2 4)從上述文件組成表中檢索與屬于該被寫文件、且數(shù)據(jù)塊起始位置位于上述步驟(2 2 3)數(shù)據(jù)區(qū)域之內(nèi)的數(shù)據(jù)塊相對應的數(shù)據(jù)塊標識;(2 2 5)將與從上述數(shù)據(jù)塊索引表中檢索到的數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用次數(shù)減1,當引用次數(shù)不為0時,進行步驟(2 2 6),當引用次數(shù)成為0時,從數(shù)據(jù)塊索引表中刪除該數(shù)據(jù)塊標識及與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊引用次數(shù),并從存儲設備上刪除該數(shù)據(jù)塊內(nèi)容,進行步驟(2 2 6);(2 2 6)將上述步驟(2 2 3)拼接后的數(shù)據(jù)切分成一組新數(shù)據(jù)塊;(2 2 7)從上述數(shù)據(jù)塊索引表中分別搜索與上述一組新數(shù)據(jù)塊相對應的每個數(shù)據(jù)塊標識若該數(shù)據(jù)塊標識已存在,則在數(shù)據(jù)塊索引表中將與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用次數(shù)加1,若該數(shù)據(jù)塊標識為新標識,則在數(shù)據(jù)塊索引表中添加該新數(shù)據(jù)塊標識,并將與該新數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用次數(shù)設置為1,并將與該新數(shù)據(jù)塊標識相對應的新數(shù)據(jù)塊內(nèi)容存儲到存儲設備上;在上述文件組成表中記錄被寫文件的文件標識、該新數(shù)據(jù)塊的起始位置、該新數(shù)據(jù)塊的大小以及該新數(shù)據(jù)塊的標識;(2 2 8)根據(jù)向已有文件寫入數(shù)據(jù)的操作命令更新上述文件元數(shù)據(jù)表中被寫文件的元數(shù)據(jù);(2 3)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的從文件系統(tǒng)中的已有文件中讀取數(shù)據(jù)的操作命令時,進行以下操作(2 3 1)根據(jù)操作命令,在計算機內(nèi)存中分配與待讀取數(shù)據(jù)的大小相等的內(nèi)存空間,并將該內(nèi)存空間初始化為空白;(2 3 2)根據(jù)操作命令中的被讀文件的文件標識和讀取位置,從上述文件組成表中檢索屬于該被讀文件的數(shù)據(jù)塊標識,且滿足與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊是起始位置處于讀取位置之前的最后一個數(shù)據(jù)塊,若檢索到該數(shù)據(jù)塊標識,且該數(shù)據(jù)塊區(qū)域與待讀取數(shù)據(jù)區(qū)域存在重疊,則讀取該數(shù)據(jù)塊內(nèi)容,并將該讀取的內(nèi)容與待讀取數(shù)據(jù)區(qū)域的重疊部分寫入上述步驟(2 3 1)的內(nèi)存空間的頭部,進行步驟(2 3 3),若檢索不到該數(shù)據(jù)塊標識,或者與檢索到的數(shù)據(jù)標識相對應的數(shù)據(jù)塊區(qū)域與待讀取數(shù)據(jù)區(qū)域不存在重疊,則進行步驟(2 3 3);(2 3 3)根據(jù)操作命令,從上述文件組成表中檢索屬于該被讀文件的數(shù)據(jù)塊標識,且滿足與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的起始位置處于待讀取數(shù)據(jù)區(qū)域內(nèi);讀取與檢索到的所有數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的內(nèi)容,并將讀出的數(shù)據(jù)塊內(nèi)容中與待讀取數(shù)據(jù)區(qū)域的重疊部分寫入上述步驟(2 3 1)的內(nèi)存空間中;(2 3 4)根據(jù)操作命令,更新上述文件元數(shù)據(jù)表中被讀文件的元數(shù)據(jù);(2 3 5)將上述步驟(2 3 1)的內(nèi)存空間中的數(shù)據(jù)通過文件系統(tǒng)的驅(qū)動模塊返回給應用程序;(2 4)當文件系統(tǒng)的驅(qū)動模塊接收到來自應用程序的刪除文件系統(tǒng)中的已有文件的操作命令時,進行以下操作(2 4 1)從上述文件組成表中檢索屬于被刪除文件的數(shù)據(jù)塊標識;(2 4 2)在上述數(shù)據(jù)塊索引表中將與檢索到的每個數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊的引用次數(shù)減1,當引用次數(shù)變?yōu)?時,從數(shù)據(jù)塊索引表中刪除該數(shù)據(jù)塊標識及與該數(shù)據(jù)塊標識相對應的數(shù)據(jù)塊引用次數(shù),從存儲設備上刪除該數(shù)據(jù)塊內(nèi)容,并進行步驟(2 4 3),當引用次數(shù)未變?yōu)?時,進行步驟(2 4 3);(2 4 3)從上述文件組成表中刪除被刪除文件的所有記錄;(2 4 4)從上述文件元數(shù)據(jù)表中刪除被刪除文件的元數(shù)據(jù)。
全文摘要
本發(fā)明涉及一種文件系統(tǒng)中實時刪除重復數(shù)據(jù)的方法,屬于計算機數(shù)據(jù)存儲技術領域。在文件系統(tǒng)創(chuàng)建階段,在嵌入式數(shù)據(jù)庫中設置文件元數(shù)據(jù)表、數(shù)據(jù)塊索引表和文件組成表;在文件系統(tǒng)使用階段,通過文件系統(tǒng)驅(qū)動接收和響應應用程序?qū)ξ募到y(tǒng)發(fā)起的操作命令,包括創(chuàng)建新文件、向已有文件寫入數(shù)據(jù)、從已有文件讀取數(shù)據(jù)和刪除已有文件。本發(fā)明方法,同時支持定長和不定長的文件分塊方法,可實時刪除文件系統(tǒng)中的重復數(shù)據(jù),節(jié)省存儲空間,提高存儲設備的利用效率,而且重復數(shù)據(jù)的刪除過程對應用程序和用戶完全透明,無縫兼容現(xiàn)有各種應用程序的文件操作,幾乎不會對用戶感受造成任何負面影響。
文檔編號G06F17/30GK101908073SQ20101025273
公開日2010年12月8日 申請日期2010年8月13日 優(yōu)先權日2010年8月13日
發(fā)明者唐力, 汪東升 申請人:清華大學