FreeNASのデータディスクの増設・サイズ変更(拡張)メモ

環境

  • FreeNAS 11.2 Stable
  • Hyper-V on Windows Server 2019
1
2
2022/03/11 追記
この手順は TrueNAS Scale には適用できません

目的

VM で FreeNAS を動かしているので、できるだけ再起動なしで増設・サイズ変更を認識させる。

本項では、以下の 3 パターンについて扱う

  • ディスク増設
  • ディスク容量変更(パーティションあり時。Web UI で作った場合はこちら)
  • ディスク容量変更(ディスク全体を使用時。zfs プールをコマンドラインで作成した場合)

ディスク増設

Web 画面の shell から、以下のコマンドを叩くだけ。

これで disk 一覧に追加したディスクが表示される。

なお、ZFS プールを作るのであればディスク全体を使用した方が後々楽です。(蛇足 1 参照)

1
camcontrol rescan all

ディスク容量変更(パーティションありの場合)

FreeNAS の Web UI から作ったプールの場合はこの手順です。

zpool コマンドを直接叩いて、ディスク全体をプールにした場合は別の手順です。しばらく下まで飛ばして下さい。

ディスク容量の変更を OS に認識させる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# diskinfo -v /dev/da1        # 実行前の容量確認
/dev/da4
512 # sectorsize
55834574848 # mediasize in bytes (52G) # ここ
109051904 # mediasize in sectors
(略)

# camcontrol readcap da4 -h # 容量が変化してるか確認

# camcontrol reprobe da4 # 容量を再認識させる

# diskinfo -v /dev/da4 # 実行後の容量確認


これで、容量が 表示 できる。これで新しい容量が見えるはず。

da4 の部分は、 /dev/da4 の/dev/を省略したもの。

1
camcontrol reprobe da4

zfs パーティションのサイズ変更

必要であれば、zfs pool のサイズを変更します。 というより普通に Web からやっていれば必須です。

1
2
3
4
5
# 容量確認
# zpool list

NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
minio 47.5G 556K 47.5G - - 0% 0% 1.00x ONLINE /mnt

FreeNAS で zfs pool を作ると、パーティションを切って作っているようなので、パーティションサイズを拡張します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# gpart show da4

=> 40 109051824 da4 GPT (52G)
40 88 - free - (44K)
128 4194304 1 freebsd-swap (2.0G)
4194432 100663128 2 freebsd-zfs (48G)
104857560 4194304 - free - (2.0G) # この空き容量が増設分

もし、ここで、 [CORRUPT] の表示があった場合は

# gpart repair da4

# gpart resize -i 2 da4 # -i の 2は、パーティション番号。 gpart show の時の数字です。
da4p2 resized

# gpart show da4
=> 40 109051824 da4 GPT (52G)
40 88 - free - (44K)
128 4194304 1 freebsd-swap (2.0G)
4194432 104857432 2 freebsd-zfs (50G) # 48G -> 50Gになった
# free の部分がなくなった #

ZFS に容量変更を認識させる

先に書いておきますが、ここで容量が変更されても、Web 画面には反映されません。

どうやったら反映されるんでしょう。。実用上は問題ないはずですが、監視系に問題が起きるかもしれません。

追記: TrueNAS 12.0U6 ではWeb画面にも反映されるようになったようです。(手元の環境で確認)

zpool online する

この方法では、マウント解除は発生しません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# zpool status minio
pool: minio
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
minio ONLINE 0 0 0
gptid/db00a183-f2d5-11e9-82df-00155d001e61 ONLINE 0 0 0

該当するディスクのgptid/xxxxxxx の前に、 /dev/ を追加して実行します。
daNpM 形式の場合も同じです。

# zpool online -e minio /dev/gptid/db00a183-f2d5-11e9-82df-00155d001e61

# zpool list minio
Freeが増えたことを確認

ここで容量が増えればそれで完了です。

(ダメな場合のみ) import/export する方法

注意: 一時的に ZFS pool がマウント解除されます。

1
2
3
4
# zpool set autoexpand=on minio
# zpool export minio
(ここでpoolがマウント解除される)
# zpool import minio

(念のため) マウントポイント確認

export/import した場合に限るかわかりませんが、マウントポイントが変更されてしまい共有として指定できなくなりました。

念のために確認します。

1
2
3
4
5
6
7
8
# zfs get mountpoint minio
NAME PROPERTY VALUE SOURCE
minio mountpoint /minio default

【NG】 /mnt/minio でなければWebから共有に指定できない

# zfs set mountpoint=/mnt/minio minio
=> 即時反映される

ディスク容量変更(パーティションなしの場合)

自力で zpool コマンドを叩いて、ディスク全体を使用した場合の手順です。

ディスク容量の変化を認識させる

1
2
3
4
5
6
7
8
9
# zpool list
(元の容量を確認)

# camcontrol rescan all
# zpool online -e <poolname> <devicename>
例) zpool online -e s3 /dev/da5

# zpool list
(容量が変化したことをを確認)

蛇足 1

FreeNAS の GUI から新しいディスクを追加して、pool を作成すると必ず Swap が 2GB ほど取られてしまうので、

十分な Swap or メモリが確保できているのであれば、Shell から自分で zpool コマンドを使って pool を作った方が

無駄がなくて良い。 手動で pool を作る → export →Web UI から import で OK。

ディスク全体を割り当てれば、コマンド 3 つでサイズ変更に対応できるので楽である。(swap 領域、使わないなら無駄になるし)

蛇足 2

調査したけど使わなかったコマンドです。

reopen

1
2
3
4
5
# zpool status minio
# zpool set autoexpand=on minio
# zpool reopen minio

=> 効果なし

GPT パーティションにラベルを付ける

1
2
3
4
5
6
7
8
9
# gpart modify -i 2 -l minio_ssd1 da4
da4p2 modified

# gpart show -l da4 # da4 は省略してもよい。全部表示される

=> 40 109051824 da4 GPT (52G)
40 88 - free - (44K)
128 4194304 1 (null) (2.0G)
4194432 104857432 2 minio_ssd1 (50G) # ラベルがついた

蛇足の蛇足

このエラーが解決できずにハマりました。表示上/dev/ が省略されているので、

コマンドの引数でも省略可能だと思い込んでいた。というオチでした。

1
2
# zpool online -e minio gptid/183-f2d5-11e9-82df-00155d001e61
cannot expand gptid/183-f2d5-11e9-82df-00155d001e61: no such device in pool

捕捉

Proxmox VE 7.0 + TrueNAS 12.0U6 の環境では、VirtIOのディスクを拡張子した際に dmesg に以下の出力がされてリサイズがされたかのように思えるが、これはディスク全体のサイズが変わった。と言ってるだけのようで、パーティションは拡大されていない。

1
2
GEOM_PART: ada1 was automatically resized.
Use `gpart commit ada1` to save changes or `gpart undo ada1` to revert them.