그래서 EXT4 체크섬에 대해 연구하고 있습니다.
내가 찾은이 페이지체크섬을 직접 계산해 보세요. 나는 간단하게 들리기 때문에 수퍼블록으로 시작했습니다. "체크섬 필드까지의 전체 수퍼블록"입니다.
하지만 작동하지 않습니다. 슈퍼블록으로는 동일한 결과를 얻을 수 없습니다.
이 작업을 위해 저는 Python으로 슈퍼블록 체크섬 계산기를 작성했습니다. 당신은 볼 수 있습니다GitHub의 내 프로그램. 나는 많은 것을 시도했습니다.
먼저 전체 슈퍼블록을 체크섬(1020바이트)까지 읽어서 CRC32C에 넣어 보았습니다(알고리즘은 다음과 같습니다).pip 독립적인 라이브러리). 위키에 이렇게 써있지만 작동하지 않습니다.
그런 다음 전체 슈퍼블록을 간단히 뒤집었습니다. 나는 이것이 별로 의미가 없다고 생각한다. 그리고 나는 또 실패했다.
그 후에는 좀 더 정교한 방법을 시도했습니다. 슈퍼블록의 모든 필드를 개별적으로 반전해 보았습니다. 보시다시피 또 다른 결과를 제공합니다.
Raw data: 1F DC 5E 4A
2-byte fields reversed: DC 1F 4A 5E
Full data reverse: 4A 5E DC 1F
이번에도 나는 실패했다. 이것으로 "체크섬 필드까지의 전체 슈퍼블록"이라는 문구에 대한 모든 설명을 마칩니다.
모든 알고리즘에 제로 패딩된 체크섬 필드를 추가하고 char 및 u8 필드는 반전하지 않고 리틀 엔디안 필드만 반전해 보았습니다(실제로는 좋은 생각인 것 같습니다).
그러나 원래 슈퍼블록과 동일한 체크섬을 얻을 가능성은 없습니다.
내 스크립트는 슈퍼블록에 대해 다음과 같은 출력을 생성합니다.
00c0390000cae600198a0b00c6aca40039a835000000000002000000020000000080000000800000002000001ee68c5c17e68c5c2000ffff53ef01000100000055936d5c000000000000000001000000000000000b000000000100003c000000c60200006b040000d6eb1a5613a44a8a91b66dbfe7cbbca9000000000000000000000000000000002f0061726765740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000800000000000000f00c3000ca7d5363a49944fd9db16c0f95cfab15010140000c0000000000000055936d5c0af3020004000000000000000000000000800000008070000080000000800000000071000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000200020000100000000000000000000000000000000000000040100000d63df0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe3731ed
원시 체크섬(계산되지 않음!): 0xfe3731ed
전체 슈퍼블록 계산: 0xffffffffL - 이는 항상 발생하며 일부 오버플로 오류가 있을 수 있습니다.
체크섬 없이 계산된 슈퍼블록: 0x12cec801L
체크섬 없이 계산하면 슈퍼블록이 완전히 반전됩니다: 0x7fe225e5L
계산된 필드 반전 슈퍼블록: 0x8cce5045L
어떤 문서도 찾을 수 없으며 ext4 소스 코드 파일은 주석이 너무 형편없고 매우 복잡해서 이해할 수 없습니다.
답변1
좋아요 Reddit(nightbladeofmalice)에서 답변을 얻었습니다. 이 사람은 0xFFFFFFFF에서 원래 슈퍼블록(0x12cec801)의 체크섬을 빼면 반전된(빅 엔디안) 원래 체크섬이 나온다는 사실을 알아냈습니다.
원래 슈퍼블록:
원시 체크섬(계산되지 않은 빅엔디안!): 0xf37cde15
CRC32C에 체크섬 필드가 없는 원시 슈퍼블록(1020바이트): 0xc8321eaL
반전된 체크섬(0xFFFFFFFF - 이전 필드): 0xf37cde15L