🌟

KVMの仮想ストレージ拡張

2023/06/25に公開

Ubuntu22.04 on KVM on Ubuntu22.04 の環境において仮想ストレージサイズを拡張する。

QEMU diskの拡張

QEMU/KVMを管理するホスト側で操作する。
QEMU/KVMが仮想ディスクとして利用しているQEMU diskのサイズを拡張する。
仮想マシン名 linuxvm のデフォルト仮想ディスクは /var/lib/libvirt/images/linuxvm.qcow2 なのでこれを指定してサイズ拡張する。
以下は確認も含めてVMが停止した状態で実行する必要がある。

$ sudo qemu-img info /var/lib/libvirt/images/linuxvm.qcow2
image: /var/lib/libvirt/images/linuxvm.qcow2
file format: qcow2
virtual size: 25 GiB (26843545600 bytes)
disk size: 5.36 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false

このストレージに対して25GB追加するコマンドは以下の通り。

$ sudo qemu-img resize -f qcow2 /var/lib/libvirt/images/linuxvm.qcow2 +25G
Image resized.

これで無事ストレージサイズが50GBとなる。

$ sudo qemu-img info /var/lib/libvirt/images/linuxvm.qcow2
image: /var/lib/libvirt/images/linuxvm.qcow2
file format: qcow2
virtual size: 50 GiB (53687091200 bytes)
disk size: 5.36 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false

パーティションの拡張

以下はゲストVM側で操作する。

操作前の構成は以下の通り。
/dev/vda3 が拡張対象のルートファイルシステムで、ubuntu-vg および ubuntu-lv というデフォルトのVGおよびLVが切られている。
現時点では /dev/vda が50GiBと認識されたいるが、 /vda3 には反映されていない。
また、GPT PMBR size mismatch の警告が出力されるようになっている。

$sudo fdisk -l
...
GPT PMBR size mismatch (52428799 != 104857599) will be corrected by write.
The backup GPT table is not on the end of the device.


Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C5E473E5-FB30-4587-A9A5-A176906195C0

Device       Start      End  Sectors Size Type
/dev/vda1     2048     4095     2048   1M BIOS boot
/dev/vda2     4096  4198399  4194304   2G Linux filesystem
/dev/vda3  4198400 52426751 48228352  23G Linux filesystem
...

$ sudo pvdisplay -C
  PV         VG        Fmt  Attr PSize   PFree
  /dev/vda3  ubuntu-vg lvm2 a--  <23.00g    0
$ sudo vgdisplay -C
  VG        #PV #LV #SN Attr   VSize   VFree
  ubuntu-vg   1   1   0 wz--n- <23.00g    0
$ sudo lvdisplay -C
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <23.00g

これを以下の通り修正する。
parted コマンドprintすると修正を促されるのでfixを指定して修正する。これにより警告が解消される。
その後、同じくpartedプロンプト内にてresizepart 3 と拡張したいパーティションを指定し、拡張サイズに 100%を入力する。
これによりパーティションNumber3のサイズが51.5GBに拡張される

$ sudo parted /dev/vda
GNU Parted 3.4
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Warning: Not all of the space available to /dev/vda appears to be used, you can fix the GPT to use all of the space (an extra 52428800 blocks) or continue with the current setting?
Fix/Ignore? fix
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  2150MB  2147MB  ext4
 3      2150MB  26.8GB  24.7GB
(parted) resizepart 3
End?  [26.8GB]? 100%
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  2150MB  2147MB  ext4
 3      2150MB  53.7GB  51.5GB

これにより、 /dev/vda3 には50GBの容量が付与される。一方で、PVやLVには拡張が反映されていない。

$ sudo fdisk -l
...
Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: CF748271-DBE6-4FBF-A296-179AB6C3EBFC

Device       Start       End   Sectors Size Type
/dev/vda1     2048      4095      2048   1M BIOS boot
/dev/vda2     4096   4198399   4194304   2G Linux filesystem
/dev/vda3  4198400 104857566 100659167  48G Linux filesystem
...

$ sudo pvdisplay -C
  PV         VG        Fmt  Attr PSize   PFree
  /dev/vda3  ubuntu-vg lvm2 a--  <23.00g    0
$ sudo vgdisplay -C
  VG        #PV #LV #SN Attr   VSize   VFree
  ubuntu-vg   1   1   0 wz--n- <23.00g    0
$ sudo lvdisplay -C
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <23.00g

PV/LVの拡張

PV(Physical Volume)やLV(Logical Volume)にストレージ拡張を反映する。

PVへの容量拡張のため、pvresizeを利用する

$ sudo pvresize /dev/vda3
  Physical volume "/dev/vda3" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

これにより、PVの空き容量が認識されるようになる。

$ sudo pvdisplay -C
  PV         VG        Fmt  Attr PSize   PFree
  /dev/vda3  ubuntu-vg lvm2 a--  <48.00g 25.00g
$ sudo vgdisplay -C
  VG        #PV #LV #SN Attr   VSize   VFree
  ubuntu-vg   1   1   0 wz--n- <48.00g 25.00g
$ sudo lvdisplay -C
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <23.00g

続いてLV領域の拡張のため、lvextend を利用する

$ sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
  Size of logical volume ubuntu-vg/ubuntu-lv changed from <23.00 GiB (5887 extents) to <48.00 GiB (12287 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.

これによりLVのサイズも拡張されることが確認できる。

$ sudo pvdisplay -C
  PV         VG        Fmt  Attr PSize   PFree
  /dev/vda3  ubuntu-vg lvm2 a--  <48.00g    0
$ sudo vgdisplay -C
  VG        #PV #LV #SN Attr   VSize   VFree
  ubuntu-vg   1   1   0 wz--n- <48.00g    0
$ sudo lvdisplay -C
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <48.00g

ファイルシステムの拡張

ここまでの操作でLVレベルでの容量増加が反映された。
最後にファイルシステムとして反映させる。

現時点ではルートファイルシステムとしてext4を利用しており、容量は25GBしか認識できていない。

$ mount -l | grep /dev/mapper/ubuntu--vg-ubuntu--lv
/dev/mapper/ubuntu--vg-ubuntu--lv on / type ext4 (rw,relatime)

$ df -h /
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv   23G  5.0G   17G  23% /

resize2fs コマンドを利用し、ファイルシステムの容量変更を反映する

$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 6
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 12581888 (4k) blocks long.

以上によりファイルシステムのサイズ拡張が完了する。

$ df -h /
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv   48G  5.0G   41G  11% /

Discussion