손상된 inode가 있는 디렉터리 내의 파일에 액세스

손상된 inode가 있는 디렉터리 내의 파일에 액세스

inode가 손상되거나 삭제된 ext2 파일 시스템이 있습니다. 필요한 데이터에는 손상된 inode가 없는 것 같지만 데이터가 있는 디렉터리에는 손상되어 있습니다.

$ ls -l
ls: cannot access 'data_dir': Structure needs cleaning
total 96
drwxr-xr-x   2 root root  4096 Apr 19  2016 bin
drwxr-xr-x   2 root root  4096 May 12  2016 boot
drwxr-xr-x   7 root root  4096 Jan  1  1970 dev
drwxr-xr-x   6 root root  4096 Apr 19  2016 lib
drwxr-xr-x   3 root root 16384 Apr 29  2021 lost+found
drwxr-xr-x   7 root root  4096 Apr 29  2021 media
drwxr-xr-x   2 root root  4096 Apr 19  2016 mnt
drwxr-xr-x   2 root root  4096 Apr 19  2016 opt
drwxr-x---   2 root root  4096 Apr 19  2016 root
drwxr-xr-x   4 root root  4096 Apr 29  2021 run
drwxr-xr-x   2 root root  4096 Apr 19  2016 sbin
drwxr-xr-x   3 root root  4096 Apr 19  2016 share
???????????  ? ?    ?        ?            ? data_dir
drwxr-xr-x   2 root root  4096 Apr 19  2016 sys
drwxrwxrwt   2 root root  4096 Apr 29  2021 tmp
drwxr-xr-x  10 root root  4096 Apr 19  2016 usr
drwxr-xr-x   9 root root  4096 Apr 19  2016 var

e2fsck를 실행하고 "data_dir"의 inode를 수정하여 사라지게 했습니다. 또한 ddrescue를 실행했는데 오류 없이 완료되었습니다. 아마도 불량 블록이 아니었기 때문일 것입니다. 또한 백업 슈퍼블록을 지정하여 e2fsck를 실행했지만 아무런 차이를 발견하지 못했습니다.

문제는 data_dir의 데이터에 어떻게 액세스하는가입니다. 전체 파일 시스템을 간단히 평면화하는 방법이 있습니까?

답변1

그래서 나는 후손을 위해 내가 한 일을 게시하겠습니다.

debugfs를 사용하면 inode의 내용을 파일로 덤프하고 -f 플래그를 사용하여 명령 목록을 제공할 수 있습니다.

그래서 나는 dumpe2fs /dev/sdx > dump_output이전에 나에게 주어진 모든 무료 inode를 가지고 있었습니다.

그런 다음 Python을 사용하여 알려진 무료 inode 목록을 사용된 inode 목록으로 변환했습니다.

#!/usr/bin/env python
# coding: utf-8
import re
import numpy as np

inodes_list = []
with open('dump_output', 'r') as f:
    content = f.read()
    inode_count = int(re.search(r'Inode count: *((?P<count>[0-9].*)?)$', content, re.M).group('count'))
    inodes = re.finditer(r'^  Free inodes: ((?P<inodes>[0-9].*)?)$', content, re.M)
    
    for i in inodes:
        inodes_list.append(i.group('inodes'))

# print(inode_count)

free_inodes = np.array([])
for j in inodes_list:
    elements = j.split(', ')
    for ele in elements:
        if '-' in ele:
            range_list = ele.split('-')
            range_start = int(range_list[0])
            range_end = int(range_list[1])
            free_inodes = np.append(free_inodes, np.arange(range_start, range_end+1))
        else:
            free_inodes = np.append(free_inodes, int(ele))

inode_array = np.arange(0,inode_count)
used_inodes = np.setdiff1d(inode_array, free_inodes)

with open('debugfs_inode_dump_script.txt', 'w') as o:
    for inode in used_inodes:
        o.write(f'dump <{inode}> inode_dump/{inode}.inode\n')

그런 다음 파일을 가져와 사용했습니다 debugfs -f debugfs_inode_dump_script.txt /dev/sdx. 그러나 먼저 inode_dump 디렉터리를 만들어야 했습니다.

이것은 실제로 내가 원하는 것을 달성합니다. 파일 시스템의 모든 파일이 하나의 평면에 있습니다. 나쁜 소식은 내 데이터가 목록에 없다는 것입니다.

관련 정보