破損した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ディレクトリを作成する必要がありました。

これは実際に私が欲しいものを達成します。ファイルシステム内のすべてのファイルが1つの平面にあります。悪いニュースは、私のデータがリストにないということです。

おすすめ記事