2012年2月5日日曜日

VirtualBox ディスク容量変更方法

「これだけあれば事足りるだろう」との決定を下した後、「こんな筈じゃなかった!」とハードディスクの容量が足りなくなる事は人の世の常。今回はVirtualBoxのディスク容量を変更する方法をご紹介します。やらなきゃいけない事は
  1. 仮想ディスクの容量変更
  2. パーティションサイズの変更
です。

試した環境

  • VirtualBox 4.1.8
  • ゲストOS:CentOS 6.2
  • ホストOS:Windows 7, Vista

仮想ディスクの容量変更

容量増やしたい場合
作業前に念のためバックアップ(クローン)を作成しておくことを推奨します。
コマンドプロンプトを起動し、VirtualBoxのインストールフォルダに移動し、以下のコマンドを実行。
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd VDIファイルパス --resize 希望サイズ(MB)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
容量減らしたい場合(需要あるのか?)

注:これまでもそしてこれからも未検証

仮想ディスクのサイズ変更だけなら、以下の方法でいけるかもしれませんが…
  1. 希望のサイズの空仮想ディスクを新規作成
  2. 既存の仮想ディスクの内容を空仮想ディスクにコピー
ただし後述の通りパーティションサイズはそのままなので、この場合起動できるかどうか分からん。

仮想ディスクのコピーは以下コマンドを実行。
ああでもコピー先の方が容量少ないとこの段階でエラー発生しそうだな。
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe clonevdi コピー元VDIファイル コピー先VDIファイル --existing
※参考

パーティションサイズの変更

仮想ディスクの容量変更しても、残念ながらパーティションサイズは元のままですので、ここも変更する必要があります。普通にCentOSをインストールした場合、ルートディレクトリはLVMパーティションとして作成されるので、ここではLVMパーティションのサイズ変更手順を解説します。
尚、LVMパーティションかどうかを確認するには以下コマンド。
# fdisk -l
/dev/sda1 …
/dev/sda2 … Linux LVM

そもそもLVMって何なのかってのは割愛。
ちなみに僕がとった流れは以下の通り。多分もっとスマートなやり方があると思うけど…
  1. 未割り当て領域に新規パーティション作成
  2. LVMパーティションに1.で割り当てたパーティションがっちゃんこしてサイズ拡大
未割り当て領域に新規パーティション作成
僕はGparted使いました。以下ページからISOファイルをダウンロード。
ダウンロードしたISOファイルをIDEコントローラにマウントした状態(「設定」→「ストレージ」で「IDEコントローラ」にISOファイルを割り当て)で仮想マシン起動。

その後は以下の流れを辿って、GpartedをGUIモードで起動。
  • Gparted Live (Default settings)
  • 言語:「Japan」
  • モード:GUI(「0」)
未割り当て領域を右クリック→「New」で表示されるダイアログにて新規パーティションを作成。以下のような感じで。

その後は
  • ツールバーの「Apply」をクリックし、変更を適用。
  • 左上の「Exit」アイコンをダブルクリックし、一旦シャットダウン。
  • シャットダウンしたらGpartedのISOファイルの割り当て解除し、仮想マシンを再度起動。
起動したら以下コマンドで新規パーティションの作成確認。
# fdisk -l
/dev/sda1 …
/dev/sda2 … Linux LVM
/dev/sda3 … Linux
LVMパーティションに新規作成したパーティションがっちゃんこしてサイズ拡大
まずは新規パーティションをPVとして作成。
# pvcreate /dev/sda3
…
Physical volume "/dev/sda3" successfully created
# pvdisplay ←PVの情報を表示

次に新規PVをVGへ登録。vgdisplayでVGの名前を確認し、vgextendでその名前を指定する。vgextendが成功したら、vgdisplayでVGサイズを確認してみてください。増えてればOKです。
またこの時、「Free PE / Size」の右側をメモしておいてください。
# vgdisplay
--- Volume group ---
VG Name               vg_virtualbox
…
# vgextend vg_virtualbox /dev/sda3
Volume group "vg_virtualbox" successfully extended
# vgdisplay
--- Volume group ---
…
VG Size  9.50 GiB
…
Free PE / Size  511 / 2.00 GiB

最後に、LVのサイズを拡大。
「lvextend -L [拡大サイズ] [LV名]」と打ち込みます。サイズには前述の「Free PE / Size」の右側の数字の値を、LV名はlvdisplayで表示される「LV Name」を指定。
# lvextend -L +2G /dev/vg_virtualbox/lv_root
Logical volume lv_root successfully resized
# resize2fs /dev/vg_virtualbox/lv_root

すべてが完了したら、lvdisplayやdfでサイズを確認してみてください。

※参考

2 件のコメント:

Hiroyuki Kobayashi さんのコメント...

VirtualBoxのディスク容量で困っているところでした。
非常に助かりました。
ありがとうございました。

おもくそ さんのコメント...

Re: Hiroyuki Kobayashi さん
どうもです。
Chefとか使ってInfrastructure as codeしてて、かつデータストア乗ってなければ、
Immutable Infrastructure だーっつって新規VMさくっと作って古いの廃棄って方が手っ取り早い&すっきり綺麗でしょうけど、
そもそもディスクサイズが足りなくなるのは得てしてデータの増大ってな訳で…