ZFSのデータプールの引越し

FreeBSD,NAS,パソコン・インターネット

システムプールの移行は結構面倒でした。

FreeBSDのRoot on ZFSシステムの別ディスクへの移行

AFTなのにブロックサイズが512B

データプールも移行します。なぜなら、AFTディスク(4096 navite)を使っているのに、元から使っていた512BのHDDに引きづられて、残念な状態になっています。

# zpool status upool
  pool: upool
 state: ONLINE
status: One or more devices are configured to use a non-native block size.
	Expect reduced performance.
action: Replace affected devices with devices that support the
	configured block size, or migrate data to a properly configured
	pool.
  scan: resilvered 959G in 8h55m with 0 errors on Fri Apr 28 14:30:46 2017
config:

	NAME           STATE     READ WRITE CKSUM
	upool          ONLINE       0     0     0
	  mirror-0     ONLINE       0     0     0
	    gpt/disk4  ONLINE       0     0     0  block size: 512B configured, 4096B native
	    gpt/disk6  ONLINE       0     0     0  block size: 512B configured, 4096B native
	  mirror-1     ONLINE       0     0     0
	    gpt/disk3  ONLINE       0     0     0
	    gpt/disk5  ONLINE       0     0     0  block size: 512B configured, 4096B native
	logs
	  gpt/zil      ONLINE       0     0     0

errors: No known data errors

検索すると、この問題を解決するには、プールを作り直すしかないみたいです。そのため、データプールをバックアップして、新しく作り直した仮のプール(vpool)にリストアしました。

仮のデータプールの作成

USB接続の外付け3TBのHDDを仮のデータプールとします。デバイスは、/dev/da1です。

まずは、GPTで初期化します。

# gpart destroy -F da1
# gpart create -s gpt da1
# gpart add -a 4k -t freebsd-zfs -l vdata da1

他のデータが入っていたので、初期化する時にFオプションを使っています。気をつけなければならないのが、ZPOOLとして使っていたディスクを再利用する時です。この場合は、そのプールをzpool destroyしてから使ってください。そうしないと、zpoolではimportもdestroyもできないゾンビなプールになってしまいます。この場合、ddで全領域に0を書き込まないとゾンビプールの退治ができないそうです。

次に、仮のデータプールを作ります。

# zpool create -m none vpool gpt/vdata

GW3.5AA-SUP3

別ディスクにバックアップ

まずは、データプールのバックアップです。スナップショットを作り、zfs send/recvで、簡単にバックアップできます。さすがZFSです。2.66TBのデータを約9時間半でバックアップ出来ました。転送レートは88MB/sだったことになります。

# zfs snapshot -r upool@20170513
# zfs send -Rp upool@20170513 | zfs recv -nuvdF vpool
# zfs send -Rp upool@20170513 | zfs recv -uvdF vpool

zfs sendのRオプションは階層を示します。pオプションはプロパティも転送することを示します。

recvのuオプションはマウントしないことを示します。通常はuオプションをつけて、マウントしないようにするのが安全です。Fオプションは階層に対応するためで、dオプションは階層ディレクトリを作ります。vオプションはverboseオプションです。表示されるメッセージが増えます。

最初、nオプションをつけて、"dry run"(コピーせずに、振る舞いだけ見る)でどのように展開されるかを確認します。

vpoolに使ったHDDは、外付けのUSB3.0接続のケースに入れています。

玄人志向のGW3.5AA-SUP3はUASPに対応している模様
[amazonjs asin="B0053VPYHK" locale="JP"]

データプール再作成

次に、データプールを作り直しました。既存のupoolを一旦破棄してからの、再設定になります。upoolを破棄する前に、事故防止の為、vpoolが入っている外付けのHDDを論理的・物理的に外しました。

まずは、vpoolを論理的に取り外します。

# zpool export vpool

この後、USBケーブルを抜き、物理的に取り外します。その後、バックアップ済みの既存プール(upool)を破棄します。ここでしっかり破棄しておかないと、実態がないのにプール情報だけが残った、ゾンビのプールになってしまいます。このゾンビプールを破棄するためには、HDDの全領域にddで0を書き込む必要があるみたいです。

# zppol destory upool

次に、upoolに使っていた全ディスクを初期化します。ディスクは、/dev/ada1, /dev/ada2, /dev/ada3, /dev/ada4につながっているものとします。gptのラベルは、disk4, disk5, disk6, disk7と設定しました。

# gpart destroy -F ada1
# gpart create -s gpt ada1
# gpart add -a 4k -t freebsd-zfs -l disk4 ada1
# gpart destroy -F ada2
# gpart create -s gpt ada2
# gpart add -a 4k -t freebsd-zfs -l disk5 ada2
# gpart destroy -F ada3
# gpart create -s gpt ada3
# gpart add -a 4k -t freebsd-zfs -l disk6 ada3
# gpart destroy -F ada4
# gpart create -s gpt ada4
# gpart add -a 4k -t freebsd-zfs -l disk7 ada4

データプールを作り直します。

# zpool create upool mirror gpt/disk4 gpt/disk5 mirror gpt/disk6 gpt/disk7
# zpool status upool
  pool: upool
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
        still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
        the pool may no longer be accessible by software that does not support
        the features. See zpool-features(7) for details.
  scan: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        upool          ONLINE       0     0     0
          mirror-0     ONLINE       0     0     0
            gpt/disk4  ONLINE       0     0     0
            gpt/disk5  ONLINE       0     0     0
          mirror-1     ONLINE       0     0     0
            gpt/disk6  ONLINE       0     0     0
            gpt/disk7  ONLINE       0     0     0

errors: No known data errors

綺麗なデータプールになりました。

[amazonjs asin="B00WWCDFO2" locale="JP"]

データリストア

この後、外付けHDDを接続してリストアしました。同じく、zfs send/recvを使います。オプションは先ほど説明した物と同じです。

# zpool import -R /mnt vpool
# zfs send -Rp vpool@20170513 | zfs recv -nuvdF upool
# zfs send -Rp vpool@20170513 | zfs recv -uvdF upool

2.66TBのデータを転送するのに約6時間半かかりました。転送速度は125MB/sです。

リストアが修了したら、再びバックアップしたプール(vpool)を、論理的・物理的に取り外します。

# zpool export vpool

論理的に外した後、USBケーブルを抜いて、物理的に取り外します。

きちんとできているかどうか、再起動してご確認ください。

Posted by お市のかた