データを活かしたままZFSプールサイズを拡張する

# はじめに

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のディスクに交換する場合、次の手順で既存のデータを活かしたままプールサイズの拡張ができます。

1. プールのautoexpandプロパティをonに設定する
1. ミラー構成の片方を4TBのものと交換する[^star]
1. ミラーの同期を待つ。なお同期が完了してもこの時点では片側が2TBであるためプールの容量は変わりません。もちろん同期を待つ間もデータの読み書きはできます。
1. 残りの2TBのものを4TBに交換する。
1. ミラーの同期が完了すると、4TBのプールに自動的に拡張される

[^star]: 「[ZFSのRAIDZの修復とついでに拡張する](https://qiita.com/ryuinada/items/36535a0e7f1846d89fb6 "ZFSのRAIDZの修復とついでに拡張する")」が参考になるでしょう。以前はこの脚注に「ミラーの場合は一旦zpool detachで1台を外し、attachを使って新たなディスクを追加します。壊れた場合やRAID-Zでは(offlineと)replaceを使うことになります。」という文章が記載してありましたがこれは行わず交換してreplaceを行う方が望ましいです。

RAID-Zの構成であっても、同様に1台づつディスクを交換することで、全体の容量を増やすことができます。

# まとめ

以上の通りで、ZFSではストレージ容量の拡張も比較的簡単に操作できるようになっています。ディスクのホットスワップをサポートしているハードウェアであれば、サーバーは無停止でディスクの拡張ができます。

# Linuxの場合

ここではFreeBSDで説明しましたが、LinuxでもUbuntuでは標準でZFSをサポートしていますし、ZFS on Linuxを利用すると他のLinuxディストリビューションでもZFSが利用できます。

Linuxの場合での操作方法ですが、本記事と内容は変わりません。ディスクのパーティション操作についてはFreeBSDとLinuxによる差異がありますが、ZFS部分の機能と操作はまったく同じものとなります。