Linux標準の仮想化について
2011.09.27 Author: さー
Linuxの仮想化として最近よく話題になるKVMとLXCについて比較してみようと思います。
KVMは完全仮想型、LXCはコンテナ型による方式です。
共通点としてはLinux標準だということです。
なので頻繁に再設計されるKernelにどちらも自動追従します。
ここで仮想化の方式について一度おさらいしてみます。
<完全仮想化>
完全仮想型とは、物理マシンの上で、
仮想的なマシンをエミュレートし、
それぞれでOSを起動した上でアプリケーションを実行させる仕組みです。
ex.KVM
<OS仮想化型(コンテナ型)>
コンテナ型は、異なる仮想マシン(コンテナ)に対応するプロセスたちを
同じカーネルで混在させ、相互に異なるディスク領域へアクセスする仕組みです。
ex.Virtuozzo,LXC
<準仮想化型>
準仮想化は、ゲストOSがホストOSのAPIを利用する仕組みです。
メジャーなものが多いですね。
ex.Xen,ESX/ESXi,Hyper-V
KVMなどの完全仮想型の場合、仮想マシンをエミュレートしてから、その上で OS やアプリケーションを実行させるためOS を選択できるなどの自由度は高いです。
しかし、オーバーヘッドが大きいためコンテナ型よりも処理効率が若干悪くなります。
特にFile Copyなど入出力に関しては、大きな性能の差異が確認されてます。
原因としてKVMの場合、一旦物理マシンをエミュレートするためのオーバーヘッドが大きく、I/O処理で負担になっていることが考えられます。
また同じコンテナ型でもLXCがVirtuozzoと比較して高い性能を示しています。
なぜならLXCの場合、常に最新のカーネルを利用出来ることが考えられます。
これに対してVirtuozzoはLinuxの標準ではなく、Linuxのパッチという形で与えられているため、どうしても開発が後手にまわります。
ここまでくると、LXCが断然お勧めなのかというと、
LXCにも商用利用するにあたりセキュリティ上の懸念点があります。
・/proc/sysrq-triggerでのホスト強制リブート
・システムコールによるsysctl設定の更新
・syslog出力がホストや他コンテナと干渉
・/proc/kcoreやptrace+/proc/[pid]/mem参照による漏えい
などです。
なんだかかなりLXCを推した感じになりましたが、
KVMにしろLXCにしろ優れた仮想化ソフトウェアに変わりはありませんので
迷った時はぜひご相談下さい!!