2016年7月18日月曜日

ZFSミラーのアップグレード


毎回毎回GPD WINのネタばかりでもあれなんで、たまには自作の話でも。

OpenZFS on OS Xを導入しているosx86機でHDDを交換する話を備忘録がてら記録しておこうと思います。


あらまし


元々3TB x2のミラープールを構成していたのですが、残300GB程度とヤバい感じになってきたので4TB x2に増設することに。

今回の使用HDDはWD Blue EZRZ。要するに旧WD Greenです。正直なところ、低速病でゴミになったHDDが大量に出たりとWD Greenには良い思い出がなく、最近はSeagateとHGSTしか買ってなかったんですが、色々あって自分で選べなかったためWDになりました。


準備


まずはscrubかけて破損データを(あったら)綺麗にします。
# zpool scrub r1pool
# zpool status
  pool: r1pool
 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(5) for details.
  scan: scrub repaired 0 in 14h0m with 0 errors on Mon Jul 11 00:45:12 2016
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-290F1E0F-DB69-45F9-B529-07CAB716236B  ONLINE       0     0     0
        media-D64856C8-D347-4F5E-8177-9EA3DE626836  ONLINE       0     0     0

errors: No known data errors
14時間かかりましたがノーエラーでした。zpoolが古いとか言われていますが気にしない。

次にOpenZFS on OS Xを最新版(執筆時1.5.2)にアップデートしておきます。


交換


通常だと、
  1. ミラープールをsplitして単騎x2に変更
  2. HDDを片方取り外し、新HDDに換装
  3. 残った単騎に新HDDをattach
  4. resilver完了したら残った単騎をdetach
  5. 残ったHDDを取り外し、2つ目の新HDDに換装
  6. 2つ目の新HDDをattach
といった感じの手順で換装するのですが、自室=寝室で寝ている間は電源を落としていたい都合上丸2日かかって辛いので、今回は別のアプローチにします。

今回の対象PCは通常の自作デスクトップPC(Z97M GAMING)でSSD1台とHDD2台の3ポートしか使っておらず、SATAポートに余裕があるので一時的にHDDを増設する形でresilverを行うことにしました。
つまり、
  1. 新HDDを2台一気に接続
  2. 新HDDをミラープールに2台連続でattach
  3. resilver完了で4方向ミラーが完成
  4. 旧HDDを2台連続でdetachして2方向ミラーに戻す
という手順です。

というわけで作業開始です。新HDDを接続した状態のdiskutilは
$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *512.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh SSD           250.0 GB   disk0s2
   3:         Microsoft Reserved                         134.2 MB   disk0s3
   4:       Microsoft Basic Data Windows 8.1             255.7 GB   disk0s4
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *3.0 TB     disk1
   1:                        ZFS                         3.0 TB     disk1s1
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *3.0 TB     disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                        ZFS                         3.0 TB     disk2s2
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                                                   *4.0 TB     disk3
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                                                   *4.0 TB     disk4
/dev/disk5
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *536.9 GB   disk5
   1:                        EFI EFI                     209.7 MB   disk5s1
   2:                  Apple_HFS TimeMachine             536.5 GB   disk5s2
のようになっています。旧HDDによるZFSプールがdisk1/2、新HDDがdisk3/4です。disk1/2でパーティションテーブルが異なっているのはご愛敬。diks0はSSD、disk5はTimeMachine用にZFSプールから切り出したzvolなので実ディスクではありません。

早速disk3をattach。ちなみに私はズボラなので新しく買ってきたHDDのゼロフィルとかはやりません。どうせリビルド時点で3TB近く埋めることになるし、あとはZFSがなんとかしてくれるだろの精神(盲信)。
# zpool attach r1pool media-D64856C8-D347-4F5E-8177-9EA3DE626836 /dev/disk3
# zpool status
  pool: r1pool
 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 17 13:20:40 2016
    17.8M scanned out of 2.36T at 1.62M/s, 424h41m to go
    17.8M resilvered, 0.00% done
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-290F1E0F-DB69-45F9-B529-07CAB716236B  ONLINE       0     0     0
        media-D64856C8-D347-4F5E-8177-9EA3DE626836  ONLINE       0     0     0
        disk3                                       ONLINE       0     0     0  (resilvering)

