差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
blog:2017:2017-11-09 [2017-11-09 18:11]
Decomo 作成
blog:2017:2017-11-09 [2019-11-26 00:23] (現在)
Decomo
行 1: 行 1:
-====== ZFSで使ったことがあるHDD/SSDを再利用する時はzpool labelclearすべき ======+====== ZFSのメンバだったディスクを再利用する時はzpool labelclearすべき ======
  
-一度ZFSで使ったことがあるストレージを別のzpoolに使い回す際は、zpool labelclearコマンドで当該デバイスからZFSラベル情報を消した方が良さそうだ。+一度でもZFSで使ったことがあるストレージを別のzpoolに使い回す際は、zpool labelclearコマンドで当該デバイスからZFSラベル情報を消した方が良さそうだ。
  
 再利用デバイスで新しいプールを作ろうとすると、殆どの場合は以下のようなエラーが出て作ることができない。 再利用デバイスで新しいプールを作ろうとすると、殆どの場合は以下のようなエラーが出て作ることができない。
行 12: 行 12:
 「有効なプールzrootの一部かもよ」とZFS先生は仰ってるものの、zrootは間違いなくdestroy済みで、僕は確信を以てda0p3でztankを作りたいのだよ。先生ったらお節介~。destroyしたんだからラベル情報も一緒に消しとけよ!と思わなくもないが、ZFSではdestroyの取り消しをサポートしてたりする関係で、こういう仕様なのだろう。削除済みプールの復元については、zpool importの-Dオプションを調べておくんなまし。 「有効なプールzrootの一部かもよ」とZFS先生は仰ってるものの、zrootは間違いなくdestroy済みで、僕は確信を以てda0p3でztankを作りたいのだよ。先生ったらお節介~。destroyしたんだからラベル情報も一緒に消しとけよ!と思わなくもないが、ZFSではdestroyの取り消しをサポートしてたりする関係で、こういう仕様なのだろう。削除済みプールの復元については、zpool importの-Dオプションを調べておくんなまし。
  
-ところが、条件は不明だが、このお節介が働かず以前のラベル情報を残したまま新プールが作れちゃうことがある。こうなるとマジで大惨事。新しいプールと昔のプールが管理情報の上では存在する事になり、見るからにヤバげな状態となる。その時の再現ログが↓これ。+ところがである、条件は不明だが、このお節介が働かず以前のラベル情報を残したまま新プールが作れちゃうことがある。こうなるとマジで大惨事。新しいプールと昔のプールが管理情報の上では存在する事になり、見るからにヤバげな状態となる。その時の再現ログが↓これ。
  
 <code> <code>
行 39: 行 39:
 </code> </code>
  
-既にnewtankとして実際にデータが書き込まれ、意味消失してるハズの削除済みプールoldtankが認識されていである。+ログ上からは、別々のストレージで構成される2つのプール、newtankとoldtankがあるようにしか見えない。しかし実際のところ、oldtankはnewtank以前にda0p3で使っていたもので、既にdestroy済みのプールなのである。newtankとして実際にデータが書き込まれ、意味消失してるハズの削除済みプールoldtankが認識されていだ…!
  
 こうなると最早手遅れ。oldtankを再度destroyしようにも「そんなプールは存在しない」と言われるし、ならばとデバイス1234567890123456789をどうにかする方向で頑張ってもどうにもならず…。かと言って、<fc #ff0000>この段階でlabelclearは**絶対にしてはいけない**</fc>。newtankもろとも消えてしまうので_:(´ཀ`」∠):_(実体験)。 こうなると最早手遅れ。oldtankを再度destroyしようにも「そんなプールは存在しない」と言われるし、ならばとデバイス1234567890123456789をどうにかする方向で頑張ってもどうにもならず…。かと言って、<fc #ff0000>この段階でlabelclearは**絶対にしてはいけない**</fc>。newtankもろとも消えてしまうので_:(´ཀ`」∠):_(実体験)。
  
 というわけで、ZFSプールを作る時は忘れずにlabelclearで以前の情報を消すようにしたい。 というわけで、ZFSプールを作る時は忘れずにlabelclearで以前の情報を消すようにしたい。
 +
 +----
 +**(2017-11-14 追記)**
 +
 +タイミングよく本症状が発生したのでスクショをうp。
 +{{ :blog:2017:appear_previous_corrupted_zpool.png |}}
 +
 +やった事はと言うと...
 +  - 以前のzroot(赤い方)を削除しlabelclear
 +  - 新しいzroot(緑の方)を作成
 +  - FreeBSD 11.0-RELEASEをインストール
 +  - freebsd-updateで11.1-RELEASEに更新するも、ブート時のTrying to mount root~で失敗して起動しなくなる
 +    * 今にして思えば、この時点で古いプールが認識されて旧zrootの方をマウントしようとしてたのかも…?
 +  - kernel.oldの方から起動してfreebsd-updateで11.0の最新にしようとする
 +  - 見事に失敗して起動しなくなる。起動スプラッシュのシェルでload kernelもload zfsも失敗する状態。
 +  - インストーラメディアから起動してzpool importしたらこの状態
 +
 +確かにlabelclearしたハズなんだけどなぁ…。変なzpool.cacheでも食ってんのかなぁ…?わからん。
 +
 +----
 +**(2017-11-16 追記)**
 +
 +あ、ありのまま起こったことを(ry。
 +
 +症状が出たHDDの各パーティションを再度labelclearしてddでゼロフィルまでしたにもかかわらず、古い方のzrootが認識されやがったぜ……。最終的に''zpool labelclear da0''してようやく認識されなくなった。(が、当然GPTは壊れる。セカンダリテーブルは生きてるからパーティションの認識と復旧は可能だが…。)GPTの領域にZFSラベルが書き込まれそうな使い方─つまりディスク全体をzpoolにするような使い方はした記憶がないんだが、どうしてこうなった……?
 +
 +結論としては、zpoolを作る時は対象デバイスの''/dev/daX''と''/dev/daXpY''を全てlabelclearするのが安全、可能なら全体をゼロフィルするということで。
  • blog/2017/2017-11-09.1510218666.txt.gz
  • 最終更新: 2017-11-09 18:11
  • by Decomo