首页 >PC >正文

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

创作立场声明:本人致力于搭建出一套稳定、开放的个人云方案,长期的摸索沉淀下一些经验,再此分享出来,供大家参考。笔者最初使用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

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

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

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

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

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

ddrescue克隆执行中

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

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

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

选择pool

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

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

降级状态的pool

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

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

zpool detach aquar_pool 5776694313143636179

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

去掉了损坏盘的pool

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

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

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

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

挂载了新盘的pool

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

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

NAS 篇一:ZFS mirror磁盘分区损坏后的恢复

TrueNas显示zfs正在恢复

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

网友评论

验证码 换一张
取 消
暂无评论...
三日内热门评论文章
为您推荐
  • 相关阅读
  • 业界资讯
  • 手机通讯
  • 电脑办公
  • 新奇数码
  • 软件游戏
  • 科学探索