Linux

KVMでLinux-VMのディスク拡張方法

*記事内に商品プロモーションを含む場合があります

KVMでLinux-VMのディスク拡張方法を紹介します。

作業履歴みたいになっています。

[使い方を画面で解説]Linuxの仮想化技術KVMでLinuxゲストOS(仮想マシン)のインストール方法KVM Linux(仮想化環境)にゲストOSとしてLinux(Ubuntu/CentOS/Rocky Linux/AlmaLinux)を...

コマンドメモ 大まかな流れ

50GB → 50GB+200GB に変更します

1.ホスト側作業
対象のVMを停止
virsh shutdown XXXXX

拡張予定のVMの状態を確認
qemu-img info /vm-image/XXXXX.qcow2

#KVMのゲストOSのディスクサイズを拡張 +400GB
qemu-img resize -f qcow2 /vm-image/XXXXX.qcow2 +400G

拡張予定のVMの状態を確認
qemu-img info /vm-image/XXXXX.qcow2

2.ゲストVMの作業

ゲストをVM起動

# virsh start XXXXX

ゲストOSにログインして

・パーティションの拡張
parted -l

parted /dev/sda ★システムで/dev/xxxは変わる
(parted) p
(parted) resizepart XX ★XX:拡張するパーティション番号
終了? [53.7GB]? 100% ★「100%」を入力
(parted)q

parted -l

・PV/LVの拡張

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

pvdisplay -C
lvdisplay
lvdisplay -C

PVの容量拡張
pvresize /dev/sda2

pvdisplay -C
lvdisplay
lvdisplay -C

LV領域の拡張
lvextend -l +100%FREE /dev/rl/root
*LV Pathがたまに違う

ファイルシステムの拡張
xfs_growfs /dev/mapper/rl-root
*moutポイントもたまに違う

サイズ確認
df -h
詳細な流れ

KVMホスト側の作業

QEMU diskを拡張します。

物理ファイルの大きさを確認。 50GB。

#

[/vm-image]# ls -lh
-rw-------+ 1 qemu qemu  51G 10月 26  2023 RockyLinux92-S4.qcow2
-rw-------+ 1 root root  51G 10月 19 10:50 rockylinux8-XXX.qcow2
-rw-------+ 1 root root  51G 10月 19 10:36 rockylinux8-2.qcow2
-rw-------+ 1 root root  51G  5月 30 13:36 rockylinux92.qcow2

作成時のパラメータは以下。50GBで作成しています。

virt-install \
–name=rockylinux8-XXX \
–location=/download/Rocky-8.8-x86_64-dvd1.iso \
–disk path=/vm-image/rockylinux8-XXX.qcow2,size=50,format=qcow2 \
–vcpus=4 –ram=4096 \
–graphics none \
–extra-args=”console=tty0 console=ttyS0,115200n8″

QEMU/KVMを管理するホスト側で操作します。
まず、QEMU/KVMが仮想ディスクとして利用しているQEMU diskのサイズを拡張します。

VMのディスクの箱を大きくするようなイメージです。

VMが停止した状態で実行します。
(qemu-img info はVMの停止は不要)

#

[/vm-image]# qemu-img info rockylinux8-2.qcow2

image: rockylinux8-2.qcow2
file format: qcow2
virtual size: 50G ★virt-install size=で指定したサイズ
disk size: 5.4G   ★ゲストOS側で利用しているサイズ
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
#
 
[/vm-image]#  qemu-img info  RockyLinux92-S2.qcow2
image: RockyLinux92-S2.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 46G  ★ゲストOS側で利用しているサイズ
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

このディスクに対して50GBを追加するコマンドは以下。

qemu-img resize -f qcow2 /vm-image/rockylinux8-XXX.qcow2 +200G

これでディスサイズが 50GB + 200GB = 250GBとなる。

#

#qemu-img resize -f qcow2 /db2/vm-image/rockylinux8-2.qcow2 +200G
Image resized.
 
# ls -lh
 root root  51G 10月 26  2023 rockylinux8-2.qcow2 ★まだ、50GB
#

# qemu-img info /vm-image/rockylinux8-XXX.qcow2
 
qemu-img info rockylinux8-2.qcow2
image: rockylinux8-2.qcow2
file format: qcow2
virtual size: 250G ★50GB → 250GB
disk size: 5.4G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

ゲストVM側の作業

VMの起動を起動します。

# virsh start rockylinux8-2

パーティションの拡張

操作前の構成は以下の通り。

#


# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 1.8G 8.5M 1.8G 1% /run
tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/rl-root 46G 4.9G 41G 11% / ★
/dev/sda1 1014M 223M 792M 22% /boot
tmpfs 367M 0 367M 0% /run/user/0

# fdisk -l

★/dev/sda は拡張前の50GBのまま。

