ZFSのプールを使っていると、作ったあとにHDDが壊れたり、容量を増加したくなることがあります。その時に、慌てないように事前に調査と演習をしたのでその備忘録的なものをまとめてみました。
容量の拡張は、ZFSでミラー(RAID0)にやったことがあるのですが、RAIDZは初めてです。
普通のRAIDでだと別のRAIDセットを作りコピーするとかが必要になります。
ZFSだと、無停止で拡張できるのではないかと思いブートボリュームでできないかやってみました。
実行環境はXenServer上でFreeBSD 10.3でやってみました。
#準備
- FreeBSD 10.3を用意する。
- Boot Volume用として8Gバイトのストレージを3個用意する
- FreeBSD 10.3のインストラーで自動でRAIDZでZFSを作る
ブートボリュームzrootが/dev/ada[012]で出来ているはずです。
/dev/ada[012]のパーティション情報は以下のようになります。全部同じです。
# gpart show ada0
=> 34 16777149 ada0 GPT (8.0G)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 12578816 3 freebsd-zfs (6.0G)
16775168 2015 - free - (1.0M)
zrootは以下のようになっています。
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 17.9G 2.47G 15.4G - 6% 13% 1.00x ONLINE -
# zpool status zroot
pool: zroot
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
errors: No known data errors
# zfs list zroot
NAME USED AVAIL REFER MOUNTPOINT
zroot 1.64G 9.89G 128K /zroot
ryu@ryu-03[11:55am][~:22] zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 1.64G 9.89G 128K /zroot
zroot/ROOT 852M 9.89G 128K none
zroot/ROOT/default 851M 9.89G 749M /
zroot/tmp 128K 9.89G 128K /tmp
zroot/usr 828M 9.89G 128K /usr
zroot/usr/home 192K 9.89G 192K /usr/home
zroot/usr/ports 827M 9.89G 827M /usr/ports
zroot/usr/src 128K 9.89G 128K /usr/src
zroot/var 858K 9.89G 128K /var
zroot/var/audit 128K 9.89G 128K /var/audit
zroot/var/crash 128K 9.89G 128K /var/crash
zroot/var/log 218K 9.89G 218K /var/log
zroot/var/mail 128K 9.89G 128K /var/mail
zroot/var/tmp 128K 9.89G 128K /var/tmp
また、この際にzootのプロパティ(autoexpand)をonにしておきます。
# zpool set autoexpand=on zroot
# zpool get autoexpand zroot
NAME PROPERTY VALUE SOURCE
zroot autoexpand on local
#障害を起こしてみる
FreeBSDをシャットダウンし、XenServer側で、ストレージを1つはずします。これで3本で作ったRAIDZが、1本壊れた状態になります。
その後、ブートします。
#障害の確認
zpoolで状況を確認するとDEGRADEDになっています。また、外したストレージは元はada1の/dev/apa1p3であったことがわかります。
# zpool status
pool: zroot
state: DEGRADED
status: One or more devices could not be opened. Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: http://illumos.org/msg/ZFS-8000-2Q
scan: scrub repaired 0 in 0h0m with 0 errors on Fri Sep 30 12:13:25 2016
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
ada0p3 ONLINE 0 0 0
12024642747408500701 UNAVAIL 0 0 0 was /dev/ada1p3
ada2p3 ONLINE 0 0 0
errors: No known data errors
#修復
新しく12Gのストレージを用意し、アタッチし直します。Xen Toolsが入っていればリブートなしで認識します。
xbd2: 12288MB at device/vbd/832 on xenbusb_front0
xbd2: attaching as ada1
xbd2: features: write_barrier
xbd2: synchronize cache commands enabled.
ada1として認識したようです。
##GPIDパーティションを作成
GPIDパーティションとして/dev/ada1p3を作成するのですが、ブートボリュームなのでブートセクター/ブートローダーの辻褄を合わせる必要があります。
GPIDパーティションの設定は、gpartで行います。
# gpart create -s gpt ada1
ada1 created
# gpart add -b 40 -s 512k -t freebsd-boot -l gptboot1 ada1
ada1p1 added
# gpart add -b 2048 -s 2g -t freebsd-swap ada1
ada1p2 added
# gpart add -t freebsd-zfs ada1
ada1p3 added
# gpart show ada1
=> 34 25165757 ada1 GPT (12G)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 20969439 3 freebsd-zfs (10G)
物理的なHDDを考えてるようで、4Kアライメントしていますが、論理的なストレージなので新しく追加するストレージは、アライメントを無視しました。
# gpart create -s gpt ada1
ada1 created
# gpart add -b 34 -s 512k -t freebsd-boot -l gptboot1 ada1
ada1p1 added
# gpart add -s 2g -t freebsd-swap ada1
ada1p2 added
# gpart add -t freebsd-zfs ada1
ada1p3 added
# gpart show ada1
=> 34 25165757 ada1 GPT (12G)
34 1024 1 freebsd-boot (512K)
1058 4194304 2 freebsd-swap (2.0G)
4195362 20970429 3 freebsd-zfs (10G)
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
#ZFSの修復
zpool replace で壊れたストレージを新しいストレージに交換します。
# zpool replace zroot /dev/ada1p3 /dev/ada1p3
Make sure to wait until resilver is done before rebooting.
If you boot from pool 'zroot', you may need to update
boot code on newly attached disk '/dev/ada1p3'.
Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
うまくいったみたいですね。
# zpool status
pool: zroot
state: DEGRADED
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 Fri Sep 30 17:01:55 2016
1.78G scanned out of 2.47G at 39.7M/s, 0h0m to go
596M resilvered, 72.29% done
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
ada0p3 ONLINE 0 0 0
replacing-1 UNAVAIL 0 0 0
12024642747408500701 UNAVAIL 0 0 0 was /dev/ada1p3/old
ada1p3 ONLINE 0 0 0 (resilvering)
ada2p3 ONLINE 0 0 0
errors: No known data errors
RAIDの再構築が始まっています。
注意 この状態が終わるまでストレージを抜いたりしてはいけません。データが壊れます
しばらくすると直りました。
# zpool status
pool: zroot
state: ONLINE
scan: resilvered 828M in 0h1m with 0 errors on Fri Sep 30 17:03:08 2016
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
errors: No known data errors
この状態になれば、2本も順次、12Gのストレージに差し替えて行きます。
今度は、二本同時に接続しました。
xbd4: 12288MB at device/vbd/51776 on xenbusb_front0
xbd4: features: write_barrier
xbd4: synchronize cache commands enabled.
xbd5: 12288MB at device/vbd/51792 on xenbusb_front0
xbd5: features: write_barrier
xbd5: synchronize cache commands enabled.
各々、xbd4/xbd5として認識したようです。
2本目を交換すると
# zpool list -v zroot
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 17.9G 2.47G 15.4G 12.0G 6% 13% 1.00x DEGRADED -
raidz1 17.9G 2.47G 15.4G 12.0G 6% 13%
ada2p3 - - - - - -
replacing - - - - - -
1209515388400427438 - - - - - -
ada1p3 - - - - - -
ada0p3 - - - - - -
とEXPANDSZに増加分の容量が出てきました。
最終的には、以下のようにRAIDZの容量が増えています。
# zpool list -v zroot
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 29.9G 2.47G 27.4G - 3% 8% 1.00x ONLINE -
raidz1 29.9G 2.47G 27.4G - 3% 8%
ada2p3 - - - - - -
ada1p3 - - - - - -
ada0p3 - - - - - -
#まとめ
ZFSを使うと簡単に容量を増やすことができるので、小さめにとっておいて順次拡張も今までに比べて容易になっています。