ZFS mirror磁盘分区损坏后的恢复

2021-10-28 15:03:18 2点赞 16收藏 3评论

创作立场声明:本人致力于搭建出一套稳定、开放的个人云方案,长期的摸索沉淀下一些经验,再此分享出来,供大家参考。

笔者最初使用PVE搭建了一套虚拟环境来跑nas服务以及其他self host服务,有两块4T HDD直连在TrueNas虚拟机上。但是PVE上始终未能实现对机器上N卡的直通。遂转向ESXI,转换后顺利实现了显卡直通。回过头来想把那两块硬盘重新挂载上来,这时候发现事情没有想象的那么简单。

首先TrueNas中没有导入现有zpool的功能,只有新建zpool的功能,而新建意味着对硬盘的格式化。另外在探索过程中我曾经尝试用ESXI的数据存储功能将mirror的其中一块磁盘直接纳入到存储空间中,但是由于zfs磁盘有特殊的结构,且ESXI的数据存储也不是解决这种问题的,更要命的是数据存储纳入硬盘时会破坏分区结构。于是这块硬盘就被破坏了。

查阅zfs的文档,发现应该直接使用zpool import不带任何参数进行直接导入。但为保证安全首先需要把硬盘克隆出一个镜像,然后在镜像上进行操作,测试成功后再进行原盘的操作。下面记录一下我的操作过程:

1.安装ddrescue,此处需注意大坑,ddrescue有两个版本,一个是个人(Kurt Garloff)开发的dd_rescue(apt install ddrescue),目的是加强dd命令。另一个就是GNU ddrescure(apt install gddrescue),这个工具才是广泛使用的ddrescue命令。另外TrueNas scale的系统是定制的debian,使用的下载源都是TrueNas公司的源地址,不想在这种定制系统上改太多东西,以免发生意想不到的问题。所以我使用另一台ubuntu主机进行备份操作,那么安装命令是:

apt install gddrescue

2.运行fdisk -l查看硬盘信息,信息中用硬盘的名称和文件系统格式锁定到了待拷贝的硬盘以及需要拷入信息的硬盘,下图中可以确定出我们要从/dev/sdb 拷贝到/dev/sdc

ZFS mirror磁盘分区损坏后的恢复

3.运行命令ddrescue,进行全盘拷贝。

ddrescue -f -r3 /dev/sdb /dev/sdc mapfile

-f表示覆盖原数据,-r3表示遇到错误时重试3次,mapfile是ddrescue在拷贝过程中使用的记录文件,用来支持断点续传功能,如果不指定则会自动在当前目录创建,单次运行不用太过注意,但如果要多次运行拷贝则需要区分和不同拷贝对应的mapfile。4T的硬盘需要拷贝6到8小时,下图是拷贝中的样子:

ddrescue克隆执行中ddrescue克隆执行中

4.克隆完硬盘后,将原盘(一块完好的且克隆过的硬盘和一块先前分区被破坏了的硬盘)通过RDM方式直通到TrueNas中,发现已经可以直接在TrueNas的 import功能识别了。当

时没截图,现在已经导入进去就看不到了。

选择pool选择pool

但是存储池的状态是DEGRADED(降级),因为有一块盘是坏的。

降级状态的pool降级状态的pool

从存储池状态的报告上可以看到,系统甚至可以识别出那块破坏了分区的硬盘曾经在存储池中的id。

5.既然第二块盘不能用,那么我们就把它从池中释放出来。执行后可以看到,只剩下了一块完好的硬盘。

zpool detach aquar_pool 5776694313143636179

去掉了损坏盘的pool去掉了损坏盘的pool

6.由于被破坏的硬盘仅仅是分区出了问题,硬件本身无问题,所以下一步我们直接重新将有问题的磁盘加入存储池中,让zfs把它当作一个新设备进行数据同步。

zpool attach aquar_pool 94a30883-6ea1-11eb-9c12-ff7f90a40b7e /dev/sda

这条命令的意义是将刚才释放的硬盘(/dev/sda)添加进存储池aquar_pool中,这块磁盘以目前池中那块完好的磁盘(94a30883-6ea1-11eb-9c12-ff7f90a40b7e)为基础进行数据恢复。

挂载了新盘的pool挂载了新盘的pool

执行后即可看到存储池的状态变为ONLINE,并提示有设备正在恢复数据。sda的硬盘也出现在了mirror的列表中。不知为何,使用fdisk -l查出来的硬盘id值无法被zpool识别,实际上我也发现第一块完好的硬盘在fdisk -l中的id值与zfs显示的也不一样,而这两个值显然都对应着sdb这块硬盘。

7.接下来等待zfs自行将数据恢复即可。根据status的提示目前改存储池提供的可能是降级服务,为了避免意想不到的问题,我们还是先等待池恢复健康再做其他操作。

TrueNas显示zfs正在恢复TrueNas显示zfs正在恢复

后记:其实zfs在迁移之前是需要先将池离线,将设备导出(export),再把硬盘插入别的机器中,在目标机器上直接zpool import就可以完成导入了,我由于没看文档,走了很多弯路,不过也了解了如何在硬盘损坏的情况下将存储池恢复的方法。

展开 收起
3评论

  • 精彩
  • 最新
  • 你好,请问ZFS数据出问题被删除了又没有备份快照,这种情况下原有的数据还有可能恢复吗?

    校验提示文案

    提交
    如果跟我之前一样是元数据损坏了的话在zfs层面应该就找不回来了,不知道用那种数据修复的技术有没有可能,毕竟磁盘中的信息还在盘面上刻着

    校验提示文案

    提交
    收起所有回复
  • 收藏留用,感谢分享

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
16
扫一下,分享更方便,购买更轻松