访问具有损坏 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把所有免费的索引节点都给了我。

然后我用 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 目录。

这实际上达到了我想要的目的:我将文件系统上的所有文件都放在一个平面中。坏消息是我的数据不在列表中。

相关内容