我正在备份存储在一个由一个带有2个硬盘的raidz组成的zpool中的数据。在此操作期间,我得到了校验和错误,现在状态如下:
pool: tmp_zpool
state: ONLINE
status: One or more devices has experienced an error resulting in data
corruption. Applications may be affected.
action: Restore the file in question if possible. Otherwise restore the
entire pool from backup.
see: http://zfsonlinux.org/msg/ZFS-8000-8A
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tmp_zpool ONLINE 0 0 2
raidz1-0 ONLINE 0 0 4
tmp_cont_0 ONLINE 0 0 0
tmp_cont_1 ONLINE 0 0 0
errors: Permanent errors have been detected in the following files:
/some/file让我感到困惑的是,校验和错误出现在vdev级别,而不是在磁盘级别。也许我应该指出,其中一个硬盘是内部的,另一个是外部的(这是暂时的情况)。这会是硬盘控制器的问题吗?
我能做些什么来取回受影响的文件吗?就像清除错误和导入vdev一样,只使用其中一个磁盘就会降级?我甚至没试着再读一次文件看看会发生什么。(不确定它是否会影响任何事情。)
更新:如果我清除错误并重新尝试的话,我就不再等待对可能出错的原因的解释了,所以我继续尝试。我首先做了zpool clear,然后zpool status没有显示错误。然后,我尝试读取带有错误的文件(其中两个在最后),但是相应的块仍然被报告为坏/不可读。这一次,zpool status不再显示越来越多的校验和错误。接下来,我尝试离线raidz1 vdev中的一个磁盘并重复这个过程,但是结果没有改变。在1.6T中,我总共损失了2块128 K。
答情况:目前,我发现这个问题没有全面的答案。如果有人想写一个或编辑一个现有的,请解决以下问题:
对于第一,理论及其问题似乎是:
raidz1而不是raidz2。问题:raidz2至少需要4个磁盘。虽然对冗余的需求是明确的,但是反复提出失败的冗余的解决方法是更多的冗余是没有用的。了解如何最好地利用您拥有的冗余将更加有用。raidz1而不是mirror。问题:乍一看,两者的区别似乎是效率,而不是冗余。不过,这可能是错的。原因: zfs保存每个磁盘上每个块的校验和,但这两个磁盘都没有报告单个校验和错误。这似乎表明,对于每一个坏块,这两个磁盘包含不同的块有效载荷,每个磁盘都有一个匹配的校验和,而zfs无法判断哪个是正确的。这意味着有两种不同的校验和计算,它们之间的有效载荷以某种方式改变了。这可以用RAM损坏来解释,可能(需要确认)如果选择mirror而不是raidz1,只需要一次校验和。2:
3:
mirror over raidz1会阻止这种情况发生吗?mirror而不是raidz1来进行清洗?发布于 2015-08-07 20:51:15
这是raidz1 (以及RAID5)的问题所在。如果磁盘上的数据发生变化,但没有发生驱动器故障,以让ZFS或RAID控制器知道是哪个驱动器导致了错误,那么它就无法知道哪个驱动器是正确的。使用raidz2 (和更高版本)或RAID6,您将获得足够多的驱动器,这些驱动器可以决定在重建过程中忽略哪个驱动器。
您在这里的唯一解决方案是通过还原备份副本或将/dev/null写入文件来覆盖该文件。
发布于 2016-09-02 01:16:42
我遇到了一个类似的问题。我不确定这是否有帮助,但我发现这篇关于vdev级校验和错误的相关文章来自于FreeBSD开发人员。
https://lists.freebsd.org/pipermail/freebsd-hackers/2014-October/046330.html
如果vdev_raidz.c无法确定哪个叶vdev负责,则校验和错误将出现在raidz而不是叶上。如果两个或多个叶vdevs返回同一块的坏数据,也会导致不可恢复的数据错误,则可能会发生这种情况。我看到您有一些无法恢复的数据错误,所以可能就是发生在您身上的情况。ZFS中的一些细微的设计错误也会导致vdev_raidz.c无法确定哪个子程序负责校验和错误。但是,只有在raidz vdev有镜像子时才会发生这种情况。只有当子程序是备用或替换vdev时,才会发生这种情况。您是否激活了任何备件,还是手动替换了vdev?
我自己正在考虑删除我的zpool.cache文件并导入我的池来重新生成那个zpool.cache文件。
https://serverfault.com/questions/711677
复制相似问题