メモ: 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タイプのマシンを使えばよいと考えています。それではダメだよって話がありましたら、教えてもらえると嬉しいです。
- 作者: 宮本久仁男,平初,長谷川猛,津村彰
- 出版社/メーカー: 翔泳社
- 発売日: 2009/09/15
- メディア: 大型本
- 購入: 2人 クリック: 46回
- この商品を含むブログ (19件) を見る
↑どこかに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の完全仮想化はバイナリトランスレーションを基本的に使わないらしいので、これだけをもってオーバーヘッドが少ないといえるのか?という点が、個人的に疑問です。