メモ: AMIの仮想化方式 hvm、paravirtualについて

AMIの仮想化方式に関するメモです。

たとえば、EC2でUbuntuのマシンを使いたいとします。

まず、AMIを検索するために、次のようなコマンドを実行することでしょう。

ec2-describe-images -a --filter "architecture=x86_64" --filter "root-device-type=ebs" | grep 099720109477

すると、次のような結果が返ってきます。

(略)
IMAGE   ami-1aad5273    099720109477/ebs/ubuntu-images/ubuntu-natty-11.04-amd64-server-20110426 099720109477    available       public          x86_64  machine aki-427d952b                    ebs     paravirtual     xen
(略)
IMAGE   ami-1cad5275    099720109477/hvm/ubuntu-images/ubuntu-natty-11.04-amd64-server-20110426 099720109477    available       public          x86_64  machine                         ebs     hvm     xen

このとき、AMIの仮想化方式として「paravirtual」、あるいは「hvm」が表示されます。これらは何なのか? どんな違いがあるのか? という話です。

上で抽出した2つのAMIは、仮想化方式にしか違いが見当たりません。つまり、違いを理解していなければ、どちらのAMIからインスタンスを作ればよいのか、判断できません。

結論として、特に理由がなければparavirtualタイプのマシンを使えばよいと考えています。それではダメだよって話がありましたら、教えてもらえると嬉しいです。

Xen徹底入門 第2版 (CD-ROM付)

Xen徹底入門 第2版 (CD-ROM付)

↑どこかにhvmの説明が書いてあったなーと思って読み返したら、参考になりました。

hvm

hvmは、Hardware Virtual Machineの略です。完全仮想化ともいわれます。PCのアーキテクチャをまるっとエミュレートしてくれるので、ゲストOSがそのまま動作します。

# paravirtualと対称性のある名前(fullvirtual)にしてくれたら分かりやすいのに…と思うのですが

HVMでは、ゲストOS内部での命令の発行に、オーバーヘッドがかかります。ゲストOSは、自分をゲストOSだと思っていないので、特権モードの命令をそのまま出します。そのため、仮想化ソフトウェアが、特権モードの命令をユーザモードの命令に翻訳してあげる必要があります。これが、バイナリトランスレーションと呼ばれるものです。

HVMは、CPUの仮想化機構を利用します。つまり、Amazonが管理するハードウェアのIntel-VTなりAMD-VなりがONにされることで、利用可能になります(AWSを使うなら、このあたりを意識する必要はないでしょう)。実際に動作する仮想化機構がCPUごとに異なるので、HVMという抽象化レイヤーが必要である、ともいえます。

paravirtual

paravirtualは、Para-Virtualization(準仮想化)の略です。Xenの仮想化APIを使えるようにゲストOSを修正して、仮想化機構を実現します。

準仮想化は、完全仮想化よりも、オーバーヘッドが少ないといわれます。なぜならば、仮想マシンを動かすために、ゲストOSのバイナリコードをトレースする必要がないためです。実行不能な命令が発行されないように、ゲストOSの一部に組み込んだAPIを利用して、命令自体が変更されています。

# がしかし、Xenの完全仮想化はバイナリトランスレーションを基本的に使わないらしいので、これだけをもってオーバーヘッドが少ないといえるのか?という点が、個人的に疑問です。