2009年2月3日火曜日

destroy した zpool を復活させる

Solarisで構築したZFSを他のサーバに移す時は、
「移行元:zpool export」 → 「移行先:zpool import
とやればよい。exportは省略できるので、移行元がいきなり潰れたとしてもまあOK。
 
 

のように便利なimportだけど、マニュアルによると destroy したプールの復活にも使えると。
ということでやってみた。
 
 


ZFSでは ufs上に作成されたフツーのファイルをデバイスとしてプール構築できるので、それで試そう。
$mkdir /zdev
$mkfile 500m /zdev/file01
$zpool create test01 /zdev/file01

これだけで500MBで作成した1つのファイルをデバイス扱いして「test01」というzpool ができる。
確認してみよう。

$zpool status test01
プール: test01
状態: ONLINE
スクラブ: 何も要求されませんでした
構成:

NAME STATE READ WRITE CKSUM
test01 ONLINE 0 0 0
/zdev/file01 ONLINE 0 0 0

エラー: 既知のデータエラーはありません


$zfs list test01
NAME USED AVAIL REFER MOUNTPOINT
test01 120K 460M 18K /test011


OK。
 

早速だがプールを壊す。
zpoolの操作は何も出力されないので、いつも不安なんだが。。。

$zpool destroy test01
$zpool status test01
cannot open 'test01': no such pool

 
デストロイ完了!「test01」プールは葬られた。
 
 


それではimportして行こう。
"zpool import" とすると接続されているデバイスから使えそうなzpoolを見繕ってくれる。
 
これは"/dev/dsk" を自動で探索してリストアップしてくれるんだけど、今回はデバイスの場所が違うので "-d" オプション で探索場所を指定して実行。


$zpool import -d /zdev
インポートできるプールがありません


普通にやるとこうなる。移行元で export したものはここでリストアップされるが、destroy だとしてくれない。
 
destroy済みも表示するには "-D"オプション、ラージでー だ。

$zpool import -Dd /zdev
プール: test01
ID: *******************
状態: ONLINE (DESTROYED)
アクション: プールの名前または数値識別子を使用してプールをインポートできます。
構成:

test01 ONLINE
/zdev/file01 ONLINE


DESTROYEDなプールが表示された、後は"-f"オプションをつけ、インポートするzpoolを指定するだけだ。
 

$zpool import -fDd /zdev test01


相変わらず何も出力してくれないが、うまくマウントできているはず。。
 
 


$zpool status test01
プール: test01
状態: ONLINE
スクラブ: 何も要求されませんでした
構成:

NAME STATE READ WRITE CKSUM
test01 ONLINE 0 0 0
/zdev/file01 ONLINE 0 0 0

エラー: 既知のデータエラーはありません

$zfs list test01
NAME USED AVAIL REFER MOUNTPOINT
test01 120K 460M 18K /test01



見事復活。ちなみに名前を指定してインポートも可能(引数をもう一個追加する)なので、プールの名前がかぶっていても大丈夫だ。
 
 


ファイルで作る zpool は練習用に色々使えていいですね、mkfileの使いやすさとあいまって良好な感じ。