ext4ファイルシステムで使用されているinodeのリストをダンプするためにdebugfsを使用する方法は?

ext4ファイルシステムで使用されているinodeのリストをダンプするためにdebugfsを使用する方法は?

ハードドライブのI / Oエラーが発生し、ext4パーティションからfsckの回復を試みた後、「df -i」と「find」で使用されているinodeの数が非常に異なるディスクが得られました。 |トイレ-l':

[yan@machine ~]$ ls -di /run/media/yan/data
2 /run/media/yan/data

[yan@machine ~]$ lsblk -o NAME,FSTYPE,LABEL,TYPE,SIZE,MOUNTPOINT
NAME   FSTYPE LABEL         TYPE   SIZE MOUNTPOINT
...
sdc                         disk   1.8T 
├─sdc1 vfat   clonezilla    part   512M 
├─sdc2 ext4   live_system   part  14.7G 
├─sdc3 ext4   system_images part 244.1G 
├─sdc4 ext4   data          part 781.3G /run/media/yan/data
└─sdc5 ext4   rec           part 822.5G 

[yan@machine data]$ df -i /run/media/yan/data/
Filesystem       Inodes IUsed    IFree IUse% Mounted on
/dev/sdc4      51200000 74199 51125801    1% /run/media/yan/data

[yan@machine data]$ sudo find /run/media/yan/data | wc -l
23690

したがって、fsckでパーティションがきれいであることを知らせたにもかかわらず、接続されていないinodeがたくさんあるようです(-fを使用しても)。欠けているinodeがどこにあるか(74199-23690)知りたいです。 photorecを使用して50,000個のファイルを正常に修復したため、そのファイルがまだディスクにあることがわかります。

だから私はdebugfsを試しましたが、マニュアルで割り当てられたinodeのリストをダンプする方法が見つかりませんでした。 (ほとんどのオンライン投稿はinodeをリストするためにfind / ls -iを使用していましたが、私の場合は機能しませんでした。)

df / fsckに基づいて使用されたinodeのリストを取得する方法を知っている人はいますか?

現在、私は非効率的な無差別代入攻撃に次の方法を使用することを検討しています。

for i in `seq 1 $NMAX`; do debugfs -R 'ncheck $i' | grep $i; done > inodelist

NMAXも十分に大きいですが、より効率的な方法がありますか?

編集する:

可能な方法を見つけたと思います。dumpe2fs各ブロックのすべてのブロックと利用可能な inode を一覧表示します。これにより、どのインデックスノードが使用されたかを推論することができなければなりません。

(少なくとも計算の観点から)これが私が望むものであることを確認するには、まだ「フリーではないインデックスノード」のリストを計算する必要があります。リストで明らかにそれらの間に接続されているがルートには接続されていない奇妙なインデックスノードを見つけました。

debugfs:  pwd
[pwd]   INODE: 45220182  PATH: .../dir1/dir2/dir3/dir4
[root]  INODE:      2  PATH: /
debugfs:  cd ..
debugfs:  pwd
[pwd]   INODE: 44957702  PATH: .../dir4/dir1/dir2/dir3
[root]  INODE:      2  PATH: /

答え1

ext4ファイルシステムで使用されているinodeのリストを取得する方法を見つけました。明らかに、ファイルシステムは利用可能なinodeを追跡します(そして、inodeの総数の違いから使用されたinodeの数を推測します)。無料のinodeの範囲を得ることができますdumpe2fs。使用されたinodeはリストを補完します(インポートには少しの処理が必要なので、これを行うために小さなPythonスクリプトを作成しました)。

関連情報