ZFS:将不可用池中的磁盘联机

ZFS:将不可用池中的磁盘联机

我有一个使用 FreeBSD 和 ZFS 的家用服务器,在过去的 5 年里一直运行良好,而且我曾多次成功更换有故障的磁盘。

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

我有一个由 3 个 vdev 组成的顶级池,每个都是一个 raidz1 池,因此最多 3 个磁盘可以发生故障 - 假设它们都属于不同的 vdev - 并且数据完整性完好无损。

昨天,我注意到 1 个 vdev 中的 1 个磁盘报告了不少错误。根据过去的经验,这通常表示磁盘即将发生故障,因此我会按照通常的方式进行操作:

  1. 脱机磁盘:zpool offline tank gpt/ta4
  2. 物理替换磁盘
  3. 使用 gpart 设置新磁盘,然后 zpool replace tank 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 status 报告没有已知数据错误)。有没有办法实现这一点?

2) 如果失败了,有没有办法至少让顶层池的剩余部分(由 3 个 raidz1 vdev 组成)联机?其他 2 个 vdev 完全正常。

请帮忙,我有很多宝贵的数据:-)

提前致谢。

答案1

这并不能在此时帮助你,但这正是为什么你永远不会看到我建议人们使用 raidz1 的原因 - 对于镜像集,如果他们使用大磁盘,通常建议使用三重镜像。

无论你采取什么措施,让坦克重新上线都是/极其不可能的/。我必须从这一点开始,以免让你抱有希望。

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

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

3:将原始的 gpt/ta4(据称“正常”并且只是遇到读取错误)放回系统中,或者放入具有较新 ZFS 位的新系统中(以及所有其他已删除的系统),启动并运行,直到其中一个正常工作(请注意 - 这些并不安全,尤其是最后一个,因为在尝试恢复系统时,它们可能会回滚并从而丢失最近写入的数据):

  • zpool 导入-f tank
  • zpool 导入-fF 坦克
  • zpool 导入-fFX 坦克

如果这 3 个步骤都失败了,那么您就超出了“简单”恢复的范围。在 Google 上搜索“导入坏池”、“zdb”、“zpool import -F”、“zpool import -X”、“zpool import -T”(危险!)等,可能会为您提供一些其他博客和其他人尝试恢复的信息,但此时已经非常危险,并且可能会进一步损坏数据,您很快就会进入付费恢复服务的领域(而不是来自传统数据恢复公司,他们对 ZFS 没有任何专业知识,对您没有任何用处)。

注意:更精确和“更安全”的方法是“zpool import -o readonly=on -f -T [txg_id] tank”。但是,要使此方法有效,您首先需要自己使用 zdb 来查找看似健康的最近 txg_id,而我并不准备在这里解释所有这些。Google 会是您的好朋友 - 在您阅读了足够的信息以对自己所做的事情感到满意之前,请不要采取行动。不要相信任何单一来源。

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

注 3:下一个“最安全”的做法是将驱动器放入安全系统中,并将每个整个原始驱动器也 dd 到新磁盘,这样理论上会为您提供相同的磁盘副本,但这意味着您需要相同数量的新磁盘,最好是与旧磁盘大小/类型相似或相同,但不是绝对必要的。然后仅在一组驱动器上尝试上述任何操作,同时将其他驱动器放在一边以保证安全。

相关内容