51 lines
1.6 KiB
Python
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')
|