KVMで仮想マシンを動作させる

現在Linuxの仮想化ハイバーバイザと言えばKVMが有力です。
カーネルに統合されており、Xenのカーネルコンパイルのような煩わしさが少ないという点が強みです。

しかしKVMは他の仮想ハイパーバイザに比べると、ちょっと独特なところがあります。
結論から言うと、KVMは単体で動作しません。
QEMUというKVM誕生のはるか前から存在しているPCエミュレータを利用します。

仮想ハードウェアはQEMUが提供し、CPUの演算だけKVMを介して直接処理されます。
KVMはLinuxのCPU演算を仲介するカーネルモジュールに過ぎず、QEMUを高速化する機能を提供するだけです。
つまりKVMKVMと騒いでいますがそれは、大役を果たすQEMUを高速化させる機能と言えます。

どちらにせよ、KVMとQEMUはセットで動作させなくてはなりません。

KVMの解説情報は非常に多いのですが、なぜかどこに書いてあることも微妙に違います。
ディストリビューションによる違いは特に顕著であり、同じディストリビューションの解説ページでも違います。

流れはこうです。

CPUがKVMに対応しているか
KVMモジュールがインストールされているか
必要なソフトをインストールする
仮想マシンマネージャを起動する
仮想マシンの作成
KVMは有効になっているか
補足情報
  ・動作OS
  ・KVMの操作
  ・libvirt

CPUがKVMに対応しているか

まずはどこにでも書いてある一般的な確認事項から入ってみましょう。
カーネルは必ずKVMがサポートされている2.6.20以降を採用しましょう。

KVMの使用には、CPUが仮想化機能に対応している必要があります。
QEMU自体はCPU仮想化機能は必須ではありませんが、QEMUを高速に動作させるのにKVMはいります。

次のコマンドを実行します。

Intel系CPUの場合
>grep --color vmx /proc/cpuinfo

AMD系CPUの場合
>grep --color svm /proc/cpuinfo



赤く色づいたところがあれば、CPUは対応しています。
CPU自体が対応していても、BIOSで無効になっている場合もあります。
自分のCPUが対応しているかどうかわからないときは、Intel-VT、AMD-Vというキーワードで調べましょう。

KVMモジュールがインストールされているか

コマンドからKVMモジュールがロードされているかを確認します。

>lsmod | grep kvm


なにも表示されなければkvmモジュールをインストールする必要があります。
すでにロードされていれば、KVMのインストール作業は必要ありません。

YaSTからKVMをインストールします。


インストールに成功したら再起動するか、コマンドでモジュールをロードします。

>su
#modprobe kvm
#modprobe kvm_intel
#lsmod | grep kvm


勘の鋭い人なら気づいたでしょうか。AMD CPUを使用している人はモジュール名が「kvm_amd」となることを。


必要なソフトをインストールする

KVMが入っただけでは、たんにモジュールが動作して作業を待っているだけです。

実際に仮想マシンを作成、管理、表示、稼働させる部分が必要です。

YaSTからエミュレータ本体であるQEMUをインストールします。


仮想マシンのGUI管理コンソールである「VirtualMachinManager」をインストールします。
virt-managerで検索します。


仮想マシンのネットワーク接続に必要なブリッジネットワークをインストールします。
bridge-utilで検索します。


インストールが正常に完了することを確認します。

ところでこの時、とても重要なファイルがインストールされます。
libvirtがそれです。
各種の仮想マシン管理ツールで使用される、汎用的なライブラリです。
virt-managerでも使われるので、依存関係にこっそり紛れています。


後で存在を意識する必要があるので、ここで紹介しておきます。


仮想マシンマネージャを起動する

スタートメニューの[アプリケーション]-[システム]-[仮想化]で仮想マシンマネージャを起動します。
(ちなみにYaSTの中にも同じものがあります)


はい、出ましたエラーです。


というのも前節で紹介した、Virt-Managerが使用するlibvirtがまだ有効になっていないからです。
libvirtはライブラリを名乗っているくせにサービスです。

[YaST]-[システム]-[システムサービス]でlibvirtdを選択して、有効にします。


もちろんコマンドで有効にしてもかまいません。

>su
#service libvirtd start
#chkconfig libvirtd on

再び仮想マシンを起動すると、今度はエラーなく起動します。


唯一の接続先である「localhost(QEMU)-Not Connected」をダブルクリックします。
すると管理者パスワードを問われます。

そう、libvirtd経由でQEMUでアクセスするには管理者権限が必要だからです。
パスワードが確認できるとメニューから「Not Connected」が消えます。
※このあたりの権限の振る舞いはUbuntuやCentOSなどで異なります

まだOSをインストールしていないので、ただ接続することだけを確認します。


仮想マシンの作成


左上の[New]を選択すると、仮想マシンの作成ウィザードが起動します。


OSをインストールする必要がある、を選択します。


使用するOSを選択します。ここはopenSUSE11としておきましょう。


概要として、設定項目が表示されます。
ここで各項目を編集できます。「OSインストール」をクリックします。
(ネットワークの設定はここでは割愛されています。ブリッジネットワークの作成は、VirtualBoxのブリッジの設定を参照してください。作成したbr0をネットワークアダプタに割り当てます)


