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
<TOSHIBA MQ03ABB300 JP050U>        at scbus9 target 0 lun 0 (ada7,pass8)
<WD Elements 25A3 1021>            at scbus13 target 0 lun 0 (pass11,da0)
<WD Elements 25A3 1021>            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ミラー構成が取れるという事が分かった。まぁ、当然ですけど。