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
针对两个驱动器,因此看起来您已经运行过。
不幸的是,由于没有复制品,我们真的没有办法知道。