当前位置: 首页 > news >正文

【服务器数据恢复】多块磁盘离线导致RAIDZ崩溃的数据恢复案例

服务器数据恢复环境:
SUN ZFS系列某型号存储阵列;
40块磁盘组建的存储池(其中4块磁盘用作全局热备盘),池内划分出若干空间映射到服务器使用;
服务器使用Windows操作系统。

服务器故障:
服务器在工作时由于未知原因崩溃,排除断电、进水或者误操作等外部因素。管理员重启服务器后发现无法进入系统,需要恢复该存储内的所有数据。

服务器数据恢复过程:
1、对故障存储中所有硬盘以只读方式做镜像备份,后续的数据分析和数据恢复操作都基于镜像文件进行,避免对原始数据造成二次破坏。
2、分析磁盘镜像,发现故障设备是通过ZFS文件系统来管理所有磁盘。磁盘内记录系统元信息的NVLIST较为混乱,只能粗略得知以下信息:故障存储中的磁盘被分为三组,每组12块;每个组使用ZFS文件系统独有的RAIDZ管理磁盘。RAIDZ级别为2,即每个组最多可缺失2块磁盘;故障存储内的4块全局热备全部启用。
Tips:ZFS文件系统中的池被称为ZPOOL。ZPOOL的子设备可以有很多类型:块设备、文件、磁盘等等。本案例中所采用三组RAIDZ作为子设备。
3、经过进一步分析,发现三组RAIDZ内有两组分别启用的热备盘个数为1和3。在热备盘启用后,第一组内又出现一块离线盘,第二组内则又出现两块离线盘。通过上面分析得到的结论可以模拟故障现场:三组RAIDZ中的第一组和第二组分别出现离线盘,热备盘及时进行替换;在热备盘无冗余的状态下第一组RAIDZ又出现一块离线盘,第二组RAIDZ则又出现两块离线盘,ZPOOL进入高负荷状态(每次读取数据都需要经过校验才能得到正确数据)。当第二组RAIDZ出现了第三块离线盘时候,RAIDZ崩溃、ZPOOL下线、服务器崩溃。
4、由于ZFS文件系统管理的存储池与常规存储不同。常规RAID在存储数据时只会按照特定的规则组建池,不关心文件在子设备上的位置。而ZFS文件系统在存储数据时会为每次写入的数据分配适当大小的空间,并计算出指向子设备的数据指针。ZFS文件系统的这种特性决定了RAIDZ缺盘时无法直接通过校验得到数据,必须将整个ZPOOL作为一个整体进行解析。于是,北亚企安数据恢复工程师手工截取事务块数据,并编写程序获取最大事务号入口。


获取文件系统入口:

 

获取到文件系统入口后,北亚企安数据恢复工程师编写数据指针解析程序进行地址解析。


解析数据指针:

 

获取到文件系统入口点在各磁盘的分布情况后,数据恢复工程师开始手工截取并分析文件系统内部结构。由于入口分布所在的磁盘组无缺失盘,可直接提取信息。根据ZFS文件系统的数据存储结构找到用户映射的LUN名称,进而找到其节点。
5、经过分析发现故障存储中的ZFS文件系统版本与开源版本有很大差别,无法使用之前开发的解析程序进行解析,所以北亚企安数据恢复工程师重新编写了数据提取程序提取数据。


 

6、由于磁盘组内缺盘个数较多,每个IO流都需要通过校验得到,所以提取进度极为缓慢。与用户沟通后得知,此ZVOL卷映射到XenServer作为存储设备,用户所需的文件在其中一个大小约为2T的vhd内。提取ZVOL卷头部信息,按照XenStore卷存储结构进行分析,发现这个2T的vhd在整个卷的尾部,计算其起始位置后从此位置开始提取数据。
7、Vhd提取完毕后,验证其内部的压缩包、图片和视频等文件,均可正常打开。联系用户亲自验证数据,经过反复验证后确定文件数量与系统自动记录的文件数量相差无几,缺失的那部分极少数量的文件可能因为是最新生成还未刷新到磁盘。验证文件可用性,文件全部可正常打开,本次数据恢复工作完成。

http://www.lryc.cn/news/13977.html

相关文章:

  • iconfont 图标如何在uniapp中的tabBar使用
  • 第六章.卷积神经网络(CNN)—卷积层(Convolution)池化层(Pooling)
  • c/c++开发,无可避免的模板编程实践(篇六)
  • 【Java】Spring核心与设计思想
  • 组合实现多类别分割(含实战代码)
  • 从红队视角看AWD攻击
  • 龙腾万里,福至万家——“北京龙文化促进协会第九届龙抬头传承会”在京举办
  • 《软件方法》强化自测题-业务建模(4)
  • Prometheus之pushgateway
  • 3分钟带您快速了解HIL测试及其架构
  • 华为认证含金量如何?
  • 刷题记录:牛客NC54586小翔和泰拉瑞亚
  • 面试个3年自动化测试,测试水平一言难尽。。。。
  • C++面向对象(下)
  • 面试一位软件测试6年工作者:一年经验掰成六年来用....
  • Java8 新特性--Optional
  • Pytorch GPU版本简明下载安装教程
  • 【C++】map和set的封装
  • 互融云金融控股集团管理平台系统搭建
  • Git复习
  • WebGPU学习(2)---使用VertexBuffer(顶点缓冲区)
  • 【C++之容器篇】AVL树的底层原理和使用
  • 从交换机安全配置看常见局域网攻击
  • 工具篇3.5世界热力图
  • 2023-02-20 leetcode-insertionSortList
  • LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
  • 网络编程学习一
  • Javascript 立即执行函数
  • 基于Django和vue的微博用户情感分析系统
  • 【C++】IO流