我讀到 ZFS 和 Btrfs 使用校驗和來防止數據退化我讀到,Git 透過對每次提交的所有內容進行哈希處理來保持完整性。
我打算在帶有 Btrfs RAID 1 的 Linux NAS 上使用 Git 伺服器進行存儲,但如果 Git 具有完整性,我想這就沒必要了(至少如果我只想防止資料降級的話就沒有必要)。
問題: 那麼,Git 的完整性雖然在每次提交時對所有內容進行哈希處理,但它是否可以防止或幫助防止位元腐爛?
答案1
Git 的雜湊僅在建立提交時發生,並且從那時起散列用於識別提交。這絕不能保證文件的完整性。 Git 儲存庫可能會損壞並遺失資料。事實上,git有一個內建的指令來偵測這種遺失,git fsck,但如文件所述,您有責任從備份中還原任何損壞的資料。
答案2
取決於你所說的「預防」是什麼意思。
(首先,bit-rot是一個有多種定義的術語。這個問題是不是關於由於缺乏維護,程式碼無法運行.)
如果您所說的“防止”是指它可能會通過位的衰減來檢測損壞,那麼是的,這會起作用。然而它會不是幫助修復損壞:哈希值僅提供錯誤檢測,而非校正。
這通常就是「完整性」的意思:探測未經授權/無意的資料操縱,無法阻止或修正資料。
您通常仍然需要 RAID1 和備份(可能使用 ZFS 快照或類似的實現,我不熟悉 RAID1 + 快照上的 ZFS 語義),原因如下:
如果磁碟發生致命故障,您要么需要 RAID1(或最近的備份)來恢復資料;任何錯誤修正都無法修正整個磁碟故障,除非它具有資料的完整副本 (RAID1)。對於較短的停機時間,您基本上必須擁有 RAID1。
如果您不小心刪除了部分或整個儲存庫,則需要備份(RAID1 不能保護您,因為它會立即反映對所有裝置的變更)
本身只有兩個磁碟的區塊級 RAID1(例如透過 LVM 或類似)將不是但可以保護您免受資料無聲衰減的影響:RAID 控制器無法知道兩個磁碟中哪一個保存了正確的資料。為此,您需要額外的信息,例如文件的校驗和。這就是 ZSF 和 btrfs 校驗和的用武之地:它們可以被使用(這並不是說它們是在這些情況下使用(我不知道 ZFS 或 btrfs 如何處理那裡的事情)來區分兩個磁碟中的哪一個保存了正確的資料。
答案3
防止位元腐爛
不,絕對不是。 git 沒有引入類似 RAID 的冗餘。如果目錄中的檔案.git
遭受位元腐爛,您將像平常一樣遺失內容。
有助於防止位元腐爛?
是的...不。它無助於防止位腐爛的發生,但有助於檢測位腐爛。但在正常使用期間,它絕不會透過自己的帳戶執行此操作(很明顯,當您檢查某些物件等時,它會執行此操作,但不會檢查您的歷史記錄)。您必須建立 cron 作業來重新計算內容的雜湊值並將它們與實際的雜湊值進行比較。這樣做非常簡單,因為git
哈希實際上只是內容哈希,因此重新計算它們並git fsck
為您執行此操作很簡單。但當它檢測到位腐爛時,它無法採取任何特別的措施。具體來說,由於較大的區塊會自動壓縮,因此如果翻轉較大物件中的某個位,則可能會導致全部區塊遺失。