[LVM] パーティションを追加せずに仮想ディスクを拡張する


1.TL;DR

VMwareやKVMのハイパーバイザー環境にRHEL/CentOSをインストールするとデフォルトではLVM(論理ボリューム管理)となってしまいます。仮想ディスクを増やそうとすると、ハイパーバイザー環境で仮想ディスクをサイズを増やした後に、通常はパーティションを追加する事になります。パーティションは基本パーティションを最大4つまでしか作成できません(拡張パーティションを使えば更に増やせますが、ここでは割愛します)。ディスクサイズを増やすたびに、パーティションを追加するのはイマイチなので、別の方法を試しました。

パーティションのサイズを増やして、最終的にOSが認識する論理ボリュームサイズを増やした。

2.作業の流れ

  • 仮想ディスクのサイズ拡張
  • パーティションのサイズ拡張
  • 物理ボリュームのサイズ拡張
  • 論理ボリュームのサイズ拡張

この作業は最悪仮想マシンを壊してしまう可能性がある作業です。自己責任にて行ってください。

前提となる環境

  • ハイパーバイザー(物理マシン):CentOS 7.8.2003のKVM
  • 仮想マシン:CentOS 7.8.2003

3.変更前の状態

ディスク拡張前の状態を確認しておきます。
最初にハイパーバイザー側から見える情報です。
仮想ディスクのサイズは24GBと認識されています。実際に確保されているサイズは12GBです。

[root@hypervisor images]# qemu-img info vm1.img 
image: vm1.img
file format: qcow2
virtual size: 24G (25769803776 bytes)
disk size: 12G
cluster_size: 65536
Format specific information:
    compat: 0.10

次に仮想マシン内部から見える情報です。
拡張対象の2つ目のパーティションは24.7GBです。

[root@vm1 ~]# parted /dev/vda print
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 25.8GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  25.8GB  24.7GB  primary                    lvm

ファイルシステムを確認します。
ルートのパーティション /dev/mapper/cl_centos7template-root は 22GB です。

[root@vm1 ~]# df -h
ファイルシス                        サイズ  使用  残り 使用% マウント位置
:
/dev/mapper/cl_centos7template-root    22G  7.4G   15G   35% /
/dev/vda1                            1014M  245M  770M   25% /boot
:

4.仮想ディスクのサイズ拡張

ハイパーバイザのサーバへrootでログインして行います。
仮想ディスクを増やす前に仮想マシンはシャットダウンしておきましょう。

qemu-img resizeコマンドで10GB 増やします。

[root@hypervisor images]# qemu-img resize  vm1.img +10G
Image resized.

仮想ディスクのサイズが24GBから34GBに増えました。

[root@hypervisor images]# qemu-img info vm1.img 
image: vm1.img
file format: qcow2
virtual size: 34G (36507222016 bytes)
disk size: 12G
cluster_size: 65536
Format specific information:
    compat: 0.10

5.パーティションのサイズ拡張

ここからの作業は仮想マシンにrootでログインして行います。
partedコマンドでパーティションの割り当て状況を確認します。この時点では2番目のパーティションは24.7GBのままで増えていません。

[root@vm1 ~]# parted  /dev/vda print
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 36.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  25.8GB  24.7GB  primary                    lvm

パーティションはpartedコマンドのresizepartサブコマンドで増やします。
ここはインタラクティブな方法で入力します。
最初のオプション 2は2つ目のパーティションを示します。
-1s は最後のセクターまで増やすことを意味します。
resizepartサブコマンド実行後は何もレスポンスはありませんが、心配しないでください。
終了はqサブコマンドです。

[root@vm1 ~]# parted /dev/vda
GNU Parted 3.1
/dev/vda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。

(parted) resizepart 2 -1s                                                 

(parted) q   

2番目のパーティションが24.7GBから35.4GBに増えました。

[root@vm1 ~]# parted  /dev/vda print                                   
モデル: Virtio Block Device (virtblk)
ディスク /dev/vda: 36.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  36.5GB  35.4GB  primary                    lvm

6.物理ボリュームのサイズ拡張

物理ボリュームの細部はまだ増えていません。

[root@vm1 ~]# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               cl_centos7template
  PV Size               <23.00 GiB / not usable 2.00 MiB
:

pvresizeコマンドで物理ボリュームのサイズを増やします。

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

物理ボリュームのサイズが23GBから33GBに増えました。

[root@vm1 ~]# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               cl_centos7template
  PV Size               <33.00 GiB / not usable 2.00 MiB
:

ボリュームグループのサイズは物理ボリュームの増加といっしょに増えます(33GB)。未割当(FREE)の領域が10GBある事がわかります。

[root@vm1 ~]# vgdisplay cl_centos7template
  --- Volume group ---
  VG Name               cl_centos7template
:
  VG Size               <33.00 GiB
  PE Size               4.00 MiB
  Total PE              8447
  Alloc PE / Size       5887 / <23.00 GiB
  Free  PE / Size       2560 / 10.00 GiB
  VG UUID               XZleoU-FvcU-pNs9-rIc7-4PrH-pZZ6-KfoyZm

7.論理ボリュームのサイズ拡張

最後にlvextendコマンドで論理ボリュームを増やします。
-l +100%FREE は空き領域のすべてを指します。
-r はファイルシステムも合わせてリサイズするオプションです(resize2fsコマンドと同義)。

[root@vm1 ~]# lvextend  -l +100%FREE  -r  /dev/cl_centos7template/root
  Size of logical volume cl_centos7template/root changed from <21.50 GiB (5503 extents) to <31.50 GiB (8063 extents).
  Logical volume cl_centos7template/root successfully resized.
meta-data=/dev/mapper/cl_centos7template-root isize=512    agcount=7, agsize=818944 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=5635072, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 5635072 to 8256512

論理ボリュームが31.5GBに増えました。

[root@vm1 ~]# lvdisplay /dev/cl_centos7template/root
  --- Logical volume ---
  LV Path                /dev/cl_centos7template/root
  LV Name                root
  VG Name                cl_centos7template
:
  LV Status              available
  # open                 1
  LV Size                <31.50 GiB
:

ファイルシステムも32Gへ増えていることが確認できます。

[root@vm1 ~]# df -h
ファイルシス                        サイズ  使用  残り 使用% マウント位置
:                             1000M     0 1000M    0% /sys/fs/cgroup
/dev/mapper/cl_centos7template-root    32G  7.4G   25G   24% /
/dev/vda1                            1014M  245M  770M   25% /boot
:

8.最後に

この面倒な手順を紹介しましたが、そもそもKVMやVMwareに作成する仮想マシンはLVMにする必要ないんですね。
物理マシンならLVMにすることで、HDDを追加した時にパーティションを分けずに論理ボリュームを増やすことができます。
あとはLVMスナップショットか。怖くて使ったことないけど。

非LVM(単純なパーティション)ならディスク拡張はもう少し簡単はずです。