技術情報

技術情報

特集「Xen」を使ってみよう!!

2008年9月25日

技術文書トップへ

1. 仮想化とは

1.1 仮想マシン環境

「仮想マシン環境」とは、1台のコンピュータ・ハードウェアを、あたかも複数台のコンピュータ・ハードウェアのように仮想化し、その仮想化されたコンピュータ・ハードウェア上で、OSを動作させる技術です。仮想化されたコンピュータ・ハードウェアを複数用意することで、同時に複数の異なったOSを実行することも可能です。

ページトップ

1.2 仮想マシン環境の構成

「仮想マシン環境」の構成方法にはいくつかあり、またその手法により分類方法も複数存在しますが、ハードウェアをエミュレートするという基本的な考え方は同じです。

ホストOS型
あるOS(ホストOSと呼びます)上に、ハードウェアをエミュレートする環境を載せ、その上で別のOS(ゲストOSと呼びます)を動かす方法です。エミュレートはホストOSが持つ機能を利用して実現します。汎用機の仮想マシン環境等は、この方式を採用しています。
仮想マシンモニタ型
ハードウェア上に、直接ハードウェアをエミュレートする専用のプログラムを動作させる方法です。仮想マシン環境を実現する為に必要最小限の機能を、OSとハードウェアの間に構成します。このプログラムを仮想マシンモニタと呼びます。この方式は、1つ目の方式よりも小さなオーバーヘッドで、仮想マシン環境を実装でき、Xenは、この方式を採用しています。

ページトップ

1.3 仮想マシン環境への期待

「仮想マシン環境」は様々なメリットをもたらしますが、現在最も期待されている点は、「過去の資産の継承」や「コンピュータ・ハードウェアの統合・削減」という点にあります。
ITインフラの規模拡大ととも「コンピュータ・ハードウェア」という物理資源も増え続ける一方であり、コンピュータ・ハードウェアのコスト、スペースの問題、そして何よりもその維持・管理に関する問題解決はビジネス継続性の面からも早期に対応していく必要があります。
これらの解決策の一つとして「仮想マシン環境」への期待は高まりつつあり、また、マルチコアプロセッサや大容量メモリが標準的な環境となる今後では、「仮想マシン環境」は非常に有望な技術と言えます。

ページトップ

2. Xenとは

2.1 Xenはオープンソース・ソフトウェア

Xenは、英国ケンブリッジ大学コンピュータ研究所のイアン・プラット教授を中心とするプロジェクトによって開発されたオープンソース・ソフトウェアです。これはXenの大きな特徴の一つでもあります。開発を進める為に、Linuxカーネルのコードや、CPUエミュレータQEMUのコード等、ライセンスがGPLであるオープンソース・ソフトウェアの成果も積極的に取り組んでいます。

プロジェクト・リーダーのイアン・プラット教授のもと、開発は非常に活発に進められています。また、Xenが採用している準仮想化技術というオーバーヘッドの少ない仮想化技術が可能となった背景として、オープンソース・ソフトウェアの普及は大きな要因になっているとも考えられます。準仮想化技術を導入するには、その上で動作させるOSのソースコードを入手し、変更する必要があるからです。

ページトップ

2.2 Xenの仮想化手法

Xenは、実在のハードウェアを完全にエミュレートせず、その代わりに「仮想マシン環境」を実現するのに都合の良い仮想的なハードウェアを再定義するといった、ハードウェアの準仮想化(paravirtualization)という実装手法を標準採用しています。ここで定義された仮想的なハードウェアは、実在のハードウェアに酷似していますが、操作をする為にはハイパーバイザコールの呼び出しが必須となります。Xenはこのハイパーバイザコールの要求に応じて、仮想マシン環境に変更を加えます。この準仮想化という手法の採用によって、Xenの上で動作させるゲストOSの修正が必要とされますが、エミュレーションのオーバーヘッドを最小限に抑えることができる為、性能面で大きなアドバンテージを得ることが出来ます。ハードウェアを完全にエミュレートするには、OSからのハードウェアやCPUに対する要求を分析し、実際に実行する必要がありますが、準仮想化の環境では、ゲストOSはXenに対して本来やりたいことを直接要求できる為、処理を単純化できるのです。

ドメイン
Xenでは、仮想マシン環境一つ一つを「ドメイン(Domain)」と呼称します。この内、Xenが起動する時に必ず立ち上がり、管理ツール等が動作する特別なドメインをを「Domain0」と呼びます。ここでは、xm command、xend、xenstored、xenconsoled が動作し、管理者は「Domain0」上で管理作業を行います。また、「Domain0」以外のサービスを提供するドメインを「DomainU」といい、一般に言うGuest OS に対応します。

また、Xenはハードウェアの完全仮想化(full virtualization)も提供しています。完全仮想化では、実ハードウェア用に用意されたOSをそのままXen上で動作させることが可能となりますが、準仮想化方式に比べ、エミュレーションの為のコストが大きくなります。OSが仮想ハードウェアを制御する命令を実行した際に、CPUはそれを検出し、Xenに制御を渡します。制御を渡されたXenは、OSが行おうとした処理を分析し、仮想ハードウェアの動作をエミュレートします。

ページトップ

2.3 Xenのその他の特徴

Xenの上では複数のドメインが動作しますが、その中の1つのドメインに特別な役目を担わせ、これを「Domain0」といいます。Xen は、物理デバイスの制御とXenのマネジメント機能を、この「Domain0」上のLinuxカーネル等に任せています。このことにより、各種デバイスへの対応はLinuxカーネル等に任せ、Xenは自身の構造をシンプルに保つことができます。
また、Xenが提供する仮想マシン環境はマルチプロセッサに対応しているので、仮想マシン環境(ドメイン)の中で、マルチプロセッサ対応のOSを動かすことも可能です。
この他、物理マシンの間で仮想マシン環境(ドメイン)を移動することができます。この機能により、物理マシン間に跨った負荷分散の実現や、OSを停止させずに物理マシンを交換することが可能となります。

ページトップ

3. Xenのメリット

3.1 サーバ統合によるコストの削減

システムが大規模化するにつれ、膨大な数のサーバ群の導入、及び運用のコストの増大が問題になっています。そこで、サービスレベルを維持したままコストを削減するには、Xenを使って多数のサーバを統合することが考えられます。1台のサーバ上に、複数の仮想的なサーバ環境を用意し、各々がサービスを提供してマシン台数を減らします。また、物理的なマシン台数の削減に付随して、マシンコストの削減以外の効果も期待出来ます。例えば、ネットワーク構成の単純化、マシンの設置スペースやラックの有効活用、更には電源・熱容量の消費削減といった点が考えられます。

ページトップ

3.2 サービス独立性の維持

サーバ統合により1台のマシンに複数のサービスを集約する場合、それらが互いに影響し合わないようにする必要があります。Xenでは、各サービスに1つの仮想マシン環境を割り当てることにより、互いに独立した環境を維持することが出来ます。

ページトップ

3.3 セキュリティの確保

上述の通り、各仮想マシンは独立した環境を保有する為、ある仮想マシン内の資源は、同じ仮想マシン内で動作するプログラムからのみ参照可能となります。つまり、別の仮想マシン上で動作するプログラムは、物理的に独立したサーバ上で動作するプログラムと同等の独立した存在となり、各々のセキュリティが確保されます。例えば、ある仮想マシン上で悪意のあるプログラムが動いたとしても、他の仮想マシンで動作するサービスに影響を与えることはありません。

ページトップ

3.4 サービスへの資源量保証

仮想マシンに割り当てられた資源は、他の仮想マシン上のプログラムの影響を受けることなく利用出来ます。Xenでは、各々の仮想マシンのCPU時間とメモリ量は保証され、ある仮想マシン上のサービスが高負荷になった場合でも、他の仮想マシン上で動作するサービスには影響を与えません。UNIXやLinuxは、ユーザやプログラムの要求に対して、ベストエフォートで臨もうとします。これは、資源の有効利用の視点からは効果的ですが、多くのメモリやCPU時間を要求したプログラムが、実際に多くの資源を獲得できてしまい、別のプログラムに影響を与えやすいという欠点があります。仮想マシン環境を利用すると、この欠点を解消出来ます。

