web-dev-qa-db-ja.com

ZFSがディレクトリを破損しましたが、zpoolは何も問題を検出しません

私のFreeBSD10.2サーバー上のディレクトリはどういうわけか絶望的に破損しました(ZFSはそれを防ぐはずではなかったのですか?)

lsまたはそれに対する他のコマンドにより、現在のセッションがカーネルレベルでフリーズします(SIGKILLでも何もしません)。

enter image description here

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

ディレクトリには重要なデータが含まれていないので、削除して「クリーン」な状態にできれば問題ありません。

頭に浮かぶ解決策の1つは、新しいZFSプールを作成し、正常なデータをすべてコピーしてから、古いデータを削除することです。しかし、それは非常に危険だと感じています。システムがハングし、サーバーがダウンした場合はどうなりますか?

あまり混乱することなく、破損したディレクトリを取り除く方法を考えられますか?

2
panta82

私のFreeBSD10.2サーバー上のディレクトリはどういうわけか絶望的に破損しました(ZFSはそれを防ぐはずではなかったのですか?)

ZFSは、ディスクからのエラーのみを検出し、メモリ(ECCがここで責任を負います)またはアプリケーション(ファイルにガベージを書き込みたいかどうかがわからないため)からは検出しません。

また、プールをバックアップしているディスクvdevが1つしかない場合、エラーが見つかったとしても、それらを修復することはできません。これを有効にするには、2つ目のディスクを追加します。そうしないと、影響を受けるファイルを削除して、バックアップから復元する必要があります。

頭に浮かぶ解決策の1つは、新しいZFSプールを作成し、正常なデータをすべてコピーしてから、古いデータを削除することです。しかし、それは非常に危険だと感じています。システムがハングし、サーバーがダウンした場合はどうなりますか?

その後、サーバーがダウンして再起動し、エラーなしで続行するか、同じエラーを表示するか、新しいエラーが発生する可能性があります。誰も本当に知らないので、エラーを完全に取り除く方法に集中することをお勧めします。

データをバックアップし(ZFSでもバグやエラーでデータを強制終了する可能性があるため、すでに行っているはずです)、サーバーを再起動し、疑わしい点がないかログを確認します。ダウンタイムの余裕があるときに実行してください。ダウンタイムを許容できない場合は、引き継ぐことができる少なくとも別のマシンが必要なので、ニーズと戦略について考えてください。バグのように見えるものを見つけた場合は、2台目のマシンで再現してみてください(zfs send/recvを使用してプールをコピーします)。

あまり混乱することなく、破損したディレクトリを取り除く方法を考えられますか?

zfs sendを使用して、このディレクトリを保持するZFSファイルシステムをコピーし(最悪の場合:ルートファイルシステム、別名プール全体、最良の場合:このディレクトリのみ)、zfs recvパイプ(またはsshまたはnetcat)を使用して、現在のスナップショットを別のマシンまたはバックアップメディアにコピーし、通常どおりに古いマシンのディレクトリを削除して、正常なバックアップまたはアプリケーションから再入力します(つまり、ほとんどの場合、再インストールします)。

何か問題が発生した場合、または後で調査したい場合は、この時点のすべてのデータ、スナップショット、およびメタデータを保持するスナップショットがコピーされています。

3
user121391