====== FreeBSDのZFSでミラープールにUSB接続のHDDを追加する ======
FreeBSD 12.0-RELEASEのZFSのミラープールにUSB接続のHDDをアタッチしてみた。USB接続だろうと何だろうと、いつもの手順でzpool attachすれば行けるはずだけど、実のところ今までやったことが無かった。/usr/homeを置いてるHDDが手狭になってきたため、交換ついでに試してみた記録。
まずは対象のミラープール(zhome)の確認。
$ zpool status zhome
pool: zhome
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: resilvered 0 in 0 days 00:12:00 with 0 errors on Thu Nov 22 00:25:49 2018
config:
NAME STATE READ WRITE CKSUM
zhome ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada7p1 ONLINE 0 0 0
ada8p1 ONLINE 0 0 0
logs
mirror-1 ONLINE 0 0 0
ada5p4 ONLINE 0 0 0
ada6p4 ONLINE 0 0 0
cache
ada5p8 ONLINE 0 0 0
ada7p1とada8p1でミラー構成になっていることが分かる。
お次にcamcontrolで対象のHDDを確認。
# camcontrol devlist
at scbus9 target 0 lun 0 (ada7,pass8)
at scbus13 target 0 lun 0 (pass11,da0)
at scbus14 target 0 lun 0 (pass12,da1)
必要なHDDのみ抜粋したため番号が飛んでいるが、ada7がプールを構成する2.5インチHDDの1つで、da0/da1がプールに追加するUSB接続の8TB HDDである。
da0/da1にパーティションを作る。自分はディスク全体ではなくパーティションでZFSを構成する派なのである。
8TBのHDDを用意したので、gpartでてきとーにda0のパーティションを切り、da1にそのままコピーする。
# gpart create -s gpt da0
# gpart add > gpart add -a 4k -t freebsd-zfs -s 15620000000 da0
da0p1 added
$ gpart show da0
=> 40 15627986864 da0 GPT (7.3T)
40 15620000000 1 freebsd-zfs (7.3T)
15620000040 7986864 - free - (3.8G)
# gpart backup da0 | gpart restore da1
$ gpart show da1
=> 40 15627986864 da1 GPT (7.3T)
40 15620000000 1 freebsd-zfs (7.3T)
15620000040 7986864 - free - (3.8G)
そして、いつも通りzpool attachする。コマンドが返ってくるまで結構時間が掛かって不安になるけど、強い心で待つ。
# zpool attach zhome ada7p1 da0p1
# zpool attach zhome ada7p1 da1p1
あとはプールのresilveringが終わるのを待つだけ、何だけれども、今回初めての現象に遭遇した。
デバイスをアタッチ後、zpool iostatで読み書きの状況を見ていたら、どういうわけか2MB/s程度の速度しか出ていない。
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
zhome 2.26T 474G 637 0 2.49M 0
mirror 2.26T 474G 637 0 2.49M 0
ada7p1 - - 288 0 1.31M 0
ada8p1 - - 273 0 1.19M 0
da0p1 - - 0 0 0 0
da1p1 - - 0 0 0 0
logs - - - - - -
mirror 388K 1.98G 0 0 0 0
ada5p4 - - 0 0 0 0
ada6p4 - - 0 0 0 0
cache - - - - - -
ada5p8 10.6G 139G 0 0 0 0
---------- ----- ----- ----- ----- ----- -----
ミラーの片割れを物理的に取り外し、新しいHDDを取り付けてzpool replaceするいつもの方法、すなわちワザとプールをデグレさせて新しいHDDでミラーを復旧させる良い子のみんなは真似しちゃダメな方法だと直ぐにresilveringが走っていたのだけど…。
暫く観察してたところ、どうやらresilveringの前にプールの全走査?をしているっぽい?
$ zpool status zhome
pool: zhome
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Sun Jul 14 08:38:19 2019
355G scanned at 1.08G/s, 1.25M issued at 3.89K/s, 2.26T total ★←ここ
0 resilvered, 0.00% done, no estimated completion time
config:
NAME STATE READ WRITE CKSUM
zhome ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada7p1 ONLINE 0 0 0
(略)
上記ログを見て分かる通り、1.08G/sという2.5インチHDDにはありえない速さでスキャンが行われており、実際の読み込み速度と合わせて考えると何らかのメタデータを読んでる?
とりあえず「355G scanned at 1.08G/s」の部分がプールの容量に達した後、データの同期が開始されるようだ。一度始まってしまえば順当に100MB/s超の速度が出るのでしばらく待つ。
$ zpool status zhome
pool: zhome
state: ONLINE
scan: resilvered 4.51T in 0 days 07:07:33 with 0 errors on Sun Jul 14 15:45:52 2019
config:
NAME STATE READ WRITE CKSUM
zhome ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada7p1 ONLINE 0 0 0
ada8p1 ONLINE 0 0 0
da0p1 ONLINE 0 0 0
da1p1 ONLINE 0 0 0
logs
mirror-1 ONLINE 0 0 0
ada5p4 ONLINE 0 0 0
ada6p4 ONLINE 0 0 0
cache
ada5p8 ONLINE 0 0 0
errors: No known data errors
終わってみれば94MB/s程度でresilveringが行われた事になるので、いつも通りの速度だったと言える。
というわけで、SATAとUSBのHDDを混在させても問題なくZFSミラー構成が取れるという事が分かった。まぁ、当然ですけど。