ZFS で作成した ZVOL のサイズが足りなくなり拡張するという作業を数年に一度行っているが、毎回やり方をググっているのでメモを兼ねて書く。ZVOL を拡張しても、内部のパーティション(ext4 を想定)も拡張しないと、実際に使用可能な容量は増えないのでこちらも拡張する。

なお、ここでは内部にパーティションが1つしか無いことを想定している。複数ある場合、末尾のパーティションは簡単に拡張できる (partedで指定するパーティション番号を変更するだけ)が、それ以外は大変なはず.....。

(作業前にスナップショットを取っておくと安心)

$ sudo zfs snapshot pool0/vol0@before_expand

作業前にアンマウントすること!

$ sudo umount /mnt/path/of/where/volume/is/mounted

まず ZVOL を拡張する。

$ sudo zfs set volsize=1200G pool0/vol0
$ sudo zfs get volsize pool0/vol0 # 増えたことを確認する
NAME           PROPERTY  VALUE    SOURCE
pool0/vm/vol0  volsize   1.17T    local

ディスクサイズが増えたことで GPT テーブル情報が実際のディスクと一致しなくなるのでこれを修正し、さらにパーティションをリサイズする。

$ sudo parted /dev/zvol/pool0/vol0
Warning: Not all of the space available to /dev/sda appears to be used, you can fix the GPT to use all of the space (an extra *** blocks) or continue with the current setting?
Fix/Ignore? Fix

parted でボリュームを開いた時にエラーが検出され、 Fix するかとのメッセージが出るので Fix と打つ。そのまま続けて p でパーティションを確認する。

(parted) p
Model: Unknown (unknown)
Disk /dev/zd192: 1288GB
Sector size (logical/physical): 512B/8192B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name  Flags
 1      1049kB  800GB  800GB  ext4

resizepart で1番目のパーティションをディスクの100%の位置まで拡張する。

(parted) resizepart 1 100%
(parted) p
Model: Unknown (unknown)
Disk /dev/zd192: 1288GB
Sector size (logical/physical): 512B/8192B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  1288GB  1288GB  ext4

parted を終了し、e2fsck でパーティションのエラーを確認する(resize2fs のために必要)

$ sudo e2fsck -f /dev/zvol/pool0/vol0-part1
... (終わるまでしばらく待つ)

最後に resize2fs で増えた分の領域を認識させる

$ sudo resize2fs /dev/zvol/pool0/vol0-part1

終わり。一応最後にまた e2fsck した方が良いかもしれない。

parted の代わりに fdisk でリサイズする方法もあるが、(たぶん)GPT テーブルの修正はできないし、パーティションを一度消す→開始位置が同じで終了位置が違うパーティションを再作成というオペレーションになるためちょっと怖いので parted を使った方が良いと思う。

参考にしたサイト