使用 zfs,如果您拥有copies=2
然后丢失了一个包含其中一些副本的驱动器,您如何告诉系统它应该为受影响的文件制作数据块的新副本?或者 zfs 是否在发现坏数据块后立即开始为额外副本添加数据块?
擦洗会这样做吗?
(v0.6.0.56-rc8,ZFS 池版本 28,ZFS 文件系统版本 5,Ubuntu 11.10)
jll*_*gre 10
“copies=2”(或 3)更适合与没有冗余的池(单个磁盘或条带)一起使用。目标是能够恢复轻微的磁盘损坏,而不是整个设备故障。在后一种情况下,池是不可挂载的,因此不会发生同样的块恢复。
如果您有冗余(镜像/raidz/raidz2/raidz3),同上块与其他块没有什么不同,擦洗/重新同步将重新创建它们。
我发现这个问题真的很有趣,在花了一个小时翻阅文档后,我深入研究了代码。这是我发现的。
首先,一些术语。Ditto 块(这些副本是什么,而不是镜像)在写入时自动创建,但可能与原始副本位于相同的虚拟设备 (vdev) 中,也可能不同。另一方面,镜像块总是被反射到另一个虚拟设备上。
但是,代码将这两种类型的块都称为子块。您将在此处看到同上块只是其子项io_vd == NULL
(这是在 write 函数中)。对于镜像块,io_vd
将设置为相应的虚拟设备(例如,您的第二个磁盘)。
考虑到这一点,当它到达读取部分时,如果它不包含预期good_copies
,它会将所有子项(无论是镜像还是同上块)视为潜在不安全,并根据需要重写它们。所以听起来你的问题的答案是 - 是的,当你至少有一个好的副本时,它会重写它们,并且具有以下任一条件:
呼!也许有人可以指出缺陷,但我很喜欢通过这个小练习学习 ZFS,我希望这会有所帮助!
归档时间: |
|
查看次数: |
5139 次 |
最近记录: |