Xenとは何か

!! 注意 !!

このドキュメントは書きかけです。精査も検証もされていません。誤字脱字も多数残っています。

このドキュメントは現状のままで提供され、更新や修正されるか否かも含めて無保証です。 この内容により生じた一切の影響、損失、被害の責任を筆者は負わないものといます。

この文書は各種の公開された資料を参考にして独自に記述しています。

OSと仮想マシン

アプリケーション実行環境

コンピュータに何かを実行させるために、通常はアプリケーションソフトを動作させます。このアプリケーションが動作するためには、当然のごとく実行に必要なハードウェアが必要です。かつてはアプリケーションがハードウェアを直接操作していた時代もありましたが、これは非常に効率が悪く、また、異なるハードウェアではそのまま動作させられません。現在では一般的にこれらハードウェアを抽象化し、アプリケーションが利用しやすいように管理し、また、便利な機能を集めて「実行環境」を提供するのがOSの役割です。

一般的なOS環境は、他にもCPU資源やメモリなどのリソース管理やマルチタスク管理、使用者の実行権限管理など、各種のアプリケーション実行環境を提供しています。 よって、アプリケーションはOSの機能を使ってハードウェア上で実行されることになるため、当然実行するOSに強く依存することになります。 その一方で、色々な理由によりアプリケーション毎にOS環境を別々に用意したいことがあるでしょう。これを実現する方法としては物理的に複数のハードウェアを用意することでもできますが、単一のハードウェアだけで可能とするのが仮想化(仮想マシン)です。

仮想マシンの種類


OS3

(VMM)OSOS使

OS(OS)OSOSOSOSOS

OSOSOSSolarisZone(Solaris)jailchrootDragonFlyBSDvkernelNetBSD/usermodeBSDLinux

OS
virtual machine type

それぞれの方式には長所も短所もあり、どの方式が良いというものではありません。また、現実にはこれらの3種類に完全に分類できるものでも ありません。

Xen仮想マシン

Xenの仮想化手法

Xenはハイパーバイザ型の仮想マシンマネージャ(VMM)です。本質的な部分は単独で動き主にCPUやメモリ、タイマーなどの基本的なハードウェアを管理し、Xen仮想マシンというハードウェア環境を提供します。この仮想マシンは複数作り出すことができるため、Xen仮想マシン用のOSを何個も同時に動作させることができます。

つまりアプリケーション型の仮想化のように「あるOSの上で別のOSを動かす」ことは決してなく、「Xenハイパーバイザが提供する仮想ハードウェアの上で対応したOSを同時に複数動かす」ことができるものです。注1

Xen 1.0ではハイパーバイザ内にハードウェアに対応したデバイスドライバを持ち動作させていました。しかし、これでは新しいハードウェアが出来る度にドライバを作成せねばなりません。同じ事は既に既存のOSで使われています。そのため、Xen2.0ではその成果を外部から利用できるようにハイパーバイザ内にドライバを持つことを止め、特別なゲストOSにデバイスを直接割り当てる(権限移譲)ことで対処しました。この特別なゲストOSのことをXenでは特権ドメインと呼びます。通常、特権ドメインでは特別はデバイスと共にXenハイパーバイザの制御も任されます(ただし、ハイパーバイザそのものがこのドメイン上に存在するわけではありません。ハイパーバイザに対して指令を送る口を持っていると考えればよいでしょう)。なお、Xen2.0ではハードウェア資源を物によって別のゲストOS(Domain-U)に割り当てることができます。例えば、USBだけをDomain-0ではない特定のドメインに与えてることができます。

Para-Virtualization

XenではDomain-UはXen仮想マシンという特別なハードウェアを提供します。この特別なハードウェアは、一般的な現実に存在するPCアーキテクチャとは異なっています。具体的には、Xen Busと呼ばれる仮想的なバスを提供し、そこを通して仮想デバイスにアクセスするためのHyperVisor Callと呼ばれる特別なソフトウェアインターフェースを使ってデバイスにアクセスします。また、PCアーキテクチャでは歴史的経緯によりBIOSや16bit命令が使われる場合が残っていますが、Xen仮想マシンではそのようなものはありません。 このため、既存のPCアーキテクチャ用のOSそのままでは動作させることができません。つまり、Xen仮想マシン専用のOSが必要となります。ただし、これは一般的にOSカーネルと言われる部分で吸収できるため、通常のOSで動く一般的なアプリケーションには影響を与えません。このように、既存のOSをそのままではなく一部を仮想マシン用に手直しして仮想マシンを動作させる方法のことをPara-Virtualization(準仮想化)と呼びます。注2

(Para-Virtualizaion説明図)

Full-Virtualization


Para-VirtualizaionOSDomain-UXen 3.0XenXenOSPCOS(Full-Virtualization)
(Full-Virtualizaion)
Full-VirtuallizationOSCPU()CPUOS

()()XenIntel x86-32bitCPUIntel VT-xAMD-VFull-VirtuallizationIntel VT-xAMD-VCPU

Full-VirtualizationDomain-0Full-VirtualizationDomain-0Domain-0

Domain-UXenPara-VirtualizationPara-VirtualizationOSOS
(PV Driver説明図)

参考文献


注1:
これを勘違いすると、boot時や各種ハードウェアの制御方法について理解できなかったり、誤った対処をしてしまうなど根本的な問題を引き起こします。しかし現実にはWeb上や雑誌記事、書籍などでも間違った説明が溢れているので、注意が必要です。
注2:
準仮想化という言葉は既に定着しているのですが、この言葉からはまるでちゃんと仮想化できていない(きちんと仮想化されていない)というイメージを受けてしまう場合があります。実際、確かに「既存のPC上のすべてのハードウェアを仮想化しているか」という視点でみるとその通りです。
が、別の視点で見ると、Xen仮想マシンという仮想ハードウェアを定義(ここがハードウェアの仮想化)し、そのハードウェア仕様に従ってOSを移植するのは至極真っ当な考え方でもあると言えます。
個人的な感覚では、むしろXenにおける完全仮想化はPCハードウェアという別のアーキテクチャのOSをXen仮想マシンという異なるアーキテクチャのハードウェア上で動かすためにエミュレータを導入して無理矢理実行できるようにしているように思え、とても完全とは言えないと思えてしまうからです。例えるなら、同じIntel製CPUを搭載しているかつてのPC-98x1というハードウェア上で、仮にAT互換機用のOSをそのまま動くようにエミュレータを作成/用意して動かした場合、それは「完全仮想化」と言えるのか。私の感覚からは「それはちょっとちがうんじゃない?」と思ってしまうのです。
もちろん、最初に書いたように、エミュレータを導入してでもPCハードウェアを完全に仮想化することが必要な場面がある(そしてそうしなければ動かない物が存在する)という点では全く異論はありません。

$Id: about_xen.html,v 1.2 2008/07/12 10:22:13 oshima Exp $