2010年12月21日火曜日

VirtualBoxで仮想ディスクのサイズを減らしてみた(4)

(1)、(2)、(3)と続いたエントリも今回で最後です。

仮想ディスクの掃除が完了しましたので、ホストOSのコマンドラインからVirtualBox付属のVBoxManageコマンドを使って、仮想ディスクのファイルサイズを縮小します。

仮想ディスクはスナップショット毎に、.vdi形式の差分ファイルが生成されます。VBoxManageコマンドは差分ファイル単体を個別に指定してサイズを縮小できますが、指定できるのは常に単一ファイルです。したがって、仮想ディスクに関係するファイルを一括で指定して、まとめてサイズを縮小するようなことはできません。対象ファイルのファイル名は、仮想メディアマネージャを使って一つ一つ調べることになります。これが本来のやり方です。

しかし、Mac OS X版のVirtualBoxの仮想メディアマネージャは、複数の仮想マシンそれぞれにスナップショットがある場合に、仮想ディスクを正しくツリー表示できないようです。信頼できない情報を元に作業を続けたくはありません。

そこで今回は、コマンドラインからVBoxManageコマンドで仮想ディスクの全ファイルのリストを出力し、仮想マシン名とスナップショット名を元に対象ファイルを探す方法を紹介します。

VirtualBoxのスナップショット名は、複数の対象に同じ名前をつけられますので、今回は念のため、一意のIDであるUUIDを極力使うようにします。

なお、仮想マシンのある時点の状態を保存するスナップショットのUUIDと、そのスナップショットの時点での仮想ディスクの状態を表すUUIDは別物ですので注意してください。仮想マシンには仮想ディスクが複数接続されている事もありますので、スナップショットと同じUUIDはつけられません。

実際の手順はイカの通りです。

作業に慣れてくれば、直接Snapshotフォルダに移動して、ファイルの日付とサイズから対象ファイルを推測するような手抜きもできるのですが、読者の方々にとっては今回が初めての作業のはずですし、失敗した場合の被害も大きいので、多少面倒でも確実な方法を紹介します。


・仮想ディスクのサイズを減らす
  1. これまでの作業内容を保存するために仮想マシンのスナップショット(2回目)を取ります。作業手順は5.〜9.と変わりませんので省略します。後の作業の都合上、スナップショット名は半角英数字で、他のスナップショットと区別がつくような名前を選ぶようにしてください。私は「2010-12-21」のように、スナップショットを取った日付を入れるようにしています。
  2. 仮想マシンを一度起動して仮想ディスクに問題がない事を確認します。特に注意するのはswap領域が元通りになっていることです。swapが有効かどうかは、CUIの場合は「swapon -s」コマンド、GUIの場合は「システム」-「システム管理」-「システム・モニタ」の「リソース」タブで確認できます。
  3. 仮想マシンをシャットダウンします。
  4. 28.で作成した仮想ディスクから、29.の作業の影響を取り除くために、2回目のスナップショットに復元します。これでスナップショットのツリーの「最新の状態(変更)」が「最新の状態」になっているはずです。
  5. ここからはホストOSのコマンドライン上で作業しますので、Teminal.appを起動してください。VirtualBoxを終了させる必要はありませんが、対象の仮想マシンは電源オフの状態になっている事を確認してください。
  6. コマンドラインから「VBoxManage showvminfo (仮想マシン名)」を実行します。最後の方で、指定した仮想マシンのスナップショットの一覧が表示されますので、28.で作成したスナップショットの名前と一致する行を探して、UUIDを確認してください。
    $ VBoxManage showvminfo Ubuntu10.10
    (中略)
    Snapshots:
    
       Name: 2010-10-29 (UUID: 783672B3-3AE1-7264-A73B-C35D6384ACB0)
          Name: 2010-12-21 (UUID: 1c0653cd-e897-41af-bd30-55f3a195ff33) *
    
    $
    
  7. 「VBoxManage list hdds」コマンドの出力結果から、「Usage:」行の仮想マシン名とスナップショットのUUIDが一致する仮想ディスクを探します。下記の例では上記のコマンドに「| grep -B 7 -e (スナップショットのUUIDか一意のスナップショット名)」を追加して表示させていますが、よく分からない方はターミナルのスクロールバッファを検索した方が早いかもしれません。
    $ VBoxManage list hdds|grep -B 7 -e 1c0653cd-e897-41af-bd30-55f3a195ff33
    
    UUID:        550e8400-e29b-41d4-a716-446655440000
    Parent UUID: 5748decc-f629-461c-9a36-a35a221fe21f
    Format:      VDI
    Location:    /Users/msmhrt/Library/VirtualBox/Machines/Ubuntu10.10/Snapshots/{550e8400-e29b-41d4-a716-446655440000}.vdi
    State:       created
    Type:        normal
    Usage:       Ubuntu10.10 (UUID: 38b86f85-2575-52a9-a531-23108d8da837) [2010-12-21 (UUID: 1c0653cd-e897-41af-bd30-55f3a195ff33)]
    $
    
    仮想ディスクのエントリを見つけたら、「Location:」行を探してください。この行で表示されているのが対象ファイルのフルパス名です。今回は「/Users/msmhrt/Library/VirtualBox/Machines/Ubuntu10.10/Snapshots/{550e8400-e29b-41d4-a716-446655440000}.vdi」になります。
  8. 「ls -al (対象ファイルのフルパス名)」で、作業前のファイルサイズを確認します。
  9. VirtualBoxの画面上で、29.の手順で作成した新しいスナップショットはそのままにして、5. で作成した古いスナップショットだけを削除します。この作業で仮想ディスクがマージされると、28.で作成された仮想ディスクのファイルサイズが、5.で作成された仮想ディスクのファイルサイズをそのまま追加したぐらいに増えますが、これは一時的な状態ですので気にしないでください。なお、くれぐれも対象ファイルをrmコマンド等で直接削除しないようにしてください。
  10. 「VBoxManage modiafyhd (対象ファイルのフルパス名) --compact」コマンドを実行します。
    $ VBoxManage modifyhd /Users/msmhrt/Library/VirtualBox/Machines/Ubuntu10.10/Snapshots/{550e8400-e29b-41d4-a716-446655440000}.vdi --compact
    Oracle VM VirtualBox Command Line Management Interface Version 3.2.12
    (C) 2005-2010 Oracle Corporation
    All rights reserved.
    
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    $
    ファイルサイズにもよりますが、多少時間がかかりますので、間違って中止しないように注意してください。
  11. 再度「ls -al (対象ファイルのフルパス名)」を実行して、35.で確認したファイルサイズよりもサイズが減っていることを確認してください。ファイルサイズに全く変化が無いか、少し増えているようであれば、対象ファイルの選択を間違えた可能性がありますのでやり直してみてください。
  12. 最後にホストOSのディスクの空き容量を確認して最初と比べて減っていれば作業は完了ですが、今まで一度もスナップショットを作成したことがない仮想マシンの場合は、今回作成したスナップショットによって、空き容量が逆に減っているかもしれません。その場合は今回作成した唯一のスナップショットを削除して、仮想ディスクのベースになる.vdiファイルに対して、37.の手順を実行してください。
・最後に
一連のエントリを書いている間にVirtualBox 4.0のβ版がいくつかリリースされましたが、VirtualBoxのVer. 3.2.12以外の実行環境ではまだ試していませんのでご注意ください。

(了)

0 件のコメント:

コメントを投稿