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
該目錄不包含任何重要數據,所以我可以刪除它並進入“乾淨”狀態。
想到的一種解決方案是創建一個新的 ZFS 池,複製所有健康的數據,然後刪除舊的。但這感覺非常危險。如果系統掛起並且我的伺服器出現故障怎麼辦?
你能想出一種方法來擺脫損壞的目錄而不會造成太多破壞嗎?
我的 FreeBSD 10.2 伺服器上的一個目錄莫名其妙地被損壞了(ZFS 不應該阻止這種情況嗎?)
ZFS 僅檢測來自磁碟的錯誤,而不是來自記憶體(ECC 在這裡負責)或您的應用程序(因為它不知道您是否要將垃圾寫入文件)。
此外,只有一個單磁碟 vdev 支持您的池,即使發現錯誤,也無法修復它們。添加第二個磁碟以啟用此功能,否則您將不得不刪除受影響的文件並從備份中恢復它們。
想到的一種解決方案是創建一個新的 ZFS 池,複製所有健康的數據,然後刪除舊的。但這感覺非常危險。如果系統掛起並且我的伺服器出現故障怎麼辦?
然後您的伺服器很可能會關閉,重新啟動並繼續沒有錯誤,顯示相同的錯誤或出現一些新錯誤。沒有人真正知道,所以我建議專注於如何永久刪除錯誤:
備份您的數據(因為您應該已經這樣做了,因為即使 ZFS 也可以通過錯誤或錯誤殺死您的數據),重新啟動伺服器,檢查日誌是否有任何可疑之處。在您可以承受停機時間的時候進行。如果您無法承受停機時間,您應該至少擁有另一台可以接管的機器,因此請考慮您的需求和策略。如果您發現一些看起來像錯誤的東西,請嘗試在第二台機器上重現它(用於
zfs send/recv
複製池)。你能想出一種方法來擺脫損壞的目錄而不會造成太多破壞嗎?
用於
zfs send
複製包含此目錄的 ZFS 文件系統(最壞的情況:根文件系統,也就是整個池;最好的情況:僅此目錄)並zfs recv
通過管道(或通過管道傳輸ssh
或netcat
)將目前快照複製到另一台機器或備份中,然後像往常一樣刪除舊機器上的目錄,並從已知良好的備份或您的應用程序中重新填充它(在大多數情況下意味著重新安裝)。如果出現任何問題或您想稍後進行調查,您將擁有包含該時間點的所有數據、快照和元數據的複制快照。