我的 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.f2fs
(debugfs
遗憾的是 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 发行版的维护者发送错误报告,表明该发行版应该打包更新版本,或向后移植相关补丁。
如果上游开发人员的最新源代码版本也无法处理此问题,那么绝对是时候向开发人员发送错误报告了。