ページトップ

3.5 拡張性と柔軟性 - 仮想マシンの能力の変更

仮想マシン環境上でのサービスの提供は、物理マシン上での提供に比べ、拡張性と柔軟性に秀でています。Xenを利用した環境では、ハードウェアの物理的制限が緩和されます。サービスが物理的なハードウェアと結び付けられている場合、サービスの”状態”が変わってもそれに合わせて資源量を変更できない場合があります。しかし、仮想マシン環境では、各仮想マシンに割り当てるCPU時間やメモリ量を動的に変更することが可能です。例えば、昼間はオンライン処理を担当する仮想マシンに多くの資源を割り当て、夜間はバッチ処理を行う仮想マシンにそれらの資源を回すことも可能です。
また、運用開始時にはサービスに必要な資源量を正確に予測できない場合等、先ずはスモールスタートにて運用を開始し、以後の運用状況を見ながら資源割り当てを調整することも可能です。

ページトップ

3.6 仮想マシンを移動する

Xenを利用すると、ほとんど無停止で、別の物理ハードウェア上に仮想マシンイメージを移動することが出来ます。1つの物理マシン内だけでは負荷調整が十分できない場合、物理マシンをまたがって負荷分散を行えます。また、サービスを停止することなく、物理マシンのメンテナンスを行う為に利用することも出来ます。定期メンテナンス等の為、物理マシンを停止させなければならない場合、その物理マシン上で動いている仮想マシンを、別の物理マシン移動することによって仮想マシン上のサービスは、ほぼ無停止で提供し続けることが可能なのです。これは、クラスターシステムにおけるサービス引き継ぎとは異なり、プロセスメモリの内容、ソケットのコネクション状態、ファイルのオープン状態等が引き継がれる為、アプリケーション側での考慮は不要となります。

ページトップ

4. インストール

技術解説を始める前に

ここからは、オープンソース版Xenを入手しLinux上でコンパイル、インストール、設定を行う方法、及び各種機能の使用方法について解説します。解説にあたっては、特定のLinuxディストリビューションには依存しないように記述します。なお、本解説において対象とするXenのバージョンは、release 3.0.4_1とします。また、対象アーキテクチャはx86とします。

ページトップ

基本用語解説

●ハイパーバイザ
ハードウェアのエミュレートを行い、仮想マシン環境を作り出すプログラムを指します。CPUやメモリなどの資源の仮想化を行い各仮想マシンに提供します。仮想マシンモニタ、VMMと呼ばれることもあります。
●ドメイン
Xenでは各VM(仮想マシン) のことをドメインと称します。
●Xenホスト
Xenハイパーバイザが動作している実マシンを指します。Xenホスト上で一つ以上のドメインが動作します。Xenサーバホストとも呼ばれます。
●dom0
Xenホスト起動時に必ず起動する特権ドメインです。ドメイン0。このドメインでは、各種管理ツールやデーモンが動作します。ドメインの起動、終了などの作業は全てdom0で行います。通常、ゲストOSとしてはLinuxが使用されます。
●domU
dom0以外のドメインを指します。ドメインU。domUは、サービスを動作させる目的で利用します。
●ゲストOS
ドメイン上で動作している、LinuxやWindowsなどのOSです。
●完全仮想化ドメイン
Fully virtualized domain。FVドメインと略することもあります。実在のハードウェア環境をエミュレートしたドメインです。HVMドメインとも呼ばれ、実ハードウェア用に用意されたOSのバイナリをそのまま動作させることができます。
●準仮想化ドメイン
Para-virtualized domain。PVドメインと略することもあります。エミュレーションのオーバヘッドを最小限におさえるために、新たに定義した仮想マシン環境を提供するドメインです。このドメイン上でOSを動作させるためには、Xen環境が再定義したハードウェア環境にあわせてOSを修正する必要があります。代わりに、このドメイン上のゲストOSは高効率で動作します。
●Xenカーネル
準仮想化ドメイン環境用の、ゲストOSのカーネルを指します。Linuxの場合、Xen Linuxとも呼ばれます。また、Xenハイパーバイザを意味する場合もありますが、本解説ではその意味では使用しません。
●OSS Xen
本解説では、オープンソースとして開発されているXenのことを、Xen EnterpriseやLinuxディストリビューション等の派生プロダクトとの区別が必要な場面ではOSS Xenと呼称します。

ページトップ

4.1 インストール手順

Xenに対応したLinuxディストリビューションであれば、インストーラの指示に従ってメニューを選択していくのみで、Xen環境をインストールすることができます。
一方、自分の手で最初からインストールを行い、Xen仮想マシンの環境を作り上げるためには、以下の作業が必要です。

1. Xenとdom0の用意

  • (a)native Linuxをインストール
  • (b)Xenハイパーバイザのインストール
  • (c)native Linuxをdom0としてセットアップ

2. domUにゲストOSをインストール

  • (a)native Linuxのインストール
  • (b)native LinuxをdomUとしてセットアップ

基本方針は、標準のLinuxディストリビューションのインストールを行なった後、その環境をdom0やdomUの環境で動くように設定変更し直すことです。

これから述べる手順では、将来dom0として動作することになるLinuxディストリビューションが、既にインストールされていることを前提としています。そのLinuxディストリビューション上で、Xenハイパーバイザをソースコードからコンパイルしてインストールし、次にそのLinuxディストリビューション自身を、今インストールしたXenハイパーバイザの上のdom0として動作できるように設定し直します。

補足 domUが利用するファイルシステムのインストールには、幾つか方法があります。本書ではでは、下記1の手順により既にインストール済であることを前提にしていますが、利用する環境にあわせて、2や3の手順を利用して、domUをインストールすることも可能です。

1. マシン全体をリブートし、将来ゲストOSとなるOSのインストーラを起動して直接目的のディスクやパーティションにインストールする方法。

2. dom0から、完全仮想化ドメインを一つ生成し、その中でゲストOSのインストーラを起動して、目的のディスクやパーティションにインストールする方法。この場合、dom0上の通常ファイルをインストール先とすることもできます。
(準仮想化ドメインでも、専用のインストーラを作り込めば、同様の手順でインストールすることは可能です。)

3. dom0から、目的のディスクやパーティション上にファイルシステムを作り、マウントし、そこにdomU用のファイルシステムをインストールする方法。この場合も、dom0上の通常ファイルをインストール先とすることもできます。

ページトップ

4.2 Xenハイパーバイザのインストール

この節では、Xenハイパーバイザをソースコードからコンパイルしインストールする手順と、dom0用のLinuxのセットアップについて説明します。

ページトップ

4.2.1 ダウンロード

