Javaな日々

NO JAVA, NO LIFE.

Nested VM な環境で Live Migration する

ある VM を違うホストマシンの VM に移動させる技術を,Migration (マイグレーション) と言っています.Migration 指せる環境を作るにはサーバー機を 2 台用意する方法もありますが,仮想化の技術を試す中ではバカバカしいので,環境も仮想させて仮想マシンがサーバーを行き来する環境構築してみます.

f:id:yksris:20130314084400p:plain
サーバーで動いていた VM を…

f:id:yksris:20130314084407p:plain
別のサーバーの VM に移動,こんな感じ.

前提

今回はホストマシンの MacBook Pro 上に『移動させる VM をホストするサーバー』を仮想させた VM を 2 台用意して,その仮想 VM の間で VM を移動させます.(つまり,仮想 VM の中で仮想 VM を動かすということ)

※ 前提でホストマシンは MacBook Pro としていますが,Windows 機でも VMWare Workstation 等が動くのであれば同じように環境を構築できると思われます.

手順

Mac 上の VMWare Fusion を使って,ネットワークにブリッジ接続する形で仮想マシンを 2 台用意します.

それぞれの仮想マシンの設定ファイル MACHINE_NAME.vmwarevm/MACHINE_NAME.vmx を vim などで開き,最後の行に以下を追記します.

vhv.enable = "TRUE"

それぞれの VM に CentOS をインストールします.パッケージをカスタマイズする箇所では X Windwow System と GNOME,メインの仮想化に関するツール,最低限のビルドツールをインストールしておけば十分です.

CentOS で IP アドレスの固定,SELinuxiptables の停止を行います.

それぞれの VM で,GNOME のメニューバーから Applications → System Tools と辿って Virtual Machine Manager を起動します.

仮想サーバー 1 に QEMU を使って仮想マシンを 1 台作成します.

仮想マシンを作成すると /var/lib/libvirt/images に仮想ディスクが生成されるので,これを netfs で仮想マシン 2 と共有させます.この時,リモートから /var/lib/libvirt/images の読み書きの際に root 権限が必要になってしまうので,/etc/exports で設定してあげます.

仮想マシン 2 側で netfs で共有するように設定した仮想ディスクイメージを仮想マシン 2 自体 (正確には違うが…) に結びつけます.

仮想マシン 2 側でネットワーク共有している仮想ディスクイメージを主とした仮想マシンを作成します.

仮想マシン 1 側で作成した VM を起動させて,仮想マシン 2 側から Migration してやります.そうすると,仮想マシン 1 から 2 へ,VM が Migration できます.

ざっと流れはこんな感じです.詳しいことは後で付け足していきます.

今回のように仮想ディスクに関しては,ネットワークを通して使用することで VM を移動させる際のコピーの手間を省くことができますが,処理速度に直接関係する仮想メモリについてはそうはいきません.現在の仮想化技術で Migration を行う際は,このように仮想メモリの内容をネットワーク越しに移動先の VM にコピーしています.

なぜ移動させるか

仮想化のメリットとして,Migration が可能だということが挙げられますが,なぜか.負荷の低いサーバーを集約,または負荷の高いサーバーを分散させることによって,サーバー稼働率をあげられるからです.仮想マシンに対して,ホストマシンのスペック以上のスペックをあたえることを『オーバーコミット』と言いますが,これができるから集約・分散が行えます.負荷に合わせてリアルタイムで VM ホストサーバーを行き来するようなクラウドシステムになれば,より高い効率が望めるわけです.