Initial remote commit
This commit is contained in:
80
misc_tools/interleave_check.py
Normal file
80
misc_tools/interleave_check.py
Normal file
@@ -0,0 +1,80 @@
|
||||
CHUNK = 128*512
|
||||
LV_START = 5120000*512
|
||||
BSIZE = 4096
|
||||
|
||||
# The directory data block is at virtual block 5251104
|
||||
# virt_byte = 5251104 * 4096 = 21508521984
|
||||
virt_byte = 5251104 * BSIZE
|
||||
|
||||
group = virt_byte // (5*CHUNK)
|
||||
in_group = virt_byte % (5*CHUNK)
|
||||
chunk_idx = in_group // CHUNK
|
||||
intra = in_group % CHUNK
|
||||
|
||||
print(f'Virtual byte: {virt_byte}')
|
||||
print(f'Chunk group: {group}')
|
||||
print(f'Chunk index: {chunk_idx}')
|
||||
print(f'Intra: {intra}')
|
||||
print()
|
||||
|
||||
# This is chunk_idx=4 - a PERC metadata chunk
|
||||
# The PERC stored filesystem data here
|
||||
# Physical location:
|
||||
# In our translation, we skip chunk_idx=4
|
||||
# But if the PERC stored data there, it's at:
|
||||
# phys = LV_START + group*5*CHUNK + chunk_idx*CHUNK + intra
|
||||
# (5 chunks per group including metadata chunk)
|
||||
phys_with_meta = LV_START + group*5*CHUNK + chunk_idx*CHUNK + intra
|
||||
print(f'Physical byte if 5-chunk groups: {phys_with_meta}')
|
||||
print(f'Physical sector: {phys_with_meta//512}')
|
||||
|
||||
# Also try: physical = LV_START + group*4*CHUNK + ... but for chunk 4
|
||||
# In our current scheme chunk 4 has no mapping
|
||||
# But the data must be somewhere on disk
|
||||
|
||||
# The PERC presents 5 virtual chunks = 5*64KB = 320KB per group
|
||||
# Of these, 4 are data and 1 is PERC metadata
|
||||
# But what if it's the OPPOSITE?
|
||||
# What if 4 are PERC metadata and only 1 is data? No - we verified 4/5 ratio
|
||||
|
||||
# What if the metadata chunk IS stored on disk but at a different offset?
|
||||
# The PERC stores its own metadata in those chunk positions
|
||||
# For reading filesystem data that falls there, it must use the metadata chunk
|
||||
# storage differently
|
||||
|
||||
# Let's read what's physically at that location
|
||||
# The virtual block 5251104 is in chunk group 'group' at chunk position 4
|
||||
# In the physical layout (5 chunks per group):
|
||||
# group X physical layout: [data0][data1][data2][data3][meta4]
|
||||
# Our translation: physical chunk = group*4 + chunk_idx (skipping meta)
|
||||
# So physical chunk for data chunks 0-3 = group*4 + 0,1,2,3
|
||||
# And physical chunk for meta = stored AFTER the 4 data chunks = group*4+4?
|
||||
# But that would mean physical layout is: data0,data1,data2,data3,meta4
|
||||
# which IS 5 consecutive chunks on disk
|
||||
|
||||
# So the physical byte for chunk_idx=4 would be:
|
||||
phys_consecutive = LV_START + group*5*CHUNK + 4*CHUNK + intra
|
||||
print(f'Physical byte (consecutive 5-chunk): {phys_consecutive}')
|
||||
|
||||
# Read it
|
||||
with open('/dev/md0','rb') as f:
|
||||
f.seek(phys_consecutive)
|
||||
data = f.read(512)
|
||||
nonzero = sum(1 for b in data if b != 0)
|
||||
print(f'Nonzero bytes: {nonzero}/512')
|
||||
print(f'First 32: {data[:32].hex()}')
|
||||
|
||||
# Also check: maybe the metadata chunk is interleaved differently
|
||||
# What if physical layout per group is: [meta0][data1][data2][data3][data4]?
|
||||
# i.e. metadata chunk is FIRST, not last?
|
||||
for meta_pos in range(5):
|
||||
# If metadata is at position meta_pos within each group of 5 physical chunks
|
||||
# Then for virtual chunk_idx=4 (the one we skip):
|
||||
# virtual chunks 0,1,2,3 map to physical chunks skipping meta_pos
|
||||
# virtual chunk 4 IS the metadata chunk
|
||||
phys_test = LV_START + group*5*CHUNK + meta_pos*CHUNK + intra
|
||||
with open('/dev/md0','rb') as f:
|
||||
f.seek(phys_test)
|
||||
data = f.read(64)
|
||||
nonzero = sum(1 for b in data if b != 0)
|
||||
print(f'meta_pos={meta_pos}: phys={phys_test} nonzero={nonzero} first8={data[:8].hex()}')
|
||||
Reference in New Issue
Block a user