Nested VM な環境で Live Migration する
ある VM を違うホストマシンの VM に移動させる技術を,Migration (マイグレーション) と言っています.Migration 指せる環境を作るにはサーバー機を 2 台用意する方法もありますが,仮想化の技術を試す中ではバカバカしいので,環境も仮想させて仮想マシンがサーバーを行き来する環境構築してみます.
サーバーで動いていた VM を…
別のサーバーの VM に移動,こんな感じ.
前提
- MacBook Pro (CPU は Sandy Bridge 以降)
- VMWare Fusion 5.0.0
今回はホストマシンの 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 アドレスの固定,SELinux と iptables の停止を行います.
それぞれの 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 ホストサーバーを行き来するようなクラウドシステムになれば,より高い効率が望めるわけです.