我正在备份存储在由2个硬盘的单个raidz vdev组成的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个128K块。
回答状态 :目前,我发现这个问题没有全面的答案。 如果有人想写一个或编辑一个现有的,请解决以下问题:
1,理论和他们的问题似乎是:
raidz1 raidz2select。 问题:至less需要4个raidz2磁盘。 虽然对冗余的需求是明确的,但一再表示冗余失败的治疗更为冗余是没有用的。 了解如何最好地利用您拥有的冗余,将会非常有用。
raidz1在mirrorselect。 问题:乍一看,这些差异似乎是效率,而不是冗余。 不过这可能是错误的。 原因:zfs保存每个磁盘上的每个块的校验和,但是两个磁盘都没有报告个别的校验和错误。 这似乎表明,对于每个坏块,这两个磁盘包含不同的块有效载荷,每个有一个匹配的校验和,zfs无法分辨哪个是正确的。 这表明有两个不同的校验和计算,并且有效载荷以某种方式在它们之间改变。 这可以通过RAM损坏来解释,也可以(需要确认),通过raidz1selectmirror ,只需要一个校验和。
写入期间的RAM损坏,而不是读取。 如上所述,这似乎是合理的。 问题:为什么在写入时不能将其检测为错误? 难道是zfs不检查它写什么? 或者说,写入不同磁盘的块有效载荷是相同的?
对于2:
对于3:
是否清楚mirror raidz1会阻止这种情况?
我假设这个zpool scrub已经发现了这个问题。 在我的情况下,我正在移动一些数据,在我真正阅读这个zpool之前,我摧毁了源数据,认为我有2个磁盘冗余。 这里的道德是否会在信任它的内容之前洗刷一个zpool? 当然擦洗是有用的,但它是必要的? 例如,磨砂是必要的mirror而不是raidz1 ?
这是raidz1(也是RAID5)的问题。 如果磁盘上的数据发生变化,但没有发生驱动器故障,让ZFS或RAID控制器知道哪个驱动器导致错误,则无法知道哪个驱动器是正确的。 使用raidz2(或更高版本)或RAID6,您可以获得一组驱动器,可以决定要重build哪个驱动器。
这里唯一的解决scheme是覆盖文件,通过恢复备份副本或写入/dev/null文件。
我遇到了类似的问题。 我不确定这是否有帮助,但我发现这个相关的post是关于FreeBSD开发人员的vdev级校验和错误的。
https://lists.freebsd.org/pipermail/freebsd-hackers/2014-October/046330.html
如果vdev_raidz.c无法确定哪个叶子vdev负责,则校验和错误将出现在raidz vdev而不是叶子上。 如果两个或多个叶子vdevs返回相同块的错误数据,这也可能发生,这也会导致不可恢复的数据错误。 我看到你有一些不可恢复的数据错误,所以也许这就是发生在你身上的事情。
ZFS中细微的devise错误也可能导致vdev_raidz.c无法确定哪个孩子负责校验和错误。 然而,我只看到,当一个raidz vdev有一个镜像的孩子发生。 只有当孩子是备用的或更换vdev时才会发生这种情况。 你有没有激活任何备件,或者你手动更换一个vdev?
我自己正在考虑删除我的zpool.cache文件,并导入我的池重新生成zpool.cache文件。