Initial remote commit
This commit is contained in:
59
misc_tools/verify_mapping.py
Normal file
59
misc_tools/verify_mapping.py
Normal file
@@ -0,0 +1,59 @@
|
||||
CHUNK = 128*512
|
||||
LV_START = 5120000*512
|
||||
BSIZE = 4096
|
||||
|
||||
# Root dir data block = 9262
|
||||
# We read this successfully, so our translation works for it
|
||||
# Let's verify: block 9262 as filesystem block (offset from LV start)
|
||||
# vs block 9262 as PERC virtual block
|
||||
|
||||
fs_virt_byte = 9262 * BSIZE # filesystem block offset from LV start
|
||||
perc_virt_byte = 9262 * BSIZE # same number, different interpretation
|
||||
|
||||
# As filesystem block (what our NBD server does):
|
||||
# The NBD server presents a virtual address space where block N = byte N*4096
|
||||
# And applies the 4/5 chunk translation to convert to physical
|
||||
fs_group = fs_virt_byte // (5*CHUNK)
|
||||
fs_in_group = fs_virt_byte % (5*CHUNK)
|
||||
fs_chunk_idx = fs_in_group // CHUNK
|
||||
fs_intra = fs_in_group % CHUNK
|
||||
|
||||
print(f'Block 9262 as filesystem virtual (via NBD translation):')
|
||||
print(f' virt_byte={fs_virt_byte}')
|
||||
print(f' chunk_group={fs_group} chunk_idx={fs_chunk_idx} intra={fs_intra}')
|
||||
if fs_chunk_idx != 4:
|
||||
phys = LV_START + fs_group*4*CHUNK + fs_chunk_idx*CHUNK + fs_intra
|
||||
print(f' physical={phys}')
|
||||
with open('/dev/md0','rb') as f:
|
||||
f.seek(phys)
|
||||
data = f.read(64)
|
||||
print(f' first 32: {data[:32].hex()}')
|
||||
|
||||
# We know from istat that block 9262 contains the root directory
|
||||
# and we verified it has valid directory entries
|
||||
# So the block numbers ARE filesystem-level, and our translation IS correct
|
||||
|
||||
# Now: why does block 5251104 (var dir data) fall in a metadata chunk?
|
||||
# 5251104 * 4096 = 21508521984
|
||||
# group = 21508521984 // (5*65536) = 65638
|
||||
# in_group = 21508521984 % (5*65536) = 262144 = 4*65536
|
||||
# chunk_idx = 4 -> METADATA
|
||||
|
||||
# This means the /var directory data genuinely falls in a PERC metadata slot
|
||||
# The PERC would have stored its OWN metadata there
|
||||
# and the filesystem data for block 5251104 would need to be
|
||||
# at a DIFFERENT physical location
|
||||
|
||||
# Unless... the ext4 filesystem uses block numbers differently
|
||||
# In ext4 with flex_bg, block numbers might be relative to something else
|
||||
|
||||
# Let's check: what block does istat say for /var?
|
||||
# We need to run istat on inode 1310721
|
||||
import subprocess
|
||||
r = subprocess.run(['istat', '/dev/nbd0', '1310721'],
|
||||
capture_output=True, text=True)
|
||||
print()
|
||||
print('istat output for /var (inode 1310721):')
|
||||
print(r.stdout)
|
||||
print(r.stderr[:200] if r.stderr else '')
|
||||
|
||||
Reference in New Issue
Block a user