永久性的 ZFS 错误表示什么?

永久性的 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

编辑:我确信这些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

文件似乎完全相同。此外,文件运行良好。如果我在应用程序中使用它,它的表现与我预期的一样。

作为文档状态

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

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

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

操作:如果可能,请恢复相关文件。否则,从备份中恢复整个池。

也许我遗漏了一些东西,但据我所知,该文件似乎完好无损,并且确实需要修复,也没有显示任何损坏,尽管 ZFS 提出了建议。

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

什么该文件的永久错误是什么?该文件是否存在一些我不太清楚的低级问题?如果是这样,为什么shasum该文件的差异无法被检测到?

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

答案1

的措辞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 的观点,你应该尽快投资冗余。

答案2

永久性错误意味着文件中存在校验和错误,并且没有足够的副本来修复。这意味着至少一次读取由于 I/O 错误而返回了损坏的数据。如果任何对象都接收了读取,然后将其写回到同一个磁盘文件,那么您现在将面临无法恢复的数据损坏。

查看您的池配置,似乎没有冗余。这非常危险。您无法获得 ZFS 的任何自我修复优势,但它将要zpool clear能够告诉您何时发生数据损坏。通常情况下,ZFS 会自动且默默地纠正损坏的读取,但在您的情况下却做不到。由于CKSUM计数0针对两个驱动器,因此看起来您已经运行过。

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

相关内容