KVM仮想マシンのディスク容量を増やす

Linux

CentOS8のKVMホストマシン上に作成したRockyLinux9の仮想マシンの「/」のディスク容量を増やそうと思う。

今のパーティション状態。/は45Gの割り当てがされている

[root@rocky9 ~]# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 732M 9.6M 722M 2% /run
/dev/mapper/rl-root 45G 2.1G 43G 5% /
/dev/vda1 960M 393M 568M 41% /boot
tmpfs 366M 0 366M 0% /run/user/0
tmpfs 366M 0 366M 0% /run/user/1000
[root@rocky9 ~]#

ブロックの確認

[root@rocky9 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
vda 252:0 0 50G 0 disk
tqvda1 252:1 0 1G 0 part /boot
mqvda2 252:2 0 49G 0 part
tqrl-root 253:0 0 45.1G 0 lvm /
mqrl-swap 253:1 0 3.9G 0 lvm [SWAP]
[root@rocky9 ~]#

これからの進め方

現在(50GB) ← 今ここ
↓
VMを正常シャットダウン
↓
★ バックアップ/スナップショット取得
↓
仮想ディスク 50GB → 120GB
↓
VM起動
↓
vda2拡張
↓
PV拡張
↓
LV rl-root → 100GB
↓
XFS拡張
↓
df -hで確認

Rocky9を正常停止

KVMホストからrocky9をシャットダウン

[root@kvm01 ~]# virsh shutdown rocky9
ドメイン rocky9 はシャットダウン中です
[root@kvm01 ~]#

少し待って、落ちたことを確認

[root@kvm01 ~]# virsh list --all
 Id   名前      状態
------------------------------
 -    rocky9    シャットオフ
 -    win2k16   シャットオフ

[root@kvm01 ~]#

qcow2の状態と容量を確認

停止後に、構成を確認。

[root@kvm01 ~]# qemu-img info /var/lib/libvirt/images/rocky9.qcow2
image: /var/lib/libvirt/images/rocky9.qcow2
file format: qcow2
virtual size: 50 GiB (53687091200 bytes)
disk size: 2.66 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
[root@kvm01 ~]#

ここで、

file format: qcow2
virtual size: 50 GiB

となっていることを確認します。

この時点でバックアップ

同じディレクトリに置くなら、

cp --sparse=always \
/var/lib/libvirt/images/rocky9.qcow2 \
/var/lib/libvirt/images/rocky9_before_expand.qcow2

コピー後、バックアップがとれていることを確認します。

[root@kvm01 ~]# ls -lh /var/lib/libvirt/images/rocky9*.qcow2
-rw------- 1 root root 51G  9月 25 16:02 /var/lib/libvirt/images/rocky9.qcow2
-rw------- 1 root root 51G  9月 25 16:04 /var/lib/libvirt/images/rocky9_before_expand.qcow2
[root@kvm01 ~]#

次は 元の rocky9.qcow2 だけを50GB → 120GBへ拡張します。

表示が 51G なのはファイルの実使用サイズなので、念のため拡張前に仮想サイズを確認する。

KVMホストで実行。

[root@kvm01 ~]# qemu-img info /var/lib/libvirt/images/rocky9.qcow2
image: /var/lib/libvirt/images/rocky9.qcow2
file format: qcow2
virtual size: 50 GiB (53687091200 bytes)
disk size: 2.66 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
[root@kvm01 ~]#

ここで virtual size: 50 GiB を確認できたら、次に進みます。

50GB → 120GBへ拡張

VMが停止している状態で、120GBに変更

[root@kvm01 ~]# qemu-img resize /var/lib/libvirt/images/rocky9.qcow2 120G
Image resized.
[root@kvm01 ~]#

成功したら、120GBになります。

[root@kvm01 ~]# qemu-img info /var/lib/libvirt/images/rocky9.qcow2
image: /var/lib/libvirt/images/rocky9.qcow2
file format: qcow2
virtual size: 120 GiB (128849018880 bytes)
disk size: 2.66 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
[root@kvm01 ~]#

なお、バックアップした以下のファイルには絶対に resize を実行しません。これは50GB時点の復旧用としてそのまま残します。

rocky9_before_expand.qcow2

VMを起動します。

[root@kvm01 ~]# virsh start rocky9
ドメイン rocky9 が起動されました
[root@kvm01 ~]#

起動確認:

[root@kvm01 ~]# virsh list
 Id   名前     状態
-----------------------
 3    rocky9   実行中

[root@kvm01 ~]#

その後、Rocky9ゲスト側にログインして、ディスクが120Gになったことを確認します。

[root@rocky9 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0          11:0    1 1024M  0 rom
vda         252:0    0  120G  0 disk
tqvda1      252:1    0    1G  0 part /boot
mqvda2      252:2    0   49G  0 part
  tqrl-root 253:0    0 45.1G  0 lvm  /
  mqrl-swap 253:1    0  3.9G  0 lvm  [SWAP]
[root@rocky9 ~]#

現在は、

/dev/vda       120G   ← 拡張済み
└─/dev/vda2     49G   ← ここがまだ旧サイズ
   ├─rl-root   45.1G
   └─rl-swap    3.9G

なので、次は /dev/vda2 をディスク末尾まで拡張します。今回は fdisk で削除・再作成するより growpart を使うのがおすすめです。

まず growpart が入っているか確認

[root@rocky9 ~]# which growpart
/usr/bin/which: no growpart in (/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
[root@rocky9 ~]#

入ってなかったのでインストールします。

[root@rocky9 ~]# dnf install -y cloud-utils-growpart
メタデータの期限切れの最終確認: 0:17:55 前の 2026年09月25日 15時56分38秒 に実施しました。
依存関係が解決しました。
=======================================================================================================================================================================
 パッケージ                                      アーキテクチャー                  バージョン                               リポジトリー                         サイズ
=======================================================================================================================================================================
インストール:
 cloud-utils-growpart                            x86_64                            0.33-1.el9                               appstream                             34 k

~以下略~

/usr/bin/growpart などが表示されたら、まだ拡張せず、念のため現在のパーティション構成を確認します。

[root@rocky9 ~]# fdisk -l /dev/vda
ディスク /dev/vda: 120 GiB, 128849018880 バイト, 251658240 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xd7afef0b

デバイス   起動 開始位置  終了位置    セクタ サイズ Id タイプ
/dev/vda1  *        2048   2099199   2097152     1G 83 Linux
/dev/vda2        2099200 104857599 102758400    49G 8e Linux LVM
[root@rocky9 ~]#

まずは実際には変更せず、「変更するとどうなるか」を表示します。

[root@rocky9 ~]# growpart -N /dev/vda 2
CHANGE: partition=2 start=2099200 old: size=102758400 end=104857599 new: size=249559007 end=251658206
# === old sfdisk -d ===
label: dos
label-id: 0xd7afef0b
device: /dev/vda
unit: sectors
sector-size: 512

/dev/vda1 : start=        2048, size=     2097152, type=83, bootable
/dev/vda2 : start=     2099200, size=   102758400, type=8e
# === new sfdisk -d ===
label: dos
label-id: 0xd7afef0b
device: /dev/vda
unit: sectors
sector-size: 512

/dev/vda1 : start=        2048, size=     2097152, type=83, bootable
/dev/vda2 : start=     2099200, size=   249559007, type=8e
[root@rocky9 ~]#

特に重要なのはここです。

old:
start=2099200
size=102758400

new:
start=2099200
size=249559007

開始位置 2099200 が変わっていません。つまり既存LVMの先頭位置を維持したまま、vda2 の終了位置だけをディスク末尾まで伸ばす変更です。

では実際に拡張します。

[root@rocky9 ~]# growpart /dev/vda 2
CHANGED: partition=2 start=2099200 old: size=102758400 end=104857599 new: size=249559007 end=251658206
[root@rocky9 ~]#

成功すると、

CHANGED: partition=2 ...

のように表示されます。

その直後に、

[root@rocky9 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0          11:0    1 1024M  0 rom
vda         252:0    0  120G  0 disk
tqvda1      252:1    0    1G  0 part /boot
mqvda2      252:2    0  119G  0 part
  tqrl-root 253:0    0 45.1G  0 lvm  /
  mqrl-swap 253:1    0  3.9G  0 lvm  [SWAP]
[root@rocky9 ~]#

を実行してください。

成功です。/dev/vda2 が 49G → 119G に拡張されています。

現在は、

vda          120G
├─vda1         1G  /boot
└─vda2       119G  ← 拡張完了
  ├─rl-root  45.1G /
  └─rl-swap   3.9G

次は LVMのPV(Physical Volume)に、この増えた70GBを認識させます。

まず現在の状態を確認しましょう。

[root@rocky9 ~]# pvs
  PV         VG Fmt  Attr PSize    PFree
  /dev/vda2  rl lvm2 a--  <119.00g 70.00g
[root@rocky9 ~]#

続けて、

[root@rocky9 ~]# vgs
  VG #PV #LV #SN Attr   VSize    VFree
  rl   1   2   0 wz--n- <119.00g 70.00g
[root@rocky9 ~]#

実際に拡張をしてみる。

[root@rocky9 ~]# pvresize /dev/vda2
  Physical volume "/dev/vda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
[root@rocky9 ~]#

成功すると、

Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated

などと表示されます。

その後、結果を確認します。

[root@rocky9 ~]# pvs
  PV         VG Fmt  Attr PSize    PFree
  /dev/vda2  rl lvm2 a--  <119.00g 70.00g
[root@rocky9 ~]# vgs
  VG #PV #LV #SN Attr   VSize    VFree
  rl   1   2   0 wz--n- <119.00g 70.00g
[root@rocky9 ~]#

実は、pvresize 前の pvs ですでに119GB/70GBになっていたので、カーネル/LVM側では拡張後のサイズを既に認識できていました。pvresize を実行しても問題なかった。

現在は、

VG rl:約119GB
├─ rl-root:約45.1GB  ← /
├─ rl-swap:約3.9GB
└─ 未使用:70GB

です。

次はいよいよ rl-root を 最終サイズ100GB にします。

まずLV名を確認します。

[root@rocky9 ~]# lvs
  LV   VG Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rl -wi-ao---- 45.05g
  swap rl -wi-ao---- <3.95g
[root@rocky9 ~]#

rl-root が確認できたら、今回は「100GB追加」ではなく「合計100GB」にするので、以下のコマンドを実行

[root@rocky9 ~]# lvextend -L 100G /dev/mapper/rl-root
  Size of logical volume rl/root changed from 45.05 GiB (11533 extents) to 100.00 GiB (25600 extents).
  Logical volume rl/root successfully resized.
[root@rocky9 ~]#

ここは間違えやすいところで、

lvextend -L +100G ...

ではありません。+100G にすると100GB追加しようとするため、今回の目的とは違います。

成功したら、確認します。

[root@rocky9 ~]# lvs
  LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rl -wi-ao---- 100.00g
  swap rl -wi-ao----  <3.95g
[root@rocky9 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0          11:0    1 1024M  0 rom
vda         252:0    0  120G  0 disk
tqvda1      252:1    0    1G  0 part /boot
mqvda2      252:2    0  119G  0 part
  tqrl-root 253:0    0  100G  0 lvm  /
  mqrl-swap 253:1    0  3.9G  0 lvm  [SWAP]
[root@rocky9 ~]#

今は「LVMは100GBになったが、その中のXFSファイルシステムがまだ45GB」という状態です。

仮想ディスク /dev/vda        120G  ✓
  ↓
パーティション /dev/vda2    119G  ✓
  ↓
LV /dev/mapper/rl-root       100G  ✓
  ↓
XFSファイルシステム           45G  ← 今ここ

最後にXFSを拡張

Rocky9上で実行してください。
XFSはマウントしたまま拡張できるので、/ をアンマウントする必要はありません。

[root@rocky9 ~]# xfs_growfs /
meta-data=/dev/mapper/rl-root    isize=512    agcount=4, agsize=2952448 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=11809792, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 11809792 to 26214400
[root@rocky9 ~]#

成功すると最後の方に、

data blocks changed from ... to ...

のような表示が出ます。

その後、dfで確認します。

[root@rocky9 ~]# df -hT /
ファイルシス        タイプ サイズ  使用  残り 使用% マウント位置
/dev/mapper/rl-root xfs      100G  2.5G   98G    3% /
[root@rocky9 ~]#

これで/の拡張が完了しました。

おつかれさまでした。

コメント

タイトルとURLをコピーしました