Nexus5 Format F2FS Boom

0x80 前言

之前记录过一次作死经历,万万没想到就然还会有姊妹篇。Nexus 5作为我购机史上最成功的一次尝试,在它如此暮年之时,却又遭受如此折腾,前有mac丢失,现有数据丢失。。

文件系统结构基于AOSP 7.1.1。

0x81 数据丢失这种现象发生了不止一次

其实早在很久以前,我就遇到过几次数据丢失,当然那都是我自己作死去换Recovery,换了之后清理/data居然清理掉了整个emmc芯片上的数据。而这一次,对于切换/data区的ext4文件系统到f2fs,即使自己做了双重备份,却也是防不胜防,我最终惊奇地发现整个Internal Storage都变成了空的,冷汗直流。

0x82 F2FS

F2FS:Flash Friendly File System,顾名思义闪存友好的文件系统,最早由三星提出,声称可以最大限度的提高Flash闪存对于随机文件的读写效率,但是三星从来没有使用到自家的产品上。前一段时间华为发布了Mate9声称采用了F2FS可以18个月都不卡,都是噱头。

为什么要使用f2fs呢,其实好处还是很多的,特别是对于一些emmc5.0以下的老闪存设备,读写速度的提升还是有的,但是我们可能并感知不到,并且对于连续读写,f2fs可能还没ext4快。f2fs自发布以来,于早期被集成进了kernel 3.8并不断完善,后来各大开发者将这一feature引入自己rom的内核当中,逐渐的很多三方rom都开始支持f2fs,其中刷机小王子Nexus 5也是他们中的一员。

0x83 事情发生的经过

RR在4月4日放出了更新,本着闲的蛋疼升个级的想法,我冒出了直接切换文件系统到F2FS的想法,这是悲剧的开始。

按往常习惯,我在更新这些三方系统时总是会用钛备份(神器)进行一次已安装应用的全量备份,这么多都是为了避免升级过程中发生意外。备份完成进入TWRP Recovery后,我想到更换文件系统往往都要格式化分区,这样我的/data下的数据就会全部丢失。于是我便去搜索是否有方法可以不丢失数据,毕竟重新设置系统的各个选项还是一件很麻烦的事情,所幸让我找到了方法。方法很简单:

  1. TWRP备份/data
  2. Wipe -> Change File System -> Format F2FS 格式化为f2fs
  3. Setting -> use “rm -rf” instead of format 恢复备份的/data

经过以上步骤,就可以完成/data分区的文件系统转换。

而实际上在执行到第二步时悲剧就已经发生了,format完/data之后,什么都没有了,整个Internal Storage都变成了空的,冷汗直流。

0x84 数据丢失的原因

其实原因很简单,后期的Android系统增强了内部存储和外部存储的功能,为了方便的管理内部存储,Android为没有SD卡的设备(比如Nexus 5)做了映射,把内部存储的一部分映射为/sdcard,这样APP就可以和正常的使用外置存储一样使用内置存储。

就像刚才说的/sdcard只是个映射,它其实指向了/storage/self/primary,而primary也是个软链接,他们最终的映射关系是:

/sdcard -> /storage/self/primary -> /mnt/usr/0/primary -> /storage/emulated/0(实际上这是fuse的,其真实的挂载点还有一个/data/media/0)

看了上面的映射关系,发现跳来跳去,但其实这都是一种兼容性的设计,/sdcard是早期的外置存储挂载点,/storage和/storage/self的文件系统是tmpfs内存文件系统,/storage/emulated是fuse(模拟存储器实际上是/data/media,有点LVM的感觉),/mnt是标准的linux挂载目录,在Android下有若干个目录,其中user是为多用户支持提供的。

FUSE: Filesystem In User Namespace,用户空间文件系统,是一种虚拟文件系统,它可被视为内核态文件系统在用户态的映射(不知道这种说法准不准确,反正我一直是这么理解的)

由于内置存储默认状况下是被/data全吃的,其余的挂载点都可以视作映射,因此格式化了/data就是格式化了整个内置存储器,数据自然就没有了。那TWRP经典的四清呢,仔细研究你就会发现,/data被特殊对待,它并没有真的被格式化,而是跳过/data/media目录删除所有的文件,所以不会清理掉“内存卡”上的数据。

到这里一切也都明白了,可怜了我的联系人和大量收藏的照片,还有看了3年看了3%的小说,唉,不说,我想静静。