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
を使った方が良いと思う。