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

错误的 inode:f2fs 损坏,fsck.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

所以它仍然拒绝帮助我,现在它失败并出现一个模糊的错误......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

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

看起来父目录 ( /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

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

答案1

Assertion failed!
[fsck_chk_dentry_blk: 563] le32_to_cpu(de_blk->dentry[i].hash_code) == hash_code

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

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

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

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

相关内容