如何使用 debugfs 转储 ext4 文件系统上已使用的 inode 列表?

如何使用 debugfs 转储 ext4 文件系统上已使用的 inode 列表?

在硬盘驱动器 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

所以看起来我有很多未连接的 inode,尽管 fsck 告诉我分区是干净的(即使使用 -f)。我想知道(74199-23690)丢失的索引节点在哪里。我知道磁盘上仍然有这些文件,因为我已经使用 photorec 成功恢复了 50k 个文件。

所以我尝试使用 debugfs,但我在手册中找不到转储分配的 inode 列表的方法。 (大多数在线帖子使用 find/ls -i 来列出 inode,这在我的情况下不起作用)。

有谁知道一种根据 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 脚本来做到这一点)。

相关内容