KVM で qcow2 形式のイメージをルートパーティションに使っているゲストで、パーティションの拡張をやったのでメモっておきます。
ホストでディスクイメージの拡張
ゲストを停止します。
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