ここでは、専門的な構造や技術を、ある程度噛み砕いて説明します。
変な例えを用いているので、若干ズレが生じているかもしれませんがご了承ください。
インテル® バーチャライゼーション・テクノロジーとは、
仮想化をハードウェアレベルでサポートする技術の事で、大きく分けて下記3つの機能があります。
1.VT-x
2.VT-i
3.VT-d
詳細は後ほど説明することにしまして・・・
インテル® バーチャライゼーション・テクノロジーの詳細に入る前に、まずは前提となる仮想化の説明から進めます。
ここでいう仮想化はコンピュータの仮想化で、具体的にはPCやサーバーになります。
物理的な1台のマシンで、複数台のマシンを実現することを仮想化と言い、仮想化で構築した複数のマシンのことをバーチャルマシン(VM)と呼びます。
また各VMにインストールされたOSはゲストOSと呼びます。
一つのCPU、一つのNIC、一つのメモリといったハードウェアリソースを複数のVMで共有することが可能です。
1台のマシンを購入すれば、複数のサーバーが立てられる、なんだかお得です。
また仮想化には現在大きく分けて2つの実現方法
1.ハイパーバイザ型
2.ホストOS型
に分類されます。
今回のお題には直接的な関係はないので簡単に説明すると、ハイパーバイザ型は土台にVMMをインストールし、その上にゲストOSをインストールします。
ホストOS型は、土台にOSをインストールしそのアプリとしてVMMをインストール、さらにその上にゲストOSをインストールします。
【マシンの分離と独立】
各VMは独立して扱われます。
上の図で説明しますと、仮想サーバー3から仮想サーバー1は物理的に分離した、別のサーバーマシンとして扱うことができます。
例えば、仮想サーバー1を企業のサーバーとし、仮想サーバー3をサーバーではなく一個人のクライアントPCとして構築し、実際にアクセスしてみるといった事も可能です。
【カプセル化】
一つのVMをファイルパッケージとして扱い、カプセル化されています。
具体的には、OSやインストールしたソフトだけでなく、ハードウェアやBIOSもファイルで管理されており、一つのパッケージとして扱われます。
【ハードウェア非依存】
仮想化バーチャルマシンモニタ(VMM)というソフトが必要になり、物理ハードウェアはこのVMMによってリソース配分が行われ、各VM毎に仮想的なハードウェア環境が構築されます。
ユースケース毎に異なってくると思いますが、主なメリットは下記になります。
【物理マシンの削減】
1台のマシンで、複数のマシンを実現できるためコストの削減や省スペース化に有効です。
【ハードウェアリソースの有効活用】
最近のコンピュータは非常に高性能です。
このレビューのために提供頂いたCore-i7 3770は4コア8スレッドで、ハイパーバイザによっては8コアもしくはシングルコアの8CPUとして扱う事も可能です。
例えば、ちょっとしたWebサーバーやファイルサーバーを構築する場合、このCPUはオーバースペックで性能を持て余す事になるでしょう。
仮想化によって複数台のVMでCPUリソースを扱うことにより、本来の性能を使い切る事が可能になります。
【マシンの複製が容易】
仮想化されていない場合、同じマシンを複数台用意する場合は、OSのインストールにアプリのインストールとそれらの設定が台数分必要になります。
しかしVMの場合はカプセル化されているため、ファイルパッケージをコピーするだけで、同じマシンの複数台作成が容易に可能です。
これは、似たようなサーバーを複数台立てたい場合や、サーバーアプリ開発の過程でステップ単位でバックアップを取ったり、クラッシュテストをする場合のテスト環境を複製したりする場合に容易に行えるため非常に便利です。
【マシンの移植が容易】
カプセル化とハードウェア非依存によるメリットです。
1台のマシンに1つのOSを入れた場合、他のマシンにHDDだけ移して稼動させることは基本的には不可能です。全く同じハードウェア構成なら可能かもしれませんが、構成が異なる場合はシステムが不安定になることが考えられます。
仮想化している場合、ハードウェアへの依存が非常に低いため、構成の異なるマシンでも容易に移植が可能です、またカプセル化されているため最短の場合コピーするだけで運用が可能になります。
これはサーバーメンテナンス時にサーバーを(ほぼ)止めずに運用したい場合や、サーバーのハードウェア増強が簡単に行えるといったことが可能になります。
VT-xは命令系統の扱いををハードウェアレベルでサポートします。
まずソフトウェアは、CPUのリングプロテクションというアーキテクチャを利用して、ハードウェアにアクセスします。レベル概念を用いて、ハードウェアへのアクセスを保護する機構です。
レベルの数値が低いほど権限が強く、数値が高いほど権限が弱くなります。
OSやVMMを含めた全てのソフトウェアは、いずれかのレベルに属します。
基本的には、ハードウェアに直接アクセスできるのはLEVEL0であり、それより高いレベルは、一つ下のレベルに対し正しい手順でアクセスする必要があります。
基本的にOSはLEVEL0に属するものとして設計されています。
実際にはCPUの状態で管理されており、LEVEL0のソフトウェアの命令を処理する時は、LEVEL0状態に遷移します、そしてLEVEL1のソフトウェアの命令を処理する時はLEVEL1状態に遷移します。LEVEL1状態の時にLEVEL0のハードウェアを直接アクセスする命令が要求された場合は権限違反としてエラーで返します。
この様に信頼性や安全性が高いソフトウェアのみハードウェアアクセスの権限を許すことによって、安全にハードウェアを操作する事が可能になります。
変な例えですが・・・
会社で予算が必要な場合、平社員(LEVEL3)が勝手にお金を持ち出して使うことはできないのと一緒です。上長(LEVEL2)に会議(CPUモード3)の場で提案して承認を得る、その上長はさらに上長(LEVEL1)に会議(CPUモード2)で提案、役職が上になるほど提案時の理由付け(正しい手順でのアクセス)がしっかりしていないと承認されません。
また、平社員が勝手に会社のお金に手をつけようとしたらおそらく懲戒(エラー)でしょう。
ここで、ハードウェアレベルで仮想化をサポートしていないマシンに、仮想化環境を構築すると、ゲストOSはLEVEL1にVMMがLEVEL0に割り振られます。
やっぱり変な例えですが・・・
OS部長はOS課長へと降格し、部長の座にはVMMが就きます。
課長(OS)は、今までどおりの権限で予算を扱おうとしますが(ハードウエアアクセス)、部長(VMM)はそれを監視します。
課長には予算を引き出す権限がないので、金庫のお金は取り出せません。(権限違反でありCPUからエラー)
複数の課(VM)で予算が必要になりました。
課が多ければ多いほど、予算会議が多ければ多いほど部長(VMM)は忙しくなり、各予算の審議や予算割り振りが大変になります。
しかも、予算会議だけではなく、他の会議(仮想化に影響しない処理命令)もあるので振り分けが大変です。
そこでVT-xの登場です。
具体的にはリングプロテクションに加え、仮想化独自の2つのレベル(状態)を追加しました。
これをバーチャルマシンエクステンション(VMX)と呼びます。
1.VMX rootモード
2.VMX non-rootモード
仮想化環境ではVMMにVMX rootを、ゲストOSにVMX non-rootを割り当てます。
VMX non-root時に仮想化に影響のある命令を受け付けると、CPUが感知しエラーを発生しさらにVMX rootに状態遷移してVMMに処理を移します。
ハードウェアレベル(CPU)でゲストOSの命令を判断して状態を切替え、さらに(ほぼ)VMM専用のモードが設けられたためVMMの処理を単純化できパフォーマンスが向上します。
厳密には上記の他に、従来のLEVEL0~LEVELxの概念のある普通のモードが加わります。
またバーチャルマシンコントロールストラクチャ(VMCS)というアーキテクチャも追加。
これはVMやVMMの処理を切替える際の処理中データを構造化してデータセットとして扱うものです。決められた形のデータの形になるため、ハードウェアレベルでも扱いやすく、VMMでも処理を単純化することができるため、パフォーマンスの向上につながります。
更には、VMXとVMCSを扱うための命令が追加されており、今まで複雑な処理をVMMでこなしていたものがハードウェアレベルで実装されるため、処理速度の向上やVMMの処理の簡素化につながり、やはりパフォーマンスの向上につながります。
そして拡張ページテーブル(EPT)の追加。
メモリはVMMによって各VMで競合しないように振り分けられます、その際ゲストOSからは普通のメモリ空間と認識させる必要があるためアドレスの変換が発生します。
そのアドレスの変換処理をハードウェアレベルでサポートするのがEPTです。
くどいようですが、ハードウェアでの処理ですのでVMMのソフトウェア処理と比較しパフォーマンスは向上します。
ちょっと息抜きをしましょう。
VT-iはVT-xと機能的には殆ど一緒です。
違うのは搭載されるCPUが異なるという点で、Itanium系のCPUに搭載されています。
ということで、説明は割愛いたします。
VT-dはI/OのDMAをVMで直接行えるようハードウェアレベルでサポートします。
ここで言うI/OはUSBやPCI-eやNICなどのコンピュータの周辺機器が対象です。
この機能はCPUでなく、主にチップセット側がサポートします。
DMAとはダイレクトメモリアクセスと言って、各I/Oとメモリ上のデータをCPUを介さずに直接やりとりするアーキテクチャの事です。そうすることによりCPUで遠回りすることなく、ショートカットができるのと、CPUの消費も低減できるためI/Oとのデータ通信速度が向上します。
前述したようにメモリはVM共通で利用しているため、やはりアドレスの変換が発生します。
ゲストOSが指定するメモリアドレスは仮想メモリのアドレスであり、I/Oが参照しようとしている物理メモリのアドレスとは異なります。
そのアドレス変換をチップセット側でサポートします、さらにはチップセットに変換テーブル用の記憶領域を設け、VMMに問い合わせることなくアドレスの変換が可能になります。
さてどの様に検証しましょう。