我希望能夠捕獲和驗證大規模文件集合的校驗和,這些文件通常嵌套在複雜的目錄層次結構中。
每個文件都需要校驗和嗎?是否有方法利用現有的目錄結構來僅驗證檔案樹中的一個節點,而不一定驗證其中的每個檔案?
答案1
使用校驗和最有效的方法是讓電腦完成這一切。使用諸如ZFS 之類的檔案系統,它在寫入所有資料時對所有資料進行校驗和(實際上它使用雜湊值,這比校驗和更強),並在每次讀取資料時驗證它們。當然,缺點是 ZFS 不知道刪除或覆蓋檔案何時是錯誤以及何時是正常操作,但由於 ZFS 對所有內容都使用寫入時複製語義,因此您可以使用它的快照功能來降低風險。
ZFS 還可以使用您設定的任何冗餘自動恢復哈希檢查失敗的數據,無論是raid5 式奇偶校驗、驅動器鏡像還是重複副本(將份數=N 屬性添加到任何ZFS 文件系統,它將存儲N個副本)您寫入的任何資料)。它還將雜湊值儲存在默克爾樹中,其中檔案的雜湊值取決於區塊的雜湊值,目錄項目的雜湊值取決於其包含的檔案和目錄的雜湊值,檔案系統的哈希值取決於根目錄的哈希值等。
無論您最終採用哪種解決方案,您總是會發現該過程受到磁碟速度的限制,而不是 CPU 速度的限制。
另外,不要忘記考慮磁碟的 BER。畢竟,它們只是旋轉的鐵鏽片。消費級硬碟每讀取 10^14 位,就有 1 個錯誤讀取位的錯誤率,相當於每讀取 11 TB 就有 1 個位。如果您有 11 TB 的資料集,並且您計算其中每個檔案的雜湊值,那麼您將錯誤地計算其中一個校驗和,並永久損壞資料集中一個檔案的一個區塊。然而,ZFS 知道它寫入池中每個磁碟的每個區塊的雜湊值,因此知道哪個區塊遺失了。然後,它可以使用池中的冗餘(奇偶校驗、鏡像或額外副本)來使用正確的值來重寫該區塊中的資料。當您使用 zfs send 或 receive 將資料從主系統複製到備份時,這些安全功能也適用。
然而,本在評論中提出了一個很好的觀點。 ZFS 不會向使用者公開其計算的任何雜湊值,因此進入或離開 ZFS 系統的資料應附帶雜湊值。我喜歡網路檔案館透過一個 xml 檔案來實現這一點,該檔案伴隨著檔案館中的每個專案。看https://ia801605.us.archive.org/13/items/fakebook_the-firehouse-jazz-band-fake-book/fakebook_the-firehouse-jazz-band-fake-book_files.xml舉個例子。
答案2
也許這是一個提出的好時機袋它。這是一種非常簡單但功能強大的文件打包格式,用於數位物件的歸檔、長期保存和傳輸。使用者包括國會圖書館和加州數位圖書館。
BagIt 工具(存在於多種程式語言中)將您的檔案放入特定的目錄結構中,並為您進行校驗和/雜湊處理。就這些。
PS:當然,BagIt 工具還可以根據包含的校驗和/雜湊來驗證套件,並且您可以為套件添加一些元資料。但這就像包包一樣複雜。
答案3
我會為每個文件產生校驗和。校驗和非常小,為整個目錄生成校驗和將要求您也處理每個文件(至少如果您沒有談論目錄校驗和,僅從目錄條目中生成 - 我也會生成它們,以確保沒有數據)被刪除)。
假設整個檔案有一個校驗和。您知道資料已損壞,但您不知道這是否只是一個文件,更重要的是,不知道是哪個文件。單獨的校驗和可以為您提供更大的靈活性。您可以檢測損壞的單一文件,並將其從其他備份的文件中替換(這反過來又可能導致其他文件損壞)。
這樣您的資料更有可能保存下來。
答案4
我已經瀏覽了答案,儘管我喜歡依靠 ZFS 來處理資料層錯誤的想法,但仍然存在檔案被錯誤或惡意更改的問題。在這種情況下,ZFS 不會保護您,就像其他人提到的那樣,它不會為您提供用戶可查看的「哈希」來儲存在其他地方以進行外部驗證。
有一個名為 TripWire 的 Linux 應用程序,廣泛用於監視系統可執行文件,以驗證它們在攻擊後沒有被更改。該項目現在顯然已被放棄,但有一個名為 的新項目AIDE (Advanced Intrusion Detection Environment)
,在 ServerFault 上推薦:
https://serverfault.com/questions/62539/tripwire-and-alternatives
安裝時,它將每 x 分鐘運行一次(用戶可設定),並且會檢查您指定的所有資料夾中的檔案變更。它需要運行一次來計算所有檔案雜湊值,然後,它根據當前檔案檢查所有雜湊值,並確保它們仍然相同。您可以指定要使用哪種類型的雜湊值或雜湊值組合(我不建議任何比SHA-256 弱的雜湊值)、要使用的檔案屬性(內容、大小、修改的時間戳記等)、檢查的頻率、如何/在哪裡儲存哈希資料庫等。
有些人可能會認為這種做法太過分了,但根據 OP 的要求,他儲存的資料在某個時間點後將保持不變,這可能會讓他更加安心。