Mat*_*vid 6 zfs filesystems hard-drive corruption checksum
我正在备份存储在 zpool 中的数据,该 zpool 由一个带有 2 个硬盘的 raidz vdev 组成。在这个操作过程中,我得到了校验和错误,现在状态如下:
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
Run Code Online (Sandbox Code Playgroud)
我感到困惑的是校验和错误出现在 vdev 级别,而不是磁盘级别。也许我应该注意,其中一个硬盘是内部的,另一个是外部的(这是暂时的情况)。这可能是硬盘控制器的问题吗?
我可以尝试做些什么来取回受影响的文件?就像清除错误并导入 vdev 仅使用其中一个磁盘降级一样?我什至没有尝试再次读取文件以查看会发生什么。(不知道会不会有什么影响。)
更新:如果我清除错误并重试,我放弃了等待可能出错的解释,所以我继续尝试。我首先做了zpool clear,然后zpool status没有显示任何错误。然后,我尝试读取有错误的文件(最后有 2 个),但仍将相应的块报告为错误/不可读。这一次,zpool status不再显示越来越多的校验和错误。接下来,我尝试使 raidz1 vdev 中的一个磁盘脱机并重复该过程,但结果没有改变。总共,我在 1.6T 中丢失了 2 128K 块。
回答状态:目前,我发现这个问题没有全面的答案。如果有人想写一个或编辑现有的一个,请解决以下问题:
对于 1,理论及其问题似乎是:
选择raidz1过raidz2。问题:一个人至少需要 4 个磁盘来进行raidz2. 虽然对冗余的需求是明确的,但反复建议解决冗余失败的方法是更多的冗余是没有用的。了解如何最好地利用您拥有的冗余会更有用。
选择raidz1过mirror。问题:乍一看,它们之间的区别似乎是效率,而不是冗余。不过,这可能是错误的。原因:zfs 为每个磁盘上的每个块保存一个校验和,但两个磁盘都没有报告单独的校验和错误。这似乎表明对于每个坏块,这 2 个磁盘包含不同的块有效负载,每个都有匹配的校验和,而 zfs 无法判断哪个是正确的。这表明有 2 种不同的校验和计算,并且它们之间的有效载荷以某种方式发生了变化。这可以通过 RAM 损坏来解释,并且可能(需要确认)选择mirrorover raidz1,只需要一个校验和。
写入期间 RAM 损坏,而不是读取。如上所述,这似乎是合理的。问题:为什么这在写入时没有被检测为错误?可能是 zfs 不检查它写的内容吗?或者更确切地说,写入不同磁盘的块有效负载是相同的?
对于 2:
对于 3:
是否很清楚mirroroverraidz1会阻止这种情况?
我假设对这个 zpool 的清理已经检测到了这个问题。就我而言,我正在移动一些数据,并在实际读取此 zpool 之前破坏了源数据,认为我有 2 个磁盘冗余。这里的道德是在信任其内容之前擦洗 zpool 吗?擦洗当然有用,但有必要吗?例如,用mirror代替raidz1?是否需要擦洗?
这是 raidz1(以及 RAID5)的问题。如果磁盘上的数据发生变化,但没有发生驱动器故障让 ZFS 或 RAID 控制器知道哪个驱动器导致了错误,那么它就无法知道哪个驱动器是正确的。使用 raidz2(及更高版本)或 RAID6,您可以获得一定数量的驱动器,可以决定在重建时忽略哪个驱动器。
这里唯一的解决方案是通过恢复备份副本或写入/dev/null文件来覆盖文件。
| 归档时间: |
|
| 查看次数: |
1577 次 |
| 最近记录: |