今日、既存の Linux zpool に 3 番目のミラーを追加しようとして、非常に愚かなことをしてしまいましたbackup
。数年に一度ディスクを交換する以外は、ZFS での管理作業はほとんど行っていないので、2、3 の間違いを犯したとだけ言っておきます。そして、それを修正しようとして、プールを再作成するというオンライン アドバイスを誤って読み、 という名前の新しいプールを作成してしまい、backup
既存のプールを破壊してしまいました。(はい、-f
文句を言われた後にそのオプションを使用しました。はい、私は馬鹿です。これで、二度とそんなことはしないことがわかりました。次に進みましょう。)
オンラインで読んだbackup
ところによると、私が「作成した」元のプールはおそらく回復不可能だそうです。でも、名前の由来はbackup
理由があって付けられたものなので、まあいいでしょう。このプールには、15 年ほど前のバックアップが主に保管されています。ただし、元に戻せたら便利なもの (一時的に移動した不要なデータ) がいくつかあり、そのボリュームにあったバックアップ設定に関係して、再度設定するのに数日かかるものもあります (今では、それらのものを別の場所にバックアップする必要があることがわかっているので、これは学習になります)。
しかし、バックアップのバックアップはあります。数か月前にシステムの別のアップグレード (OS のアップグレードも含む) 中に取り外したドライブの 3 番目のミラーを今日交換しました。そのドライブは実際には故障していませんでしたが、古く、いくつかの不良セクタが蓄積し始めていたため、破損するのを待つよりも、そのときに取り外したほうがよいと考えました。
とにかく、その古いドライブはまだあるので、それをシステムに戻して、そこからプール データを回復できると考えました。失われるのは、過去数か月のバックアップ データだけです。さて、そのドライブのプールを正式にエクスポートしたことは一度もありません。その後 OS をアップグレードしたので、そのドライブが自動的に検出されるとは思っていませんでした。(いくつかのドライブを移動したので、同じ SATA ポートに接続されているかどうかはわかりません。)
しかし、zpool import
コマンドは何も自動的に見つけないようです。いくつかのオプションを試してみると、プールzpool import
の 2 番目のバージョン (現在は破棄されています) が表示されますbackup
が、これは他の 2 つのドライブに誤って作成した空のプールです。
この 3 番目のディスクのデータを読み取る方法についてアドバイスをいただけますか? 私の記憶の限りでは、数か月前にケースから取り出す前は、ZFS プールのミラーとして完全に機能し、最新の状態でした。特に、次の点が挙げられます。
- 破棄されたプールが存在するという事実は、
backup
この古いプールを検出して回復/インポートする機能に潜在的に干渉しているのでしょうか? それを回避する方法はありますか? - サーバーにはまだ古い OS インストールが残っており、古いディスクを使用していたときに実行されていたものと思われます。ZFS プールが検出されるかどうかを確認するために、そこから起動してみましたが、検出されませんでした。(繰り返しますが、ドライブが同じ場所に接続されていない可能性があります。) しかし、その古いプールのメタデータや ID 番号など、このドライブ上の完全なミラーを ZFS に強制的にインポートするために使用できる可能性のあるものを含む、取得できる ZFS ログ ファイルやその他のものはありますか?
- 最初の 2 つのディスク上のプールがコマンドによって破壊されたと仮定しています
create -f
。ただし、最初のプールを直接回復する方法をご存知の方がいらっしゃれば、非常に助かります。 - ZFS が古い 3 番目のミラーを ZFS プール ディスクとして検出しない他の理由はありますか? もしそうなら、他に何か提案はありますか? 試すことができる他の回復ツールはありますか?
ご協力やご提案をいただければ幸いです。
zdb -l /dev/sdb1
編集:これは3番目のドライブからの出力です
------------------------------------
LABEL 0
------------------------------------
version: 5000
name: 'backup'
state: 0
txg: 0
pool_guid: 3936176493905234028
errata: 0
hostid: 8323329
hostname: [omitted]
top_guid: 14695910886267065742
guid: 17986383713788026938
vdev_children: 1
vdev_tree:
type: 'mirror'
id: 0
guid: 14695910886267065742
whole_disk: 0
metaslab_array: 34
metaslab_shift: 33
ashift: 12
asize: 1000197324800
is_log: 0
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 17914838236907067293
path: '/dev/sdd1'
whole_disk: 0
DTL: 143
create_txg: 4
children[1]:
type: 'disk'
id: 1
guid: 17986383713788026938
path: '/dev/sdb1'
whole_disk: 0
DTL: 141
children[2]:
type: 'disk'
id: 2
guid: 1683783279473519399
path: '/dev/sdc1'
whole_disk: 0
DTL: 145
create_txg: 4
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
create_txg: 0
labels = 0 1 2 3
これを正しく解釈していれば、ステータス 0 はプールがそのままであることを意味します。しかし、プールの GUID を使用してインポートしようとしてもzpool import 3936176493905234028
、「インポートできません... 使用可能なプールがありません」というエラーが表示されます。(pool_guid を使用する必要があると思いますが、guid と top_guid も使用してみましたが、何も機能していないようです。)
編集2: このプールがアクティブだった元の OS から zpool.cache ファイルを回復して試したところzpool import -c zpool.cache
、次のようになりました:
pool: backup
id: 3936176493905234028
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:
backup UNAVAIL insufficient replicas
mirror-0 UNAVAIL insufficient replicas
sdd1 FAULTED corrupted data
sdc1 FAULTED corrupted data
これはある程度予想通りです。これらは、作成コマンドによってプールが上書きされた 2 つのディスクです。ただし、sdb1 は潜在的なドライブとしてリストされていません。おそらく、ディスクを取り出した後にプールから削除したためです。それでも、sdb1 には古いミラー データの完全なコピーがあると思いますし、zdb もそれに同意しています。なぜインポートされないのでしょうか。