ZFS 目录损坏,但 zpool 未检测到任何错误

ZFS 目录损坏,但 zpool 未检测到任何错误

我的 FreeBSD 10.2 服务器上的一个目录不知何故被彻底损坏了(ZFS 不是应该防止这种情况发生吗?)

ls或任何其他针对它的命令都会导致当前会话在内核级别冻结(即使 SIGKILL 不执行任何操作)。

在此处输入图片描述

ZFS scrub 未发现任何问题。

 # 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

该目录不包含任何重要数据,因此如果我可以删除它并进入“干净”状态就好了。

我想到的一个解决方案是创建一个新的 ZFS 池,复制所有健康数据,然后删除旧数据。但这感觉很危险。如果系统挂起并且我的服务器瘫痪怎么办?

您能想到一种方法来让我在不造成太多干扰的情况下摆脱损坏的目录吗?

答案1

我的 FreeBSD 10.2 服务器上的一个目录不知何故被彻底损坏了(ZFS 不是应该防止这种情况发生吗?)

ZFS 仅检测来自磁盘的错误,而不是来自内存(这里由 ECC 负责)或应用程序的错误(因为它不知道您是否要将垃圾写入文件)。

此外,如果池仅由一个磁盘 vdev 支撑,即使发现错误,也无法修复。请添加第二个磁盘以启用此功能,否则您必须删除受影响的文件并从备份中恢复它们。

我想到的一个解决方案是创建一个新的 ZFS 池,复制所有健康数据,然后删除旧数据。但这感觉很危险。如果系统挂起并且我的服务器瘫痪怎么办?

然后你的服务器很可能会宕机,然后重启,要么继续运行而不会出错,要么显示相同的错误,要么出现一些新的错误。没有人真正知道,所以我建议专注于如何永久消除错误:

备份您的数据(您应该已经这样做了,因为即使是 ZFS 也可能因错误或漏洞而毁掉您的数据),重新启动服务器,检查日志中是否有任何可疑内容。请在您可以承受停机时间的时候执行这些操作。如果您无法承受停机时间,您至少应该有另一台可以接管的机器,因此请考虑您的需求和策略。如果您发现某些看起来像是错误的东西,请尝试在第二台机器上重现它(用于zfs send/recv复制池)。

您能想到一种方法来让我在不造成太多干扰的情况下摆脱损坏的目录吗?

使用zfs send复制包含该目录的 ZFS 文件系统(最坏情况:根文件系统,又称整个池;最佳情况:仅此目录)并通过zfs recv管道(或通过管道sshnetcat)将当前快照复制到另一台机器或备份介质,然后像平常一样删除旧机器上的目录,并从已知的良好备份或应用程序中重新填充它(在大多数情况下意味着重新安装)。

如果出现任何问题或者您想稍后进行调查,您可以使用复制的快照,其中包含从此时间点开始的所有数据、快照和元数据。

相关内容