web-dev-qa-db-ja.com

ZFSは障害のあるプール状態から回復します

6ディスクのZFS raidz1プールがあり、ディスクの交換を必要とする最近の障害が発生しました。通常は問題ありませんが、今回は交換を行う前にサーバーハードウェアが停止しました(ただし、ドライブの障害とは関係なく、私が知る限り)。

友人から別のマシンを入手してシステムを再構築することができましたが、ドライブを移動する過程で、残りの5つの良好なディスクがオンラインであると見なされる正しい構成が得られるまで、ケーブルを束に交換する必要がありました。このプロセスにより、pool/raidzのチェックサムエラーが発生したようです。

残りの5台のドライブをセットアップし、適切なドライブをインストールして、故障したドライブの代わりに使用する準備をしました。ただし、プールの状態はFAULTEDなので、交換することはできません。

root@zfs:~# zpool replace tank 1298243857915644462 /dev/sdb
cannot open 'tank': pool is unavailable

このエラーから回復する方法はありますか? 6つのドライブのうち5つをオンラインにしておけば、適切なデータを再構築するのに十分だと思いますが、今はそれで十分ではないようです。

これが私のプールのステータスログです:

root@zfs:~# zpool status tank
  pool: tank
 state: FAULTED
status: One or more devices could not be used because the label is missing or invalid.
        There are insufficient replicas for the pool to continue functioning.
action: Destroy and re-create the pool from a backup source.
   see: http://zfsonlinux.org/msg/ZFS-8000-5E
  scan: none requested
config:

    NAME                     STATE     READ WRITE CKSUM
    tank                     FAULTED      0     0     1  corrupted data
      raidz1-0               ONLINE       0     0     8
        sdd                  ONLINE       0     0     0
        sdf                  ONLINE       0     0     0
        sdh                  ONLINE       0     0     0
        1298243857915644462  UNAVAIL      0     0     0  was /dev/sdb1
        sde                  ONLINE       0     0     0
        sdg                  ONLINE       0     0     0

更新(10/31):過去1週間に数回配列をエクスポートおよび再インポートしようとしましたが、成功しませんでした。最初に試した:

zpool import -f -R /tank -N -o readonly=on -F tank

それはすぐにこのエラーを引き起こしました:

cannot import 'tank': I/O error
       Destroy and re-create the pool from a backup source.

上記のコマンドに「-X」オプションを追加して、トランザクションログをチェックするようにしました。マシンが完全にロックされたため、あきらめる前に約48時間実行しました(ローカルまたはネットワーク経由でログインできませんでした)。

今、私は単純なzpool import tankコマンドを試していますが、それはしばらくの間、出力なしで実行されているようです。何かを出力するかどうかを確認するために、一晩実行したままにします。

pdate(11/1):zpool import tankは約12時間実行されており、これまでのところコマンドライン出力はありません。しかし、私のコンピューターはまだ応答性があるので、それはプラスです。

5
Nick

基本的に、バックアップから復元する以外に回復する公式の方法はありません。ただし、巻き戻しと呼ばれるZFS機能があります。これにより、プールからトランザクションを削除して、プールが再び機能するようになる可能性があります。次のテキストは、ZFS Internalsブログパート#11からのものです。

本番環境で試さないでください。使用ATお客様自身のリスク!

zpool import -FX mypoolここで、オプションの意味は次のとおりです。
*-F必要に応じて巻き戻しを試みます。
* -X極端な巻き戻しをオンにします。
*-Tインポートに使用する開始txgを指定します。このオプションは、テスト目的で意図的に文書化されていないオプションです。

最初に、この巻き戻し手順を使用して回復しようとしました。それは私にとってはうまくいきませんでした、多分それはzfs-Fuse forLinuxに実装されていません。 ZFSOnDiskFormat.pdfによると、txgに128の可能な値を持つ配列があります。私のzfs-Fuseバージョン0.7.0オプション-Tには存在しません。そこで、zfs-Fuseを変更して、利用可能なtxgをuberblock配列にリストし、特定のIDでtxgから開始できるようにしました。変更されたzfs-Fuseを使用して、ZFSのファイルシステムにアクセスできました。

私はこの方法を使用してプールを回復しました。したがって、回復することは可能ですが、サポートされていない方法であり、事態をさらに悪化させるのは非常に簡単であるため、非常に注意して行う必要があります。私の意見では、Sun/Oracleはこれらの状況に対してZFSのfsckを提供するべきです。

5
Venci Vatashki

ところで、将来誰かを助けることを期待して:

このエラーは悪化し、初期設定以外のプール内のドライブに/ dev/sdX、/ dev/hdXという名前を使用したことが原因である可能性があると思います限目。

別の命名スキームを使用することをお勧めします Linux上のZFS FAQではるかによく説明されています 。私の小さなプールでは、/ dev/disk/by-id /に切り替えました。必要に応じて、既存のプールで非常に スキームの切り替えが簡単 です。

0
Nick