我有一台使用 FreeBSD 和 ZFS 的家庭服务器,它在过去 5 年中运行良好,并且有几次我成功地更换了有故障的磁盘。
然而,今天发生了一个小灾难,我希望找到解决办法。
我有一个由 3 个 vdev 组成的顶级池,每个池都是一个 raidz1 池,因此最多 3 个磁盘可能会出现故障——假设它们都属于不同的 vdev——并且数据完整性完好无损。
昨天,我注意到 1 个 vdev 中的 1 个磁盘报告了很多错误。从以往的经验来看,这通常表明磁盘即将发生故障,所以我做了我通常做的事情:
但是,这一次在第 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 vdevs 组成)的其余部分联机?其他 2 个 vdev 完全没问题。
请帮忙,我有很多宝贵的数据:-)
提前致谢。
并不是说它在这个时候对你有帮助,但这正是你永远不会看到我建议人们使用 raidz1 的原因——对于镜像集,如果他们使用巨大的磁盘,通常建议使用三重镜像。
极端情况下/不太可能/你可以采取的任何行动都会让坦克重新上线。我必须从那开始,以免提高你的希望。
1:确保磁盘是安全的 - 即使这意味着拔掉所有磁盘。
2: 更新到最新版本的 FreeBSD - 你想要最新的 ZFS 位你可以得到你的手。
3:将原来的 gpt/ta4(应该是“OK”,只是遇到读取错误)放回系统中,或者放入一个带有更新 ZFS 位的新系统(以及所有其他位,如果你已经删除了它们),启动它,并运行,直到一个工作(预先警告 - 这些不安全,尤其是最后一个,因为在他们尝试恢复系统时,他们可能会回滚并因此丢失最近写入的数据):
如果这三个都失败了,那么您就超出了“简单”恢复的范围。在谷歌上搜索“导入坏池”、“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 到一个新磁盘,从理论上讲,为您提供相同的磁盘副本,但这意味着您需要相同数量的新磁盘,最好与旧磁盘具有相似或相同的大小/类型,但不是绝对必要的。然后才在一组驱动器上尝试上述任何一种方法,同时将其他驱动器放在一边以确保安全。