如何確保 BTRFS 中的唯讀快照沒有損壞?

如何確保 BTRFS 中的唯讀快照沒有損壞?

我們如何確保只讀快照不會因磁碟故障而損壞?

計算校驗並將其儲存以進行進一步檢查的唯一方法是唯一的方法,還是 BTRFS 自己處理?

基本原理

我定期備份快照,以防止可能出現的磁碟故障。幾天前,我無法拍攝btrfs send | btrfs receive特定的快照。當我刪除它時,其餘操作都正常。此外,他還btrfs scrub表示,存在一些無法糾正的錯誤。這讓我認為主磁碟上的快照在將它們備份到外部磁碟之前可能已損壞,如果我沒有意識到這一點,我最終會在外部磁碟上獲得已損壞的備份。

這就是我想要防止發生的事情。我想確保如果我(可以)備份快照,那麼它不會損壞。

答案1

根據您所說的「因磁碟故障而損壞」的含義,有兩種可能的答案。

如果您指的是簡單的靜態資料損壞

BTRFS 自行處理此問題,對使用者透明。它在內部對所有內容(包括快照中的資料)進行校驗和,然後在讀取每個區塊時驗證校驗和。不過,也有一些例外:

  • nodatasum如果使用或選項安裝卷nodatacow,則不會對資料塊進行校驗和。在大多數情況下,您不應該使用這些選項進行安裝,因此這不應該成為問題。
  • 任何設定了該屬性的檔案NOCOWC在指令的輸出中lsattr)也不會被檢查。您不太可能有任何真正重要的文件設定了此屬性(systemd 日誌檔案已設定它,但僅此而已,除非您手動設定它)。

如果您的意思是由於丟失太多設備而對卷上的資料造成重大破壞

除非在某處擁有另一個資料副本,否則無法防止這種情況發生。基本上,如果您遺失的裝置數量超過了該磁碟區的儲存設定檔可以承受的數量,那麼您的資料就會遺失,並且除了從備份還原之外,沒有任何方法可以將其還原。


關於您的具體情況

您所討論的發送/接收問題可能是由scrub 報告的那些無法糾正的錯誤的副作用。當 BTRFS 無法透明地修復錯誤時(通常是因為區塊是使用無法進行復原的設定檔儲存的,例如 single 或 raid0),它會傳回 I/O 錯誤,這將導致發送操作失敗。因此,如果您使用發送/接收,您將不會得到已經損壞的備份(實際上,您也不會使用大多數其他工具,任何好的備份軟體如果無法讀取檔案都會拋出錯誤)。

在這種情況下,聽起來無法修正的錯誤完全是快照獨有的資料或未建立快照的資料。您可以透過將來源磁碟區單獨安裝到某個位置並從安裝位置執行以下命令來相當輕鬆(儘管不是很快)找出哪些檔案有問題:

find . -exec cat '{}' \; > /dev/null

這將嘗試讀取磁碟區上的每個文件,您將在控制台上看到任何讀取錯誤,並在錯誤訊息中顯示檔案名稱。這可能非常慢,因此如果您的資料量很大,您可能需要並行化它。

一旦找到並處理了這些文件,就不會再有進一步的問題了。如果您在修復這些問題後發現這些問題在不久的將來再次發生,您應該考慮檢查您的硬件,因為某物正在悄悄地破壞資料。

相關內容