LVM にインストールした仮想マシンのディスクをあとから増やす方法

host 側に LVM でパーティションを切って、そこに KVM なりなんなりの仮想マシン (guest) をインストールした場合、あとから guest のディスクを増やすのにはこんなふうにすればいいかな、というメモ。

まず host 側で LVM パーティションを作成し、そこに guest をインストール。

# lvcreate --size 4G --name guestvm /dev/VolGroupVM
# virt-install --connect qemu:///system --name guestvm --ram 512 --file /dev/VolGroupVM/test # (略

guest のインストールでは LVM を使用せず、普通にパーティションを切る。3つ目のプライマリパーティションを / にマウントして、全部ひとまとめ。

  • /dev/vda1 => /boot
  • /dev/vda2 => (swap)
  • /dev/vda3 => /

guest インストール後の df と fdisk の結果はこんな感じになる。

[guest]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/vda3              3454588   2224760   1051508  68% /
/dev/vda1               101086     17867     78000  19% /boot
tmpfs                   255296         0    255296   0% /dev/shm

[guest]# fdisk /dev/vda
Command (m for help): p

Disk /dev/vda: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1          13      104391   83  Linux
/dev/vda2              14          78      522112+  82  Linux swap / Solaris
/dev/vda3              79         522     3566430   83  Linux


さて、拡大したくなったら一旦 guest を落として、host 側で LVM パーティションを拡大。

[host]# lvextend --size +10G /dev/VolGroupVM/guestvm

guest を起動をするとディスク自体は大きくなってるけどパーティションテーブルがそのままなので、

[guest]# fdisk /dev/vda
Command (m for help): p

Disk /dev/vda: 15.0 GB, 15032385536 bytes
255 heads, 63 sectors/track, 1827 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1          13      104391   83  Linux
/dev/vda2              14          78      522112+  82  Linux swap / Solaris
/dev/vda3              79         522     3566430   83  Linux

一旦末尾のパーティション (primary 3) を削除して、新しくディスクいっぱいのパーティションを作成。

Command (m for help): d
Partition number (1-4): 3

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (79-1827, default 79): 
Using default value 79
Last cylinder or +size or +sizeM or +sizeK (79-1827, default 1827): 
Using default value 1827

Command (m for help): p

Disk /dev/vda: 15.0 GB, 15032385536 bytes
255 heads, 63 sectors/track, 1827 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1          13      104391   83  Linux
/dev/vda2              14          78      522112+  82  Linux swap / Solaris
/dev/vda3              79        1827    14048842+  83  Linux

"w" でパーティションテーブルを書き込んで fdisk 終了。新しいパーティションテーブルを認識させるために guest を reboot

起動したら resize2fs でファイルシステムを拡大。

[guest]# resize2fs /dev/vda3
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vda3 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/vda3 to 3512210 (4k) blocks.
The filesystem on /dev/vda3 is now 3512210 blocks long.

[guest]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/vda3             13617624   2226496  10693996  18% /
/dev/vda1               101086     17867     78000  19% /boot
tmpfs                   255296         0    255296   0% /dev/shm

無事、拡大に成功。guest の再起動は必要だけども、LVM での拡大と fdisk でのパーティション切り直しは一瞬で終わるし resize2fs はオンラインでできるので、ダウンタイムはかなり短くてすむ。

もちろん guest 側でも LVM を使っても問題ないのだけど (vgextend / lvextend / resize2fs すればいい)、LVM だと何かあった時 (起動しないけどファイルをサルベージしたいとか)、host からマウントするのが面倒そうだったので、こんな感じにしてみた。