服务器数据恢复环境&故障:

北京某公司一台配有72块SAS硬盘的服务器,管理员误操作删除了该服务器中的12个lun,这12个lun中包含了该公司的客户信息以及其他重要数据,急需恢复服务器数据。

服务器数据恢复过程:

1、将故障服务器所有硬盘以只读方式做扇区级别的镜像备份。后续的数据分析和数据恢复操作都基于镜像文件进行,避免对原始数据造成二次破坏。

2、北亚企安数据恢复工程师基于镜像文件分析服务器底层数据,找到盘头位置的超级块,通过分析超级块信息获取到磁盘组的起始块信息、磁盘组名称、逻辑组起始块号、raid编号等基本信息。


分析超级块:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_服务器数据恢复


3、通过分析得知每个数据块占8个扇区,数据块后附加64字节数据块描述信息,根据这些信息判断出作为校验盘的磁盘并在数据恢复过程中将这些磁盘剔除。

0x10:6字节为aggr_data块号

如果0x10处为FFFF表示校验块


校验块描述信息样例:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_服务器数据恢复_02


4、在进行盘序分析时可以根据每块磁盘8号扇区的磁盘信息和磁盘末尾的RAID盘序表来确定盘序。

a、确定各个磁盘所属aggr组。

b、判断组内盘序。数据指针跳转时不考虑校验盘,只需要取得数据盘的盘序即可。

aggr_raid(磁盘靠近尾部) 根据10H处的VCN块号判断磁盘组内各盘的顺序


分析盘序表:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_服务器数据恢复_03


小贴士:Netapp的节点分布在数量众多的数据块内,在数据块内又被统一组织为节点组。每个节点组的前64字节记录系统数据,然后以192字节为一项来记录各个文件节点。文件节点根据用户级别分为两类:“MBFP”系统文件节点和“MBFI”用户文件节点,数据恢复一般只需要MBFI节点组。


服务器节点样例图:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_Netapp数据恢复_04


说明:

头部信息64字节(此头部为数据文件的节点文件块头部,大小为64字节)

标志,常量(“MBFP”为元文件的节点标志,“MBFI”为用户文件的节点标志)


5、根据更新序列值获取到最新节点。解析节点中节点类型、逻辑块号、文件数量、文件大小、所占块数量及数据指针,获取节点在节点文件中的逻辑块号,从0开始计数。

6、获取目录项,并根据其节点编号,找到对应节点。


获取服务器内对应节点截图:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_数据恢复_05


7、提取服务器数据。

a、扫描节点信息。


扫描服务器节点信息:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_Netapp数据恢复_06


节点扫描类:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_数据恢复_07

节点扫描程序完整流程:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_Netapp数据恢复_08


在循环扫描完毕之后会将所有扫描到的MBFP、MBFI和DOC数据块分别写入到三个文件内,用于后续处理。


b、将节点信息导入到数据库。


将ScanNode扫描得到的MBFI和MBFP、Dir存入数据库以备后续使用。


MBFI导入数据库整体流程:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_Netapp数据恢复_09


函数执行完毕后查看数据库得到如下信息:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_数据恢复_10


小贴士:Netapp在更改inode节点时不会直接覆盖而是重新分配inode进行写入。单个文件的节点node_uid唯一不变,mbfi_usn会随着节点的变化而增大(正常情况下提取某个文件时使用usn最大的节点)。一般情况下存储划分出的单个节点会作为LUN映射到服务器使用,根据file_size可以确定这个文件的大小,按照文件大小分组后再选取usn最大值的节点,跳转到MBFI文件的offset值偏移位置,取出节点。


节点样例图示:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_数据恢复_11


c、提取文件

在获取到要提取的文件的Node之后,开始提取块设备文件。

提取块设备文件:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_服务器数据恢复_12


初始化完毕后,开始提取文件的各级MAP,在本次提取过程中文件大小均大于1T,MAP层级为4,所以需要提取4次。第一级MAP默认只占用1个块,所以在程序内直接提取,后三级MAP在GetAllMap函数内进行提取。通过块号计算数据块位置时,由于NetApp使用JBOD组织LVM,直接用块号除以每块磁盘上的块数可得到当前块所在的磁盘序号(计算机整数除法,丢弃小数邠);再使用块号取余块数,得到数据块在此磁盘上的物理块号,物理块号乘以块大小,得到数据块偏移位置。


8、块设备文件系统解析。

该案例的块设备5T lun用的是aix小机的jfs2文件系统。因此需要解析jfs2文件系统,提取里面的数据库备份文件。

7扇区记录lvm描述信息,获取pv大小和pv序号;找到vg描述区,获取lv数和pv数;找到pv描述区,获取pp序号和pp数。


解析文件系统块信息:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_数据恢复_13


lv类型及率挂在信息区域:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_Netapp数据恢复_14


解析8个由大小1T的lun组成的oralce ASM文件系统,提取其中的数据库文件。


添加8个lT的lun:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_数据恢复_15


解析asm文件系统,提取出数据库文件:


【服务器数据恢复】服务器误操作删除lun的Netapp数据恢复案例_Netapp数据恢复_16


数据验证:

北亚企安工程师对提取出来的数据进行检测后没有发现异常,联系用户方工程师亲自进行验证,经反复验证,确认本次恢复出来的数据完整可用。