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つの平面にあります。悪いニュースは、私のデータがリストにないということです。