ZFS文件系统数据恢复的方法

  • 前言
  • 通常处理方法
    • 网上的资料介绍还有个尝试的选项:
  • 恢复数据的方法
  • Python的实现:
    • 解析元数据:
    • 恢复文件:

前言

ZFS是一个非常稳定可靠的文件系统,但是还是有一定几率会出现系统坏掉,用户数据不能读取出来的情况。如果一个ZFS存储同时连接到2个控制器,两个控制器同时zpool import池,由于元数据覆盖,就会出现整个文件系统坏掉。

通常处理方法

首先应该参考官网:https://docs.oracle.com/cd/E26926_01/html/E25826/gbbwl.html#scrolltoc
其中修复 ZFS 存储池范围内的损坏的方法依次如下:
1.可以尝试使用 zpool clear -F 命令或 zpool import - F 命令恢复池。这些命令尝试回滚最后几次池事务,使其回到运行状态。可以使用 zpool status 命令查看损坏的池和建议的恢复步骤.
zpool clear -F tpool
zpool import tpool
zpool import -F tpool

2.您可以在只读模式下导入受损的池。此方法使您可以导入该池,从而可以访问数据。
zpool import -o readonly=on tpool

3.您可以使用 zpool import -m 命令导入缺少日志设备的池。

4.如果无法使用上述池恢复方法恢复池,则必须从备份副本中恢复池及其所有数据。所用的机制通常随池配置和备份策略的不同而有很大差别。首先,保存 zpool status 命令所显示的配置,以便在销毁池后可以重新创建它。然后,使用 zpool destroy -f 命令销毁池。此外,将描述数据集的布局和在本地设置的各种属性的文件保存在某个安全的位置(因为在使池无法访问后此信息将变得无法访问)。使用池配置和数据集布局,可以在销毁池后重新构造完整的配置。然后可以使用任何备份或恢复策略填充数据。

网上的资料介绍还有个尝试的选项:

1.zpool import -FX
2.zpool import -o readonly=on
3.The combination of zdb -lu and zpool import -T.
如果这些都不能把ZFS import进来,而用户又没有备份,这意味着数据的丢失。在这种情况下,是没有现成的工具可以恢复数据,只能依赖人工根据具体问题去编码,把磁盘上面的数据恢复出来。

恢复数据的方法

我们的思路是这样的:
1.使用zdb -e -vvvvvv zpoolname >> filename.txt
2.根据zdb运行过程中的错误,修改zdb源码,略过错误的元数据,尽量把元数据完整读取出来。源码中如果发现错误,就读取元数据信息时直接退出,我们应该注释掉该行。
3.根据元数据里面的文件信息和地址信息,写一个自动处理脚本,把文件读取出来,保存到新的存储空间。
使用的命令如下:
zdb_read -R -e -r 文件长度 pool2 元数据中的地址1:元数据中的地址2:元数据中的文件长度:f >> 新的文件路径
为了使zdb能够直接读取出文件,我们必须修改这个工具,直接截取文件长度大小。

Python的实现:

解析元数据:

def parse_metadata_blk(self):self.file_path = ""self.file_uid = ""self.file_gid = ""self.file_mode = 0self.file_size = 0self.blk_size = 0self.blk_type = "unknown"self.address_list = []for line in self.lines:if not line:continuevar_list = line.split()if len(var_list) <= 1:#print "Error. can't parse: " + linecontinueif line.find("ZFS plain file (K=inherit) (Z=inherit)") != -1:self.blk_type = "file"continueif line.find("ZFS directory (K=inherit) (Z=inherit)") != -1:self.blk_type = "dir"continueif self.blk_type == "unknown":continueif var_list[0] == "path":self.file_path = self.output_dir + var_list[1].strip()continueif var_list[0] == "uid":self.file_uid = int(var_list[1].strip())continueif var_list[0] == "gid":self.file_gid = int(var_list[1].strip())continueif var_list[0] == "mode":self.file_mode = int(var_list[1].strip())continueif self.blk_type != "file":continueif var_list[0] == "size":self.file_size = int(var_list[1].strip())continueif line.startswith("Indirect blocks:"):start_address = Truecontinueif len(var_list) >= 6 and var_list[1] == "L0":self.address_list.append(var_list[2].strip())self.blk_size_16  = var_list[3].split("L/")[0]self.blk_size = int(var_list[3].split("L/")[0], 16)continuereturn 0

恢复文件:

def recover_file(self):if not self.address_list:return 0if not self.file_path:return 0if os.path.exists(self.file_path):os.remove(self.file_path)print "The meta data is " + self.current_metaprint "Recovering file: %s size: %d" % (self.file_path, self.file_size)ret = 1for addr in self.address_list:addr_list = addr.split(":")cmd = "%s/zdb_read -R -e -r %d pool2 %s:%s:%s:f >> %s" % (self.pwdStr, self.file_size, addr_list[0], addr_list[1], self.blk_size_16, self.file_path)try:ret, out, err = self.run_system_cmd(cmd)#ret = self.run_cmd(cmd)except Exception, e:print str(e)return 1self.file_size = self.file_size - self.blk_sizeif ret != 0:print "Failed to recover: " + self.file_pathreturn 1else:self.recover_file_num = self.recover_file_num + 1# Update the file attribute.try:os.chmod(self.file_path, self.file_mode)os.chown(self.file_path, self.file_uid, self.file_gid)except Exception, e:print str(e)return 1return 0

