KVMの概要
KVMはLinuxのカーネル自体をハイパーバイザとする仕組み。
Intel VT-x
やAMD-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)