KVM のゲストOSのルートパーティションの拡張を行う


KVM で qcow2 形式のイメージをルートパーティションに使っているゲストで、パーティションの拡張をやったのでメモっておきます。

構成

  • ホスト・ゲストともに CentOS 6.3
  • ゲストのディスクイメージは qcow2 形式の 1 台のみ。全領域がルートパーティション *1
  • サイズを 5GB → 10GB に拡張する

ホストでディスクイメージの拡張


ゲストを停止します。

virsh shutdown guest


(念のため)イメージをバックアップしておきます。

cd /var/lib/libvirt/images
cp guest.qcow2 guest.qcow2.bak


イメージを拡張します。
CentOS 6 なら次のコマンドで簡単に拡張できました。CentOS 5 の場合「raw に変換 → 拡張 → qcow2 に変換」とする必要があるっぽいです。

qemu-img resize guest.qcow2 +5G


ゲストを起動します。このとき、すぐにコンソールを操作してシングルユーザモードで起動させてください。

virsh start guest
virsh console guest


シングルユーザモードで起動する手順は、大体次のような感じです。

  • GRUB のカーネルを選択する画面で 'e' を押して編集モードにする
  • kernel の行の最後に '1' を追記する
  • 'b' を押して起動する

ゲストでパーティションテーブルの拡張(シングルユーザモード)


fdisk でパーティションテーブルを弄ります。

fdisk /dev/vda


まずは 'u' で単位をブロックではなくセクタにします。
これを行わない場合、RHEL 6 系で普通にセットアップしていると間違いなくパーティションの位置がズレるらしいです*2

u


'p' で変更前のパーティションテーブルの内容を表示します。

p


"始点" が超重要なのでメモっておきます。

ディスク /dev/vda: 10.7 GB, 10737418240 バイト
ヘッド 181, セクタ 40, シリンダ 2896, 合計 20971520 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000306d8

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1   *        2048    10485759     5241856   83  Linux


パーティションを削除して作り直します。

d 1  ※ 削除
n    ※ 新しいパーティションの作成
p    ※ プライマリパーティション
1    ※ パーティション番号は1


次に、パーティションの "始点" の入力が求められます。必ず変更前と同じにします。

2048


次に "終点" の入力が求められますが、全領域を使うのでそのまま Enter で OK です。


変更後のパーティションの確認しておきます。

p


次のようになっているはずです。

ディスク /dev/vda: 10.7 GB, 10737418240 バイト
ヘッド 181, セクタ 40, シリンダ 2896, 合計 20971520 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000306d8

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1            2048    20971519    10484736   83  Linux


間違いが無ければ 'w' で書き込みます。多分警告みたいなものが出ますが無視します。

w


ゲストを再起動して、もう一度シングルユーザモードで立ちあげます。

sync
reboot

ゲストでファイルシステムの拡張(シングルユーザモード)


パーティションの拡張にさえ成功していれば、後は `resize2fs` でファイルシステムを拡張するだけです。


変更前の「df -h」は次のような感じでした。

Filesystem            Size  Used Avail Use% マウント位置
/dev/vda1             5.0G  3.7G  1.1G  79% /
tmpfs                 499M     0  499M   0% /dev/shm


resize2fs でファイルシステムのリサイズをします。

resize2fs /dev/vda1


「df -h」で確認してみます。

# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/vda1             9.9G  3.7G  5.7G  40% /
tmpfs                 499M     0  499M   0% /dev/shm


成功しました!


最後にもう一度リブートして、マルチユーザモードに戻しておきます。

sync
reboot

*1:パーティションを複数切ったり LVM にしたりするとこの手の作業が面倒そうなので可能な限りシンプルにしています

*2:どこかでそのような情報を見たのですがどこだったか忘れました・・・