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 디렉터리를 만들어야 했습니다.
이것은 실제로 내가 원하는 것을 달성합니다. 파일 시스템의 모든 파일이 하나의 평면에 있습니다. 나쁜 소식은 내 데이터가 목록에 없다는 것입니다.