错误的 inode:f2fs 损坏,fsck.f2fs 无法修复

Léo*_*Lam 6 linux filesystems data-recovery android f2fs

我的 Android 手机上的 f2fs 分区最近已损坏。它仍然可以正常安装;但是,我完全失去了对一个目录 ( /data/media/0) 的访问权限,该目录现在显示为空。然而磁盘空间根本没有改变。

fsck.f2fs从终端运行时,它拒绝检查已安装的文件系统。我无法卸载数据分区或将其重新挂载为只读。美好的。在恢复模式下重新启动后,分区未安装,我在运行时得到这个fsck.f2fs

~ # fsck.f2fs /dev/block/mmcblk0p39
Info: sector size = 512
Info: total sectors = 21425920 (in 512bytes)

Assertion failed!
[fsck_chk_dentry_blk: 563] le32_to_cpu(de_blk->dentry[i].hash_code) == hash_code
Run Code Online (Sandbox Code Playgroud)

所以它仍然拒绝帮助我,它现在失败并出现一个模糊的错误......stat目录给了我:

root@victara:/ # stat /data/media/0                                            
  File: `/data/media/0'
  Size: 4096     Blocks: 24  IO Blocks: 4096    directory
Device: 10307h/66311d    Inode: 4    Links: 35
Access: (770/drwxrwx---)    Uid: (1023/media_rw)    Gid: (1023/media_rw)
Access: 2016-04-04 16:55:56.800148001
Modify: 2016-04-05 02:47:44.314999998
Change: 2016-04-05 02:47:44.314999998
Run Code Online (Sandbox Code Playgroud)

inode(数量?)似乎很低……所以我检查了其他目录:

root@victara:/ # stat /data/media/
  File: '/data/media/'
  Size: 4096        Blocks: 16         IO Block: 4096   directory
Device: 10307h/66311d   Inode: 4078        Links: 4    
Access: (0770/drwxrwx---)  Uid: ( 1023/media_rw)   Gid: ( 1023/media_rw)
__bionic_open_tzdata: couldn't find any tzdata when looking for localtime!
__bionic_open_tzdata: couldn't find any tzdata when looking for GMT!
__bionic_open_tzdata: couldn't find any tzdata when looking for posixrules!
Access: 2016-04-04 14:48:25.000000000
Modify: 1970-01-01 02:27:21.000000000
Change: 1970-02-07 02:30:36.000000000

root@victara:/ # stat /data/media/obb                                          
  File: `/data/media/obb'
  Size: 4096     Blocks: 16  IO Blocks: 4096    directory
Device: 10307h/66311d    Inode: 4080     Links: 3
Access: (775/drwxrwxr-x)    Uid: (1023/media_rw)    Gid: (1023/media_rw)
Access: 1970-01-01 03:27:21.519999999
Modify: 2016-03-17 22:38:30.505748550
Change: 2016-04-04 17:42:31.569999988
Run Code Online (Sandbox Code Playgroud)

看起来父目录 ( /data/media) 具有 inode 4078,父目录 ( ) 的另一个子/data/media/obb节点具有 inode 4080。因此,从逻辑上讲,/data/media/0应该具有 inode 4079,但stat告诉我它具有 inode 4。

所以看起来文件系统元数据已损坏。如果没有帮助,fsck.f2fsdebugfs(这可悲的是不为f2fs存在),并在一个非常最小的Linux环境(Android的恢复),是有办法,我可以纠正的inode编号或其他东西我可以做恢复访问我的数据?


有趣的是,该目录似乎仍在占用磁盘空间,它被视为“非空”,因此我无法将其删除。

root@victara:/data/media # rm -rf 0
rm: 0: Directory not empty
1|root@victara:/data/media # ls
0 obb 
root@victara:/data/media # ls -al 0                                                                             
total 0
Run Code Online (Sandbox Code Playgroud)

重要提示:我无法再测试解决方案,因为我需要手机和存储空间并重新格式化分区。

tel*_*coM 0

Assertion failed!
[fsck_chk_dentry_blk: 563] le32_to_cpu(de_blk->dentry[i].hash_code) == hash_code
Run Code Online (Sandbox Code Playgroud)

“断言失败”意味着程序中的内部错误,在本例中是在fsck.f2fs. 基本上,这意味着程序员期望始终正确的事情实际上并非如此。

生产级程序应该始终使用比“断言失败”消息更好的消息来处理错误-至少,它应该给出更具描述性的错误消息。有时,“断言失败”错误意味着您遇到了开发人员已经意识到但尚未实施的罕见情况。

在这种情况下,唯一的选择是查看是否有可用的更新版本的程序,并希望它已被更新以以某种明智的方式处理此类情况。如果较新的版本仅以源代码形式从上游开发人员处提供,并且它解决了问题,则可能需要向 Linux 发行版的维护者发送错误报告,表明该发行版应该打包更新版本,或向后移植相关补丁。

如果上游开发人员的最新源代码版本也无法处理此问题,那么绝对是时候向开发人员发送错误报告了。