ZFS文件系统数据恢复的方法相关推荐

  1. 【服务器数据恢复】EMC存储Zfs文件系统下raid5数据恢复案例

    服务器存储数据恢复环境: 某公司一台EMC存储,12块硬盘组成raid5,2块热备盘: Zfs文件系统. 服务器存储故障: 硬盘故障导致存储崩溃. 服务器存储数据恢复过程: 1.对故障存储所有硬盘进行 ...

  2. 【服务器数据恢复】Zfs文件系统误删除数据的数据恢复案例

    服务器故障: 一台zfs文件系统服务器,运维人员误操作删了服务器上的数据,用户联系到我们数据恢复中心要求恢复数据. 服务器数据恢复过程: 1.服务器数据恢复工程师对故障服务器所有硬盘进行扇区级镜像备份 ...

  3. windows文件服务器双机热备_遇到ZFS文件系统如此棘手的问题,这种办法简单又高效!...

    一.ZFS文件系统 ZFS是一款128bit文件系统,总容量是现有64bit文件系统的1.84x10^19倍,其支持的单个存储卷容量达到16EiB(2^64byte,即 16x1024x1024TB) ...

  4. 终于有人把 ZFS 文件系统讲明白了

    本文主要介绍高级文件系统 ZFS,将讨论它的来源.它是什么以及为什么它在技术人员和企业中如此受欢迎. 注意: 本文多次提到 ZFS ,当谈到 ZFS 功能和安装时,其实说的是 OpenZFS.自从 O ...

  5. 服务器数据恢复通用方法/服务器硬盘故障导致数据丢失解决方案

    [服务器数据恢复原因推断] 服务器数据丢失情况很多,通常无法明确服务器数据丢失的原因,常见的丢失原因有:服务器硬盘出现故障,管理员或者服务器自动进行fsck操作,这一操作可能造成更加严重数据丢失或者导 ...

  6. linux内核zfs,Linux使用ZFS文件系统

    Linux使用ZFS文件系统 来源:it168网站 ZFS(Zettabyte File System)作为一个全新的文件系统,全面抛弃传统File System + Volume Manager + ...

  7. Linux学习之文件系统zfs文件系统

    ZFS(Zettabyte File System)一个打破过去思维的文件系统,是 Sun Microsystems这家公司所开发出来的全新型态文件系统,因为License的问题所以目前只有在Sola ...

  8. linux zfs功能,linux – 有没有办法一次设置多个ZFS文件系统属性?

    我的正常ZFS文件系统构建过程可能类似于:zpool create vol1 -o autoexpand=on -o autoreplace=on mirror nvme0n1 nvme1n1 -f ...

  9. 细说嵌入式Linux文件系统的制作方法

    说到Linux文件系统对于刚刚接触Linux的初学者来说还是有些生疏,其实理解了他的定义并且掌握他的使用方法并不是什么难事.在下文中大家就会详细的了解到什么是Linux文件系统,并且可以学会嵌入式Li ...

最新文章

  1. Windows server 2012 搭建×××图文教程(二)配置路由和远程访问服务
  2. java 真数组 伪数组_伪数组(ArrayLike)
  3. vue 项目抛出警告
  4. ajax 延迟显示加载中提示
  5. shell下后台挂起
  6. 在 WPF 程序中使用矢量图
  7. python整数类型与数学-Python类型和运算--数字
  8. Arduion 底层原理之 setup函数和loop函数
  9. 会员制营销系统_想提升门店经营水平?会员制营销法可以帮到你
  10. Oracle中记录被锁解锁方法
  11. 从事Java后端开发,要学习哪些知识和技能?
  12. Transformer靠什么基因,得以闯入CV界秒杀CNN?
  13. java跳转页面后再跳回前一个页面_js中实现页面跳转(返回前一页、后一页)
  14. Android音频可视化
  15. 【手把手教程】如何快速实现任意自定义的域名的网页跳转
  16. android 输入法 确定按钮,Android 输入法笔记
  17. android gettext方法,android – EditText不返回getText()上的内容
  18. java和数据库的应用_JAVA数据库应用的一个小例子
  19. 年度最火购车方式网上购车平台购车,强势来袭!
  20. 河南理工大学计算机学院张磊,河南理工大学关于表彰2010—2011学年学生创先争优活动先进集体和先进.doc...

热门文章

  1. 人工智能未来会取代人类吗?AI智能,科技正在改变我们的历史
  2. 科里奥利力简单清晰的推导
  3. 液压断路器-BA系列设备用断路器规格型号说明
  4. 树莓派——9、IO操控代码编程
  5. 容错学习问题(LWE)
  6. 主流浏览器内核有哪几种?
  7. CSS 读书笔记
  8. 《JS高级程序设计》第二遍读书笔记
  9. 元宇宙为服装设计展示提供数字化社交平台
  10. java 遍历类属性_Java 遍历类中的属性