Filesystems

ZFS 損壞的目錄,但 zpool 沒有檢測到任何錯誤

  • December 21, 2016

我的 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通過管道(或通過管道傳輸sshnetcat)將目前快照複製到另一台機器或備份中,然後像往常一樣刪除舊機器上的目錄,並從已知良好的備份或您的應用程序中重新填充它(在大多數情況下意味著重新安裝)。

如果出現任何問題或您想稍後進行調查,您將擁有包含該時間點的所有數據、快照和元數據的複制快照。

引用自:https://serverfault.com/questions/821426