本書では、オープンソースのXen3.0.4_1を用いて、以降の解説を行うものとします。
先ず、Xenハイパーバイザの開発プロジェクトのサイトから、ソースコードをダウンロードしコンパイルします。Xen3.0.4_1のソースコードは、
http://bits.xensource.com/oss-xen/release/3.0.4-1/src.tgz/xen-3.0.4_1-src.tgz
から入手できます。この中には、次のものが含まれています。

  • Xenハイパーバイザ本体のコード
  • 管理用ツールのコード
  • Linuxカーネルを準仮想化環境に対応させるためのパッチ(※1

ソースコードの他に、コンパイル済みのバイナリ、及びRed Hat、SuSE用のパッケージも用意されており、以下のページから辿ることができます。
http://xen.org/download/index_3.0.4.html
開発用リポジトリはmercurialと呼ばれるバージョンコントロールシステム(※2)で管理されています。Xenハイパーバイザのコードのリポジトリは、下記URLに置かれてます。
http://xenbits.xensource.com/
このうち開発用リポジトリは以下となります。
http://xenbits.xensource.com/xen-unstable.hg

ページトップ

4.2.2 必要となる環境

コンパイルに必要なツールは次のとおりです。

  • GCC(v3.2以降)
  • GNU Make
  • GNU Binutils
  • zlib開発環境(zlib-dev等)
  • Python開発環境(v2.3以降)
  • curses開発環境(libncurses-devel等)
  • LaTeX及びtransfig(ドキュメントを整形する場合のみ)
  • X11開発環境
  • openssl開発環境
  • 仮想フレームバッファを有効にする場合は、次も必要になります。
    ・ dev86開発環境
    ・ SDL開発環境
    ・ LibVNCServer開発環境

実行に必要な環境は次のとおりです。

  • zlib
  • Python(v2.3以降)
  • curses
  • bridge-utilsパッケージ(/sbin/brctl)
  • iprouteパッケージ(/sbin/ip)
  • hotplugまたはudev
  • 仮想フレームバッファを有効にする場合は、次も必要になります。
    ・ SDL
    ・ LibVNCServer(libvncserver-config)

また、仮想フレームバッファを使用している場合、別途VNC client(vncviewer等)が必要になります。
より正確な条件は xen-3.0.4_1-src/xen/tools/check/chk build あるいは xen-3.0.4_1-src/xen/tools/check/chk
install で確認することができます。

ページトップ

4.2.3 コンパイル

通常は
# make world
# make install
で問題ありません。
コンパイルオプションとしては次のものが指定できます。環境変数に定義するか、makeに与えるコマンドラインで設定などをします。環境変数には次のようなものがあります。

コンパイルオプション 説明
CROSS_COMPILE クロスコンパイラへのプレフィックス
XEN_COMPILE_ARCH コンパイル環境のCPU アーキテクチャ。以下のものから選択します。
・x86_32:IA32
・x86_64:AMD64或はIntel64
・ia64:Itanium(IPF)
・powerpc:PowerPC
XEN_TARGET_X86_PAE x86_32 pae(physical address extension)を使用する時に指定します。(デフォルト n)
XEN_OS コンパイル環境としてのOSを指定します。(OpenBSD、Solaris等、Linux以外のOS環境でもコンパイル出来ます。)
DESTDIR インストール先ディレクトリ(デフォルトは、“/”)を指定します。
KERNELS コンパイルする準仮想化環境用Linuxカーネルを指定します。
・linux-2.6-xen:dom0、domU兼用カーネル
(通常はこれのみでよいでしょう。デフォルト。)
・linux-2.6-xen0:dom0専用カーネル
・linux-2.6-xenU:domU専用カーネル
ACM_SECURITY ACMを有効にします。(デフォルト n)
ACM_DEFAULT_SECURITY_POLICY ACMでデフォルトで使用するポリシーです。
デフォルトACM_NULL_POLICY
・ACM_NULL_POLICY
ポリシーを適用しません
・ACM_CHINESE_WALL_POLICY
chinese wall(万里の長城)ポリシー
・ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY
simple type enforcementポリシー
・ACM_CHINESE_WALL_AND_SIMPLE_TYPE_
ENFORCEMENT_POLICYACM_NULL_POLICY
chinese wallポリシーとsimple type enforcementポリシーの両方を適用
XENSTAT_XENTOP libxenstatライブラリとxentopをコンパイルします。(デフォルト y)
VTPM_TOOLS vTPM関連のツールをコンパイルします。(デフォルト n)
LIBXENAPI_BINDINGS Xen APIライブラリをコンパイルします。(デフォルト n)
XENFB_TOOLS 仮想フレームバッファ関連のツールをコンパイルします。(デフォルト n)

ページトップ

4.2.4 設定ファイル

コンパイル時の設定ファイルには、次のような設定項目があります。configを書くことができます。xen-3.0.4_1-src.tgzを展開して出来るディレクトリxen-3.0.4_1-srcの直下に.configを作成して設定を書きます。

設定項目 説明
debug デバッグ用コンパイル。
verbose デバッグ用メッセージ出力を有効にします。
perfc perfc(性能分析用機能)を有効にします。
perfc_arrays perfc arrayを有効にします。
crash_debug GDBスタブを有効にします。
max_phys_cpus サポートする最大物理CPU数を指定します。
pae x86 paeサポートを有効にします。

ページトップ

4.2.5 ターゲットルール

make時のターゲットルールがあります。
make helpにて主なものを確認することができます。

コンパイルオプション 説明
world バイナリを削除してコンパイルし直します。
clean バイナリを削除します。
distclean、mrproper clean + カーネルツリー及びダウンロードしてファイルの削除します。
help ヘルプメッセージ表示します。
build xen、カーネル、ツール及びドキュメントを作成します。
dist 全てを作成してローカルのディレクトリにインストールします。
xen xenハイパーバイザのコンパイルを行います。
tools ツール類のコンパイルを行います。
docs ドキュメントの生成を行います。
dev-docs 開発者向けのドキュメント生成を行います。
kernels ゲストカーネルのコンパイルを行います。
prep-kernels ゲストカーネルソースツリーを準備します。(コンパイルはしません。)
install 全てをインストールします。
install-xen xenハイパーバイザをインストールします。
install-kernels ゲストカーネルをインストールします。
install-tools ツール類をインストールします。
install-docs ドキュメント類をインストールします。
uninstall アンインストールします。(問答無用にファイルを消すので注意)
<kernel>-prep カーネルソースツリーを準備します。
<kernel>-config カーネルのコンフィギュレーションモードをCONFIGMODE変数で指定します。
次のいずれかを指定できます。
・oldconfig
・menuconfig
・xconfig
<kernel>-build カーネルをコンパイルします。
<kernel>-install カーネルをインストールします。
<kernel>-delete カーネルソースツリーを削除します。
<kernel>-clean カーネルバイナリを削除します。
kbuild kernelsと同じです。
kclean カーネルバイナリを削除します。
kdelete カーネルソースツリーを削除します。
mkpatches linusソースからのパッチを作成します。

ここで<kernel>は次のいずれかを指定します。
linux-2.6-xen, linux-2.6-xen0, linux-2.6-xenU
それぞれdom0/domU兼用カーネル、dom0専用カーネル、domU専用カーネルを意味します。

ページトップ

4.2.6 作成されるディレクトリ、ファイル

make worldにより、作成される主なディレクトリ、ファイルについて説明します。

作業ディレクトリ

作業用に、次のディレクトリが作成されます。

●pristine-linux-<VERSION>
vanilla linux
●ref-linux-<VERSION>
vanilla linuxにpatches/linux-<VERSION>/*.patchを適用したものです。
●linux-<VERSION>-<EXTRAVERSION>
ref-linuxに対して、linux-2.6-xen-sparseのファイルを置き換えたものです。
linux-2.6-xen-sparse/mkbuildtree<destdir>が実行されます。
linux-2.6-xen-sparse/以下へsymbolic linkが張られます。
linux-<VERSION>-<EXTRAVERSION>/include/xen/interfaceからxen/include/xen/public以下へsymblic linkが張られます
●build-linux-<VERSION>-<EXTRAVERSION> <ARCH>
linux-<VERSION>-<EXTRAVERSION>をコンパイルする時に使用されるディレクトリです。

ここで<VERSION> <EXTRAVERSION> <ARCH>は、次の意味を持ちます。

  • <VERSION>Linuxカーネルのバージョンで、2.6.16.33など
  • <EXTRAVERSION>xen、xen0、xenUのいずれか
  • <ARCH>x86 32、x86 32pae、x86 64、ia64、powerpcのいずれか

出力ファイル

コンパイルが終了すると、次のファイルが作成されます。Xenハイパーバイザは、ディレクトリxen配下に、Linuxカーネルは、ディレクトリbuild-linux-<VERSION>-<EXTRAVERSION> <ARCH>以下に作成されます。

●Xenハイパーバイザ
xen
xen-syms
xen.gz
●Linuxカーネル
vmlinux
vmlinux-stripped
vmlinuz
System.map

ページトップ

4.2.7 インストール

コンパイルが終了したら、次にXenハイパーバイザと、dom0用のLinuxカーネルのインストールを行います。

# make install

“/boot”配下に次のファイルがコピーされ、またブート処理で必要となるシンボリックリンクファイルも作成されます。

  • config-2.6.16.33-xen
  • vmlinuz-2.6.16.33-xen
  • System.map-2.6.16.33-xen
  • vmlinux-syms-2.6.16.33-xen
  • xen-syms-3.0.4-1
  • xen-3.0.4-1.gz

initrdイメージの作成

initrdを使用している場合は、Xen用カーネルに合わせたinitrdを作成しておく必要があります。mkinitrdコマンドで作成することができます。

mkinitrd <initrd へのパス名> < カーネルバージョン>

xen 3.0.4-1では、カーネルバージョンは2.6.16.33-xenであるので/boot/initrd-2.6.16.33 xen.imgにinitrdイメージを作成する場合は、

# mkinitrd /boot/initrd-2.6.16.33_xen.img 2.6.16.33_xen

で作成します。
ディストリビューションによっては、initrdを作成するコマンドとして、mkninitramfsや他のコマンドを採用している場合があります。

ページトップ

5. ブートローダの設定

Xenの環境では、Xenハイパーバイザとdom0用のLinuxカーネルをブートローダーにより同時にメモリ上に読み込んでおき、Xenハイパーバイザに制御を渡す必要があります。
昨今のLinuxディストリビューションの多くは、ブートローダとしてgrubを採用しています。
grubを利用する場合、grubの設定ファイル(※3)で、Xenハイパーバイザとdom0用のLinuxカーネルの両方のオブジェクトを指定します。“kernel”にxenハイパーバイザのオブジェクトを指定し、Linuxカーネルのオブジェクトは“module”で指定します。initrdも“module”で指定します。
下記は、その設定例です。

title Xen 3.0 / XenLinux 2.6
kernel /boot/xen-3.04-1.gz dom0_mem=262144
module /boot/vmlinuz-2.6.16.33-xen root=/dev/sda4 ro console=tty0
module /boot/my_initrd.gz

ページトップ

5.1 Xenの起動オプション

Xenハイパーバイザ起動時に、Xenに起動オプションを渡すことができます。通常は、この起動オプションをgrubの設定ファイルに記述することにより、Xenに渡します。
この節では、Xenの起動時オプションについて解説します。

ページトップ

5.1.1 アーキテクチャに依存しないオプション

IA32、Itanium、PowerPCどのアーキテクチャ用のXenでも共通に利用できるXen起動オプションを解説します。

オプション 説明
badpage 使用しないページを“,”で区切って指定します。(ページ単位で0x<hex>)
例badpage=0x3f45,0x8a321
デフォルトは、指定なし
dma_bits DMA可能なビット数を指定します。
デフォルトは、30bit
dma_emergency_pool DMA可能メモリの緊急プールサイズを指定します。
デフォルトは、0
sched スケジューラを指定します。
creditかsedfが選択できます。
デフォルトは、credit
dom0_vcpus_pin dom0の仮想cpuを物理cpuに固定します。
デフォルトは、指定なし
noreboot 再起動しません。
デフォルトは、指定なし
tbuf_size xentraceバッファサイズを指定します。
デフォルトは、0
xentraceを使用するには指定が必須です。
no-pv-compat boolean値を指定します。
互換モードを無効にします。
crashkernel <カーネルサイズ>@<カーネル位置>
kexec+kdump用
gdb gdbスタブが使用するシリアルの設定を行います。
none
gdbスタブを無効
com{1,2}[HL]
com1またはcom2を指定します。
8bit目を立てる(H)、立てない(L)

ページトップ

5.1.2 x86アーキテクチャ依存のオプション

IA32、AMD64(あるいはIntel64)で指定可能なオプションについて解説します。

オプション 説明
nolapic、lapic local apicの有効か無効かをを指定します。
apic_verbosity apic関連デバッグレベルを指定します。
・debug
・verbose
amd_flush_filter amd64のtlb flush filterを強制的に有効、無効にします。
・on:有効にする
・off:無効にする
cachesize L2キャッシュサイズを指定します。
nofxsr fxsave、fxrstore命令、xmm命令を無効にします。
noserialnumber processor serial numberを無効にします。
nomce machine checkを無効にします。
mce machine checkを有効にします。
P5はこれを指定しないとmachine checkは有効になりません。
dom0_mem dom0へのメモリを指定します。
以下を“,”で区切って指定します。
●min:<メモリ量>
最小メモリ量を指定
●max:<メモリ量>
最大メモリ量を指定
●<メモリ量>
割り当てメモリ量を指定
dom0_max_vcpus 最大仮想cpu数を指定します。
dom0_shadow dom0に対してshadow modeを有効にします。
dom0_ioports_disable 指定したioポートをdom0からアクセスを禁止します。
<ioポート>[-<ioポート>]
mem 最大物理メモリアドレスを指定します。
apic apicドライバを指定します。
・default
・bigsmp
・es7000
・summit
hvm_debug 完全仮想化ドメインのデバッグレベルを指定します。
ioapic_ack ioapicのack方式指定
・old:unmask方式
・new:eoi方式
noirqbalance irq balance無効
microcode.verbose microcde操作、verboseモードに設定します。
numa numa指定
・on
・off
・fake=<ノード数>
・noacpi
xenheap_megabytes x86_64(AMD64、Intel64)のときのみ意味を持ちます。
Xenが使用するメモリ量を指定します。
デフォルトは、16MB
nosmp SMP無効化
maxcpus 最大物理CPU数を指定します。
デフォルトは、NR CPUS(=デフォルトは、32)
watchdog NMI watchdogを有効にします。
acpi acpi設定を行います。
・off
・force
・strict
・ht
・noirq
acpi_skip_timer_override IRQ0/pin2の割り込み優先を無視します。
noapic ioapicを初期化しません。(使用もしない)
reboot reboot時の動作を指定します。
・n:rebootしない
・w:warm reboot
・c:cold reboot
・b:x86_32 biosによるreboot
・n:x86_32 reset lineあるいはtriple faultによるreboot
hpet_force hpet(高精度タイマ)を有効にします。
NMI NMI動作を指定します。
・ignore:無視
・dom0:dom0へ渡す
・fatal:Xen がメッセージを表示して停止
debug_stack_lines stack trace表示最大行数を指定します。
デフォルトは、20

ページトップ

6. xendの設定

dom0上で動作するxendデーモンは、Xenハイパーバイザとのやりとりを仲介するデーモンです。このxendデーモンの動作を設定ファイルで指定することができます。
xendの設定ファイルは /etc/xen/xend-config.sxp であり、S式(S-expression)(※4)で記述します。

キー 説明
logfile 実行時のログファイルです。
デフォルトは、/var/log/xen/xend.log
loglevel ログレベル
次のものから設定します。
DEBUG、INFO、WARNING、ERROR、CRITICAL
デフォルトは、DEBUG
xend-unix-server unix socketから要求を受け付けるか否かを指定します。
デフォルトは、yes
xend-unix-path xend-unix-serverの有効時に使用するunix domain socketのパスを指定します。
デフォルトは、/var/lib/xend/xend-socket
xend-http-server xendがhttpからの要求を受け付けるか否かを指定します。
デフォルトは、no
xend-port xend-http-serverを有効にしたときに、使用するポート番号を指定します。
デフォルトは、8000
xend-address xend-http-serverを有効にしたときにbindするアドレスを指定します。
デフォルトは、’’で、全てのインターフェース
xend-relocation-server relocation serverを起動するか否かを指定します。
デフォルトは、no
複数マシン間でのマイグレーションに必要となります。
xend-relocation-port xend-relocation-serverを有効にしたときに使用するポート番号を指定します。
デフォルトは、8002
xend-relocation-address xend-relocation-serverを有効にしたとき、bindするアドレスを指定します
デフォルトは、’’で、全てのインターフェース
xend-relocation-hosts-allow xend-relocation-serverを有効にしたとき、接続を許すホストを指定します。FQDNかIPアドレスで指定し、正規表現記述が可能です。
デフォルトは、’’で、全てのホストからの接続が可能です。
external-migration-tool 外部デバイスのマイグレーションのために必要な実行ファイル、スクリプトを指定します。
vTPM といったものが必要とします。
サンプルスクリプトは、
/etc/xen/scripts/external-device-migrate
network-script xend起動時に起動する、ネットワーク設定用スクリプト名を指定します。
/exc/xen/scriptsからの相対パス名を書きます。
通常network-bridge、network-routeあるいはnetwork-nat
vif-script virtual interface作成するために起動するスクリプト名を指定します。
/exc/xen/scriptsからの相対パス名を書きます。
通常vif-bridge、vif-routeあるいはvif-nat
network-scriptと合わせて設定します。
dom0-min-mem dom0に設定できる最低メモリ量(メガバイト単位)を指定します。
正の値に設定すればバルーンドライバでその値に調整されます。
0に設定すればバルーンドライバは動作しません。
dom0-cpus dom0が使用可能なCPU数を指定します。
0にすれば全てのCPUが使用できます。
console-limit コンソールサーバーのバッファ上限(キロバイト単位)を指定します。
制限はドメイン毎に行います。
デフォルトは、1024
enable-dump ドメインでクラッシュが起きた場合、ドメインのクラッシュダンプを作成するか否かを指定します。
デフォルトは、no
vnc-listen VNCが使用するデフォルトポート番号を指定します。
各ドメインの設定で指定しなかった場合に使用されます。
vncpasswd VNCが使用するデフォルトパスワードを指定します。
各ドメインの設定で指定しなかった場合に使用されます。

ページトップ

7. 準仮想化ドメインの設定

本節では準仮想化ドメインの設定について解説します。Linuxを準仮想化ドメインで動作させる場合、以下の手順を踏むことになります。

  • Linuxディストリビューションをインストール
  • インストールしたLinuxディストリビューションを、準仮想化ドメインで動くように設定

ページトップ

7.1 準仮想化ドメインインストール

dom0は動かさず、「インストールCDからマシンを起動し、空いているパーティションに、ディストリビューションをインストールする」方法を紹介します。作業手順は次のとおりになります。

  • 1. インストールCDからマシンを起動し、空いているパーティションにLinuxディストリビューションをインストールします。
  • 2. Xen用のLinuxカーネルをインストールします。このカーネルは、【4.2.6 作成されるディレクトリ、ファイル】で生成したものです。
  • 3. initrdイメージをインストールします。
    必要な場合はdom0の時と同様に、mkinitrdコマンドでinitrdイメージを作成しておきます。もし、Xen関連機能をカーネルモジュールとしてコンパイルした場合(※5)は、それらカーネルモジュールを明示的にinitrdに組み込む必要があります。
    必要に応じて、--with=【モジュール名】オプションを指定し、モジュール化した機能をinitrdイメージに組み込むようにします。
    (例)# mkinitrd --with=xenblk /boot/initrd-2.6.16.33_xen.img 2.6.16.33_xen
  • 4. Linuxの設定ファイルを書き換えます。
  • 5. ドメイン設定ファイルを作成します。
  • 6. dom0からブートします。

変更の必要があるLinuxの設定ファイルを以下に記載します。

●/etc/inittab
gettyの起動とrunlevelの変更(Xが使用できない場合)
●/etc/fstab
次節にて解説します「ドメイン設定ファイル」の“disk”の項目で指定する仮想ブロックデバイスを、/etc/fstabから参照するディスクとします。
●ネットワーク関連
次節にて解説します「ドメイン設定ファイル」の“vif”の項目で指定するネットワークインターフェイスに関する設定を行います。通常のイーサネットのインターフェイスに対する設定と同じです。
●/etc/modules、/etc/modules.conf、もしくは/etc/modprobe.conf
仮想デバイスドライバをカーネルモジュールとしてコンパイルした場合は、組み込む必要があります。

ページトップ

7.2 ドメイン設定ファイルと設定方法

ドメインの設定ファイルを用意します。ドメインの各種属性は、このドメイン設定ファイルにて行います。この設定ファイルでは、大まかに分けて、以下の属性を定義します。

  • 仮想ハードウェアの属性。CPU、メモリ、ディスク、ネットワークなど。準仮想化ドメインか、完全仮想化ドメインも選択できます。
  • ドメイン上で動作させるOSの設定。ドメイン内のメモリに読み込むOSのオブジェクトの指定、そのOSに渡すパラメータの指定、OSが停止した時に行う動作の指定など。
  • ドメインを管理するために用いる識別子。ドメイン名やuuidなど。

この設定ファイルは、ドメインの起動時に“xm create”コマンドに渡します。下記に述べるように、非常に多くの設定を行うことが可能ですが、殆んどの場合は、既にある設定ファイル(サンプル設定ファイル等)をコピーし、name、vif、disk、uuidの4つの項目を変更すれば、十分です。
ドメイン設定ファイルには次の項目が指定できます。

キー 説明
kernel カーネルイメージを指定します。
ramdisk initrdイメージを指定します。
builder ドメイン生成方式を指定します。準仮想化ドメインの時は指定する必要はありません。
memory メモリ量を指定します。
name ドメイン名を指定します。
uuid UUID(※6)を指定します。ドメインの識別子として利用します。
cpus 仮想cpuが動作して良い物理cpuを指定します。
vcpu 割り当てる仮想CPU数を指定します。
bootloader 後述するpygrubを使用する時には【="/usr/bin/pygrub"】を指定します。
disk 仮想ブロックデバイスを指定します。
vif 仮想ネットワークインターフェイスを指定します。
vfb 仮想フレームバッファを指定します。
vtpm 仮想tpmを指定します。
dhcp
netmask
gateway
hostname
root
nfs_server
extra
カーネルに渡すコマンドラインを指定します。
on_poweroff 電源断時の動作として、destroyまたはrestartを指定します。
on_reboot リブート時の動作として、destroyまたはrestartを指定します。
on_crash クラッシュ時の動作として、destroyまたはrestartを指定します。

以下に、bootloaderを指定しなかった場合の、準仮想化ドメイン用の設定例を紹介します。bootloader指定がない場合、kernelは必ず指定する必要があります。

準仮想化ドメイン用の設定例

# -*- mode: python; -*-
#============================================================================
# Python configuration setup for 'xm create'.
# This script sets the parameters used when a domain is created using 'xm create'.
# You use a separate script for each domain you want to create, or
# you can set the parameters for the domain on the xm command line.
#============================================================================
#----------------------------------------------------------------------------
# Kernel image file.
kernel = "/boot/vmlinuz-2.6.10-xenU"
# Optional ramdisk.
#ramdisk = "/boot/initrd.gz"
# The domain build function. Default is 'linux'.
#builder='linux'
# Initial memory allocation (in megabytes) for the new domain.
#
# WARNING: Creating a domain with insufficient memory may cause out of
#          memory errors. The domain needs enough memory to boot kernel
#          and modules. Allocating less than 32MBs is not recommended.
memory = 64
# A name for your domain. All domains must have different names.
name = "ExampleDomain"
# 128-bit UUID for the domain. The default behavior is to generate a new UUID
# on each call to 'xm create'.
#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
# List of which CPUS this domain is allowed to use, default Xen picks
#cpus = ""         # leave to Xen to pick
#cpus = "0"        # all vcpus run on CPU0
#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
# Number of Virtual CPUS to use, default is 1
#vcpus = 1
#----------------------------------------------------------------------------
# Define network interfaces.
# By default, no network interfaces are configured. You may have one created
# with sensible defaults using an empty vif clause:
#
# vif = [ '' ]
#
# or optionally override backend, bridge, ip, mac, script, type, or vifname:
#
# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
#
# or more than one interface may be configured:
#
# vif = [ '', 'bridge=xenbr1' ]
vif = [ '' ]
#----------------------------------------------------------------------------
# Define the disk devices you want the domain to have access to, and
# what you want them accessible as.
# Each disk entry is of the form phy:UNAME,DEV,MODE
# where UNAME is the device, DEV is the device name the domain will see,
# and MODE is r for read-only, w for read-write.
disk = [ 'phy:/dev/hda1,hda1,w' ]
#----------------------------------------------------------------------------
# Define frame buffer device.
#
# By default, no frame buffer device is configured.
#
# To create one using the SDL backend and sensible defaults:
#
# vfb = [ 'type=sdl' ]
#
# This uses environment variables XAUTHORITY and DISPLAY. You
# can override that:
#
# vfb = [ 'type=sdl,xauthority=/home/bozo/.Xauthority,display=:1' ]
#
# To create one using the VNC backend and sensible defaults:
#
# vfb = [ 'type=vnc' ]
#
# The backend listens on 127.0.0.1 port 5900+N by default, where N is
# the domain ID. You can override both address and N:
#
# vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=1' ]
#
# Or you can bind the first unused port above 5900:
#
# vfb = [ 'type=vnc,vnclisten=0.0.0.0,vnunused=1' ]
#
# You can override the password:
#
# vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ]
#
# Empty password disables authentication. Defaults to the vncpasswd
# configured in xend-config.sxp.
#----------------------------------------------------------------------------
# Define to which TPM instance the user domain should communicate.
# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM'
# where INSTANCE indicates the instance number of the TPM the VM
# should be talking to and DOM provides the domain where the backend
# is located.
# Note that no two virtual machines should try to connect to the same
# TPM instance. The handling of all TPM instances does require
# some management effort in so far that VM configration files (and thus
# a VM) should be associated with a TPM instance throughout the lifetime
# of the VM / VM configuration file. The instance number must be
# greater or equal to 1.
#vtpm = [ 'instance=1,backend=0' ]
#----------------------------------------------------------------------------
# Set the kernel command line for the new domain.
# You only need to define the IP parameters and hostname if the domain's
# IP config doesn't, e.g. in ifcfg-eth0 or via DHCP.
# You can use 'extra' to set the runlevel and custom environment
# variables used by custom rc scripts (e.g. VMID=, usr= ).
# Set if you want dhcp to allocate the IP address.
#dhcp="dhcp"
# Set netmask.
#netmask=
# Set default gateway.
#gateway=
# Set the hostname.
#hostname= "vm%d" % vmid
# Set root device.
root = "/dev/hda1 ro"
# Root device for nfs.
#root = "/dev/nfs"
# The nfs server.
#nfs_server = '169.254.1.0'
# Root directory on the nfs server.
#nfs_root = '/full/path/to/root/directory'
# Sets runlevel 4.
extra = "4"
#----------------------------------------------------------------------------
# Configure the behaviour when a domain exits. There are three 'reasons'
# for a domain to stop: poweroff, reboot, and crash. For each of these you
# may specify:
#
# "destroy",          meaning that the domain is cleaned up as normal;
# "restart",          meaning that a new domain is started in place of the old
#                     one;
# "preserve",         meaning that no clean-up is done until the domain is
#                     manually destroyed (using xm destroy, for example); or
# "rename-restart",   meaning that the old domain is not cleaned up, but is
#                     renamed and a new domain started in its place.
#
# The default is
#
#   on_poweroff = 'destroy'
#   on_reboot = 'restart'
#   on_crash = 'restart'
#
# For backwards compatibility we also support the deprecated option restart
#
# restart = 'onreboot' means on_poweroff = 'destroy'
#                            on_reboot = 'restart'
#                            on_crash = 'destroy'
#
# restart = 'always'   means on_poweroff = 'restart'
#                            on_reboot = 'restart'
#                            on_crash = 'restart'
#
# restart = 'never'    means on_poweroff = 'destroy'
#                            on_reboot = 'destroy'
#                            on_crash = 'destroy'
#on_poweroff = 'destroy'
#on_reboot = 'restart'
#on_crash = 'restart'
#============================================================================

ページトップ

7.3 pygrub

domUのカーネルイメージ及びinitrdイメージは、dom0からアクセスできる必要があります。それらがdomUのゲストOSのディスクイメージ上にある場合は、そのデータをdom0上へ持ってくる必要があります。pygrubは、その処理を行ってくれるツールです。ドメイン設定ファイルで、bootloaderに/usr/bin/pygrubを指定するとpygrubが呼び出されます。
カーネルイメージ等の指定は、domUディスクイメージ内にある下記のgrubの設定ファイルにて行います。

/boot/grub/menu.lst
/boot/grub/grub.conf
/grub/menu.lst
/grub/grub.conf

pygrubがサポートしていないコマンドは無視されます。ドメイン設定ファイルでディスクを複数指定した場合は、先頭に指定したディスクにgrubの設定ファイルがあると仮定されます。そのディスクをパーティション分割していた場合は、アクティブパーティションが選択されます。
grubの設定ファイル(menu.lst,grub.confなど)を使用する場合は(ia64上ではelilo.confも使用可能ですが、ここでは説明を割愛します。)、domUのコンソールからgrub風のインターフェースでboot imageを指定することができます。ドメイン設定ファイルでも指定を行うことができ、そのときはkernel及びramdiskにdomUディスクイメージ上でのパスを書けばよいでしょう。
pygrubはdomUが使用するファイルシステムを解釈してカーネルとRAMディスクを読み込み、dom0内に/var/run/xend/boot/boot_kernel.【ランダム文字列:5文字】及び/var/run/xend/boot/boot_ramdisk.【ランダム文字列:5文字】というファイルを作成します。削除は再起動時のみ行われるので、空き容量に注意する必要があります。pygrubは次のファイルシステムをサポートしています。(2007年5月現在)

  • ext2
  • ext3
  • reiserfs
  • Solaris ufs
  • iso9660(unstableのみ)
  • fat(unstableのみ)

下記は、pygrubを利用する際の設定例です。kernel、ramdiskの設定が無くなっているのがわかります。

name = "domu_1"
memory = "256"
disk = [ 'file:/home/domu_image/domu_1,xvda,w', ]
vif = [ 'mac=00:16:3e:7c:cc:f2, bridge=xenbr0', ]
nographic=1
uuid = "68e346a2-4810-cfdd-31f4-50050c7a61bd"
bootloader="/usr/bin/pygrub"
vcpus=1
on_reboot = 'restart'
on_crash = 'restart'

実際にこのドメイン設定ファイルを指定して、ドメインを生成してみましょう。

# xm create -c domu_1
Using config file "/etc/xen/domu_1".
WARNING:root:Unknown directive boot

すると、次のようなメニューが表示され、カーソルキーでブートするカーネルを選択することができます。

ブート選択メニュー

pyGRUB version 0.5
--------------------------------------------------------------------------
Xen-3.0.4-1 g1 (2.6.11-g1)
Fedora Core (2.6.19-1.2911.fc6debug)
Fedora Core (2.6.18-1.2798.fc6xen)
--------------------------------------------------------------------------
Use the ^ and V keys to select which entry is highlighted.
Press enter to boot the selected OS. 'e' to edit the
commands before booting, 'a' to modify the kernel arguments
before booting, or 'c' for a command line.

ページトップ

8. 完全仮想化ドメインの設定

本節では完全仮想化ドメインの設定について解説します。
完全仮想化ドメインを使用するためにはCPUがVT-x、あるいはAMD-Vをサポートしている必要があります。

ページトップ

8.1 完全仮想化ドメインインストール

CD(イメージ)からブートすることができ、OSの通常のインストールを行うことができます。ただし、CDを入れ替える部分はコツが必要となります。ディスクイメージは、専用パーティションを用意するかファイルを用意しておく必要があります。

ページトップ

8.2 ドメイン設定ファイルと設定方法

完全仮想化ドメイン用の設定項目には次のようなものがあります。準仮想化ドメイン用の設定項目と異なる部分を記述します。準仮想化ドメインの場合と同様に、既にある設定ファイル(サンプル設定ファイル等)をコピーしname、vif、disk、uuidの項目を変更すれば殆んどの場合は十分でしょう。

キー 説明
kernel=/usr/lib/xen/boot/hvmloader kernelにはhvmloaderを指定します。これでBIOSが起動し、BIOSドメインのファイルシステム上に存在するカーネルイメージをロードします。
builder=hvm 完全仮想化ドメインであること指定します。
device_mode デバイスエミュレーションを行うプログラムを指定します。
/usr/lib/xen/bin/qemu-dm、あるいは/usr/lib64/xen/bin/qemu-dmを指定します。
boot 起動デバイス探索順を指定します。(a: floppy, c: hard disk, d: cd-rom)
例“cda”
snapshot=1 ディスクイメージのコピーオンライトを行います。
sdl SDLライブラリを使用します。
vnc VNCライブラリを使用してグラフィックスを有効にします。
vnclisten VNC serverがlistenしているipアドレスを指定します。
vncdisplay VNC display番号を指定します。
vncunused VNC serverが、使用していないポートを見つけようとします。
vncconsole ドメイン起動時にvncviewerを起動します。
vncpaswd VNC consoleにパスワードを設定します。
nographic グラフィックスを無効にして、シリアルポートを使用します。
stdvga stdvgaを有効にします。(cirrus logicデバイスを使用)
serial シリアルポートのリダイレクト先を指定します。
soundhw エミュレートするsound cardを指定します。
localtime リアルタイムクロックがlocaltimeかを指定します。
full-screen フルスクリーンで起動します。
usbdevice mouse、tablet
keymap keymap指定。en-us、ja、・・・

変更の必要があるLinuxの設定ファイルを以下に記載します。

●VNC serverを使用する場合
vncconsole=1を指定しておくと、ドメイン起動時に自動的にvncviewerが起動されます。指定しない場合は、別途vncviewerを起動する必要があります。デフォルトでは5900番ポートを使用します。
●cdromの設定
次の例のようにして設定します。dom0内の/dev/cdromを完全仮想化ドメイン内のhdc上にあるcdromに設定します。
disk = [ 'phy:/dev/cdrom, ioemu:hdc:cdrom,r' ]
●cdromの入れ替え
Xen 3.0.4_1では、完全仮想化ドメインではメディアの入れ替えを検出することができません。完全仮想化の画面で【ctrl + alt + 2】でqemuコンソール画面に切り替えて、次のような操作を行います。操作が終わったら【ctrl + alt + 1】でドメインの画面に戻ります。(※7
・【ctrl + alt + 1】ドメイン画面
・【ctrl + alt + 2】qemuコンソール画面
  • 1. ”info block”で、ブロックデバイスを確認します。
    実行例
(HVMXen) info block
hda: type=hd removable=0 file=/pub/Xen/domU/rhas5b_FV ro=0 drv=raw
hdc: type=cdrom removable=1 locked=0 file=/dev/hda ro=1 drv=raw
fda: type=floppy removable=1 locked=0 [not inserted]
  • 2. メディアを解放します。
    dom0上で操作します。
    # eject hdc
  • 3. 実マシンでメディアを交換します。
    メディアを抜いた状態で、”info block”で見ると、”hdc: type=cdrom removable=1 locked=0 [not inserted]”等となります。
  • 4. HVMXen上で、hdcの情報を更新します。
    (HVMXen) change hdc /dev/hda

ページトップ

8.3 PV-on-HVMドライバ

PV-on-HVMドライバは、完全仮想化ドメインに対してXen専用ドライバを導入することにより、I/O性能を向上させることができるものです。このXen専用ドライバをPV-on-HVMドライバと呼びます。2.6.10-2.6.18でコンパイルできると思われます。(※8)本例では2.6.18で行いました。
以下にコンパイル方法と導入方法を説明します。

PV-on-HVMのコンパイル

# cd xen-unstable.hg/unmodified_drivers/linux-2.6
# make -C /path/to/linux-2.6.18 M=$PWD modules
# make -C /path/to/linux-2.6.18 M=$PWD modules_install
# mkinitrd -v /boot/initrd-2.6.18-prep-xen-1.img 2.6.18-prep --preload=xen-vbd --with=xen-vnif

build環境としてimake(/usr/bin/lndirコマンド)が必要となるので注意しましょう。コンパイルは次のように行います。コンパイル済みのLinuxカーネルソースツリーが必要となります。(これはPV-on-HVMドライバに限った話ではなく、カーネルソースツリー外でカーネルモジュールをコンパイルする時には、必要となります。)
initrdイメージの設定では、--preloadオプションと、--withオプション等を使用し、PV-on-HVMドライバを組み込む必要があります。
bootloader(grub)がdiskを読む必要があるので、次のように設定に工夫が必要す。bootloaderはPV-on-HVMドライバを使えないため、従来のディスクコントローラのエミュレーション経由でアクセスを行い、Linuxは同じデバイスに対してPV-on-HVMドライバでアクセスをバイパスさせます。

disk = [ 'phy:/dev/sda5,hda,r', 'phy:/dev/sda5,xvda,w' ]
vif = [ 'mac=00:16:3e:13:9f:ca, bridge=xenbr0' ] (type=ioemu を除く)

hdaはbootloaderがカーネルイメージを読み出すための設定で、xvdaがpv-on-hvmドライバが使用するための設定です。その後、/etc/fstabとgrub.confを仮想ブロックデバイスを参照するように書き換えた後、再起動を行います。(例えば、/etc/fstabにおいて/dev/hdcを/dev/xvdaに、grub.confにおいてroot=/dev/hdc2をroot=/dev/xvda2に変更します)
再起動後、lsmodとsysfsを使用してPVドライバが組み込まれていることの確認を行います。(※9

PV-on-HVMドライバの設定

# lsmod | grep xen
xen_vnif 28928 0
xen_vbd 19536 8
xenbus 43048 2 xen_vnif,xen_vbd,[permanent]
xen_platform_pci 32464 3 xen_vnif,xen_vbd,xenbus
# dmesg | grep hda
Kernel command line: ro root=/dev/hda2
ide0: BM-DMA at 0xc000-0xc007, BIOS settings: hda:pio, hdb:pio
hda: QEMU HARDDISK, ATA DISK drive
hda: max request size: 512KiB
hda: 39086082 sectors (20012 MB) w/256KiB Cache, CHS=16383/255/63, (U)DMA
hda: cache flushes supported
hda: hda1 hda2
EXT3 FS on hda2, internal journal
# cd /sys/block/xvda
# ls -l | grep xen
total 0
lrwxrwxrwx 1 root root 0 Feb 27 02:51 device -> ../../devices/xen/vbd-51712/
# cd /sys/class/net/eth0
# ls -l | grep xen
lrwxrwxrwx 1 root root 0 Feb 27 02:51 device -> ../../../devices/xen/vif-0/

設定ファイルの書式は、準仮想化ドメインの設定に準じます。

ページトップ

8.4 完全仮想化ドメイン設定ファイル例

完全仮想化ドメインの設定ファイルを見てみましょう。
builderの項目に'hvm'を指定し、kernelの項目にはLinuxカーネルではなくlvmloaderを指定しています。

完全仮想化ドメインの設定ファイル

#  -*- mode: python; -*-
#============================================================================
# Python configuration setup for 'xm create'.
# This script sets the parameters used when a domain is created using 'xm create'.
# You use a separate script for each domain you want to create, or
# you can set the parameters for the domain on the xm command line.
#============================================================================
import os, re
arch = os.uname()[4]
if re.search('64', arch):
    arch_libdir = 'lib64'
else:
    arch_libdir = 'lib'
#----------------------------------------------------------------------------
# Kernel image file.
kernel = "/usr/lib/xen/boot/hvmloader"
# The domain build function. HVM domain uses 'hvm'.
builder='hvm'
# Initial memory allocation (in megabytes) for the new domain.
#
# WARNING: Creating a domain with insufficient memory may cause out of
#          memory errors. The domain needs enough memory to boot kernel
#          and modules. Allocating less than 32MBs is not recommended.
memory = 128
# Shadow pagetable memory for the domain, in MB.
# Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
# shadow_memory = 8
# A name for your domain. All domains must have different names.
name = "ExampleHVMDomain"
# 128-bit UUID for the domain. The default behavior is to generate a new UUID
# on each call to 'xm create'.
#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
#-----------------------------------------------------------------------------
# The number of cpus guest platform has, default=1
#vcpus=1
# Enable/disable HVM guest PAE, default=1 (enabled)
#pae=1
# Enable/disable HVM guest ACPI, default=1 (enabled)
#acpi=1
# Enable/disable HVM APIC mode, default=1 (enabled)
# Note that this option is ignored if vcpus > 1
#apic=1
# List of which CPUS this domain is allowed to use, default Xen picks
#cpus = ""         # leave to Xen to pick
#cpus = "0"        # all vcpus run on CPU0
#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
# Optionally define mac and/or bridge for the network interfaces.
# Random MACs are assigned if not given.
#vif = [ 'type=ioemu, mac=00:16:3e:00:00:11, bridge=xenbr0, model=ne2k_pci' ]
# type=ioemu specify the NIC is an ioemu device not netfront
vif = [ 'type=ioemu, bridge=xenbr0' ]
#----------------------------------------------------------------------------
# Define the disk devices you want the domain to have access to, and
# what you want them accessible as.
# Each disk entry is of the form phy:UNAME,DEV,MODE
# where UNAME is the device, DEV is the device name the domain will see,
# and MODE is r for read-only, w for read-write.
#disk = [ 'phy:/dev/hda1,hda1,r' ]
disk = [ 'file:/var/images/min-el3-i386.img,hda,w', ',hdc:cdrom,r' ]
#----------------------------------------------------------------------------
# Configure the behaviour when a domain exits. There are three 'reasons'
# for a domain to stop: poweroff, reboot, and crash. For each of these you
# may specify:
#
# "destroy",          meaning that the domain is cleaned up as normal;
# "restart",          meaning that a new domain is started in place of the old
#                     one;
# "preserve",         meaning that no clean-up is done until the domain is
#                     manually destroyed (using xm destroy, for example); or
# "rename-restart",   meaning that the old domain is not cleaned up, but is
#                     renamed and a new domain started in its place.
#
# The default is
#
#   on_poweroff = 'destroy'
#   on_reboot   = 'restart'
#   on_crash    = 'restart'
#
# For backwards compatibility we also support the deprecated option restart
#
# restart = 'onreboot' means on_poweroff = 'destroy'
#                            on_reboot = 'restart'
#                            on_crash = 'destroy'
#
# restart = 'always'   means on_poweroff = 'restart'
#                            on_reboot = 'restart'
#                            on_crash = 'restart'
#
# restart = 'never'    means on_poweroff = 'destroy'
#                            on_reboot = 'destroy'
#                            on_crash = 'destroy'
#on_poweroff = 'destroy'
#on_reboot   = 'restart'
#on_crash    = 'restart'
#============================================================================
# New stuff
device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
#-----------------------------------------------------------------------------
# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d)
# default: hard disk, cd-rom, floppy
#boot="cda"
#-----------------------------------------------------------------------------
# write to temporary files instead of disk image files
#snapshot=1
#----------------------------------------------------------------------------
# enable SDL library for graphics, default = 0
sdl=0
#----------------------------------------------------------------------------
# enable VNC library for graphics, default = 1
vnc=1
#----------------------------------------------------------------------------
# address that should be listened on for the VNC server if vnc is set.
# default is to use 'vnc-listen' setting from /etc/xen/xend-config.sxp
#vnclisten="127.0.0.1"
#----------------------------------------------------------------------------
# set VNC display number, default = domid
#vncdisplay=1
#----------------------------------------------------------------------------
# try to find an unused port for the VNC server, default = 1
#vncunused=1
#----------------------------------------------------------------------------
# enable spawning vncviewer for domain's console
# (only valid when vnc=1), default = 0
#vncconsole=0
#----------------------------------------------------------------------------
# set password for domain's VNC console
# default is depents on vncpasswd in xend-config.sxp
vncpasswd=''
#----------------------------------------------------------------------------
# no graphics, use serial port
#nographic=0
#----------------------------------------------------------------------------
# enable stdvga, default = 0 (use cirrus logic device model)
stdvga=0
#-----------------------------------------------------------------------------
#   serial port re-direct to pty deivce, /dev/pts/n
#   then xm console or minicom can connect
serial='pty'
#-----------------------------------------------------------------------------
#   enable sound card support, [sb16|es1370|all|..,..], default none
#soundhw='sb16'
#-----------------------------------------------------------------------------
#    set the real time clock to local time [default=0 i.e. set to utc]
#localtime=1
#-----------------------------------------------------------------------------
#    start in full screen
#full-screen=1
#-----------------------------------------------------------------------------
#   Enable USB support (specific devices specified at runtime through the
# monitor window)
#usb=1
# Enable USB mouse support (only enable one of the following, ‘mouse' for
#     PS/2 protocol relative mouse, ‘tablet' for
#     absolute mouse)
#usbdevice='mouse'
#usbdevice='tablet'
#-----------------------------------------------------------------------------
#   Set keyboard layout, default is en-us keyboard.
#keymap='ja'

ページトップ

9. コンソール

9.1 xmコンソール

xm consoleコマンドを用いて、準仮想化ドメインのコンソールあるいは、完全仮想化ドメインのシリアルコンソールへ接続することができます。

# xm console <ドメインID>

xm createコマンドに“-cオプション”を指定しておくことにより、起動時に自動的にxen consoleに接続することもできます。ドメインで指定できるコンソールデバイスには次のものがあります。

tty<番号>、ttyS<番号>、xvc<番号>

xvcはxen専用のデバイス番号を使用するため、xvcを使用するのが望ましいでしょう。使用するデバイスの指定はゲストカーネルに渡す起動オプションで次のように指定します。

xencons={tty<N>、ttyS<N>、xvc<N>}

ここで<N>は番号であり、通常は0を指定します。

注意すべきは、ゲストOSのコンソールもxenconsで指定したものを使用するように指定することと(console=オプション)、inittabでそのデバイスに対してgettyを起動するようにすることです。

ページトップ

9.2 SDL/VNCと仮想フレームバッファ

仮想フレームバッファとは、dom0とdomUでフレームバッファ用のメモリを共有し、そこにドメインが描画を行い、dom0上でSDLまたはVNCを使用して表示を行う仕組みです。(図9.1)

仮想フレームバッファを定義することにより、ゲストOSからフレームバッファを使用することができます。コンソール出力を出すためには、CONFIG_FRAMEGUFFER_ CONSOLE=yを指定しておくことが必要です。(Xを使用するだけなら不要です。)ドメイン定義ファイルには、以下の設定をしておきます。(※10

vfb = [ ’type=sdl’ ]

あるいは

vfb = [ ’type=vnc’ ]

vncを選んだ場合、vncviewを自動で起動する設定はないので手動で起動する必要があります。ポート番号が不明ですので、vncdisplay等で設定を参照すると良いでしょう。あるいは、netstat -ptlでポート番号を見つけることもできます。

ページトップ

※1 Linux2.6.23以降のバージョンでは、カーネル本体に取り込まれ、Linux標準機能としてリリースされています。

※2 詳細に関しては、http://www.selenic.com/mercurial/wiki/を参照してください。

※3 ディストリビューションにより異なりますが、
/boot/grub/menu.lst
/boot/grub/grub.conf
/grub/menu.lst
/grub/grub.conf
などがあります。

※4 “(<設定項目> <設定値>)”の形式。

※5 標準設定では、カーネル内に静的に組み込まれます。

※6 UUIDを生成するにはuuidgenを使用すると良いでしょう。uuidgenはe2fsprogsに含まれます。

※7 意:VNC viewerを使用している場合【ctrl + alt】を入力するにはf8を押下して、表示されるメニューでctrlとaltにチェックを入れます。

※8 各ディストリビューションではカーネルに独自パッチがあたっているので、単純にカーネルバージョンだけでは決められません。個別に調べる必要があります。

※9 Xenのバージョンにより、PVドライバのモジュール名が異なります。

※10 VNCの方が安定しているようなので、こちらを推奨します。

ページトップ