我有一个 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
把所有免费的索引节点都给了我。
然后我用 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 目录。
这实际上达到了我想要的目的:我将文件系统上的所有文件都放在一个平面中。坏消息是我的数据不在列表中。