ZFS:使磁盘在不可用池中联机

我有一台使用FreeBSD和ZFS的家庭服务器,在过去的5年里运行良好,有几次我成功地更换了有故障的磁盘。

然而,今天发生了一场小小的灾难,我希望find一个解决办法。

我有一个由3个vdevs组成的顶级池,每个vdevs都是一个raidz1池,所以最多3个磁盘可能会失败 – 假设它们全部属于不同的vdevs – 并且数据完整性完好无损。

昨天,我注意到1个vdev中的1个磁盘报告了很多错误。 从以往的经验来看,这通常表示磁盘即将失败,所以我做我平时做的事情:

  1. 离线磁盘:zpool离线jargpt / ta4
  2. 物理replace磁盘
  3. 使用gpart设置新磁盘,然后使用zpoolreplacetank gpt / ta4

但是,这一次在步骤2和步骤3之间发生了灾难:当我在安装新驱动器后启动服务器时,我闻到了一些燃烧的东西,而我的HBA指出有4个驱动器不可用! 由于难以置信的运气不好,一定有一些电压浪涌,因为同一个vdev(gpt / ta2)中的另一个驱动器现在已经完全死亡,目视检查显示PCB上的一个MOSFET被烧断。

所以现在gpt / ta2是UNAVAIL,gpt / ta4是OFFLINE,显然vdev是raidz1,也是UNAVAIL。

我的问题是:1)有没有办法让gpt / ta4重新联机? 当我尝试发布“zpool online tank gpt / ta4”时,它告诉我游泳池不可用,所以我不能这样做。 我可以理解为什么会这样,但我认为gpt / ta4虽然遇到一些读取错误,但在离线之前基本上仍然是raidz1池的“好”成员(zpool状态报告没有已知数据错误)。 有没有办法做到这一点?

2)否则,有没有办法使我的顶级池(其中包含3个raidz1 vdevs)的剩余部分在线? 其他2个vdevs都很好。

请帮忙,我有很多宝贵的资料:-)

提前致谢。

这并不能帮助你,但这正是为什么你永远不会看到我build议人们使用raidz1 – 而对于镜像系统,如果他们使用巨大的磁盘,往往build议三面镜子。

在极端/不可能的情况下,你所能采取的任何行动都将使坦克恢复在线状态。 我必须从这个开始,以免提出你的希望。

1:确保磁盘是安全的 – 即使这意味着拔掉所有的磁盘。

2:更新到FreeBSD的最新版本 – 您需要获得最新的ZFS位。

3:把原来的gpt / ta4(假设是'OK',只是遇到读取错误)放回到系统中,或放入一个新的ZFS位(如果你已经移除了所有其他位)它运行,直到一个工作(被预先警告 – 这些是不安全的,尤其是最后一个,在他们试图恢复系统,他们可能会回滚,从而失去了最近的书面数据):

  • zpool导入-f坦克
  • zpoolimport-FF坦克
  • zpoolimport-fFX坦克

如果所有3个都失败了,那么你就不在“简单”恢复的范围之内了。 一些谷歌search“导入坏池”,“zdb”,“zpool导入-F”,“zpool导入-X”,“zpool导入-T”(危险!),等等,可能会为您提供一些额外的博客和信息对于其他人的恢复尝试,但是在那个时候它已经处于非常危险和潜在的进一步数据破坏的境地,而且你正在迅速进入付费恢复服务领域(而不是传统的数据恢复公司,他们在ZFS方面没有专业知识对你没有任何用处)。

注意:更精确和更安全的方法是“zpool import -o readonly = on -f -T [txg_id] tank”。 然而,为了这个工作,你需要自己使用zdb,首先find一个貌似健康的最近txg_id,我不打算在这里解释所有的东西。 Google会成为你的朋友,直到你阅读了足够的信息,才能对自己所做的事感到舒服。 不信任单一来源。

注2:“最安全”的做法是立即联系能够进行ZFS恢复服务的人员。

注3:要做的下一个“最安全”的事情是将驱动器放在一个安全的系统中,并将每个整个原始驱动器加到一个新的磁盘上,理论上给你一个相同的磁盘拷贝,但这意味着你需要一个相同数量的新磁盘,最好是相同或相同的大小/types的旧磁盘,但不是绝对必要的。 只有在一套驱动器上尝试以上任何一项,同时保持其他人的安全。