#
[root@rockylinux8-2 ~]# fdisk -l
ディスク /dev/sda: 250 GiB, 268435456000 バイト, 524288000 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xa26550cf
 
デバイス   起動 開始位置  終了位置    セクタ サイズ Id タイプ
/dev/sda1  *   2048   2099199   2097152   1G 83 Linux
/dev/sda2    2099200 104857599 102758400  49G 8e Linux LVM ★

ディスク /dev/mapper/rl-root: 45 GiB, 48360325120 バイト, 94453760 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
 
ディスク /dev/mapper/rl-swap: 4 GiB, 4248829952 バイト, 8298496 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

★parted -l で確認すると /dev/sda が268GBになっています。

#

# parted -l
モデル: ATA QEMU HARDDISK (scsi)
ディスク /dev/sda: 268GB   ★
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
 
番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
1    1049kB  1075MB  1074MB  primary  xfs  boot
2    1075MB  53.7GB  52.6GB  primary       vm  ★250GBでない
parted -l
モデル: ATA QEMU HARDDISK (scsi)
ディスク /dev/sda: 268GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
 
番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
1    1049kB  1075MB  1074MB  primary  xfs   boot
2    1075MB  53.7GB  52.6GB  primary        lvm

parted /dev/sda

p 入力

番号 2 の50GBを拡張したいので、
resizepart 2
拡張したいパーティションを指定し、拡張サイズに 100%を入力。

これによりパーティション番号 2のサイズが50GB→250GBに拡張されます。

#

# parted /dev/sda

GNU Parted 3.2
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
 
(parted) p             ★「p」で表示
モデル: ATA QEMU HARDDISK (scsi)
ディスク /dev/sda: 268GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
 
番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
1    1049kB  1075MB  1074MB  primary  xfs      boot
2    1075MB  53.7GB  52.6GB  primary           lvm
 
(parted) resizepart 2
終了?  [53.7GB]? 100%    ★「100%」を入力
 
(parted) p               ★「p」で表示
モデル: ATA QEMU HARDDISK (scsi)
ディスク /dev/sda: 268GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
 
番号  開始    終了    サイズ  タイプ ファイルシステム フラグ
1    1049kB  1075MB  1074MB  primary xfs   boot
2    1075MB  268GB   267GB   primary       lvm ★250GBになっている
 
(parted)q

#

# parted -l
モデル: ATA QEMU HARDDISK (scsi)
ディスク /dev/sda: 268GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
 
番号  開始    終了    サイズ  タイプ  ファイルシステム  フラグ
1    1049kB  1075MB  1074MB  primary  xfs     boot
2    1075MB  268GB   267GB   primary         lvm
#

# fdisk -l
ディスク /dev/sda: 250 GiB, 268435456000 バイト, 524288000 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xa26550cf
 
デバイス   起動 開始位置  終了位置    セクタ サイズ Id タイプ
/dev/sda1  *    2048   2099199   2097152     1G 83 Linux
/dev/sda2     2099200 524287999 522188800   249G 8e Linux LVM

PV/LVの拡張

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

実行するコマンドは以下の流れ。

どこでうまく行かなかったが分からなくなるので、「pvdisplay」「lvdisplay」で実行前後のサイズを確認します。

pvdisplay -C
lvdisplay
lvdisplay -C

PVの容量拡張
pvresize /dev/sda2

pvdisplay -C
lvdisplay
lvdisplay -C

LV領域の拡張
lvextend -l +100%FREE /dev/rl/root

ファイルシステムの拡張
xfs_growfs /dev/mapper/rl-root

#
 
[root@rockylinux8-2 ~]# pvdisplay -C
  PV         VG Fmt  Attr PSize   PFree
  /dev/sda2  rl lvm2 a--  <49.00g    0
 
