import struct CHUNK = 128*512 LV_START = 5120000*512 BSIZE = 4096 IPG = 8192 def read_virt(virt_byte, length): result = bytearray(length) pos = virt_byte remaining = length with open('/dev/md0','rb') as f: while remaining > 0: group = pos // (5*CHUNK) in_group = pos % (5*CHUNK) chunk_idx = in_group // CHUNK intra = in_group % CHUNK seg_len = min(CHUNK-intra, remaining) dst_off = pos - virt_byte if chunk_idx != 4: phys = LV_START + group*4*CHUNK + chunk_idx*CHUNK + intra f.seek(phys) data = f.read(seg_len) result[dst_off:dst_off+len(data)] = data pos += seg_len remaining -= seg_len return bytes(result) # Read GDT from md0 print('Reading GDT from /dev/md0...') gdt_data = read_virt(BSIZE, 20*64) for g in range(20): entry = gdt_data[g*64:(g+1)*64] it_lo = struct.unpack_from(' 0 and name_len > 0: name = blk_data[off2+8:off2+8+name_len].decode('utf-8',errors='replace') if name not in ('.','..'): tname = {1:'file',2:'dir',7:'link'}.get(ftype,'?') print(f' {tname:4s} inode={ino:10d} {name!r}') off2 += rec_len