EXT4 CRC32C 校驗和算法記錄不充分
所以我正在對 EXT4 校驗和進行某種研究。
我找到了這個頁面並嘗試自己計算校驗和。我從 Superblock 開始,因為它聽起來很簡單:“整個超級塊直到校驗和欄位”。
但它不起作用:我無法得到與超級塊相同的結果。
對於這個任務,我在 Python 上編寫了超級塊校驗和計算器。你可以看看我在 GitHub 上的程序。我嘗試了很多東西。
首先,我嘗試將整個超級塊讀取到校驗和(1020 字節)並將其放入 CRC32C(算法是來自 pip 的獨立庫)。儘管這是在 wiki 中編寫的,但這不起作用。
然後我簡單地反轉了整個超級塊。我認為這沒有多大意義。而我又失敗了。
在此之後,我嘗試了更複雜的方法。我試圖分別反轉超級塊的所有欄位。如您所見,它給出了另一個結果:
Raw data: 1F DC 5E 4A 2-byte fields reversed: DC 1F 4A 5E Full data reverse: 4A 5E DC 1F
再一次,我失敗了。至此,對片語“直到校驗和欄位的整個超級塊”的所有解釋都結束了。
我嘗試在所有算法中添加零填充校驗和欄位,並嘗試僅反轉 little-endian 欄位(實際上似乎是個好主意),而不反轉 char 和 u8 欄位。
但是沒有機會獲得與原始超級塊相同的校驗和。
我的腳本為超級塊生成這樣的輸出:
00c0390000cae600198a0b00c6aca40039a835000000000002000000020000000080000000800000002000001ee68c5c17e68c5c2000ffff53ef01000100000055936d5c000000000000000001000000000000000b000000000100003c000000c60200006b040000d6eb1a5613a44a8a91b66dbfe7cbbca9000000000000000000000000000000002f0061726765740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000800000000000000f00c3000ca7d5363a49944fd9db16c0f95cfab15010140000c0000000000000055936d5c0af3020004000000000000000000000000800000008070000080000000800000000071000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000200020000100000000000000000000000000000000000000040100000d63df0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe3731ed
原始校驗和(未計算!):0xfe3731ed
計算的整個超級塊:0xffffffffL - 這總是發生,可能是一些溢出錯誤。
計算的沒有校驗和的超級塊:0x12cec801L
沒有校驗和的計算完全反轉的超級塊:0x7fe225e5L
計算的欄位反轉超級塊:0x8cce5045L
我找不到任何文件,而且 ext4 原始碼文件的註釋很差(而且非常複雜),我無法理解它們。
好的。我從 Reddit (nightbladeofmalice) 得到了答案。這個人注意到,如果你從 0xFFFFFFFF 中減去它,那麼沒有校驗和欄位 (0x12cec801) 的原始超級塊的校驗和將給出反轉的(大端)原始校驗和:
原始超級塊:00c0390000cae600198a0b008f99a400e8a53500000000000200000002000000008000000080000000200000082d8e5c012d8e5c2100ffff53ef01000100000055936d5c000000000000000001000000000000000b000000000100003c000000c60200006b040000d6eb1a5613a44a8a91b66dbfe7cbbca9000000000000000000000000000000002f00617267657400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000008000000000000008e013000ca7d5363a49944fd9db16c0f95cfab15010140000c0000000000000055936d5c0af302000400000000000000000000000080000000807000008000000080000000007100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000020002000010000000000000000000000000000000000000004010000df1b5b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015de7cf3
原始校驗和(未計算,大端!):0xf37cde15
CRC32C 中沒有校驗和欄位的原始超級塊(1020 字節):0xc8321eaL
反轉校驗和(0xFFFFFFFF-前一個欄位):0xf37cde15L