是否有任何使用 btrfs CoW 作為重複數據刪除的重複數據刪除腳本?
在 Linux 上尋找重複數據刪除工具有很多,請參見例如這個 wiki 頁面。
幾乎所有腳本要麼只檢測、列印重複文件名,要麼通過將重複文件硬連結到單個副本來刪除它們。
隨著 btrfs 的興起,將出現另一種選擇:創建文件的 CoW(寫時複製)副本(如
cp reflink=always
)。我還沒有找到任何可以執行此操作的工具,有人知道執行此操作的工具嗎?
我為此寫了bedup。它將增量 btree 掃描與 CoW 重複數據刪除相結合。最好與 Linux 3.6 一起使用,您可以在其中執行:
sudo bedup dedup
我試過臥床。雖然不錯(並且具有一些有用的差異化功能,可能使其成為許多人的最佳選擇),但它似乎可以掃描所有目標文件的整體以獲取校驗和。
這是非常緩慢的。
另一方面,其他程序,例如 rdfind 和 rmlint,掃描方式不同。
rdfind 具有使用 btrfs reflink 的“實驗性”功能。(以及硬連結、符號連結等的“可靠”選項)
rmlint 為 btrfs 複製、引用連結、正常硬連結、符號連結、刪除和您自己的自定義命令提供“可靠”選項。
但更重要的是,rdfind 和 rmlint明顯更快。如,數量級。它不是掃描所有目標文件的校驗和,而是大致執行以下操作:
- 掃描整個目標文件系統,只收集路徑和文件大小。
- 不考慮具有唯一文件大小的文件。僅此一項,就可以節省大量時間和磁碟活動。(“Scads”是一些反指數函式或其他東西。)
- 在剩餘的候選中,掃描前 N 個字節。不考慮那些文件大小相同但前 N 個字節不同的文件。
- 對最後 N 個字節執行相同操作。
- 只有剩下的(通常是很小的一部分),掃描校驗和。
我知道的 rmlint 的其他優點:
- 您可以指定校驗和。md5太可怕了?試試sha256。或 512。或逐位比較。或者你自己的散列函式。
- 它為您提供了 Btrfs“複製”和“reflink”選項,而不僅僅是 reflink。“cp –reflink=always” 有點冒險,因為它不是原子的,它不知道核心中該文件還發生了什麼,並且它並不總是保留元數據。“複製”,OTOH(這是一個簡寫術語……我正在忽略官方 API 相關名稱),是一個核心級呼叫,它是原子的並保留元數據。幾乎總是產生同樣的結果,但更健壯和安全。(儘管大多數程序足夠聰明,不會刪除重複文件,但如果它不能首先成功地臨時重新連結到另一個。)
- 它為許多案例提供了大量選項(這也是一個缺點)。
我將 rmlint 與 deduperemove 進行了比較——後者還盲目地掃描所有目標文件以查找校驗和。Duperemove 花了幾天時間完成我的音量(我認為是 4),完全傾斜。fmlint 花了幾個小時來辨識重複項,然後不到一天就用 Btrfs 複製對它們進行了重複數據刪除。
(也就是說,任何努力編寫和支持質量、功能強大的軟體並免費贈送的人,都值得稱讚!)
順便說一句:您應該不惜一切代價避免使用正常硬連結作為“通用”重複數據刪除解決方案進行重複數據刪除。
雖然硬連結在某些目標案例中非常方便(例如,單個文件或使用可以掃描超過某個最小大小的特定文件類型的工具 - 或作為許多免費和商業備份/快照解決方案的一部分),但它可能是災難性的用於大型通用文件系統上的“重複數據刪除”。原因是大多數使用者的文件系統上可能有數千個文件,它們的二進製文件相同,但功能完全不同。
例如,許多程序會生成模板和/或隱藏的設置文件(有時在它可以看到的每個文件夾中),它們最初是相同的——並且大多數仍然如此,直到您(使用者)不需要它們。
作為一個具體的說明:照片縮略圖記憶體文件,無數程序在包含照片的文件夾中生成(並且有充分的理由 - 便攜性),可能需要數小時或數天才能生成,但隨後使用照片應用程序變得輕而易舉。如果這些初始記憶體文件都硬連結在一起,那麼您稍後在目錄上打開應用程序並建構一個大記憶體……然後猜猜看:現在每個具有先前硬連結記憶體的文件夾現在都有錯誤的記憶體。潛在的後果是災難性的結果,可能導致意外的數據破壞。並且還可能以某種方式爆炸不支持硬連結的備份解決方案。
此外,它可能會破壞整個快照。快照的全部意義在於“實時”版本可以繼續更改,並能夠回滾到以前的狀態。如果一切都硬連結在一起……你“回滾”到同一件事。
好消息是,使用 Btrfs 複製/重新連結進行重複數據刪除可以消除這種損害(我認為——因為在掃描期間,它應該看到硬連結文件是相同的……除非它有邏輯不考慮硬連結。它可能取決於執行重複數據刪除的特定實用程序。)