私のFreeBSD10.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
ディレクトリには重要なデータが含まれていないので、削除して「クリーン」な状態にできれば問題ありません。
頭に浮かぶ解決策の1つは、新しいZFSプールを作成し、正常なデータをすべてコピーしてから、古いデータを削除することです。しかし、それは非常に危険だと感じています。システムがハングし、サーバーがダウンした場合はどうなりますか?
あまり混乱することなく、破損したディレクトリを取り除く方法を考えられますか?
私のFreeBSD10.2サーバー上のディレクトリはどういうわけか絶望的に破損しました(ZFSはそれを防ぐはずではなかったのですか?)
ZFSは、ディスクからのエラーのみを検出し、メモリ(ECCがここで責任を負います)またはアプリケーション(ファイルにガベージを書き込みたいかどうかがわからないため)からは検出しません。
また、プールをバックアップしているディスクvdevが1つしかない場合、エラーが見つかったとしても、それらを修復することはできません。これを有効にするには、2つ目のディスクを追加します。そうしないと、影響を受けるファイルを削除して、バックアップから復元する必要があります。
頭に浮かぶ解決策の1つは、新しいZFSプールを作成し、正常なデータをすべてコピーしてから、古いデータを削除することです。しかし、それは非常に危険だと感じています。システムがハングし、サーバーがダウンした場合はどうなりますか?
その後、サーバーがダウンして再起動し、エラーなしで続行するか、同じエラーを表示するか、新しいエラーが発生する可能性があります。誰も本当に知らないので、エラーを完全に取り除く方法に集中することをお勧めします。
データをバックアップし(ZFSでもバグやエラーでデータを強制終了する可能性があるため、すでに行っているはずです)、サーバーを再起動し、疑わしい点がないかログを確認します。ダウンタイムの余裕があるときに実行してください。ダウンタイムを許容できない場合は、引き継ぐことができる少なくとも別のマシンが必要なので、ニーズと戦略について考えてください。バグのように見えるものを見つけた場合は、2台目のマシンで再現してみてください(zfs send/recv
を使用してプールをコピーします)。
あまり混乱することなく、破損したディレクトリを取り除く方法を考えられますか?
zfs send
を使用して、このディレクトリを保持するZFSファイルシステムをコピーし(最悪の場合:ルートファイルシステム、別名プール全体、最良の場合:このディレクトリのみ)、zfs recv
パイプ(またはssh
またはnetcat
)を使用して、現在のスナップショットを別のマシンまたはバックアップメディアにコピーし、通常どおりに古いマシンのディレクトリを削除して、正常なバックアップまたはアプリケーションから再入力します(つまり、ほとんどの場合、再インストールします)。
何か問題が発生した場合、または後で調査したい場合は、この時点のすべてのデータ、スナップショット、およびメタデータを保持するスナップショットがコピーされています。