
我正在使用 Amazon S3 Glacier Deep Archive 在我的 Ubuntu 電腦上儲存備份。我的工作流程基本上可以歸結為:
tar cf - $FILES | gzip -3 --stdout | aws s3 cp - $TARGET
我認為這工作得很好,但對於非常大的檔案(1TB+),我擔心如果我的電腦在某個地方出現問題,或者有點翻轉,整個檔案將變得無法使用。理想情況下,我想為此流程添加一些糾錯功能。
我查看了 PAR2,它似乎可以滿足我的要求,但有一個警告:它不能將管道作為輸入。這需要我在磁碟上建立整個檔案,然後透過 PAR2 運行它,然後上傳所有內容。對於超過 1TB 的存檔,這在可用磁碟空間方面並不總是可行,更不用說這會大大減慢進程。
我找不到任何類似的工具來將前向糾錯資訊新增到資料流中,而不先將其儲存到文件中。我怎樣才能做到這一點?解決方案是否將資訊添加到單獨的文件或修改流以添加冗餘並不重要。
答案1
工具:redupe
我為此找到了一個工具:redupe
。閱讀相關內容:Redupe:前向糾錯。
這篇文章介紹了
redupe
為資料流提供前向糾錯的[...]工具。 [...]redupe
是按照gzip
或 之類的壓縮工具建模的bzip2
,但增加了冗餘而不是消除冗餘。redupe
直接對資料進行操作,透過新增與原始資料內聯的冗餘資訊將其轉換為冗餘狀態。
補充命令是reundupe
,它實際上只是一個工具,您對它的稱呼決定了它的功能。
你可以得到redupe
來自 GitHub。
我成功地redupe
在 Debian 12 中進行了編譯和測試。
彙編
注意:這裡描述的一些問題可能會發生,因為我缺乏程式設計和編譯的經驗,或者可能是因為我沒有事先(或根本沒有)配置所有內容。
我的作業系統是 Debian 12。
我下載了
redupe-master.zip
來自 GitHub,解壓縮並將自己置於新創建的redupe-master/
.透過試驗和錯誤,我發現我需要以下軟體包:
automake
、、、、、* 。make
gcc
libpopt-dev
libtool
sudo apt-get update sudo apt-get install automake make gcc libpopt-dev libtool
* 至少這些包是我嘗試過的,而且它們看起來都很重要。
-
autoreconf -ivf
-
./configure && make && sudo make install
我能夠啟動
redupe
,但該工具無法找到libredupe.so.0
。我發現相關的庫位於/usr/local/lib/
.我strace redupe
發現該工具檢查了多個位置(例如/usr/lib/
),但沒有檢查/usr/local/lib/
。我將與redupe
from相關的所有內容移至/usr/local/lib/
`/usr/lib/:sudo mv /usr/local/lib/libredupe.* /usr/lib/
我還發現新安裝的文件
/usr/local/bin/redupe
與/usr/local/bin/reundupe
常規文件相同。一個常規檔案就足夠了,另一個名稱可以是符號連結:(cd /usr/local/bin/ && sudo rm reundupe && sudo ln -s redupe reundupe)
我的測試
- 我將 1 GiB 從管道傳輸
/dev/urandom
到常規檔案original
。 - 我
original
透過管道redupe
將結果儲存為original.rd
. - 我
original.rd
透過管道tr ab xy
更改了一些字節,將結果儲存為modified.rd
. - 我確定
original.rd
和modified.rd
是不同的(可以使用cmp
或md5sum
等)。 1 GiB 的隨機資料中存在 noa
和 no 的可能性非常非常小b
,所以這一步並不是真正需要的。 - 我
modified.rd
透過管道reundupe
將結果儲存為result
. - 我檢查(用
cmp
)original
和是否result
相同。
上述過程使用了幾個常規文件。隨著常規文件數量的減少,過程如下所示:
</dev/urandom head -c 1G >original \
&& <original redupe | tr ab xy | reundupe | cmp - original
成功cmp
(無錯誤,退出狀態 0)表示redupe
有效。這個對我有用。
我還在沒有tr
( … | redupe | reundupe | …
) 的情況下進行了測試,看看在完全沒有損壞的情況下是否一切正常。這是。
結論、註釋
redupe
有效,但它不是包治百病的靈丹妙藥。繼續閱讀。調用
redupe --help
,注意-o
/--overhead
選項。如果資料損壞嚴重而無法
reundupe
修正,則該工具將列印error reading input
;稍有誤導,請注意。我設法找到一個(相對較小的)隨機數據文件,在應用
redupe -o 1
(弱冗餘)、更改(相對強烈)和應用後,它reundupe
給了我一個不同的文件,沒有任何錯誤reundupe
。我並不真正懷疑有錯誤,偶然我可能設法創建了一個對reundupe
. OTOH 偶爾的位元翻轉已得到很好的糾正。雖然偶爾的位元翻轉(和位元組翻轉)得到了很好的糾正,但流中丟失或過多的位元組卻被糾正了。致命的。該工具似乎不是為糾正此類錯誤而設計的。
您寫道「我擔心我的電腦是否在某個地方出現問題」。如果您的電腦之前出現過混亂
redupe
,那麼redupe
將會處理混亂的上游流並盡職地處理它。垃圾進垃圾出;reundupe
將重新建立原始混亂的流。如果你的電腦(或其他什麼)真的之後就會變得一團糟,redupe
很可能該工具也無法幫助您,因為它只處理位元翻轉。redupe
在管道內工作,這就是您想要的。但這也意味著它必須使用相對較小的視窗來處理資料。幾個彼此靠近的損壞位元組比分散在一個大檔案中的相同數量的損壞位元組更糟糕。你想放在and
redupe
之間,而不是之前。然後,從備份中檢索時,將是 before 。反過來做(即before 、before )是有缺陷的,因為:gzip
aws
gzip
reundupe
gunzip
redupe
gzip
gunzip
reundupe
(實際原因)稍微翻轉就會
gunzip
失敗(它檢查 CRC)而且數據甚至不需要reundupe
被修正;但即使你可以gunzip
繼續,還有另一個原因;這是…(理論原因)壓縮透過檢測模式、相似性來工作,因此減少了冗餘;你不想添加冗餘並立即刪除它;您想要減少實際數據的冗餘,然後添加一些有意的冗餘並收下。
現在在我看來,當沒有腐敗時,它
redupe
會正確而堅定地發揮作用;reundupe
它可以修復輕微損壞(更改的位元組)。顯然「超出冗餘」的損壞可能會或可能不會被檢測到reundupe
(在您的情況下,未檢測到的損壞可能會gunzip
失敗)。換句話說,該工具不會損壞良好的數據,並且它為您提供了從損壞的數據中恢復良好數據的機會。在我看來,該工具的淨值肯定是正面的。進行自己的測試並確定是否
redupe
適合您;和--overhead
你想要的;以及性能是否可以接受。