[root@rockylinux8-2 ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/rl/swap
  LV Name                swap
  VG Name                rl
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                <3.96 GiB
  Current LE             1013
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
 
  --- Logical volume ---
  LV Path                /dev/rl/root
  LV Name                root
  VG Name                rl
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                <45.04 GiB
  Current LE             11530
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

PVの容量拡張
pvresize /dev/sda2

#

[root@rockylinux8-2 ~]# lvdisplay -C
  LV   VG Attr      LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rl -wi-ao---- <45.04g
  swap rl -wi-ao----  <3.96g
[root@rockylinux8-2 ~]# pvresize /dev/sda2 ★
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

#

[root@rockylinux8-2 ~]# pvdisplay -C
  PV         VG Fmt  Attr PSize    PFree
  /dev/sda2  rl lvm2 a--  <249.00g 200.00g
 
[root@rockylinux8-2 ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/rl/swap
  LV Name                swap
  VG Name                rl
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                <3.96 GiB
  Current LE             1013
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
 
  --- Logical volume ---
  LV Path                /dev/rl/root
  LV Name                root
  VG Name                rl
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                <45.04 GiB
  Current LE             11530
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

LV領域の拡張
lvextend -l +100%FREE /dev/rl/root

#

[root@rockylinux8-2 ~]# lvdisplay -C
  LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rl -wi-ao---- <45.04g
  swap rl -wi-ao----  <3.96g

[root@rockylinux8-2 ~]# lvextend -l +100%FREE /dev/rl/root ★
  Size of logical volume rl/root changed from <45.04 GiB (11530 extents) to <245.04 GiB (62730 extents).
  Logical volume rl/root successfully resized.

#

[root@rockylinux8-2 ~]# pvdisplay -C
  PV         VG Fmt  Attr PSize    PFree
  /dev/sda2  rl lvm2 a--  <249.00g    0
 
[root@rockylinux8-2 ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/rl/swap
  LV Name                swap
  VG Name                rl
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                <3.96 GiB
  Current LE             1013
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
 
  --- Logical volume ---
  LV Path                /dev/rl/root
  LV Name                root
  VG Name                rl
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                <245.04 GiB
  Current LE             62730
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
#

[root@rockylinux8-2 ~]# lvdisplay -C
  LV   VG Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rl -wi-ao---- <245.04g
  swap rl -wi-ao----   <3.96g
[root@rockylinux8-2 ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
devtmpfs              1.8G     0  1.8G    0% /dev
tmpfs                 1.8G     0  1.8G    0% /dev/shm
tmpfs                 1.8G  8.5M  1.8G    1% /run
tmpfs                 1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/mapper/rl-root    46G  4.9G   41G   11% /  ★
/dev/sda1            1014M  223M  792M   22% /boot
tmpfs                 367M     0  367M    0% /run/user/0

ファイルシステムの拡張

OSのファイルシステムを拡張します。

#
 
$ mount -l | grep root

$ more /etc/fstab
 
/dev/mapper/rl-root    /      xfs  defaults   0 0
UUID=XXXXXXXXXS        /boot  xfs  defaults   0 0
/dev/mapper/rl-swap    none   swap defaults   0 0

resize2fs /dev/mapper/rl-root

resize2fs /dev/rl/root

「Couldn’t find valid filesystem superblock.」でエラーになります。

#

# resize2fs /dev/mapper/rl-root
resize2fs 1.45.6 (20-Mar-2020)
resize2fs: Bad magic number in super-block while trying to open /dev/mapper/rl-root
Couldn't find valid filesystem superblock.
 
# resize2fs  /dev/rl/root
resize2fs 1.45.6 (20-Mar-2020)
resize2fs: Bad magic number in super-block while trying to open /dev/rl/root
Couldn't find valid filesystem superblock.

RHEL 7系OS からは標準ファイルシステムが ext → xfs に変更になりました。

その関係で、ファイルシステム操作系コマンドもxfs_系使う必要があります。

xfsファイルシステムの拡張は xfs_growfs コマンドで行う。

#

$ mount -l
/dev/mapper/rl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
 
# xfs_growfs /dev/mapper/rl-root
 
meta-data=/dev/mapper/rl-root    isize=512    agcount=4, agsize=2951680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=11806720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=5765, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 11806720 to 64235520
 
# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
devtmpfs              1.8G     0  1.8G    0% /dev
tmpfs                 1.8G     0  1.8G    0% /dev/shm
tmpfs                 1.8G  8.5M  1.8G    1% /run
tmpfs                 1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/mapper/rl-root   246G  6.3G  239G    3% /  ★246GB
/dev/sda1            1014M  223M  792M   22% /boot
tmpfs                 367M     0  367M    0% /run/user/0

#

parted -l
モデル: ATA QEMU HARDDISK (scsi)
ディスク /dev/sda: 268GB  ★
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
 
番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
1    1049kB  1075MB  1074MB  primary  xfs     boot
2    1075MB  268GB   267GB   primary          lvm ★
 
 
ls -lh
-rw-------+ 1 qemu qemu  51G 10月 26  2023 rockylinux8-2.qcow2

まだ、ホスト側の物理ファイルサイズはそのままです。

[ホスト側で]virtual sizeは、すでに拡張済みなので変化なし。
「disk size」は、VM内で実施ディスクを使用すると使用量に応じて増えます。

# qemu-img info rockylinux8-2.qcow2
image: rockylinux8-2.qcow2
file format: qcow2
virtual size: 250G (268435456000 bytes)
disk size: 5.5G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true

最後に

KVMホスト側でゲストVMのディスクの箱を大きくする作業以外は、ほとんどLinuxのOSでディスクを拡張する操作と同じです。

[使い方を画面で解説]Linuxの仮想化技術KVMでLinuxゲストOS(仮想マシン)のインストール方法KVM Linux(仮想化環境)にゲストOSとしてLinux(Ubuntu/CentOS/Rocky Linux/AlmaLinux)を...