我的 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
管道(或通过管道ssh
或netcat
)将当前快照复制到另一台机器或备份介质,然后像平常一样删除旧机器上的目录,并从已知的良好备份或应用程序中重新填充它(在大多数情况下意味着重新安装)。
如果出现任何问题或者您想稍后进行调查,您可以使用复制的快照,其中包含从此时间点开始的所有数据、快照和元数据。