將糾錯訊息加入管道 tar 流

將糾錯訊息加入管道 tar 流

我正在使用 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。

  1. 我下載了redupe-master.zip 來自 GitHub,解壓縮並將自己置於新創建的redupe-master/.

  2. 透過試驗和錯誤,我發現我需要以下軟體包:automake、、、、、* 。makegcclibpopt-devlibtool

    sudo apt-get update
    sudo apt-get install automake make gcc libpopt-dev libtool
    

    * 至少這些包是我嘗試過的,而且它們看起來都很重要。

  3. autoreconf -ivf
    
  4. ./configure && make && sudo make install
    
  5. 我能夠啟動redupe,但該工具無法找到libredupe.so.0。我發現相關的庫位於/usr/local/lib/.我strace redupe發現該工具檢查了多個位置(例如/usr/lib/),但沒有檢查/usr/local/lib/。我將與redupefrom相關的所有內容移至/usr/local/lib/`/usr/lib/:

    sudo mv /usr/local/lib/libredupe.* /usr/lib/
    
  6. 我還發現新安裝的文件/usr/local/bin/redupe/usr/local/bin/reundupe常規文件相同。一個常規檔案就足夠了,另一個名稱可以是符號連結:

    (cd /usr/local/bin/ && sudo rm reundupe && sudo ln -s redupe reundupe)
    

我的測試

  1. 我將 1 GiB 從管道傳輸/dev/urandom到常規檔案original
  2. original透過管道redupe將結果儲存為original.rd.
  3. original.rd透過管道tr ab xy更改了一些字節,將結果儲存為modified.rd.
  4. 我確定original.rdmodified.rd是不同的(可以使用cmpmd5sum等)。 1 GiB 的隨機資料中存在 noa和 no 的可能性非常非常小b,所以這一步並不是真正需要的。
  5. modified.rd透過管道reundupe將結果儲存為result.
  6. 我檢查(用cmporiginal和是否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在管道內工作,這就是您想要的。但這也意味著它必須使用相對較小的視窗來處理資料。幾個彼此靠近的損壞位元組比分散在一個大檔案中的相同數量的損壞位元組更糟糕。

  • 你想放在andredupe之間,而不是之前。然後,從備份中檢索時,將是 before 。反過來做(即before 、before )是有缺陷的,因為:gzipawsgzipreundupegunzipredupegzipgunzipreundupe

    • (實際原因)稍微翻轉就會gunzip失敗(它檢查 CRC)而且數據甚至不需要reundupe被修正;但即使你可以gunzip繼續,還有另一個原因;這是…

    • (理論原因)壓縮透過檢測模式、相似性來工作,因此減少了冗餘;你不想添加冗餘並立即刪除它;您想要減少實際數據的冗餘,然後添加一些有意的冗餘並收下

  • 現在在我看來,當沒有腐敗時,它redupe會正確而堅定地發揮作用;reundupe它可以修復輕微損壞(更改的位元組)。顯然「超出冗餘」的損壞可能會或可能不會被檢測到reundupe(在您的情況下,未檢測到的損壞可能會gunzip失敗)。換句話說,該工具不會損壞良好的數據,並且它為您提供了從損壞的數據中恢復良好數據的機會。在我看來,該工具的淨值肯定是正面的。

  • 進行自己的測試並確定是否redupe適合您;和--overhead你想要的;以及性能是否可以接受。

相關內容