
(Ubuntu Linux 伺服器,64 位元)我正在對剛下載的檔案(~3.0 GB)進行故障排除,但它未通過完整性測試,這時我發現了一些非常不尋常的情況。
首先這是下載後檔案的MD5,與預期值不符:
~% md5sum media.iso
5d74facb904cc1765a468354908a8f34 media.iso
一段時間過去了,在這段時間文件應該沒有任何改變,但是當我再次檢查文件時:
~% md5sum media.iso
a5b97c5016afb39bd67ccfc3fa6ca59e media.iso
這實在是出乎我的意料。由於我有大量 RAM,我懷疑這是快取的影響,並且出現了問題。令我驚訝的是,我決定重試磁碟中的整個檔案:
~% sudo sysctl -w vm.drop_caches=3 # This linux command invalidates
vm.drop_caches = 3 # everything in the memory cache.
~% md5sum media.iso
2992aa6270f6e1de9154730ed3beedc1 media.iso
我重新做了它,現在它似乎保持一致,儘管這仍然不是我期望的值。當然,記憶體快取中的內容與磁碟上的內容不同。這是個大問題。
為了修復下載問題,我在來源電腦上建立了一個 torrent 並在目標電腦中開啟它。 ~3.0GB 中的 5 個 1MB 區塊未通過完整性檢查。我使用 torrent 來修復這些文件塊以及文件完整性如何確定。
現在的問題是確定資料在哪裡不同步。
- 我測試了內存記憶體測試86+,除了位衰落測試之外的所有測試。我以為會看到一些故障的記憶體模組,但什麼都沒有。一切都好。
- 檔案系統是 Ext4,基於 LVM2,基於 3 磁碟 RAID5 陣列。 Ext4 被認為是穩定的,如果磁碟之間的資料不一致,mdadm 會發出警告。但日誌裡什麼都沒有。 SMART 錯誤日誌是乾淨的,磁碟是新的(「開機時間」少於 30 天)。
- 我正在尋找有關當前內核(2.6.35)中任何資料遺失錯誤的信息,但據我所知,似乎沒有任何資訊。
關於我還可以檢查什麼,或者缺陷/錯誤到底在哪裡,有什麼想法嗎?
它是 Ubuntu 10.10 64 位元、Core i7 930、6 GB 非 ECC RAM。
更新:我確認文件已正確寫入磁碟,從磁碟讀取頁面後,頁面在記憶體中被更改。我做了更多的記憶測試(我讓它在一夜之間進行位褪色測試),但仍然一無所獲。所有內存模組似乎都正常。
更多測試:
~% md5sum media.iso
cc8bcf1ce67ff7704eadc2222650c087 media.iso
~% cp media.iso tmp1
~% md5sum tmp1
bde6c54b2d7b03404b43056b908036ed tmp1
~% md5sum media.iso
134f607cf4c633ef11d2576d1c635d08 media.iso # ← THIS IS THE CORRECT VALUE
~% cmp -l media.iso tmp1
98697009 101 121
~% udiff <(xxd -s ... media.iso) <(xxd -s ... tmp1 )
--- /proc/self/fd/11 2010-11-03 14:52:55.649433000 -0200
+++ /proc/self/fd/13 2010-11-03 14:52:55.649433000 -0200
@@ -13,7 +13,7 @@
5e1fef1: 280f 5a87 37d2 e6d6 647d bebe f04e 64d8 (.Z.7...d}...Nd.
5e1ff01: 19a5 2ff4 178b 1e37 afb0 e914 e03f bd62 ../....7.....?.b
5e1ff11: 2b8d 4245 985f a9f8 a993 1f51 6d31 30e7 +.BE._.....Qm10.
-5e1ff21: 8274 0d35 ab8f 86b7 130f e1d7 20c6 3541 .t.5........ .5A
+5e1ff21: 8274 0d35 ab8f 86b7 130f e1d7 20c6 3551 .t.5........ .5Q
5e1ff31: 387b f226 6348 fabc 1eae 67ef adda c3b6 8{.&cH....g.....
5e1ff41: a931 bf29 690f 25f9 8922 6dcc 009f 60a5 .1.)i.%.."m...`.
5e1ff51: 559a 9d03 92cb fb5c a75f a26e 0954 0af4 U......\._.n.T..
~% md5sum media.iso
54d67cc4dcad49b6d1bf6619074b471c media.iso
~% direcat media.iso|md5sum
134f607cf4c633ef11d2576d1c635d08 -
~% direcat media.iso | cmp -l media.iso -
98697009 121 101
231297649 146 147
519630641 177 157
2291859249 377 357
2442055473 127 107
2907131697 171 151
(是使用 讀取的direcat
版本,即繞過頁面快取)cat
O_DIRECT
有一個明確的模式:它總是發生在 16 位元組對齊中的第二個位元組。在該位元組中,幾乎總是第 4 位元 (LSB) 翻轉為 1,但有一個實例是第 2 位元翻轉為 0。
答案1
如果檔案的 md5sum 發生變化,則按可能性的順序有幾種可能的解釋:
- 文件已寫入。
- 您的 RAM 有缺陷(或其他主機板組件,但 RAM 是迄今為止最容易故障的)。
- 您的儲存有缺陷。 (不太可能,因為有缺陷的儲存通常會導致檔案不可讀,而不是資料損壞。)
- 核心錯誤,可能在檔案系統程式碼中。 (對於 ext4 來說不太可能。)
請注意,「磁碟和快取之間的不一致」只是一種症狀,而不是原因。這甚至不是您觀察到的症狀:您觀察到的是時間 T 時的記憶與時間 T' 時的記憶之間的差異。
如果您確定檔案沒有被修改,那麼最有可能的解釋是 RAM 有缺陷。遺憾的是,記憶體測試並不總是能偵測出損壞的 RAM。如果您可以獲得該文件的兩個不同副本,請比較它們(cmp -l file1 file2
);如果差異是對齊的(例如,差異始終位於 16 位元組序列的第 42 位元)或由移位的區塊組成(指標變數發生損壞的跡象),則所有跡像都指向有缺陷的 RAM。