仮想ディスクの追加をクリックします。


物理DVDドライブを指定する場合はデフォルトでいいです。
isoイメージを指定する場合は、「参照」から選択します。
ソースにisoイメージのパスが入力され、プロトコルもfileに変更されます。


するとディスクに、DVDドライブが追加されます。
もしisoイメージやマウントドライブなどの構成を変更する場合は「ディスク」から変更します。


最後にOKをクリックするとQEMUコンソールが起動し、インストールが開始されます。
マウスがキャプチャされた場合は「Alt + Ctrl」で脱出します。

※注意
ディスク作ったり消したりなんとか繰り返してると、仮想マシン作成時にiteration over non-sequenceというエラーダイアログが出ることがありました。これはPythonの文字列処理のエラーらしいです。
もう一度仮想コンソールを起動し直したり、仮想マシンを作成し直したりすると直ったりしました。あまり深刻にならなくていいようです。コマンドから仮想マシンを作成、起動しても問題なく動作しました。
あとOKボタン押すと同時にコンソール表示のためにエラーはいたりしますが、裏ではもうVMがスタートしてたりします。
エラーが出たからといって慌てず、いろいろ動作を確認しましょう。



仮想マシンの構成を変更する場合は、各仮想マシンを開いて「詳細」をクリックします。
DVDメディアなどのマウントもここから行います。



なお仮想マシンが起動しているときはこんな感じ。
レスポンスもなかなか軽快です。

ハイパーバイザ型の仮想システムなので、QEMUコンソールを閉じたからといって仮想マシンが終了するわけではありません。裏で動き続けています。
仮想マシンを終了したい場合は仮想OS内からシャットダウンを行うか、マネージャから仮想マシンをシャットダウンしみます。


ここでちょっと確認 そもそもKVMは本当に有効になっているのか

そもそもQEMUは仮想化ソフトなので、KVMが失敗していても仮想マシンは動作してしまいます。
QEMUがKVMと連携しているかを確認します。
コマンドラインから

>qemu-kvm &

QEMUを単体で起動します。起動デバイスが指定されていないので、通常は起動エラーが発生します。
そこでQEMU上で「Alt+Ctrl+2」を入力すると、QEMU-Monitorが起動します。
(QEMU)に続いて、「info kvm」と入力すると、「kvm support: enabled」と表示されます。


ちなみに

>qemu &

とノーマルQEMUを起動して同じことをすると、「kvm support: disabled」と表示されます。


QEMUでKVMが利用可能であることが確認できました。
QEMU Monitorを元のコンソールに切り替えるには「Alt + Ctrl + 1」を入力します。


補足情報

・動作OS
・KVMの操作
・libvirt
動作OS
Hyper-Vとは異なり、KVMはホストOSが32bitでも64bitでも動作します。
ただその性質上ホストOSが32bitの場合、使用できるゲストOSも32bitに限られます。
なお、Windowsはインストールはともかく運用するのは一筋縄では行きません。頑張って先人の知恵を借りましょう。

KVMの操作
KVMの操作には三種類の手法があります。
KVM管理コマンド
KVMの標準の管理コマンド。QEMUコマンドとKVMコマンドが混じっています。
KVM管理コマンドはその性質上、KVMの設定ファイルであるXMLを直接編集します。
オプションの数が多く複雑であることから、容易ではありません。
virt-install
libvirtを介して実行される、抽象化された各種仮想化システム向けの共通コマンド。
virt-managerによってインストールされる。結構数が多いが、他の仮想システム向けにも使える。
一般的手法。
virt-manager
virt-installのGUIフロントエンド。一般的手法。

たとえばKVM管理コンソールでOSインストールを開始するコマンドを紹介しておきます。

#qemu-img create -f qcow2 ~/testVM.img 20G
#/usr/bin/qemu-kvm -hda ~/testVM.img -boot d -cdrom /data/suse-11.3-DVD-i586-.iso -m 1024

QEMUのコマンドで20GBのディスクを作成。
KVMでメモリ1GB、空のディスクを接続して、DVDにisoイメージをマウントして、DVDドライブからブートさせるという作業を実施しています。

libvirt
libvirtとは、各種仮想システムのバラバラの管理手法を抽象化、共通化させるライブラリです。
ラッパーと呼ばれるやつです。
要はいろんな仮想管理ソフトを動作させるにはlibvirtが必要、ということです。

KVMは特にこのlibvirtを介した制御がデフォルトの管理方法になります。

複雑なXMLファイルを直接編集したり、KVMコマンドで編集したりすることも可能ですが、基本的にlibvirtを介した設定変更がもっとも確実です。
実績で言えば、KVMを牛耳っているRedhatもlibvirtを介した設定変更したサポートしてません。らしいです。
VirtualMachinManagerもlibvirtを使用して動作します。

サーバなどGUIを搭載しないコンソールの場合でも、virt-managerやvirt-installはlibvirtdを介してリモートから実行できるため、サーバ側にKVMとlibvirtdのみをインストールし、リモートからのクライアント管理ができます。





prev.gif