服务器数据恢复环境:
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提取完毕后,验证其内部的压缩包、图片和视频等文件,均可正常打开。联系用户亲自验证数据,经过反复验证后确定文件数量与系统自动记录的文件数量相差无几,缺失的那部分极少数量的文件可能因为是最新生成还未刷新到磁盘。验证文件可用性,文件全部可正常打开,本次数据恢复工作完成。

【服务器数据恢复】ZFS文件系统下ZPOOL下线的数据恢复案例的更多相关文章

  1. Unix下zfs文件系统重组RAID-5后可以这样恢复

    存储做的RAID-5, SCSI硬盘,操作系统是FreeBSD,文件系统是zfs.本案例共有12块硬盘,11块硬盘里有数据,1块硬盘是热备盘.其中第6块数据硬盘出现故障,重组时需要将其剔除. 物理盘: ...

  2. ZFS文件系统及Freenas介绍

    一.简介 1.什么是zfs文件系统 ZFS文件系统的英文名称为Zettabyte File System,也叫动态文件系统(Dynamic File System),是第一个128位文件系统.最初是由 ...

  3. 什么是 ZFS文件系统?ZFS概念及特点简介

    什么是 ZFS? ZFS(Zettabyte File System)是由SUN公司的Jeff Bonwick领导设计的一种基于Solaris的文件系统,最初发布于20014年9月14日. SUN被O ...

  4. rsync+inotify 实现资源服务器的同步目录下的文件变化时,备份服务器的同步目录更新,以资源服务器为准,去同步其他客户端

    测试环境: 资源服务器(主服务器):192.168.200.95 备份服务器(客户端):192.168.200.89 同步目录:/etc/test 同步时使用的用户名hadoop密码12345 实验目 ...

  5. 【云服务器部署】---Linux下安装nginx

    [云服务器部署]---Linux下安装nginx 之前两篇,分别讲了:Linux下安装MySQL  和  springboot项目部署云服务器 nginx安装也是挺简单的.具体步骤如下: 第一步,下载 ...

  6. 【云服务器部署】---Linux下安装MySQL

    [云服务器部署]---Linux下安装MySQL 有关如何阿里云ECS建网站,推荐一片文章,我是是通过这篇文章安装tomcat和jdk的 网址:阿里云ECS建网站(建站)超详细全套完整图文教程! 注意 ...

  7. 数据迁移_把RAC环境备份的数据,恢复到另一台单机Oracle本地文件系统下

    数据迁移_把RAC环境备份的数据,恢复到另一台单机Oracle本地文件系统下 作者:Eric 微信:loveoracle11g 1.创建pfile文件 # su - ora11g # cd $ORAC ...

  8. FAT32文件系统下的文件、目录管理

    背景 FAT32作为一个文件系统,有着广泛的应用.在安装操作系统时,许多个人用户默认都选择FAT32文件系统,因此,了解FAT32文件系统下的文件.目录的管理方式就显得非常必要了. FAT32文件系统 ...

  9. zfs文件系统简单使用

    关于ubuntu下zfs的使用参考:https://github.com/zfsonlinux/zfs/wiki/Ubuntu%2016.04%20Root%20on%20ZFS 安装zfs: 启动z ...

  10. CentOS7使用ZFS文件系统

    默认情况下,CentOS7并没有含ZFS支持的文件和,需要进行更新和安装第三方库. Step 1:安装第三方库和更新系统 [root@localhost ~]# rpm -Uvh http://www ...

随机推荐

  1. LC761.特殊的二进制序列

    import org.junit.jupiter.api.Test;import java.util.ArrayList;import java.util.Collections;import jav ...

  2. 【SDOI2015】寻宝游戏

    代码 (树链剖分) #include<cstdio> #include<set> using namespace std; typedef long long LL; cons ...

  3. 2020-6-2 map?

      问题描述 试题编号: 202006-2 试题名称: 稀疏向量 时间限制: 2.0s 内存限制: 512.0MB 问题描述:     #include<stdio.h>//数据量很大,所 ...

  4. LeetCode-794 有效的井字游戏

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-tic-tac-toe-state 题目描述 用字符串数组作为井字游戏的游戏板 boa ...

  5. linux配置爬虫环境

    #宝塔面板安装python3 #安装依赖包 yum -y groupinstall "Development tools" yum -y install zlib-devel bz ...

  6. SQL常用命令使用方法

    (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * f ...

  7. 自定义view,用来测试屏幕

    public class BezierGestureTrackView extends View { private Bitmap mBufferBitmap; private Canvas mBuf ...

  8. PKU2506Tiling

    https://blog.csdn.net/Harington/article/details/86612106

  9. fabric学习笔记11

    fabric学习笔记10 20201303张奕博 2023.1.23 测试实践2 导入链码依赖包 package main import ( "github.com/hyperledger/ ...

  10. libuv 网络库设计概览译

    设计概览 libuv 是一种支持跨平台的网络库,最初是为了NodeJS作为某个模块实现的,主要基于事件驱动的I/O 模型设计的. 这个库不仅仅对不同的I/O polling 机制提供简单的抽象. ha ...