errors: No known data errors
resilverが始まりました。
このままdisk3のresilver完了を待たずdisk4を投入します。
# zpool attach r1pool /dev/disk3 /dev/disk4
# zpool status
  pool: r1pool
 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 17 13:21:34 2016
    18.3M scanned out of 2.36T at 1.53M/s, 450h33m to go
    36.3M resilvered, 0.00% done
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-290F1E0F-DB69-45F9-B529-07CAB716236B  ONLINE       0     0     0
        media-D64856C8-D347-4F5E-8177-9EA3DE626836  ONLINE       0     0     0
        disk3                                       ONLINE       0     0     0  (resilvering)
        disk4                                       ONLINE       0     0     0  (resilvering)

errors: No known data errors
特に問題なくresilverが始まりました。
数分待ってから状況を確認してみると、
# zpool status
  pool: r1pool
 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 17 13:21:34 2016
    45.7M scanned out of 2.36T at 699K/s, (scan is slow, no estimated time)
    91.0M resilvered, 0.00% done
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-290F1E0F-DB69-45F9-B529-07CAB716236B  ONLINE       0     0     0
        media-D64856C8-D347-4F5E-8177-9EA3DE626836  ONLINE       0     0     0
        disk3                                       ONLINE       0     0     0  (resilvering)
        disk4                                       ONLINE       0     0     0  (resilvering)

errors: No known data errors
699K/s!?1ヶ月経っても終わらんぞ!?と焦りましたが、昼ご飯を食べて戻ってきたら
# zpool status
  pool: r1pool
 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 17 13:21:34 2016
    224G scanned out of 2.36T at 63.2M/s, 9h51m to go
    449G resilvered, 9.29% done
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-290F1E0F-DB69-45F9-B529-07CAB716236B  ONLINE       0     0     0
        media-D64856C8-D347-4F5E-8177-9EA3DE626836  ONLINE       0     0     0
        disk3                                       ONLINE       0     0     0  (resilvering)
        disk4                                       ONLINE       0     0     0  (resilvering)

errors: No known data errors
まともな速度になっていました。
この時点でのdiskutilはこんな感じです。
$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *512.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh SSD           250.0 GB   disk0s2
   3:         Microsoft Reserved                         134.2 MB   disk0s3
   4:       Microsoft Basic Data Windows 8.1             255.7 GB   disk0s4
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *3.0 TB     disk1
   1:                        ZFS                         3.0 TB     disk1s1
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *3.0 TB     disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                        ZFS                         3.0 TB     disk2s2
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *4.0 TB     disk3
   1:                        ZFS                         4.0 TB     disk3s1
   2: 6A945A3B-1DD2-11B2-99A6-080020736631               8.4 MB     disk3s9
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *4.0 TB     disk4
   1:                        ZFS                         4.0 TB     disk4s1
   2: 6A945A3B-1DD2-11B2-99A6-080020736631               8.4 MB     disk4s9
/dev/disk5
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *536.9 GB   disk5
   1:                        EFI EFI                     209.7 MB   disk5s1
   2:                  Apple_HFS TimeMachine             536.5 GB   disk5s2
ざっと13時間ほど待つと、resilverが完了します。
# zpool status
  pool: r1pool
 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(5) for details.
  scan: resilvered 4.72T in 12h51m with 0 errors on Mon Jul 18 02:12:44 2016
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-290F1E0F-DB69-45F9-B529-07CAB716236B  ONLINE       0     0     0
        media-D64856C8-D347-4F5E-8177-9EA3DE626836  ONLINE       0     0     0
        disk3                                       ONLINE       0     0     0
        disk4                                       ONLINE       0     0     0

errors: No known data errors
そして旧HDDをdetach。
# zpool detach r1pool media-290F1E0F-DB69-45F9-B529-07CAB716236B
# zpool detach r1pool media-D64856C8-D347-4F5E-8177-9EA3DE626836
# zpool status
  pool: r1pool
 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(5) for details.
  scan: resilvered 4.72T in 12h51m with 0 errors on Mon Jul 18 02:12:44 2016
config:

    NAME        STATE     READ WRITE CKSUM
    r1pool      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        disk3   ONLINE       0     0     0
        disk4   ONLINE       0     0     0

