KVMの概要

KVMはLinuxのカーネル自体をハイパーバイザとする仕組み。 Intel VT-xAMD-VといったCPUの仮想支援機能を必要とし、完全仮想化によりOSの仮想環境を提供します。

KVMの処理の仕組み

KVMでは仮想マシンにリソースを割り振るためのスケジューラやメモリ管理についてはLinuxカーネルのものを利用します。

ただし、KVMを使うことで変更される点が大きく2つあります。

− プロセスに新たなゲストモードが追加される − ゲストOSからのIO要求は/dev/kvmを経由された処理される

Linuxには通常、カーネルモードとユーザモードの2つがある。カーネルモードは全てのメモリ空間にアクセスすることができ、他のリソースを管理することができる。 ユーザモードは通常のプログラムを動作するモードでアクセスできるリソースは限られている。

KVMを使うと新たにゲストモードが追加される。そのプロセス自体が内部的にカーネルモードとユーザモードという2つのモードを持つ。

KVMは2つのコンポーネントから構成されている。ハードウェアの仮想化を管理するためのデバイスドライバ/dev/kvmと、KVMように修正れたQEMUからなる。 QEMUのプロセスはゲストOSの物理メモリとゲストモードにおけるカーネルモードとして実行されるデバイスドライバの呼び出しとのマッピングを行います。IO処理はCopy on Writeディスクイメージやその他のQEMUの機能と一緒に直接生成される。

このゲストOSのI/O命令は、次のような流れで実行される。

1)ゲストがI/O命令を発行する
2)ホストカーネルが命令をトラップし、仮想マシンのユーザー空間に遷移する
3)仮想マシンのユーザー空間でゲストに代わってI/Oを初期化する
4)仮想マシンのユーザー空間からカーネルに制御が戻る
5)カーネルがゲストコードを再開する

KVMが導入可能か確認

ホストマシンにて下記コマンドを実行しOKと表示されること

# grep -E 'svm|vmx' /proc/cpuinfo > /dev/null &&  echo OK ← CPUの完全仮想化対応確認
OK ← OKと表示されれば完全仮想化対応CPU

# grep -E 'svm|vmx' /proc/cpuinfo > /dev/null &&  echo OK ← CPUの完全仮想化対応確認
OK ← OKと表示されれば完全仮想化対応CPU

仮想化関連のパッケージをインストール

# yum -y groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" "Virtualization Tools"

# yum -y install '*guestf*' ← オフラインゲスト編集ツールインストール

■確認(KVM + QEMU)

lsmodコマンドでモジュールリストを確認

# lsmod | grep kvm
kvm_amd                40635  0
kvm                   345460  1 kvm_amd

KVMはQEMUというCPU仮想化ソフトが必要なため、rpmが入ってるか確認する

# rpm -qa | grep qemu-kvm
qemu-kvm-tools-0.12.1.2-2.355.el6.x86_64
qemu-kvm-0.12.1.2-2.355.el6.x86_64

toolsはなくても問題ない?

■確認(libvirt)

libvirt は、仮想マシン(VM)を管理するAPIを提供するライブラリです。VMだけではなく、仮想ネットワークやストレージなども管理できます。libvirtd というデーモンで実行されます。

# rpm -qa | grep libvirt

仮想マシン制御起動

# /etc/rc.d/init.d/libvirtd start ← 仮想マシン制御起動※CentOS6の場合
libvirtd デーモンを起動中:                                 [  OK  ]

起動後、仮想のバーチャルブリッジのネットワークインターフェースが作成される

# ifconfig -a
・
・
・
virbr0    Link encap:Ethernet  HWaddr 52:54:00:97:B9:07
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

virbr0-nic Link encap:Ethernet  HWaddr 52:54:00:BF:D8:69
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)