KVMメモ

仮想化技術であるKVMを試してみようと調べたので、整理してみました。まだ実際に試してはいないので、技術的に深く踏み込んだ内容はあまりありません。そもそも仮想化とは何か、から始まりKVMの特徴、という流れで書いています。

仮想化について

仮想化とは

Wikipediaでは、

仮想化(英: Virtualization)とは、コンピュータにおいてリソースの抽象化を指す用語である。「リソースの物理的特性を、そのリソースと相互作用するシステム/アプリケーション/エンドユーザーから隠蔽する技法。単一の物理リソース(サーバ、OS、アプリケーション、補助記憶装置など)を複数の論理リソースに見せかけたり、複数の物理リソース(複数の補助記憶装置群やサーバ群)を単一の論理リソースに見せかけたりできる」という実用的定義がある[1]。また、単一の物理リソースを何らかの特性の異なる単一の論理リソースに見せかけることもできる。

仮想化 - Wikipedia

と記述されています。

しかし、ここではx86仮想化に限って以下続けます。

x86仮想化とは、x86ベースのゲストオペレーティングシステム (OS) を、別のx86ベースのホストOS上で、ほとんど(あるいは全く)ゲストOSを修正することなく動作させる手法である。

x86仮想化 - Wikipedia
なぜ仮想化か

では、仮想化のメリットは何か、という話です。ビューティフルアーキテクチャによると、柔軟性や性能上の隔離や資源の有効活用が仮想化のメリットです。

まず、柔軟性について。複数ユーザがOSを使うと言う観点で考えると、マルチタスクOSで十分ですが、管理者権限がないとソフトウェアのインストールができませんが、仮想化されたOSを1人1つ割り当てれば、限られた範囲で自由に使うことができます。

次に、性能上の隔離について。こちらもマルチタスクOSと比較すると、カーネルは複雑なので、ユーザごとに使用する資源の限度を設けるのは困難ですが、仮想化されたOSごとに資源の限度を設けることはできるので、他のユーザに迷惑をかけるようなことはできなくなります。

最後に、資源の有効活用について。CPUを使うアプリケーションやメモリを使うアプリケーションを別々の物理マシンにするのは資源の無駄ですが、同一OS上で実行すると1つの機能が別の機能を巻き込んだ障害を起こす可能性があります。仮想化されたOSを使うことで、独立した環境で資源を有効活用することができます。

その他に、機能ごとのマシンを増やすのが簡単というのもありますね。クラウドサービスとして考えると必要な時に必要な資源だけを利用できるというメリットも出てくるかと思います。

仮想化の種類

ハードウェアのエミュレーション方式から、次のように、完全仮想化と準仮想化に分けられます。

準仮想化 完全仮想化
ゲストOSのコード書き換え あり なし
エミュレーションのオーバーヘッド 小さい 大きい

準仮想化では、ゲストOSのカーネルがハードウェアと通信する命令はハイパバイザと通信するよう置き換えられ、ハイパバイザが代わりに実行する。そのため、ゲストOSの完全な互換性は失われるが、完全仮想化と比較して性能が良い。

一方、完全仮想化は、ハイパバイザが、ゲストOSのハードウェアと通信する命令を検出し、ハイパバイザを直接呼び出す命令に置き換える、という形でハードウェアを完全にエミュレートする。このエミュレーションのコストが大きいので準仮想化と比較して性能が低い。しかし、CPUの仮想化支援機能(Intel VTやAMD-V)やパラバーチャルドライバを使うことで性能は改善される。

また、ハイパバイザの動作方式から、Type1(ネイティブ方式)とType2(ホスト方式)に分けられます。

Type1 Type2
ハイパバイザの動作場所 ハードウェア上 ハードウェア上のホストOS上
メリット 性能が良い インストールが簡単

ハードウェア上でハイパバイザが直接動作している方式をType1の仮想化という。KVMのようにLinuxカーネルとして実装されているハイパバイザも含まれる。

一方、Type2の仮想化は、通常のOSの上に、通常のアプリケーションのようにハイパバイザがインストールされる方式のことをいう。インストールが簡単だが、ホストOSにスケジューリングされることやレイヤが厚いことなどから、Type1と比較して性能が低い。

KVMについて

KVMとは

KVM(Kernel-based Virutal Machine)は、x86ハードウェア上で、CPUの仮想化支援機能を使って完全仮想化を実現する技術です。開発したのはイスラエルのQumranet社です。

特徴は、

  • 完全仮想化
  • Linuxカーネルのモジュールとして実装されている
    • Linuxの既存の機能を利用できる
  • ハードウェアのエミュレーションにQemuを使っている
    • KVM自体は新しい実装だが、実績あるQemuを使っているので、比較的安定している
  • CPUの仮想化支援機能を使うことで高速化を実現している
  • Virtioというパラバーチャルドライバで性能を向上させている(参照)

です。

KVMの歴史
  • 2006/10: アナウンスされる
  • 2006/12: Linux Kernelにマージされる
  • 2007/02/04: KVMが標準搭載されたLinux2.6.20がリリースされる(参照)
  • 2008/09/04: Red HatがQumranetを買収した(参照)