永久性 ZFS 错误表示什么?

Wil*_*ley 19 zfs

permanent errors今天在我的 zpool 上报告了几个。

  pool: seagate3tb
 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
        seagate3tb  ONLINE       0     0    28
          sda       ONLINE       0     0    56

errors: Permanent errors have been detected in the following files:

        /mnt/seagate3tb/Install.iso
        /mnt/seagate3tb/some-other-file1.txt
        /mnt/seagate3tb/some-other-file2.txt
Run Code Online (Sandbox Code Playgroud)

编辑:我确定这些CKSUM值是否准确。我正在编辑数据,并且可能错误地破坏了这些数据。它们可能是 0。不幸的是,我在我的笔记中找不到决定性的答案,现在错误已经解决,所以我不确定,但其他一切都是准确的/反映了 zpool 报告的内容。

/mnt/seagate3tb/Install.iso 是一个报告为具有永久性错误的示例文件。

这就是我感到困惑的地方。如果我将我的“永久错误”Install.iso与另一个文件系统上完全相同的文件的备份进行比较,它们看起来相同。

shasum "/mnt/seagate3tb/Install.iso"
1ade72fe65902b2a978e5504aaebf9a3a08bc328  /mnt/seagate3tb/Install.iso
shasum "/mnt/backup/Install.iso"
1ade72fe65902b2a978e5504aaebf9a3a08bc328  /mnt/backup/Install.iso
cmp /mnt/seagate3tb/Install.iso /mnt/backup/Install.iso
diff /mnt/seagate3tb/Install.iso /mnt/backup/Install.iso
Run Code Online (Sandbox Code Playgroud)

这些文件似乎是相同的。更重要的是,该文件运行良好。如果我在应用程序中使用它,它的行为就像我期望的那样。

正如文档所述

数据损坏错误总是致命的。

但是根据我的基本文件验证,我不确定我是否理解fatal.

状态:一台或多台设备出现错误,导致数据损坏。应用程序可能会受到影响。

行动:如果可能,恢复有问题的文件。否则从备份还原整个池。

也许我遗漏了一些东西,但据我所知,该文件似乎非常好,并且确实需要任何恢复,也没有显示任何损坏,尽管来自 ZFS 的推荐。

我看过其他同样错误的文章,但我还没有找到我的问题的答案。

文件的永久错误是什么?该文件是否存在一些对我来说不太明显的较低级别的问题?如果是这样,为什么shasum文件中的差异不会被 a 检测到?

从外行的角度来看,我看不出任何迹象表明此文件有任何错误。

Tom*_*haw 22

的措辞zpool status有点误导。永久性错误(在此上下文中)表示发生了 I/O 错误并已记录到该池的 SPA(存储池分配器)错误日志中。但这并不一定意味着有不可恢复的数据损坏。

你应该做的是zpool scrub在池上运行一个。清理完成后,SPA 错误日志将轮换,不再显示清理之前的错误。如果清理没有检测到错误,zpool status则将不再显示任何“永久性”错误。

关于文档,据说只有“致命错误”以这种方式记录。致命错误是无法由 ZFS 自动更正的 I/O 错误,因此作为失败的 I/O 暴露给应用程序。相比之下,如果 I/O 立即成功重试,或者如果逻辑 I/O 由冗余设备满足,则不会将其视为致命错误,因此不会记录为数据损坏错误。

致命错误并不一定意味着永久性数据丢失,它只是意味着在它传播到应用程序之前无法修复它。例如,松动的电缆或损坏的控制器可能会导致暂时的致命错误,ZFS 将其描述为“永久性”。它是否真的是一个问题取决于 I/O 的性质以及应用程序是否能够从 I/O 错误中恢复。

编辑:完全同意@bahamat 你应该尽快投资冗余。


bah*_*mat 7

永久性错误意味着文件中存在校验和错误,并且没有足够的副本可供修复。这意味着由于 I/O 错误,至少有一次读取返回了损坏的数据。如果收到读取的任何内容,然后将其写回同一个磁盘文件,您现在将拥有不可恢复的数据损坏。

查看您的池配置,您似乎没有冗余。这是非常危险的。你没有得到任何的ZFS的自我修复的好处,但能够告诉你什么时候出现了数据损坏。通常,ZFS 会自动且静默地纠正损坏的读取,但在您的情况下则不能。看起来您已经运行了,zpool clear因为CKSUM计数适用0于两个驱动器。

不幸的是,没有复制品,真的没有办法知道。

  • `zpool clear` 不会也清除错误消息本身,而不仅仅是错误计数吗?奇怪的是消息仍然存在,但没有显示任何错误。 (2认同)
  • 我很抱歉。为了隐私,我从永久错误列表中省略了这些文件。在编辑该输出时,我还破坏了 CKSUM 计数并丢失了有价值的上下文。我已经编辑了问题以反映现实。@用户121391 (2认同)