
故障存储:
2TB硬盘品牌不详/文件系统:Exfat/簇大小:128KB
故障现象:
此导播台使用一块2TB的硬盘做为存储设备,接入两路视频源,使用apcs视频编码。平时这两路镜头拍摄的是某个综艺节目的室内环节,基本上的流程就是拍摄完成后把存储盘交给下一组去备份然后交给后期制作。某日在完成拍摄后,由于交接工作时出现问题导致2TB硬盘被误格式化,出现问题后此硬盘就进行了封存没有再做过其它操作。
从图1中也可以看到,硬盘被格式化了,除了一些系统级文件和设备生成的文件外,是没有其它文件写入的,所以描述基本上是属实的。
客户所需要的文件是6条视频素材(1路视频各3条),长度已经不记得了,但可以提供文件名等信息,其它的素材之前已经有过备份。另外就是恢复时间上客户也有要求,需要在规定时间内完成,否则虽然面临成本问题但就只能重新补拍了!
另外经过沟通得知此盘的文件系统之前也是Exfat,属于是同一设备相同使用环境的格式化,这一类格式化只要没有手工调节过参数那么格式前后的文件系统基本参数应该是相同。同时基于这些理论判断,可以大致给出一个恢复预测“视频文件应该是可以恢复的”。
图1:硬盘的剩余空间还有1.9TB
图2:格式化后并没有做过其它操作
图3:apcs视频编码是苹果专为影视级开发的高清视频编码
故障分析:
两路视频,且视频编码为apcs(如图3),其特点就是非压缩所以采集的每一帧数据流长度(同场景下)是比民用的AVC/HVC要大的多的多。由于是两路同时采集视频,所以在写入环节肯定是存在“排队写入”的情况,而使用通用型的Exfat文件系统证明导播台只求稳定,不对底层做更多的干预,毕竟通用型文件系统最大的优点就是“稳定性”。当然只要导播台能做到数据正常存储、视频正常切换就算是达到目的了,产品更多的是关注实用性。
考虑到这些特性,而硬盘容量又较大,初步方案是先定位文件,然后确定客户所需要的数据是否还在,排除覆盖的情况。由于客户能提供文件名,所以计划从此处入手,经过对比发现文件头中有一自定义的单元,此单元储存了文件路径+文件名信息,这个对定位文件名有极大帮助,经过排查发现6条素材视频文件是都还在的。在定位文件头计划继续定位文件的结构体,已得到文件长度等信息,这样就可以判断基本的工作量了,结果发现结构体的碎片数量很多且很小。为了验证通过定位视频帧进行判断,因为没有看到一个完整的帧单元,一个帧单元被切割了很小的碎片,有的碎片似乎只有一个簇的大小,此时感觉恢复难度要比想象中大的多。
由于此导播台还使用过别的硬盘,所以计划查看下存在的数据碎片情况,结果直接惊掉了下巴,之前说过由于MOV文件容量大(影视级高清视频编码)的原因碎片的数量多到让解析程序当机!经过对比其中一个20GB多一点的文件,发现特征如下:
1、碎片小,常见就是2-8个簇,长度是动态可变的,最小的是1个簇。
2、碎片数量多,有时候能达到10W以上。
3、碎片交叉无规律,无论是结构体还是数据区都有此种情况。
多种极端情况的交织让问题变的复杂化,在开始恢复工作之前需要想好大概的恢复思路,实际上这个案例的情况和之前我们处理的“小米智能摄像机”比较相近,而小米的MP4文件由于使用的是“民用级”HVC编码,而且文件时长是控制在1分钟的,所以文件容量较小碎片数量就不会很多;而当前使用apcs“影视级”编码的MOV文件长度至少几十个GB,碎片的数量几何式增加。初步计划还是以“MOOV视频RAW级重组程序”2.0为蓝本,重新设计并修改程序,让其能适应目前的极端情况。除此之外由于单个文件容量较大,所以要尽可能的实现“半自动化”,减少手工干预的次数提升恢复的效率。
故障处理:
在开始这些工作之前还是先把6个mov视频文件的结构体进行了定位,由于碎片过小,这个工作基本上通过手工来完成,共耗时大约两天,得出了6个mov文件在硬盘上的区间及文件大小如下(隐去了真实文件名以HEX值代替):
文件0:61DDC700.MOV 67.35GB
文件1:61DD5300.MOV 71.45GB
文件2:97725700.MOV 62.63GB
文件3:9772E000.MOV 71.42GB
文件4:CC834F00.MOV 24.02GB
文件5:CC831200.MOV 34.57GB
6个文件总体容量331.34GB,区间跨度大约1TB左右,让人望而生畏!目前进行到这一步,获取了6个文件的分布情况、长度、时长等属性,结合碎片的无规律和动态变化,确定了这个案例的具体难度等级为“变态”级!
接下来就要来修改(实际上最后变成了重写)程序了,这一步也是最难的,想法付诸于实践的载体就是“程序”,首先有一点能的确定的就是目前2.0的程序的算法是可以恢复这种情况的,难点在于数量巨大的碎片如何在极少的人工干预下完成重组!所以一开始为了验证,尝试着去做了前几帧数据,结论就是除了速度慢之外没有什么槽点,效果是很好的。在接下来的几天里一直在尝试提高效率,但是基本上没有什么进展,因为能想的办法都想到了,甚至就此问题请教了“网红”AI---DeepSeek,结论是“服务器忙”……
这中间又做了一些无用功,最后又回到原点,最终想法是不要再以单个文件为主,而是要从整体上看待所有文件,也就是开启“上帝视角”,从exfat的角度去看文件分配的问题,一个碎片的归属无非是交叉的N个对象,如果是两个文件那就不是属于A就是属于B,只要判断成功了一个碎片,另一个就变的相对简单了,同理多个文件依次类推。简单讲就是有目地的进行“穷举”+全局标识,这个方法虽然一开始慢,但是随着碎片的剥离,恢复的文件越多速度会更快,因为唯一性越来越大!
在这种指导思想下,对程序算法进行了全方位升级;另外由于是大容量的硬盘,碎片又多,对扫描结果的随时保存也很重要,之前的是小型的卡类这一块不是很在意,所以也进行了升级;做这些工作又消耗了大约5天时间,然后开始了对第一个文件的测试(图4),速度比之前提升了到少10倍是有的,只是
速度还是不是很理想,中间不断的进行优化,最终速度达到了极限,是后这个71.42GB的文件在通过大约6天的时间完成了重组,当然这中间还是需要手工介入的,最终的碎片数量是104,203个,超过了10W个!!!