72 lines
2.1 KiB
Bash
72 lines
2.1 KiB
Bash
python3 -c "
|
|
CHUNK = 128*512
|
|
LV_START = 5120000*512
|
|
BSIZE = 4096
|
|
BPG = 32768
|
|
NUM_GROUPS = 35728
|
|
GDT_ENTRY = 64
|
|
|
|
# Check which GDT entries fall in metadata chunks
|
|
# for BOTH primary and backup GDT locations
|
|
print('Primary GDT (virtual byte 4096):')
|
|
prim_bad = []
|
|
for g in range(NUM_GROUPS):
|
|
byte_abs = BSIZE + g * GDT_ENTRY
|
|
in_group = byte_abs % (5*CHUNK)
|
|
chunk_idx = in_group // CHUNK
|
|
if chunk_idx == 4:
|
|
prim_bad.append(g)
|
|
|
|
print(f' Groups in metadata chunks: {len(prim_bad)}')
|
|
print(f' First few: {prim_bad[:10]}')
|
|
print(f' Last few: {prim_bad[-5:]}')
|
|
|
|
print()
|
|
print('Backup GDT (virtual byte (BPG+1)*BSIZE):')
|
|
backup_start = (BPG+1) * BSIZE
|
|
backup_bad = []
|
|
for g in range(NUM_GROUPS):
|
|
byte_abs = backup_start + g * GDT_ENTRY
|
|
in_group = byte_abs % (5*CHUNK)
|
|
chunk_idx = in_group // CHUNK
|
|
if chunk_idx == 4:
|
|
backup_bad.append(g)
|
|
|
|
print(f' Groups in metadata chunks: {len(backup_bad)}')
|
|
print(f' First few: {backup_bad[:10]}')
|
|
print(f' Last few: {backup_bad[-5:]}')
|
|
|
|
# Check if bad groups overlap
|
|
overlap = set(prim_bad) & set(backup_bad)
|
|
print(f' Overlap with primary bad: {len(overlap)}')
|
|
|
|
# Find a backup GDT location with NO metadata chunk conflicts
|
|
print()
|
|
print('Searching for backup GDT with no metadata chunk conflicts...')
|
|
# Backup GDTs exist at groups: 1,3,5,7,9,25,27,49,81,125,243,343...
|
|
def has_backup(g):
|
|
if g <= 1: return True
|
|
for base in [3,5,7]:
|
|
n = base
|
|
while n < g: n *= base
|
|
if n == g: return True
|
|
return False
|
|
|
|
backup_groups = [g for g in range(1000) if has_backup(g) and g > 0]
|
|
for bg in backup_groups[:20]:
|
|
start = (bg * BPG + 1) * BSIZE
|
|
bad = []
|
|
for g in range(NUM_GROUPS):
|
|
byte_abs = start + g * GDT_ENTRY
|
|
in_group = byte_abs % (5*CHUNK)
|
|
chunk_idx = in_group // CHUNK
|
|
if chunk_idx == 4:
|
|
bad.append(g)
|
|
print(f' Backup at group {bg}: {len(bad)} bad entries '
|
|
f'({\"CLEAN\" if len(bad)==0 else bad[:3]})')
|
|
if len(bad) == 0:
|
|
print(f' *** PERFECT BACKUP GDT at group {bg} ***')
|
|
print(f' Virtual byte: {start}')
|
|
break
|
|
"
|