errors: No known data errors
ここで一旦シャットダウンし、旧HDDを取り外します。
再起動すると、UUIDで自動importしてくれます。
# zpool status
  pool: r1pool
 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(5) for details.
  scan: resilvered 4.72T in 12h51m with 0 errors on Mon Jul 18 02:12:44 2016
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-B624951E-2A6F-D140-A14B-9872B000E17F  ONLINE       0     0     0
        media-6AFBF18C-319A-E04A-BB37-FEBF9BB7C85B  ONLINE       0     0     0

errors: No known data errors
交換作業はこれで無事完了です。


拡張


さて、このプールはautoexpandをonにしていないのでこのままでは容量が拡張されません。
# zpool get autoexpand r1pool
NAME    PROPERTY    VALUE   SOURCE
r1pool  autoexpand  off     default

# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
r1pool  2.73T  2.36T   378G      932G      -    86%  1.00x  ONLINE  -
EXPANDSZで932G拡張可能なのがわかります。って以前交換したときはこんなの出てたっけ・・・
online -eで手動expandします。
# zpool online -e r1pool media-B624951E-2A6F-D140-A14B-9872B000E17F
cannot expand media-B624951E-2A6F-D140-A14B-9872B000E17F: cannot relabel '/private/var/run/disk/by-id/media-B624951E-2A6F-D140-A14B-9872B000E17F': unable to read disk capacity
できない!マジか。
# ls -l /private/var/run/disk/by-id/media-B624951E-2A6F-D140-A14B-9872B000E17F
lrwxr-xr-x  1 root  daemon  12  7 18 02:39 /private/var/run/disk/by-id/media-B624951E-2A6F-D140-A14B-9872B000E17F -> /dev/disk1s1
ちゃんと?実パーティションを指してるんだけど何がマズいんですかね?
実ディスクを指定して再importしてみます。ちなみにexportは2回叩かないと失敗する。
# zpool export r1pool
# zpool export r1pool
# zpool status
no pools available

# zpool import -d /dev r1pool
# zpool status
  pool: r1pool
 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(5) for details.
  scan: resilvered 4.72T in 12h51m with 0 errors on Mon Jul 18 02:12:44 2016
config:

    NAME        STATE     READ WRITE CKSUM
    r1pool      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        disk1   ONLINE       0     0     0
        disk2   ONLINE       0     0     0

errors: No known data errors
この状態でonline -eをかけると(一台だけで大丈夫)、
# zpool online -e r1pool /dev/disk1
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
r1pool  3.64T  2.36T  1.28T         -      -    64%  1.00x  ONLINE  -

見事拡張に成功した。ディスク(disk1)じゃなくパーティション(disk1s1)を指してたのが良くなかったのかな・・・?
もう1回importしなおし。
# zpool export r1pool
# zpool export r1pool
# zpool import r1pool
# zpool status
  pool: r1pool
 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(5) for details.
  scan: resilvered 4.72T in 12h51m with 0 errors on Mon Jul 18 02:12:44 2016
config:

    NAME                                            STATE     READ WRITE CKSUM
    r1pool                                          ONLINE       0     0     0
      mirror-0                                      ONLINE       0     0     0
        media-B624951E-2A6F-D140-A14B-9872B000E17F  ONLINE       0     0     0
        media-6AFBF18C-319A-E04A-BB37-FEBF9BB7C85B  ONLINE       0     0     0

errors: No known data errors
めでたしめでたし。


まとめ


以上、ZFSミラープールの容量アップ作業ログでした。ログに載っている時間と投稿時間によって「再構築に深夜までかかって昼まで寝てた」ことがバレるのはご愛敬

RAID-Zなどと違って、ミラー構成は2台一気に換装できるので早く終わっていいですね。終わってみればscrubより1時間速かったというのは笑えます。

また、今回初めてLinuxなどを利用せずOpenZFS on OS Xのみで換装作業を行いましたが、expand時に一手間あったものの無事作業完了させることができました。

正直なところHDDを複数台積めるosx86機以外で使い道に乏しいO3Xですが、osx86機では(少なくともApple純正ソフトRAIDより)ド安定・lz4圧縮によりTimeMachineとの相性も抜群なのでかなりオススメできる状態になっているんじゃないかなと思います。APFS?知らん。

0 件のコメント:

コメントを投稿