dd 是否進行任何類型的驗證?

dd 是否進行任何類型的驗證?

我用來dd將資料從舊硬碟複製到新硬碟。我想確保資料的完整性是安全的。

對此回答,吉爾斯說

如果 [dd] 成功終止,則備份正確,除非出現硬體故障…

這到底是什麼意思?是否dd有某種內建驗證?

如果我要使用 rsync,我--checksum也會執行第二遍來進行驗證。這種偏執有道理嗎?

答案1

dd或者任何其他應用程式都沒有您可能想到的「某種內建驗證」:它不會從儲存媒體讀回資料來與寫入的資料進行比較。這就是作業系統的工作。

實際上不可能從應用程式對硬體進行讀取驗證。它在某些情況下會起作用,但在大多數情況下它不會有任何效果。應用程式可以讀回剛剛寫入的內容如果直接寫入儲存媒體,但這通常會從記憶體快取中讀回,這不會提供任何有用的保證。在你引用的例子dd正在寫入管道,在這種情況下,它無法控制接下來的資料會發生什麼。在您的 rsync 範例中,第二遍rsync --checksum是毫無意義的:理論上它可以捕捉錯誤,但實際上,如果確實發生錯誤,那麼第二遍可能不會報告任何錯誤,因此您在浪費精力實際上並沒有提供有用的保證。

然而,應用程式驗證資料發生了什麼,即驗證作業系統已接受對資料的責任。所有系統呼叫都會傳回錯誤狀態。如果系統呼叫傳回錯誤狀態,則應用程式應將該錯誤傳播給用戶,通常是透過顯示錯誤訊息並傳回非零退出狀態。

請注意,這dd是一個例外:根據命令列參數,dd可能會忽略一些錯誤。這是極其不尋常的:dd是具有此屬性的唯一常用命令。使用cat而不是dd,這樣你就不會面臨腐敗的風險它可能會更快

在資料複製鏈中,可能會出現兩種錯誤。

  • 損壞:傳輸期間翻轉了一位。無法在應用程式層級驗證這一點,因為如果發生這種情況,則是由於程式錯誤或硬體錯誤造成的,在讀回時很可能會導致相同的損壞。驗證沒有發生此類損壞的唯一有用方法是物理斷開媒體連接並重試,最好在另一台電腦上重試,以防問題出在 RAM 上。
  • 截斷:所有複製的資料都被正確複製,但有些資料根本沒有複製。這個有時值得檢查,這取決於命令的複雜性。您不需要讀取資料來執行此操作:只需檢查大小即可。

答案2

不,dd不進行顯式驗證。如果您想要/需要經過取證驗證的磁碟或其任何部分的副本,請使用由美國國防部電腦鑑識實驗室開發的dcfldd增強版本。dd

答案3

「確定」的唯一方法是執行額外的讀取和比較過程(在刪除快取之後)。

除此之外,dd以與所有其他程式相同的方式檢測讀取和寫入錯誤......如果磁碟機(和其他涉及的元件)報告錯誤,它就會起作用;對於以靜默方式接受資料而不實際寫入資料的驅動器,您就不走運了。

這種偏執有道理嗎?

如果你不能相信你的硬體是可靠的,事情就會變得複雜...

答案4

man dd

完成後,dd 將完整和部分輸入和輸出區塊、截斷的輸入記錄和奇數長度位元組交換區塊的數量顯示到標準錯誤輸出。

部分輸入區塊是讀取小於輸入區塊大小的輸入區塊。部分輸出區塊是寫入小於輸出區塊大小的輸出區塊。磁帶設備的部分輸出區塊被視為致命錯誤。否則,將寫入區塊的其餘部分。字元設備的部分輸出區塊將產生警告訊息。

dd每次複製區塊時都會驗證輸入/輸出區塊大小是否匹配。如果不這樣做,它會透過警告或致命錯誤來處理錯誤(用 覆蓋noerror)。這就是為什麼dd幾乎一直都有效的原因。

儘管如此,它並不能取代手動驗證磁碟完整性的操作。如果該資訊對您有價值,那麼是的,你的偏執是有道理的dd完成後運行手動驗證。

相關內容