Files
ext4recovery/misc_tools/test_corruption.py
2026-04-30 11:04:05 +00:00

51 lines
1.6 KiB
Python

import struct
# Group 0 inode table at block 1070
# Virtual byte: 1070 * 4096 = 4,382,720
# Physical byte via chunk translation:
CHUNK = 128*512
LV_START = 5120000*512
BSIZE = 4096
it_virt = 1070 * BSIZE
group = it_virt // (5*CHUNK)
in_group = it_virt % (5*CHUNK)
chunk_idx = in_group // CHUNK
intra = in_group % CHUNK
print(f'Group 0 inode table:')
print(f' Virtual byte: {it_virt}')
print(f' Chunk group: {group}')
print(f' Chunk index: {chunk_idx} (4=metadata)')
print(f' Is metadata: {chunk_idx == 4}')
if chunk_idx != 4:
phys = LV_START + group*4*CHUNK + chunk_idx*CHUNK + intra
print(f' Physical byte: {phys}')
with open('/dev/sda','rb') as f:
f.seek(phys)
data = f.read(256)
nonzero = sum(1 for b in data if b != 0)
print(f' First inode nonzero bytes: {nonzero}/256')
print(f' First 32 bytes: {data[:32].hex()}')
else:
print(f' In PERC metadata chunk - reads as zeros')
# Check groups 0-15
print()
print('Checking which groups have inode tables in metadata chunks:')
for g in range(20):
it_block = 1070 + g*512
it_virt = it_block * BSIZE
in_group = it_virt % (5*CHUNK)
chunk_idx = in_group // CHUNK
if chunk_idx == 4:
print(f' Group {g:2d}: inode table in METADATA CHUNK (reads as zeros)')
else:
phys = LV_START + (it_virt//(5*CHUNK))*4*CHUNK + chunk_idx*CHUNK + (it_virt%CHUNK)
with open('/dev/sda','rb') as f:
f.seek(phys)
data = f.read(256)
nonzero = sum(1 for b in data if b != 0)
print(f' Group {g:2d}: DATA chunk, nonzero={nonzero}/256')