ZFS损坏了目录,但是zpool没有检测到任何错误

我的FreeBSD 10.2服务器上的一个目录无意中被破坏了(ZFS是不是应该阻止它?)

ls或者任何其他的命令都会导致当前会话在内核级别被冻结(甚至SIGKILL什么也不做)。

在这里输入图像说明

ZFS擦洗没有问题。

  # zpool status zroot pool: zroot state: ONLINE scan: scrub repaired 0 in 0h17m with 0 errors on Sun Dec 18 18:25:04 2016 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 gpt/zfs0 ONLINE 0 0 0 errors: No known data errors 

smartctl说磁盘一切正常。

 SMART Attributes Data Structure revision number: 16 Vendor Specific SMART Attributes with Thresholds: ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x000b 100 100 016 Pre-fail Always - 0 2 Throughput_Performance 0x0005 137 137 054 Pre-fail Offline - 89 3 Spin_Up_Time 0x0007 128 128 024 Pre-fail Always - 314 (Average 277) 4 Start_Stop_Count 0x0012 100 100 000 Old_age Always - 78 5 Reallocated_Sector_Ct 0x0033 100 100 005 Pre-fail Always - 0 7 Seek_Error_Rate 0x000b 100 100 067 Pre-fail Always - 0 8 Seek_Time_Performance 0x0005 142 142 020 Pre-fail Offline - 29 9 Power_On_Hours 0x0012 097 097 000 Old_age Always - 24681 10 Spin_Retry_Count 0x0013 100 100 060 Pre-fail Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 78 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 306 193 Load_Cycle_Count 0x0012 100 100 000 Old_age Always - 306 194 Temperature_Celsius 0x0002 171 171 000 Old_age Always - 35 (Min/Max 20/46) 196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0 197 Current_Pending_Sector 0x0022 100 100 000 Old_age Always - 0 198 Offline_Uncorrectable 0x0008 100 100 000 Old_age Offline - 0 199 UDMA_CRC_Error_Count 0x000a 200 200 000 Old_age Always - 0 

即使zdb发现没有错。

 # zdb -c zroot Traversing all blocks to verify metadata checksums and verify nothing leaked ... loading space map for vdev 0 of 1, metaslab 44 of 116 ... 12.2G completed ( 60MB/s) estimated time remaining: 0hr 00min 00sec No leaks (block sum matches space maps exactly) bp count: 956750 ganged count: 0 bp logical: 43512090624 avg: 45479 bp physical: 11620376064 avg: 12145 compression: 3.74 bp allocated: 13143715840 avg: 13737 compression: 3.31 bp deduped: 0 ref>1: 0 deduplication: 1.00 SPA allocated: 13143715840 used: 1.32% additional, non-pointer bps of type 0: 123043 Dittoed blocks on same vdev: 62618 

该目录不包含任何重要的数据,所以我会没事的,如果我可以删除它,并达到“干净”的状态。

想到的一个解决scheme是创build一个新的ZFS池,复制所有健康的数据,然后删除旧的。 但那感觉非常危险。 如果系统挂起而我的服务器出现故障呢?

你能想到一种方法,我可以摆脱损坏的目录没有太多的中断?

我的FreeBSD 10.2服务器上的一个目录无意中被损坏了(是不是ZFS应该阻止这个?)

ZFS只检测磁盘上的错误,而不是从内存(ECC负责这里)或你的应用程序(因为它不知道你是否想写垃圾到你的文件)。

此外,只有单磁盘vdev支持您的池,即使发现错误,他们也不能被修复。 添加第二个磁盘来启用它,否则你将不得不删除受影响的文件并从备份中恢复它们。

想到的一个解决scheme是创build一个新的ZFS池,复制所有健康的数据,然后删除旧的。 但那感觉非常危险。 如果系统挂起而我的服务器出现故障呢?

那么你的服务器很可能会停下来,重新启动,并继续没有错误,显示相同的错误,或得到一些新的错误。 没有人真的知道,所以我build议专注于如何永久删除错误:

备份您的数据(因为您应该已经完成​​了,因为即使ZFS可以用错误或错误来终止您的数据),请重新启动服务器,检查日志中是否有任何可疑内容。 在负担得起的时间做这件事。 如果买不起宕机时间,至less应该有另一台可以接pipe的机器,所以考虑一下你的需求和策略。 如果您发现某些看起来像是bug的东西,请尝试在第二台机器上重现(使用zfs send/recv将池复制过来)。

你能想到一种方法,我可以摆脱损坏的目录没有太多的中断?

使用zfs send来复制包含此目录的ZFS文件系统(最坏的情况是:根文件系统也就是整个池;最好的情况就是这个目录)和zfs recvpipe道(或通过sshnetcat传送)复制当前快照转移到另一台计算机或备份介质上,然后像往常一样删除旧计算机上的目录,并从已知的良好备份或应用程序(大多数情况下重新安装)重新填充该目录。

如果出现任何问题或您想稍后进行调查,则您将拥有复制的快照,该快照可保存此时所有数据,快照和元数据。