GPTヘッダのクリア

FreeBSDのバージョンを8.3にするタイミングで、gstripeで使用していたディスクをZFSで使用するようにしました。 ディスクの初期化を怠ったら、ZFS移行後にgeomからのエラーが出力されるようになってしまいました。

GEOM: ada1: the primary GPT table is corrupt or invalid.
GEOM: ada1: using the secondary instead -- recovery strongly advised.
GEOM: ada2: the primary GPT table is corrupt or invalid.
GEOM: ada2: using the secondary instead -- recovery strongly advised.
GEOM_STRIPE: Device gsswap created (id=1066737235).
GEOM_STRIPE: Disk ada1p1 attached to gsswap.
GEOM_STRIPE: Device gsdblog created (id=1610477017).
GEOM_STRIPE: Disk ada1p2 attached to gsdblog.
GEOM_STRIPE: Disk ada2p1 attached to gsswap.
GEOM_STRIPE: Device gsswap activated.
GEOM_STRIPE: Disk ada2p2 attached to gsdblog.
GEOM_STRIPE: Device gsdblog activated.
GEOM_STRIPE: Cannot add disk gptid/e39d0db3-ce0e-11e0-8ce8-001fd0c05e6b to gsswap (error=17).
GEOM_STRIPE: Cannot add disk gptid/e5df9c90-ce0e-11e0-8ce8-001fd0c05e6b to gsdblog (error=17).
GEOM_STRIPE: Cannot add disk gptid/35867e75-ce0e-11e0-8ce8-001fd0c05e6b to gsswap (error=17).
GEOM_STRIPE: Cannot add disk gptid/38becac6-ce0e-11e0-8ce8-001fd0c05e6b to gsdblog (error=17).
GEOM_STRIPE: Disk ada1p2 removed from gsdblog.
GEOM_STRIPE: Device gsdblog removed.
GEOM_STRIPE: Disk ada1p1 removed from gsswap.
GEOM_STRIPE: Device gsswap removed.
GEOM_STRIPE: Disk ada2p2 removed from gsdblog.
GEOM_STRIPE: Device gsdblog destroyed.
GEOM_STRIPE: Disk ada2p1 removed from gsswap.
GEOM_STRIPE: Device gsswap destroyed.

上がdmesgの該当部分の抜粋です。

どうやら、geomのメタデータとGPTの情報が両方とも生き残っているようです。 ちなみにZFSでは次のように、ディスク全体を使用しています。

# zpool status zusr
 pool: zusr
 state: ONLINE
 scan: none requested
config:

 NAME STATE READ WRITE CKSUM
 zusr ONLINE 0 0 0
 mirror-0 ONLINE 0 0 0
 ada1 ONLINE 0 0 0
 ada2 ONLINE 0 0 0

errors: No known data errors

gstripeコマンドでgeomのメタデータを消してみました。 が、以下のようにあえなく失敗。 zpoolをexportした状態ではメッセージが変化するものの、エラーで失敗のままです。

# gstripe clear -v ada1
Can't clear metadata on ada1: Operation not permitted.
gstripe: Not fully done.
# zpool export zusr
# gstripe clear -v ada1
Can't clear metadata on ada1: Invalid argument.
gstripe: Not fully done.

geomのメタデータはパーティションごとに書かれるようなので、 パーティション自体を削除する方針に変えました。 ただ、gpart destroyもエラーを出すだけなので、ディスクの管理情報を直接削除します。

GPTではMBRの次のセクター(LBA1)にパーティションの情報を格納しているので、そこをゼロフィルしました。 すでにZFSで使用中のディスクなので、この方法はすこし乱暴ですが、zpool create後でも、GPTの情報が残ってしまっているということは、 LBA1は(まだ)ZFSによって使用されていないということなので、大丈夫でしょう。

# dd if=/dev/zero of=/dev/ada1 bs=512 count=1 skip=1
# dd if=/dev/zero of=/dev/ada2 bs=512 count=1 skip=1

上のようにコマンドを実行して、LBA1から1セクタ分をゼロで埋めます。 引数のskip=1が「LBA1から」、count=1が「1セクタ分」、また、bs=512が 1セクタのサイズ(512バイト)を表しています。

実行後に再起動すると、geomからのエラーは出力されなくなりました。

念のため、zpool scrubコマンドでZFSの情報が壊れていないことを確認します。 scrubが完了した後、ステータスを表示すると以下のようになりました。

# zpool status zusr
 pool: zusr
 state: ONLINE
 scan: scrub repaired 0 in 0h2m with 0 errors on Mon May 21 21:30:11 2012
config:

 NAME STATE READ WRITE CKSUM
 zusr ONLINE 0 0 0
 mirror-0 ONLINE 0 0 0
 ada1 ONLINE 0 0 0
 ada2 ONLINE 0 0 0

errors: No known data errors

問題ありませんでした。

[おわり]