使用zfs时,如果您拥有copies=2 ,然后丢失了包含其中一些副本的驱动器,那么如何告诉系统它应该为受影响的文件创build一个新的数据块副本? 或者,只要zfs发现坏数据块,就开始为额外的副本添加数据块?
擦洗会干吗?
(v0.6.0.56-rc8,ZFS池版本28,ZFS文件系统版本5,Ubuntu 11.10)
“copies = 2”(或3)更多地用于没有冗余(单个磁盘或条带)的池。 目标是能够恢复轻微的磁盘损坏,而不是整个设备的故障。 在后一种情况下,游泳池是不可拆卸的,所以不会出现同样的障碍物。
如果你有冗余(镜像/ raidz / raidz2 / raidz3),同上块没有别的不同,擦洗/重新同步会重新创build它们。
我发现这个问题真的很有趣,花了一个小时的时间翻阅了文档,我潜入了代码中。 这是我发现的。
首先是一些术语。 同一块(这些副本是什么,而不是镜像)是自动创build的写入,但可能会或可能不会在原始副本相同的虚拟设备(vdev)。 另一方面,镜像块总是反映到另一个虚拟设备上。
但是,代码将两种types的块称为子项。 你会在这里看到,同上块只是儿童io_vd == NULL (这是在写function)。 对于镜像块, io_vd将被设置为相应的虚拟设备(例如,您的第二个磁盘)。
考虑到这一点,当它到达读取部分时 ,如果它不包含预期的good_copies ,则good_copies可能不安全的所有孩子(是它们的镜像或同上块),并根据需要重写它们 。 所以这听起来像是你的问题的答案是 – 是的,当你至less有一个好的副本,它会重写它们,以及下面的任何一个:
唷! 也许有人可以指出缺陷,但我喜欢通过这个小练习来学习ZFS,我希望这有助于!
@ jlliagre和其他似乎认为如果它的一个磁盘(vdevs)死亡,但池不是多余(镜像/ raidz),整个zpool死亡。 这不是真的; 即使磁盘不是镜像或raidz, 多磁盘池也将永远存在单个完整的磁盘故障。
ZFS元数据始终至less复制2次,因此完整磁盘(或其任何部分)的完全故障不会取消文件系统。 此外,许多文件,特别是较小的文件不会分散在所有的磁盘上,因此不一定会由于磁盘故障而出错。 操作系统询问有关使用同上块的多磁盘池 (用户数据副本> 1)的情况。 在这里,一个完整的磁盘故障不应该导致任何数据丢失。 ZFS将总是试图将块放在远离原始块的位置,对于具有多个vdev的池,这总是意味着在另一个vdev上(一个vdev大于池的50%的exception可能是exception的) 。 文件系统的元数据总是被拷贝+1或者+2倍于同上的水平,所以它将永远存在磁盘故障。 而且,如果你的池中有三个以上的磁盘,那么你应该能够丢失多达一半的磁盘而不会丢失任何数据。 ZFS将同上块存储在下一个磁盘上,只要您永远不会丢失相邻的两个磁盘,就永远不会丢失数据。 (三张双目失败,同上= 2)。
当有足够的数据副本来访问文件(无论这些副本是来自同一个块,镜像还是raidz),则在访问文件时,所有丢失的数据副本都将被修复。 这是擦洗的目的; 读取所有数据并通过使用冗余副本修复任何不良的问题。 因此,要直接回答OP问题,只需在更换发生故障的驱动器后执行擦洗,所有副本都将恢复。
与往常一样,您可以通过创build存储区的vdevs只是普通的稀疏文件的池来轻松地尝试这些概念。 通过删除或破坏vdev文件,您可以模拟任何types的故障,并可以validation池,文件系统和数据的完整性。
编辑:试验后,如果一个磁盘在多个磁盘非冗余池中复制> = 2时失败,看起来像zfs会使池失败。 一个或多个磁盘上的Parital数据损坏应该保持不变,应该通过擦除来修复。