Initial remote commit
This commit is contained in:
80
misc_tools/check_translation.py
Normal file
80
misc_tools/check_translation.py
Normal file
@@ -0,0 +1,80 @@
|
||||
CHUNK = 128*512
|
||||
LV_START = 5120000*512
|
||||
BSIZE = 4096
|
||||
|
||||
# What if block 5251104 is an ABSOLUTE block number on md0
|
||||
# (not relative to LV start)?
|
||||
# Then: md0_byte = 5251104 * 4096 = 21,508,521,984
|
||||
# And we DON'T add LV_START
|
||||
|
||||
abs_byte = 5251104 * BSIZE
|
||||
print(f'Block 5251104 as absolute md0 byte: {abs_byte}')
|
||||
print(f'md0 sector: {abs_byte//512}')
|
||||
|
||||
# Read it directly from md0 (no translation)
|
||||
with open('/dev/md0','rb') as f:
|
||||
f.seek(abs_byte)
|
||||
data = f.read(BSIZE)
|
||||
|
||||
import struct
|
||||
nonzero = sum(1 for b in data if b != 0)
|
||||
print(f'Nonzero bytes: {nonzero}/4096')
|
||||
print(f'First 32: {data[:32].hex()}')
|
||||
|
||||
# Try as directory
|
||||
off = 0
|
||||
entries = []
|
||||
while off < BSIZE-8:
|
||||
ino = struct.unpack_from('<I', data, off)[0]
|
||||
rec_len = struct.unpack_from('<H', data, off+4)[0]
|
||||
name_len= data[off+6]
|
||||
ftype = data[off+7]
|
||||
if rec_len < 8: break
|
||||
if ino > 0 and name_len > 0:
|
||||
name = data[off+8:off+8+name_len].decode('utf-8',errors='replace')
|
||||
tname = {1:'file',2:'dir',7:'link'}.get(ftype,'?')
|
||||
entries.append((ino,name,ftype))
|
||||
off += rec_len
|
||||
|
||||
if entries:
|
||||
print('Directory entries:')
|
||||
for ino,name,ftype in entries:
|
||||
tname = {1:'file',2:'dir',7:'link'}.get(ftype,'?')
|
||||
print(f' {tname} inode={ino} {name!r}')
|
||||
else:
|
||||
print('No valid directory entries')
|
||||
|
||||
# Also try: what if the block number is relative to LV start
|
||||
# but WITHOUT the 4/5 chunk translation?
|
||||
# i.e. just: md0_byte = LV_START + block * BSIZE
|
||||
direct_byte = LV_START + 5251104 * BSIZE
|
||||
print()
|
||||
print(f'Block 5251104 relative to LV, no translation: {direct_byte}')
|
||||
with open('/dev/md0','rb') as f:
|
||||
f.seek(direct_byte)
|
||||
data2 = f.read(BSIZE)
|
||||
nonzero2 = sum(1 for b in data2 if b != 0)
|
||||
print(f'Nonzero bytes: {nonzero2}/4096')
|
||||
print(f'First 32: {data2[:32].hex()}')
|
||||
|
||||
off = 0
|
||||
entries2 = []
|
||||
while off < BSIZE-8:
|
||||
ino = struct.unpack_from('<I', data2, off)[0]
|
||||
rec_len = struct.unpack_from('<H', data2, off+4)[0]
|
||||
name_len= data2[off+6]
|
||||
ftype = data2[off+7]
|
||||
if rec_len < 8: break
|
||||
if ino > 0 and name_len > 0:
|
||||
name = data2[off+8:off+8+name_len].decode('utf-8',errors='replace')
|
||||
tname = {1:'file',2:'dir',7:'link'}.get(ftype,'?')
|
||||
entries2.append((ino,name,ftype))
|
||||
off += rec_len
|
||||
|
||||
if entries2:
|
||||
print('Directory entries (no translation):')
|
||||
for ino,name,ftype in entries2:
|
||||
tname = {1:'file',2:'dir',7:'link'}.get(ftype,'?')
|
||||
print(f' {tname} inode={ino} {name!r}')
|
||||
else:
|
||||
print('No valid directory entries')
|
||||
Reference in New Issue
Block a user