はじめに
ZFSには保存済みデータに影響なくプールサイズ(パーティションサイズ)を拡張する機能が用意されていて、autoexpandプロパティを設定して拡張できます。これを実際に操作してみます。
ここでは1台のディスク内でプールサイズを20GBから30GBに拡張します。
テスト環境
以下のテストは手元の実験用サーバーで、内蔵120GBのSSDの前半(60GB程)にWindowsがインストールしてあるものを使いました。
ディスクはGPTでパーティション管理を行なっていて、FreeBSDのデータ用に20GB確保しました。パーティションインデックスは 6 です。
$ gpart show ada0
=> 34 250069613 ada0 GPT (119G)
34 2014 - free - (1.0M)
2048 102400 1 ms-basic-data (50M)
104448 121270272 2 ms-basic-data (58G)
121374720 204800 3 efi (100M)
121579520 1300480 4 ms-recovery (635M)
122880000 16777216 5 freebsd-swap (8.0G)
139657216 41943040 6 freebsd-zfs (20G)
181600256 68469391 - free - (33G)
GPTのパーティション名を確認すると次の通りで、work0 と設定してあります。
$ gpart show -l ada0
=> 34 250069613 ada0 GPT (119G)
34 2014 - free - (1.0M)
2048 102400 1 (null) (50M)
104448 121270272 2 (null) (58G)
121374720 204800 3 (null) (100M)
121579520 1300480 4 (null) (635M)
122880000 16777216 5 swap0 (8.0G)
139657216 41943040 6 work0 (20G)
181600256 68469391 - free - (33G)
ZFSプールはすでに作成済で、zpool list -v zworkを見ると次の通りgpt/work0を使った20GBのプールがあることがわかります。
$ zpool list -v zwork
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zwork 19.5G 1.24G 18.3G - - 0% 6% 1.00x ONLINE -
gpt/work0 19.5G 1.24G 18.3G - - 0% 6.33% - ONLINE
このZFSプールを30GBに変更します。
パーティションの拡張
まずディスクパーティションのサイズ変更を行います。gpart resize
を使ってパーティションサイズを20GBから30GBに拡張します。
$ gpart resize -i 6 -s 30g ada0
ada0p6 resized
$ gpart show ada0
=> 34 250069613 ada0 GPT (119G)
34 2014 - free - (1.0M)
2048 102400 1 ms-basic-data (50M)
104448 121270272 2 ms-basic-data (58G)
121374720 204800 3 efi (100M)
121579520 1300480 4 ms-recovery (635M)
122880000 16777216 5 freebsd-swap (8.0G)
139657216 62914560 6 freebsd-zfs (30G)
202571776 47497871 - free - (23G)
この通りパーティションは拡張できました。次にZFSプールの操作になりますが、今の段階ではまだ20GBのままです。
$ zpool list -v zwork
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zwork 19.5G 1.24G 18.3G - - 0% 6% 1.00x ONLINE -
gpt/work0 19.5G 1.24G 18.3G - - 0% 6.33% - ONLINE
autoexpandプロパティをonに設定しても、それだけではプールサイズは変わりません。
$ zpool set autoexpand=on zwork
$ zpool list -v zwork
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zwork 19.5G 1.24G 18.3G - - 0% 6% 1.00x ONLINE -
gpt/work0 19.5G 1.24G 18.3G - - 0% 6.33% - ONLINE
実際に拡張するためには、zpool online -e
を使用します。
$ zpool online -e zwork gpt/work0
$ zpool list -v zwork
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zwork 29.5G 1.24G 28.3G - - 0% 4% 1.00x ONLINE -
gpt/work0 29.5G 1.24G 28.3G - - 0% 4.18% - ONLINE
このとおり zwork は、30GBになりました。
autoexpandプロパティによる自動でのプールサイズの拡張
ここでは実験としてautoexpandプロパティを設定して1台のディスクの中でパーティションサイズの変更を行ったわけですが、実際の使用例としては、すでに使用しているミラーやRAID構成のZFSの容量のディスク交換による容量の拡張でしょう。
たとえば2TBのディスクを2台ミラー構成で使っていて残容量が少なくなって4TBのディスクに交換する場合、次の手順で既存のデータを活かしたままプールサイズの拡張ができます。
- プールのautoexpandプロパティをonに設定する
- ミラー構成の片方を4TBのものと交換する1
- ミラーの同期を待つ。なお同期が完了してもこの時点では片側が2TBであるためプールの容量は変わりません。もちろん同期を待つ間もデータの読み書きはできます。
- 残りの2TBのものを4TBに交換する。
- ミラーの同期が完了すると、4TBのプールに自動的に拡張される
RAID-Zの構成であっても、同様に1台づつディスクを交換することで、全体の容量を増やすことができます。
まとめ
以上の通りで、ZFSではストレージ容量の拡張も比較的簡単に操作できるようになっています。ディスクのホットスワップをサポートしているハードウェアであれば、サーバーは無停止でディスクの拡張ができます。
Linuxの場合
ここではFreeBSDで説明しましたが、LinuxでもUbuntuでは標準でZFSをサポートしていますし、ZFS on Linuxを利用すると他のLinuxディストリビューションでもZFSが利用できます。
Linuxの場合での操作方法ですが、本記事と内容は変わりません。ディスクのパーティション操作についてはFreeBSDとLinuxによる差異がありますが、ZFS部分の機能と操作はまったく同じものとなります。
-
「ZFSのRAIDZの修復とついでに拡張する」が参考になるでしょう。以前はこの脚注に「ミラーの場合は一旦zpool detachで1台を外し、attachを使って新たなディスクを追加します。壊れた場合やRAID-Zでは(offlineと)replaceを使うことになります。」という文章が記載してありましたがこれは行わず交換してreplaceを行う方が望ましいです。 ↩