故障存储: 64G TF卡 fat32文件系统 簇大小32sec
故障现象:
存储卡64G实际的使用空间为58.2G,使用通用性文件系统FAT32进行管理,从下图可以看到“空余空间”为58.0G,在recordfiles中有214.65M的文件。正常情况下此类设备的管理方式是不断的循环写入(删除并写入),而“空余空间”如此大只有两种情况:
1、新的存储卡第一次格式化
2、被格式化了
而通过底层的数据能判断出来属于第2种情况的可能性较大。
故障分析:
正常这就是一个比较简单的格式化后覆盖的案例,但是实际上情况远比想象中复杂,两个原因:
1、 碎片多.(图1)
图1可以看到写入的文件并不多,由于文件基本上是一分钟生成一个(类似于小米、360的1分钟方案),这个方案的优点是摄像头以时间为单位进行数据采集->数据写入->封装成MP4,这样文件不容易出错,终端设备的负荷也比较小。缺点是文件数量多,碎片相对也多。图2可以看到碎片数量为6,可能感觉不多,但这一类方案是刚格式化的卡由于空间大,能做到碎片少,随着写入的增加没有写入的碎片化越来越多,最终就是碎片数量多且小,小到只有一簇。这种极端情况下,什么软件都不可能完美重组,因为音视频帧数据块过小且交叉存储导致程序算法无法区分碎片从属关系。
碎片产生的原因,实际上用这种方案的原因都差不多,在生成文件的同时会生成日志文件和JPG预览文件,两个文件和视频文件进行了交叉,日志文件还好区分,但是JPG的数据区就很难了,因为本质上无论是那种视频编码其最终还是要走压缩的路,一旦压缩数据区是无法区分的。
2、 编码并不是常见的hvc而是hev.
Mp4文件视频编码常见的方案是avc 和 hvc,对应的是裸流264和265,为什么名称不一样,因为avc/hvc进行了编码。但是这次遇到却是裸流的265,可以看到图3中编码为hev.裸流可以理解为最原始的,不需要修饰的编码,这种情况下恢复的难度会更大,特别是在第1种情况存在的时候。因为只有很精确的定位和分离碎片才能得到比较好的效果。
图1:格式后写入了约200多M少量的数据
图2:格式化后写入的文件存在碎片
图3: “裸流”hev(265)编码
故障处理:
根据这种复杂的情况,通用型的恢复软件是无法恢复的,原理如下:
1、删除或者格式化后FAT32或者exfat 都会对FAT表进行清0,清0后存在碎片的文件是无法得到有效的链表的,没有链表就无法得到数据。
2、由于文件不连续存放,所以此时通用型恢复软件只能通过目录项中的文件第一簇指针和文件长度,来定位文件头。然后按照连续存放的方式读取,这就导致恢复的文件除了第一簇其它全是错误的。
图4:通用型恢复软件R-Studio新版本增加了文件校验并提示发现存在碎片
但是我们可以使用通用恢复软件来扫描并定位文件的目录,FAT32格式化后只要目录项所在簇没有覆盖就能定位文件的第一个簇,也就是文件头所在,在来定位文件尾,两者之间就是数据区间
由于文件名中就包含了日期和时间所以这个也可以精确定位到客户需要的文件,经过通用软件扫描发现客户要的文件名都在,而且第一簇起始是相对靠中间的,所以恢复的机率还是比较大的。
下图可以看到通用恢复软件只会定位到文件目录所在的第一个簇,也就是文件头所在,但是后边的区域就是直接以长度获取了,所以肯定是不能用的。通过这个方法成功定位了客户所要的时间段,由于是采用裸流,所以计划提取文件头所在的簇,得到第一帧画面,来和客户确定数据。但是发现失败了,因为以一个簇为单位进行提取发现视频帧是不完整的,说明碎片极小可能只有一个簇的大小(可以理解为首帧长度>簇长度)。其原理如图5,第一帧至少有三个DATA分割分别是DATA0~DATA2,注意DATA区本身就是对现实环境抽象化取值再转换成数字化的底层数据其是压缩类数据,没有参考值。另外就是图5中是为了方便介绍用了比较简单的方式,现实中可能DATA1和DATA0会“距离”很远,极端情况下也有可能DATA1位于DATA0之前(这在所有文件系统中都是允许的)。
图5:视频、音频帧数据存在碎片的简略图
经过使用不同的方案反复测试,发现没有比较好的办法应对,但是也找到了此类文件的规律,其采用moov后置方案,基本上可以判断在head和moov之间的数据就是此文件的所有簇列表,现在的问题是需要精确的定位碎片并分离数据,但是用常规的方法却无法做到。最后想到之前处理的一个JPG碎片案例,使用遍历方法不断以簇为单位写入,再查看数据,然后根据此方案再结合一些265视频裸流的特征制定了以下恢复方案:
1、 获取文件区间
2、 视频帧自身特征来缩小范围
3、 日志和JPG文件头来缩小范围
4、2和3没有地方直接遍历
根据此方案,重新写了一个小程序进行碎片的筛选和定位,写入一轮再查看一轮,最终完成定位和重组,好在文件较小,所需要的文件也就4个,3个文件定位还算比较正常,碎片的区间也不大,其中一个文件的碎片区间却让人大跌眼镜,6.45M的文件碎片却散落在65667个簇中(约1G多的空间),这个是目前为止遇到过的区间最大的值。由于区间大,所以对程序也进行了优化:
1、写入方案增加批量写入和自动写入
2、增加批量选中功能
即便如此,还是需要结合HEX值手工查看才能有效分别出数据区,有些地方如果实在无法区分,只能一个个遍历,效率是很低的,所以程序只能做一个辅助,真正的还是靠经验来判断。如图6中这个区间大的文件,最大时上一碎片和下一碎片距离有“3万多簇“,而且是DATA区,存在极多的其它视频文件干扰DATA,所以鉴别是极难的,需要丰富的经验和极大的耐心(每一次写入后需要查看数据,只能通过播放器来解码查看,这个过程很消耗精力和毅力)。
图6:MOOV视频RAW级碎片重组进行了优化升级
下图为恢复效果,4个文件播放没有任何问题,视频帧及音频帧全部正常,4个文件消耗了约两天多的时间,恢复的成功验证了方案的可行性。
图7:重组好的视频文件
这就是某小品牌智能摄像头格式化后写入部分文件的恢复方法,大家在遇到此类问题时,可以和我们联系!