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 ~]#
これで/の拡張が完了しました。
おつかれさまでした。



コメント