web-dev-qa-db-ja.com

Linux上のZFSが不十分なレプリカ

概要

次のメッセージが原因で、ZFSプールの1つをインポートできなくなりました。

status: One or more devices contains corrupted data.
action: The pool cannot be imported due to damaged devices or data.
...
    data1       UNAVAIL  insufficient replicas

「不十分なレプリカ」の意味を理解したいと思います。バックアップを取り出してストレージプールを再構築する前に、これから安全に回復する方法があるかどうかを理解したいと思います。

また、これを引き起こした原因と、今後この状況を防ぐために何ができるかについても理解したいと思います。私はZFSのロックを理解していますが、ZFSの初心者として、ドライブを箱から取り出すのと同じくらい無害なもののバックアップを引き出す必要があるのは怖いです。

バックグラウンド

最近、このボックスの電源を切り、SATAsdaディスクを取り出しました。壁からプラグを抜く前にシステムの電源を完全に切ることは99%確信していますが、シャットダウンに時間がかかりすぎた場合は、ハード電源を切った可能性があります。

ドライブを再び接続するとき、マザーボードの同じSATAポートに接続し直したと思いますが、別のポートに接続した可能性があります。

このボックスには、Debianがextパーティション上の唯一のオペレーティングシステムとしてインストールされている古いPATAsdbディスクも含まれています。

以前は、起動し、すべてのプールがインポートされ、ボリュームがマウントされていました。今回は何も得られませんでした。

今日

ボックスを起動すると、通常のGDMログイン画面が表示され、ログインできないことに気付きました。後で、すべてプール上にあるため、ユーザーのホームディレクトリがないことに気付きました。

コマンドラインから、私は次のことを発見しました。

# zfs list
no datasets available

# zpool list
no pools available

# zpool status
no pools available

私のドライブは利用可能でした。 fdiskは期待どおりの出力を生成し、/ dev/sdaXデバイスと/ dev/sdbXデバイスがありました。

zpool importは私に興味深い結果を与えました。他のプールはオンラインで報告しましたが、問題のプールはこれを報告しました:

   pool: ...
     id: ...
  state: UNAVAIL
 status: One or more devices contains corrupted data.
 action: The pool cannot be imported due to damaged devices or data.
    see: http://zfsonlinux.org/msg/ZFS-8000-5E
 config:

        data1       UNAVAIL  insufficient replicas
          sda2      UNAVAIL

この時点でzpool import poolnameを使用して他のプールをインポートし、zfs listを使用してすべてが正常であることがわかりました。

これでは違います:

# zpool import data1
cannot import 'data1': one or more devices are already in use

zpool importは、このプールに対して同じ出力を示しました。

/etc/zfs/zpool.cacheファイルを削除することを考えました。すべてをエクスポートしてから、ディレクトリを確認しました。

# zpool export -a
# ls /etc/zfs

エクスポート後にzpool.cacheがなかったので、単に再起動しました。 (プールのインポート中にzpool.cacheを削除するとどうなるかわからないので、試しませんでした。)

再起動後も同じ結果になります。他のプールは問題なく、これはインポートできません。

3
jia103

「不十分なレプリカ」の意味を理解したい

これは、ZFSがプールの読み取りまたは書き込み中にエラーを検出し、その後、問題を修正するのに十分な冗長性がプールにないことを発見したことを意味します。シングルドライブプール用にZFSを構成したように見えるので、これは単に問題が発生し、それ自体で回復できないことを意味します。

単純なケースでは、zpool status -vは、現在取り返しのつかないほど破損している個々のファイルを報告します。それらをバックアップから復元するか、削除すると、プールは破損していない状態に戻ります。これは、個別のファイルシステム、論理ボリュームマネージャー、およびRAIDサブシステムとは対照的に、ZFSで得られる利点の1つです。単一のファイルに影響を与えるディスクレベルのエラーは、その特定のファイルのエラーとして報告できますが、FS + LVM + RAIDラッシュアップでは、下位レベルのエラーはセマンティックを維持できませんスタックを伝播するときのコンテキスト。

しかし、あなたの質問によると、zpool status is not特定のファイルの問題を報告します。これは、問題プール内の1つのディスクでより根本的な問題が発生したことを意味します。この時点で、ディスク自体の診断を検討します:smartctlbadblocks、SpinRite、ベンダー診断ツールなど。

将来的には、少なくともZFSでミラーを使用することを強く検討してください。 ZFSは、使用する冗長性が与えられたときにそのような問題を修正するか、少なくともディスクの交換を手配できるようになるまで手間を省くことができます。

バックアップを抜く前にこれから安全に回復する方法

ZFSがそれを実行できれば、実行できます。 ZFSは簡単に諦めませんが、諦めた場合、プール上のデータを安全に使用できないことを意味します。

この時点で、問題は、基盤となるストレージメディアにソフトエラーがあり、SpinRite、badblocksなどが発生して、ディスクにクリーンコピーをプルアップさせることです。最後に不良セクタをコピーして、スペアセクタにコピーします。

ZFSは、部分的なセクターリカバリを受け入れないという点で、この点で他のファイルシステムよりも厳密であることに注意してください。強力なデータチェックサムは、すべてのセクターを完全に復元するだけで、ZFSがファイルシステムがクリーンになったことを受け入れることができることを意味します。

部分的なデータの方がデータがないよりも優れていると確信している場合、これはZFSが問題であることを意味します。代わりに、誤ったデータが正しくないと思われる場合、ZFSはまさにあなたが望むことを実行しています。

1つ以上のデバイスがすでに使用されています

それは良いことではありません。

これは、ZFSがディスクにアクセスする前に、他のカーネルドライバーをそのディスクに接続させたか、ZFSが複数のパスで同じディスクを検出していることを意味します。

2番目のケースにいることをお勧めします。ZFSに1つのパスのみでディスクを検索させると、この問題を回避できます。

$ Sudo ZPOOL_IMPORT_PATH="/dev/disk/by-id" zpool import -a

それが機能する場合、ZFSは通常、vdevが最後にインポートされたパスを記憶しているため、問題のあるプールのエクスポートと再インポートは強制的に機能しない可能性があります。

1
Warren Young