====== 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ミラー構成が取れるという事が分かった。まぁ、当然ですけど。