在硬盘驱动器 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 脚本来做到这一点)。