システム奮闘記:その75

仮想化ソフト「Xen」の導入に挑戦。でも断念・・・



Tweet

(2008年11月24日に掲載)
はじめに

 仮想OSの事をゲストOSと表記しています。
 Xenでは、ゲストOSと呼んだり、domain-Uと呼んだりします。
 管理OSの事を、domain-0と呼んだりします。

 でも、この奮闘記では、管理OSとゲストOSの2つの名称以外
使っていません。
 そのため「管理OS」→「domain-0」、「ゲストOS」→「domain-U」と
読みかえてください。


「Xen」の名前の由来  仮想技術のXen。 Xenといえば、禅なのだ!  坐禅を組んで、少しでも動くと坊さんから「喝!」と言われ 長い板で背中を叩かれる。  別にギャグではない。  実際に、2005年10月に鎌倉市の建長寺(禅寺)で、 日本ヒューレッドパッカード社がXenのセミナーを行ったのだ。 禅寺でのXenのセミナーの記事(ASCII24.com)  ところで映画「ランボー」が、日本語の「乱暴者」の「乱暴」に 由来しているのと同様に、Xenは「禅」から由来したのだと 書きたい所だが、実際は、全く異なる。
「Xen」の名前の由来
ギリシャ語の「Xenos」(客、外国人、身内以外の人)の接頭辞の
「Xeno」に由来している。ゲストOSの意味を込めているようだ。
詳細は以下のサイトにあります。

「Xen」の名前の由来が載ったサイト

 最初から横道に走ってしまった。閑話休題。

Xenを試してみるキッカケ  うちの会社でサーバーの置き場の問題が出てきた。  2000年当初は1台で始まったサーバーなのだが、 機能拡大による新規購入や、社内で余ったパソコンの活用で 2008年7月には、6台になった。  置き場の問題が出てきたのだ!  そしてWebサーバー兼メールゲートウェイのマシンから 異音がなるようになった。
異音が発生!
DMZのメールゲートウェイ&Webサーバーから異音が聞こえてきた。
このサーバーも導入して5年になる。それも普通のパソコンだ。
24時間連続稼働だと、摩耗しても止むなしなのだ。

 だが、DNSサーバーも故障の危険にさらされている。
 実は・・・

 20世紀に購入したパソコンを活用しているのだ!

いつ壊れるか不明なDNSサーバー
1997年に購入したパソコンを活用していたのだ。
Linux-2.4系で、テキストモードで稼働させているため
DNSだけだと、サーバーの性能が低くても稼働への影響は全くない。

でも、11年前のパソコンを24時間連続稼働しているため
いつ故障してもおかしくない状況だ。
それにDNSという通信の根幹を支えるサーバーだけに
故障するのは非常に具合が悪い。

 そこで買い替えを考えた時、思いついたのが仮想化技術の活用だった。

 最初、Xenの導入を考えた。
 この時、VMware Serverは考えていなかった。

 まぁ、結果的には題名にも書いているのだが

 Xenは断念して、VMware Serverになったのらー!

 でも、折角だから、Xen導入でコケた話を書けば良いと思ったので、
思いっきりコケた話を包み隠さず公開したいと思います (^^)


Xenのインストールに挑戦!

 システム奮闘記の連載を続けている。  初期の頃は、知識がないため「とりあえず導入」や 「とりあえず触ってみる」と精神で進んでいった。  そのためお得意の・・・  七転八倒、表情はムンクの叫び!  が日常茶飯事だったのだ。  だが、それは今は昔になってしまった。  トラブル発生、七転八倒を避けるべく、どんどん慎重になり、 徹底的に調べてから導入の方向になっていった。  技術力がついた半面、なかなか物事が進まなくなった。  さて、仮想化技術の知識が全くない状態だった。  だが、仮想化技術の仕組みを調べたり、ましてやソースコードを 見ていったのでは 一生、導入不可能なのだ!  そこで、初心に返って  とりあえず触ってみる!  を実践する事にした。

準仮想化のXen、完全仮想化のVMware Server

Xenを導入する前に、多少は知識は必要だと思い 仮想化技術ついて多少は調べてみる事にした。  同じ仮想化技術でも、XenとVMware Serverでは異なる 仕組みになっている。  完全仮想化のVMware Serverの場合、図式化すると 以下のような仕組みになっている。
VMware Serverの仕組み
ホストOS上に仮想化ソフトがあり、その上の部分に
ゲストOSがのっている形態を「完全仮想化」という。

ゲストOSは入出力(I/O)を全てホストOSを経由しているため
重たくなりやすい問題点があるが、ゲストOSのインストールの際は
仮想化用に改造しなくても良い長所もある。

 Xenは準仮想化になる。
 図式化すると以下のようになるという。

xenの仕組み
ハードウェアの上にXenが載っていている。
その上に、管理OSとゲストOSが載っている感じだ。
この形は準仮想化と呼ばれる。

そして、管理OSがゲストOSの管理を行うのだが、
入出力(I/O)に関しては、管理OSを介さずに
直接、Xenを経由してハードウェアと接続するため
完全仮想化よりも入出力が速いと言われる。

後述していますが、問題点として、ゲストOSは
そのままでは使えず、Xen用に改造を行う必要があるという
問題点を抱えている。

(xenでも完全仮想化は可能)

XenでもCPUが対応していれば、完全仮想化は可能だ。
完全仮想化の設定を行えば、ゲストOSに手を加える必要ないという。

 ここで疑問が生まれた。

 どないしてXenをインストールするねん!

 VMware Serverの場合、ホストOSの上からインストールすれば良いが
Xenの場合、管理OSやゲストOSの土台になっている。
 なので、土台になるXenが最初にインストールされる物だと考えてしまう

xenのインストール手順を以下のように考えた
Xenの上に管理OSやゲストOSがあるのだから、
土台となるXenを最初にインストールして、その後で
管理OSやゲストOSを入れる形になると思った

この疑問の答えについては後述しています。

 だが、Xenのインストールをするために、Xenのサイトを見ても

 バイナリだけでなく・・・
 tar.gz形式のソースで配布されているやん!

 うーん、ソースコンパイルの場合、どないしてインストールするねん。
 まさかCD-Rにソースプログラムを焼いて、起動させるわけでもないし。

 「最初にXenをインストールする必要があるのではないか」という
疑問を持ったのだが、考えても、わかるわけがない。
 謎が深まるばかりだった。

用語:ホストOSと管理OSについて
VMware Serverの場合、ゲストOSを管理するOSを
「ホストOS」と書いています。
ホストOS上で仮想化ソフトとゲストOSを動かしているため
まさにホスト(受け入れる側)なので、ホストOSと言われると思う。
本などでも「ホストOS」の表記が目立つので、
私もそれにならいました。

Xenの場合、ゲストOSを管理するOSを「管理OS」と表記しています。
準完全仮想化の場合、管理OSが土台になっているわけでないため
ホストOSという表記がふさわしくないためなのか
仮想化技術の本では「管理OS」と書いていたりしていますので
私も準仮想化の場合は「管理OS」と書きました。


CentOS5.1でXenのインストール

 どうやってXenをインストールするのか。そんな疑問を持ったのだ。  でも、いくら考えても、わかるわけがないので、 とりあえずXenのインストールを本の丸写しで行う事にした。  次の本を取り出す。 「Xen徹底入門」(宮本 久仁男・大島孝子・平 初・長谷川 猛:翔泳社)  そして、CentOS5.1を使って、Xenのインストールを行う事にした。  Xenという物が、どういう物か、わからないため、 最初は簡単にインストールできる方法で行う事にした。  本を見れば、管理OSを最初にインストールするというのだ。  そこで、まずは管理OSのインストールから始める。  仮想化の設定は、管理OSのインストール時から始めるのだ。
管理OSのインストール時
インストールするソフト(パッケージ)の選択の際に
「仮想化」に印を入れる。

仮想化ソフトを選択するだけで、Xenのインストールを
自動的に行ってくれるのだ。

 これで管理OSの準備は完成だ。非常に簡単 (^^)


ゲストOSのインストール  管理OSのインストールが終わり、管理OSを立ち上げる。  そして、そこからゲストOSのインストールが始まるのだ。 CentOS5.1の場合、Xenのインストールや操作を行うための 「Virtual Machine Manager」(仮想マシン管理道具)が用意されている。  そこで「Virtual Machine Manager」を使って ゲストOSのインストールを行う事にした。
「Virtual Machine Manager」を使ってみる
「Virtual Machine Manager」を選択すれば良い。
GUIの場合、この手の操作が楽で良い (^^)

 すると「Virtual Machine Manager」が起動し
以下の画面になる。

「Virtual Machine Manager」が起動
「新規」ボタンを選択する。
これを選択する事で、ゲストOSのインストールが開始されるのだ

 いよいよゲストOSのインストール作業が開始される。

ゲストOSのインストールの様子・その1
「進む」のボタンを押す。


ゲストOSのインストールの様子・その2
システム名を入力する。
ここでは、OSの名前でも良いし、機能別の名前でも良い。
利用者にとって、わかりやすい名前なら何でも良い。


ゲストOSのインストールの様子・その3
準仮想化か、完全仮想化の選択だ。
このマシンでは、CPUが対応していない事もあり
完全仮想化ができない。
そのため、準仮想化を選択せざる得ない。

 いよいよ、ゲストOSのインストールの準備だ。
 ゲストOSはホストOSと同じ、CentOS5.1を使う。

ゲストOSのインストールの様子・その4
インストール元の表記がURLになっている。


 インストール元の表記がURLである事は・・・

 http経由でインストールなのかよ!

 だった。

  しかし、apacheなんぞ立ち上げるなんて面倒な事をしたくない。
 なので、http経由でなく、以下のように直に該当のファイルを見れるように

ゲストOSのインストールの様子・その5
インストール元の表記を
「file:///CD(DVD)の中身のあるディレクトリ」にして
直に該当のディレクトリを見れるようにした。

 こうすれば良いと思ったのだが、設定を進めていくと

 エラーが出るのらー (TT)

 だった

エラーの様子
ネットワーク経由でないと、ゲストOSはインストールできないようだ。
「なんで?」と思いたくなるのだが、そういう仕組みなんだろう。

 そこで仕切り直す事にした。

 ゲストOSのインストールには、Apacheのインストールが欠かせない。
 ソースコンパイル好きの私なのだが、ここでは手抜き(?)する。
 CentOS5.1の初期状態でインストールされている

 Apacheを使うのだ!

 そう。
 どうせゲストOSインストール以外は、httpdデーモンを
おねんねさせているだけなので、初期状態で入っている物を
素直に使えば良いのだ (^^)

  Apacheの設定を行うのだが、わざわざ設定ファイルの記述を
変更する事もなく、初期状態の設定ファイルを、そのまんま使えば良い。

 極めて楽なのらー! (^^)

 というわけで、シンボリックリンクを張る作業だけ行う。

Apacheの設定の様子
シンボリックリンクを張るだけだが (^^;;
[root@xenhost]# cd /var/www/html
[root@xenhost]# ln -s /media/CentOS_5.1_Final cent
CentOS5.1の初期状態では、Webコンテンツが格納されている
ディレクトリは「/var/www/html」になる。
そこで「/var/www/html」のディレクトリに移動する。

そして、http経由で、インストール元のデータが格納されている
CD(DVD)が見れるように、シンボリックリンクを張る。

CD(DVD)のディレクトリ名が長いので、リンク名を「cent」にした。

 これで準備完了。
 簡単なのだ (^^)


  そして、再びxen設定画面(ゲストOSのインストール)に戻る。

ゲストOSのインストールの様子・その6
インストール元のURLを指定する。
「127.0.0.1」を指定している。

この時、IPアドレスの指定で、ホストOSのIPアドレスを使うと
エラーが出るのだ。

 次にゲストOSが格納されるファイルや大きさの指定を行う。

ゲストOSのインストールの様子・その7
ゲストOSが格納されるファイル名とディレクトリの指定。
そして、ファイルの大きさを指定する。

1つのディスクパーティション全体をゲストOSに入れる事もできるようだが
本の丸写しの実力しかない私なので、ここは簡単に設定するため
「シンプルファイル」を選んで、ゲストOSが格納されるファイル名と
ファイルの大きさを指定する。


ゲストOSのインストールの様子・その8
「共有物理デバイス」の所に印を入れる。
デバイスを「xenbr0」にする。

この辺りは本の丸写しなのだ (^^)

 ゲストOSの使用メモリと使用CPUの数を決める。

ゲストOSのインストールの様子・その9
とりあえずメモリは500Mにした。
CPUはマシン本体には1個しかないので、1個にした。

複数のCPUと大量のメモリを搭載した本格的なサーバーなら
この辺りの事を考えないといけないかもしれないが、
中小企業が使う分には、そこまで厳密に設定を行う必要はないだろうと
勝手に考えてみる (^^)

 これでゲストOSの資源の割り当てなどの重要な設定が終了した。

ゲストOSのインストールの様子・その10
準備完了なので「完了」ボタンを押すだけ。


ゲストOSがインストールされる様子 ここからは通常、CentOS5.1のインストールと変わらないが 一部、違う箇所もあるので、載せる事にした。
ゲストOSのインストールの様子・その11
ゲストOSが格納されるファイルを生成中の様子。
ここは様子を見守るだけで何もしなくても良い。


ゲストOSのインストールの様子・その12
ゲストOSが格納されるファイルが生成できたので、
次にインストールの準備が始まる。


ゲストOSのインストールの様子・その13
使用言語を選択する。
もちろん日本語を使うので「Japanese」を選択する。


ゲストOSのインストールの様子・その14
ネットワークの設定を行う。
まずは「IPv4」と「IPv6」の有無の設定を行う。
今回、IPv4だけを選択した。

だって、IPv6なんて、わかんないもーん (^^)

 順調に進んでいるかと思ったのだが

 いきなりエラーが出たのらー (TT)

エラーの様子
インストール元の読み書きができないというエラー。
最初に設定したURLでは、この先は使えないというのだ。

 なぜ、エラーが出たのか、わからない。
 そして、インストール元のURLの要求画面が出てきた。

 なので、最初の時と同じようにIPアドレスの指定を
自分自身である「127.0.0.1」にした。

IPアドレスの指定を「127.0.0.1」にした

 それで動かしてみるのだが・・・

 やっぱりエラーが出る (TT)

  ゲストOSのインストール開始時には「127.0.0.1」で
全く問題なかっただけに、ここでエラーが出る理由がわからない。
 見当すらつかないため・・・

 どないすれば、ええねん

 と思った。

 お得意のドツボにハマる感じだと思った。
 だが、ふと、管理OSのIPアドレスにすれば良いかもと思い
下のように行った。

IPアドレスをホストOSのIPに変更する
管理OSのIPアドレスを入力した。

 すると

 見事、インストールが再開された V(^^)V

 だった。

エラーの原因(推測)
インストールの最初の段階では、管理OS上でインストール作業を行う。
そのため、インストール元のデータが格納されたURLの指定の際
自分自身を指す「127.0.0.1」のIPで良かった。
だが、ゲストOSの格納先などが決まり、管理OSと独立した形で
インストールを進めると、CD(DVD)は管理OSにあるのに、
「127.0.0.1」を指定すると、現在、インストール中の
ゲストOSのアドレスを指してしまい、不都合が生じて
エラーが発生すると考えられる。

なので、管理OSとゲストOSの通信と考えて、
インストール元のURLをホストOSのIPアドレスを指定する事で
マシン間通信が可能になり、問題なくインストールが続行されると
考えられる。

 「いかにも」と思える理由を考えてみた。
 多分、そういう理由だと思ったりするが、仮想化についての知識は
全くないので、突っ込んで調べる事はしないのだ (^^)


 それにしても順調にインストールが進む。
 ここからは、通常、パソコンにCentOS5.1をインストールする場合と
全く同じだ。

ゲストOSのインストールの様子・その15

ゲストOSのインストールの様子・その16
「次」のボタンを押すだけ。

 次に、ゲストOS内のディスク・パーティションの設定を行う。
 厳密に言えば、ゲストOSのために割り当てられたファイルの領域を
パーティションにわけるのだ。

ゲストOSのインストールの様子・その17
自動的にパーティションをする場合や
手動でバーティションを行う場合がある。

 次にゲストOSのネットワークの設定を行う。

ゲストOSのインストールの様子・その18
図では設定をDHCPにしているが、IPアドレスを割り当てる事もできる。
用途にとって決めれば良いのだ。


ゲストOSのインストールの様子・その19
時間(標準時)の設定
ここでは「アジア/東京」を選ぶ。

関西人としては日本標準時の「明石」が良いと思ったりするが
海外では知名度は全くない。
妥協点として「アジア/日本三都物語(京都/大阪/神戸)」が
良いと思ったりする。でも、意外と海外では三都物語の都市は
知られていない。知られているといえば、京都ぐらいかも・・・。

 そして管理者(root)のパスワードの設定

ゲストOSのインストールの様子・その20
rootのパスワードを決める。
私なら「(内緒)」としたりする。

好きな女性の名前にしたい所だが、私の場合、簡単にバレる。
「ono-mayumi」(小野真弓)とか「maeda-chie」(前田知恵)だと
確実にバレるので、好きな人の名前は使えないのだ (^^;;

中国人アイドルの「rola-chen」(ローラ・チャン)もダメだなぁ・・・。

 好きな女性の名前をパスワードに使えないため
パスワードを考えるのに苦労する私。

余談:ローラ・チャンの「チャン」
ローラ・チャンのチャンは漢字で書くと「陳」になる。
ちなみに本名は「陳怡」なのだ。

「怡」には喜ぶ、楽しむの意味があり、まさに天真爛漫の
明るい女の子の雰囲気に合っている (^^)

ところで陳という名字の俳優や芸能人を挙げてみると
アグネス・チャンだ。チャンは「陳」なのだ。
アクション映画監督のジャッキー・チェンのチェンも「陳」なのだ。

中国人や台湾人の名前を音読みしても失礼にはならない。
でも、ジャッキー・チェンを音読みすると・・・

ジャッキー・ち〜ん

となり、拍子抜けの響きになる (--;;
反対に、日本人の名前を中国語読みすると同じ事があったりする。
日中の間だけでできる言葉遊び(?)になったりするのだ。

 閑話休題
 パスワードを決めたら、インストールするソフトを選ぶ

ゲストOSのインストールの様子・その21
ここでインストールするソフト(パッケージ)を選択する。

 選択し終えたら、あとはCD(DVD)からデータが運ばれるのだ。

ゲストOSのインストールの様子・その22
「次」を押すだけ。
すると、CD(DVD)が動きだし、ゲストOSのインストールが開始される。


ゲストOSのインストールの様子・その23
ゲストOSがインストールされていく様子がうかがえる。


ゲストOSのインストールの様子・その24

  CD(DVD)からの読み込みが終わると以下の画面になる。

ゲストOSのインストールの様子・その25
CD(DVD)からの読み込みが終わた事を知らせる。
ここでは「再起動」を選べば良い。


ゲストOSのインストールの様子・その26
再起動直後の様子。
ペンギンの絵が出ている。

 残りの設定を行う。

ゲストOSのインストールの様子・その27
「進む」を押すだけ。


ゲストOSのインストールの様子・その28
ファイヤーウォールの設定だが、下手に設定するとハマるので
ここでは行わない方が無難。

あとでiptablesを使ってファイヤウォールの設定は可能。
iptablesの設定については詳しくは
「システム奮闘記:その21」をご覧ください。


ゲストOSのインストールの様子・その29
SELinuxの設定なのだが、ここも知識がある人以外は
触らない方が無難なので、「無効」にしておく。
もちろん、私は知識がないので「無効」なのだ (^^;;

SELinuxといえば、中村雄一さんが挙げられる。
私と同じ名前の「雄一」なのだが・・・

私にはSELinuxを理解できる頭がないのだ (^^;;

という事で、いまだにSELinuxに着手できていない
今日この頃なのだ


ゲストOSのインストールの様子・その30
現在時刻の設定。
何も触らなくても良いかも (^^)


ゲストOSのインストールの様子・その31
root以外のユーザー名の登録。

私の場合「suga」を登録。
パスワードは内緒 (^^)

ただし、私にハニートラップを仕掛けてくれたら、
思わず、しゃべてしまうかもしれない。
でも、たかだか実験用サーバーのパスワードのためだけに、
ハニートラップを仕掛ける人はおらんやろなぁ・・・(笑)

 これで全てインストール作業が完了!

ゲストOSのログイン画面
通常のCentOS5.1のログイン画面と何ら変わらない。

 早速、ログインしてみる事にした。

ゲストOSでログイン
通常のCentOS5.1のログイン画面と何ら変わらない。
だが、ホストOSとゲストOSの両方が格納され、
同時に稼働する状態なのだ。

1つのマシンに複数のOSが同時に動くのは
何とも奇妙な感じがする。

 ちょこちょこ触ってみたが、問題はなさそうだ。
 これなら簡単にXenが導入できると思った。

GRUBの設定を見てみる  Xenのインストールができた。  そこで起動の順番がどうなっているのか。  丁度、GRUBの事を調べた後だったので、GRUBの設定ファイルを 見てみる事にした。
GRUBの設定ファイル /booot/grub/menu.lst
(CentOS5.1の場合)
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=50
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-53)
        root (hd0,0)
        kernel /xen.gz-2.6.18-53.el5
        module /vmlinuz-2.6.18-53.el5xen ro root=LABEL=/ rhgb quiet
        module /initrd-2.6.18-53.el5xen.img
赤い部分がXenを読み込む部分。
青い部分がLinuxカーネル本体を読み込む部分。

順番としてはXenを読み込んだあと、カーネル本体を読み込んでいる。

  CentOS5.1でXenをインストールを行う時、
自動的にインストールする場合は、難しい事を考えずに
円滑で行える。


 Xenのインストールで疑問に思っていた事であった
「Linuxカーネルの前にXenのインストールを行う必要があるのでは」
という事が頭に思い浮かんだ。

 もしかして、最初は通常のLinux上でXenをコンパイルして
その後、GRUBの設定ファイルを書き換えて、Xenを先に読み込めば
Xenのインストールができるのではないか。
 実際、どうなのかについては、後述しています。


障害発生!! そしてXenの導入断念・・・  ちょこちょことゲストOSを触っていて問題なさそうに思った。  これでサーバーの入れ替えができると思い、 サーバー入れ替えの日も決めた。  ところが、サーバー切り替え作業の数日前になって 思わぬ事態が発生した。  他のサーバーからftpでソフトを取り込む作業を行った。  できる限りソースコンパイルを行う私なので、RPMは使わない。  その時、障害が発生した。
発生した障害
ftp> ls
227 Entering Passive Mode (192,168,X,Y,169,62)
150 Here comes the directory listing.
-rw-r--r--    1 1013     500       2483180 Aug 13 08:18 apache_1.3.41.tar.gz
-rw-r--r--    1 1013     500       6456550 Aug 14 01:25 bind-9.4.2-P2.tar.gz
-rw-r--r--    1 1013     500       6627081 Aug 13 09:20 bind-9.5.0-P2.tar.gz
-rw-r--r--    1 1013     500       1725660 Aug 28 01:09 squid-2.6.STABLE18.tar.gz
-rw-r--r--    1 1013     500        418680 Feb 24  2007 webalizer-2.01-10-src.tgz
226 Directory send OK.
ftp> get apache_1.3.41.tar.gz
local: apache_1.3.41.tar.gz remote: apache_1.3.41.tar.gz
227 Entering Passive Mode (192,168,X,Y,232,254)
150 Opening BINARY mode data connection for apache_1.3.41.tar.gz (2483180 bytes).
*** glibc detected *** ftp: malloc(): memory corruption: 0x08a42208 ***
======= Backtrace: =========
/lib/i686/nosegneg/libc.so.6[0x4f6dc2]
/lib/i686/nosegneg/libc.so.6(__libc_malloc+0x85)[0x4f7f75]
/lib/i686/nosegneg/libc.so.6[0x533926]
/lib/i686/nosegneg/libc.so.6[0x53fbc3]
/lib/i686/nosegneg/libc.so.6(regexec+0x8c)[0x5417bc]
/lib/libselinux.so.1[0x17d43f]
/lib/libselinux.so.1(matchpathcon+0x25)[0x17d595]
/usr/lib/libkrb5support.so.0[0x139abd]
/usr/lib/libkrb5support.so.0(krb5int_labeled_fopen+0x37)[0x139dc7]
ftp[0xe78288]
ftp[0xe7189c]
ftp(main+0x48a)[0xe7baaa]
/lib/i686/nosegneg/libc.so.6(__libc_start_main+0xdc)[0x4a4dec]
ftp[0xe6d8c1]
======= Memory map: ========
00110000-00135000 r-xp 00000000 fd:00 1571804    /usr/lib/libk5crypto.so.3.1
00135000-00136000 rw-p 00025000 fd:00 1571804    /usr/lib/libk5crypto.so.3.1
00136000-0013e000 r-xp 00000000 fd:00 1571803    /usr/lib/libkrb5support.so.0.1
0013e000-0013f000 rw-p 00007000 fd:00 1571803    /usr/lib/libkrb5support.so.0.1
0013f000-00144000 r-xp 00000000 fd:00 940580     /lib/libcrypt-2.5.so
00144000-00145000 r--p 00004000 fd:00 940580     /lib/libcrypt-2.5.so
00145000-00146000 rw-p 00005000 fd:00 940580     /lib/libcrypt-2.5.so
00146000-0016d000 rw-p 00146000 00:00 0 
0016d000-0016f000 r-xp 00000000 fd:00 940568     /lib/libkeyutils-1.2.so
0016f000-00170000 rw-p 00001000 fd:00 940568     /lib/libkeyutils-1.2.so
00170000-00185000 r-xp 00000000 fd:00 940571     /lib/libselinux.so.1
00185000-00187000 rw-p 00015000 fd:00 940571     /lib/libselinux.so.1
00187000-00189000 r-xp 00000000 fd:00 940554     /lib/libdl-2.5.so
00189000-0018a000 r--p 00001000 fd:00 940554     /lib/libdl-2.5.so
0018a000-0018b000 rw-p 00002000 fd:00 940554     /lib/libdl-2.5.so
001a9000-001c2000 r-xp 00000000 fd:00 940488     /lib/ld-2.5.so
001c2000-001c3000 r--p 00019000 fd:00 940488     /lib/ld-2.5.so
001c3000-001c4000 rw-p 0001a000 fd:00 940488     /lib/ld-2.5.so
002b5000-002cc000 r-xp 00000000 fd:00 1561394    /usr/lib/libkrb4.so.2.0
002cc000-002cd000 rw-p 00017000 fd:00 1561394    /usr/lib/libkrb4.so.2.0
002cd000-002d2000 rw-p 002cd000 00:00 0 
002fc000-002fd000 r-xp 002fc000 00:00 0          [vdso]
00406000-00408000 r-xp 00000000 fd:00 940572     /lib/libcom_err.so.2.1
00408000-00409000 rw-p 00001000 fd:00 940572     /lib/libcom_err.so.2.1
0048b000-0048e000 r-xp 00000000 fd:00 1559848    /usr/lib/libdes425.so.3.0
0048e000-0048f000 rw-p 00002000 fd:00 1559848    /usr/lib/libdes425.so.3.0
0048f000-005cc000 r-xp 00000000 fd:00 940553     /lib/i686/nosegneg/libc-2.5.so
005cc000-005ce000 r--p 0013d000 fd:00 940553     /lib/i686/nosegneg/libc-2.5.so
005ce000-005cf000 rw-p 0013f000 fd:00 940553     /lib/i686/nosegneg/libc-2.5.so
005cf000-005d2000 rw-p 005cf000 00:00 0 
00705000-00795000 r-xp 00000000 fd:00 1571805    /usr/lib/libkrb5.so.3.3
00795000-00798000 rw-p 0008f000 fd:00 1571805    /usr/lib/libkrb5.so.3.3
0090f000-0091a000 r-xp 00000000 fd:00 940556     /lib/libgcc_s-4.1.2-20070626.so.1
0091a000-0091b000 rw-p 0000a000 fd:00 940556     /lib/libgcc_s-4.1.2-20070626.so.1
00981000-009bc000 r-xp 00000000 fd:00 940570     /lib/libsepol.so.1
009bc000-009bd000 rw-p 0003a000 fd:00 940570     /lib/libsepol.so.1
009bd000-009c7000 rw-p 009bd000 00:00 0 
00b59000-00b62000 r-xp 00000000 fd:00 938249     /lib/libnss_files-2.5.so
00b62000-00b63000 r--p 00008000 fd:00 938249     /lib/libnss_files-2.5.so
00b63000-00b64000 rw-p 00009000 fd:00 938249     /lib/libnss_files-2.5.so
00b9b000-00bc8000 r-xp 00000000 fd:00 1573192    /usr/lib/libgssapi_krb5.so.2.2
00bc8000-00bc9000 rw-p 0002d000 fd:00 1573192    /usr/lib/libgssapi_krb5.so.2.2
00c56000-00c65000 r-xp 00000000 fd:00 940569     /lib/libresolv-2.5.so
00c65000-00c66000 r--p 0000e000 fd:00 940569     /lib/libresolv-2.5.so
00c66000-00c67000 rw-p 0000f000 fd:00 940569     /lib/libresolv-2.5.so
00c67000-00c69000 rw-p 00c67000 00:00 0 
00e6a000-00e81000 r-xp 00000000 fd:00 163403     /usr/kerberos/bin/ftp
00e81000-00e84000 rw-p 00016000 fd:00 163403     /usr/kerberos/bin/ftp
00e84000-00eb1000 rw-p 00e84000 00:00 0 
08417000-08a47000 rw-p 08417000 00:00 0 
b7e00000-b7e21000 rw-p b7e00000 00:00 0 
b7e21000-b7f00000 ---p b7e21000 00:00 0 
b7f95000-b7fb7000 rw-p b7f95000 00:00 0 
b7fd9000-b7fdd000 rw-p b7fd9000 00:00 0 
b7fe4000-b7fea000 rw-p b7fe4000 00:00 0 
bfe37000-bfe8a000 rw-p bfe37000 00:00 0          [stack]
アボートしました
[root@xen]# 
ピンクの所に注目した。
ftpを利用中に、malloc()においてメモリ違反(衝突)が発生し
それが原因でftpが停止したようだ。

Xenの場合、メモリ管理機構は個々のOSが行うのか
Xenが行うのかは、わからないが、メモリ管理機構に不具合があり
その結果、malloc()を使ってメモリ領域を確保する際に
衝突が発生し、ftpが停止する事態になった事が推測できる。

 思わぬ事態に遭遇した。
 もちろん、原因を追求する必要があるのだが、そんな知識はないため
とても自力では対処できない。
 しかもサーバー入れ替え作業が数日後に控えている。

 なので、涙を飲んでXenの導入を断念する事にした (TT)

 急遽、VMware Serverに乗り換えしたのだ!

 他の選択肢を準備したお蔭で、サーバーの入れ替えは滞りなく終えた。
  VMware Server導入の話は「システム奮闘記:その74」
(仮想化技術入門 VMware Server導入)をご覧ください。

  OSC2008札幌、京都、名古屋で「只今、xenの導入準備中」と言っただけに
突然の変更だと、詐欺師になりそうなのだが、あくまでも準備中であって

 その後、Xen導入に失敗しただけ

  なので、全くウソはついていないのだ (^^)

 というわけで、Xenについて熱く語れないのが残念なのだが
「失敗してもうた」の話題ぐらいなら語れる。


 失敗談の生産という初期のシステム奮闘記を思い出させる話になった。
 初志貫徹という事なのだ (^^)


Xenのソースコンパイル

Xenのインストールだが、CentOS5.1から本の丸写しで 簡単に行える事はわかった。  ソースコンパイルでの方法も覚えておいた方が良いと思った。 そして、Xenのソースコンパイルを試してみる事にした。  先に結論から書くと・・・  見事に失敗したのらー!! (^^)  だが、失敗事例を載せるのは、システム奮闘記を連載開始当初から 守り続けたの編集方針なので、どんな状態だったのかを説明するため、 堂々と包み隠さず失敗談を載せる事にしました。 (注釈)  この所、失敗談や七転八倒の話があまりないですが 別に隠蔽していたわけでなく、失敗談が激減したためです (^^;;  早速、この時、最新版だったXenのソース(3.2.1)を ダウンロードした。  そしてソースを展開する。
Xen-3.2.1の展開
[root@xen]$ tar xvfz xen-3.2.1.tar.gz

(途中、省略)

[root@xen]$ cd xen-3.2.1

 そしてREADMEを見ながらインストールの方法を調べる。

READMEの内容
On Linux:

3. For the very first build, or if you want to destroy existing
   .configs and build trees, perform the following steps:

    # make world
    # make install

 なので、早速、「make world」を打ってみる。
 だが・・・

 なんでエラーが出るねん (TT)

 だった。

「make world」を打ってみた
[root@xen]# make world
make clean
make[1]: ディレクトリ `/usr/src/xen-3.2.1' に入ります
make -C xen clean
make[2]: ディレクトリ `/usr/src/xen-3.2.1/xen' に入ります
make -f Rules.mk _clean

(途中、省略)

install -m0644 -p include/public/COPYING /usr/src/xen-3.2.1/dist/install/usr/include/xen
make[3]: ディレクトリ `/usr/src/xen-3.2.1/xen' から出ます
make[2]: ディレクトリ `/usr/src/xen-3.2.1/xen' から出ます
for i in  linux-2.6-xen  ; do make $i-install || exit 1; done
make[2]: ディレクトリ `/usr/src/xen-3.2.1' に入ります
make -f buildconfigs/mk.linux-2.6-xen build
make[3]: ディレクトリ `/usr/src/xen-3.2.1' に入ります
set -e ; \
        if [ ! -e linux-2.6.18-xen.hg/.hg ] ; then \
            __repo=$(sh buildconfigs/select-repository linux-2.6.18-xen.hg .:..) ; \
            if [ -d ${__repo} ] ; then \
                echo "Linking ${__repo} to linux-2.6.18-xen.hg." ; \
                ln -s ${__repo} linux-2.6.18-xen.hg ; \
            else \
                echo "Cloning ${__repo} to linux-2.6.18-xen.hg." ; \
                hg clone ${__repo#file://} linux-2.6.18-xen.hg ; \
            fi ; \
        else \
            __parent=$(hg -R linux-2.6.18-xen.hg path default) ; \
            echo "Pulling changes from ${__parent} into linux-2.6.18-xen.hg." ; \
            hg -R linux-2.6.18-xen.hg pull ${__parent} ; \
        fi
select-repository: Searching `.:..' for linux-2.6.18-xen.hg
select-repository: Ignoring `.'
buildconfigs/select-repository: line 35: hg: command not found
select-repository: Unable to determine Xen repository parent.
make[3]: *** [linux-2.6.18-xen.hg/.valid-src] エラー 1
make[3]: ディレクトリ `/usr/src/xen-3.2.1' から出ます
make[2]: *** [linux-2.6-xen-install] エラー 2
make[2]: ディレクトリ `/usr/src/xen-3.2.1' から出ます
make[1]: *** [install-kernels] エラー 1
make[1]: ディレクトリ `/usr/src/xen-3.2.1' から出ます
make: *** [world] エラー 2
[root@xen]# 

 思わず頭を抱えた。それに

 リポジトリ(repository)って何やねん・・・

 どこかで聞いた言葉ではがあるが、意味まではわからない。

リポジトリとは
英和辞典で「repository」を調べてみると以下の意味だった。
保管場所、タンス、倉庫、押し入れ。

コンピュータ用語では、データやファイルを蓄積する場所だという。
ソフトの開発現場で、改良した内容の蓄積などに使われている感じだが
実際に、どういう意味で、どういう時に使う言葉なのかは
この時点(今もそうだけど・・・)では、わからなかった。

 エラーの原因がわからない。解決するだけの知識がない。
 なので、どうあがいても無駄だと思い、Xen-3.2.1のインストールは諦め、
バージョンを下げて、Xen-3.1.4のインストールに挑戦する事にした。

Xen-3.1.4の展開
[root@xen]$ tar xvfz xen-3.1.4.tar.gz

(途中、省略)

[root@xen]$ cd xen-3.1.4

 そしてコンパイルを行う。

Xen-3.1.4のコンパイル
[root@xen]$ make world
make clean
make[1]: Entering directory `/home/member/suga/src/xen-3.1.4'
make -C xen clean
make[2]: Entering directory `/home/member/suga/src/xen-3.1.4/xen'

(途中、省略)

make[3]: Entering directory `/usr/src/xen-3.1.4'
Cannot find linux-2.6.18.8.tar.bz2 in path .:..
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.8.tar.bz2 -O./linux-2.6.18.8.tar.bz2
--17:37:16--  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.8.tar.bz2
www.kernel.org をDNSに問いあわせています... 204.152.191.5, 204.152.191.37
www.kernel.org|204.152.191.5|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 41842273 (40M) [application/x-bzip2]
Saving to: `./linux-2.6.18.8.tar.bz2'

26% [====================>                                                           ] 11,036,232   371K/s  eta 58s   

青い部分は、コンパイルするディレクトリにLinuxカーネルが
存在しない事を表している。
そして、赤い部分は、Linuxカーネル(2.6.18.8)を
カーネルが保管されているサーバーに接続を行っている。
つまり、Xenのディレクトリに該当のLinuxカーネルソースが
存在しない場合は、保管されているサーバーに接続し
ダウンロードを行っているのだ。


そしてダウンロードしたカーネルとXenが同時に
コンパイルされていく。
ここがXenのコンパイルにおけるミソなのだ。

 これは便利だなぁと思った。

 でも、頻繁に行う場合、ネットの混雑に元になるので、
一度、linux-2.6.18.8.tar.bz2をダウンロードしておいて、
Xenのコンパイルを行うディレクトリに置いておくと
コンパイルの度に、カーネルが保管されているサーバーへ
接続する事もないため、通信網の渋滞を防ぐ事になる。


 さて、コンパイルが終わる。
 そして、make installで、インストールを行う。

 これでインストール作業は終了。
 ブートローダーの設定ファイルの変更を行う。

  /boot ディレクトリを見てみるとコンパイルされた
XenとLinuxカーネルが置かれている。

/boot ディレクトリの様子
[suga@mail boot]$ ls
System.map-2.6.18.8-xen  lost+found                 vmlinuz-2.6.9-42.EL
System.map-2.6.9-42.EL   message                    xen-3.1.4.gz
config-2.6.18.8-xen      message.ja                 xen-3.1.gz
config-2.6.9-42.EL       vmlinux-syms-2.6.18.8-xen  xen-3.gz
grub                     vmlinuz-2.6-xen            xen-syms-3.1.4
initrd-2.6.18.8-xen.img  vmlinuz-2.6.18-xen         xen.gz
initrd-2.6.9-42.EL.img   vmlinuz-2.6.18.8-xen
[suga@mail boot]$ 
赤い部分がコンパイルしてできたXen。
青い部分は、Xenと一緒にコンパイルされてできたカーネル。

 CentOSでは、GRUBを使っているため、grub.confの変更を行う。

  (注意)
  本当は menu.lstファイルが設定ファイルだが、CentOSの場合
  細工をしているため、grub.confが設定ファイルになっている。
  詳細は「システム奮闘記:その71」(ブートローダーGURBの仕組み)
  をご覧ください

grub.conf(menu.lst)の変更
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=50
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-53)
        root (hd0,0)
        kernel /xen-3.1.4.gz
        module /vmlinuz-2.6.18.8-xen ro root=LABEL=/
        module /initrd-2.6.18.8-xen.img
この時、xenとLinuxカーネルの読み込む順番に注目した。
先にXenを読み込み、そしてLinuxカーネルを読み込んでいる。

 この時、気づいた。

 どうやってXenをインストールしているのかだった。
 Xenのインストールの手順を図式化すると以下の事だった。

Xenのインストールの手順
最初にCD-ROM(DVD)でLinuxをインストールする。
これは、普通にLinuxを入れる場合と同じだ。

そして、Xenのコンパイルを行う。
その際、Linuxカーネルも自動的に取り込み、
同時にコンパイルを行う。Xen仕様のカーネルの作成だ。

最後に、GRUBの中に、XenとXen仕様のカーネルを取り込む。

つまりLinux上で、XenとXen仕様のコンパイルを行った後
GRUBの記述を変更する事で、入れ替えを行うのだ。

 この図式がわかった時

 目から鱗だったのらー (^^)

  さて、準備は良し。
 再起動をかけてみる。ワクワクしながら起動していくのだが・・・

 カーネルパニックが出てもうた・・・(TT)

 ハードウェアとXenの相性が悪かったのだろう。

 別のマシンで、Xenのインストールを行ってみた。
 すると・・・

 なんとか起動したのだ! (^^)

 これで管理OSが無事立ち上がった。

 次に、ゲストOSの設定だ。
 ネットで検索して、ネットの丸写しを敢行した。

 まずはゲストOSが格納されるディスク領域の作成だ。

ゲストOSが格納されるディスク領域の作成
[root@xen]# dd if=/dev/zero of=/home/xen/imgfile bs=1024k seek=4096 count=1
読み込んだブロック数は 1+0
書き込んだブロック数は 1+0
[root@xen]#
/home/xen ディレクトリに、ゲストOSを格納するディスク領域を作成。
その領域のファイル名を「imgfile」にした。

と書いたが、全部、ネットに書いていた方法の丸写しなのだ (^^)

 そしてゲストOSの設定を行う。
 ゲストOSのファイルシステムをLinux標準のファイルシステムの
ext3にするための設定を行う。

 ゲストOS格納用のファイル(先ほど作成した「imgfile」)に
手を加えれば良いのだ。

ゲストOSのファイルシステムをext3に設定
[root@xen]# mkfs.ext3 ./imgfile
mke2fs 1.35 (28-Feb-2004)
./imgfile is not a block special device.
Proceed anyway? (y,n) y
warning: 256 blocks unused.

Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
525312 inodes, 1048576 blocks
52441 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group
16416 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@xen]#
いかにも知っているかの如く書いているのだが実は・・・

ネットや本の丸写しなのだ!

とは言え、連載初期の頃との違いはある。
初期の頃は「何をしているのかわからず真似していた」
今は「コマンドや方法を知らないだど、何をしているのかはわかる」

こんな違いはあるのだ (^^)

 ゲストOSのファイルシステムをext3にする事ができた。

 そしてスワップ領域を作成する。
 これも本の丸写しだ (^^)

ゲストOSのスワップ部分のディスク領域の作成
[root@xen]# dd if=/dev/zero of=/home/xen/swap.img bs=1M count=256
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 0.467422 seconds, 574 MB/s
[root@xen]#
/home/xen ディレクトリに、ゲストOSが使うスワップ部分のディスク領域を作成。
その領域のファイル名を「swap.img」にした。

と書いたが、全部、ネットに書いていた方法の丸写しなのだ (^^)

 そして作成した領域をスワップ領域にするため
ファイルシステムの設定を行う必要がある。

ゲストOSのスワップ領域のファイルシステムを設定
[root@xen]# mkswap /home/xen/swap.img
Setting up swapspace version 1, size = 268431 kB
[root@xen]# 

 そこでスワップ領域の設定が完了。
 ディスク領域は準備は良し。


 お次は、ゲストOSの中身を設定していく。
 以下の方法でゲストOSのディスク領域を設定していく。

ゲストOSの領域にマウント
[root@xen]# mkdir -p /mnt/ClockDomain
[root@xen]# mount -o loop /home/xen/imgfile /mnt/ClockDomain
[root@xen]#
ゲストOS(作成したイメージファイル)の中に入れるようにする方法だ。

最初にゲストOSの入口になるディレクトリを作成(赤い部分)
そして、mountコマンドで、ゲストOSの領域に入れるようにする。
イメージファイルのマウントの場合、オプションに「-o loop」を使う。

 もちろん、これも・・・

 本の丸写しなのらー!

 そうなのです。
 事務員に詳しい知識を求める方が間違いなのです (^^)


 これでゲストOSの中に入れるようになった。
 そして、ゲストOSの中の環境を整備する。

 デバイスファイル作成のためのシェルを作る。
 これがあれば、コマンド一発で作成できる。
 もちろん丸写しである事を正直に明記します (^^)

デバイスファイル作成のシェル(makedev.sh)
#!/bin/sh

for i in console null zero tty1 tty2 tty3 tty4
do
/dev/MAKEDEV -d /mnt/ClockDomain/dev -x $i
done
console、null、zero、tty1、tty2、tty3、tty4の
デバイスファイルを作成するためのシェルだ。

「/mnt/ClockDomain」ディレクトリは、ゲストOSの
トップディレクトリにマウントされている。
そのため「/mnt/ClockDomain/dev」ディレクトリを指定すれば、
ゲストOSの/dev/ディレクトリを意味する事になる。

 早速、デバイス作成を行う。

ゲストOSの中の整備(デバイスファイル作成)
[root@xen]# ./makedev.sh
[root@xen]#

 そして、ゲストOS内に /etc/fstabファイルを作成して、
ゲストOSのマウントを指定する。



ゲストOSの中の整備(/etc/fstab作成)
[root@xen]# mkdir /mnt/ClockDomain/etc
[root@xen]# emacs /mnt/ClockDomain/etc/fstab &

 /etc/fstab のファイルの中身は以下の通り。

ゲストOSの中の整備(/etc/fstab の中身)
/dev/sda1                /                       ext3    defaults        1 1
none                    /dev/pts                devpts  gid=5,mode=620  0 0
none                    /dev/shm                tmpfs   defaults        0 0
none                    /proc                   proc    defaults        0 0
none                    /sys                    sysfs   defaults        0 0
/dev/sda2         swap                    swap    defaults        0 0

 あとはゲストOSを動かすための設定ファイルの作成だ。
 雛型になるファイルがある。
 「/etc/xen/xmexample1」というファイルだ。

 これをコピーして「test」というファイル名にして編集してみる。
 もちろん、編集も本の丸写しや見よう見まね (^^)

/etc/xen/testの編集
#  -*- 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.18.8-xen"

# Optional ramdisk.
ramdisk = "/boot/initrd-2.6.18.8-xen.img"

# 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 = 128

# A name for your domain. All domains must have different names.
#name = "ExampleDomain"
name = "test"

# 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 = [ 'mac=00:30:48:91:8A:D4' ]

#----------------------------------------------------------------------------
# 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:hda1,hda1,w' ]
disk = [ 'file:/home/xen/imgfile,sda1,w', 'file:/home/xen/swap.img,sda2,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/sda1 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'

#============================================================================
色をつけている部分は、雛型のファイルの内容を書き換えている部分です。
Xenの仕組みを理解していないため、あてずっぽにやってみました (^^;;

 これでゲストOSの設定は終わったと思った。
 そしてマウントを外す。

マウントを外す
[root@xen]# umount /mnt/ClockDomain
[root@xen]#

 さて、これでXenを開始させてみる。

ゲストOSの起動
[root@xen]# xm create -c test

 でも・・・

 エラーが出た (^^;;

エラーの内容
[root@xen]# xm -c create test
Using config file "./test".
Error: Unable to connect to xend: No such file or directory. Is xend running?
[root@xen]# 
xendというデーモンが起動していないからだ。
xenは起動させる時に、デーモンを起動させる必要があるようだ。

 そこで気をとり直してデーモンを動かしてみる。

Xenデーモンの起動
[root@xen]# /use/sbin/xend start

 これで準備完了と思った。
 そしてゲストOSの起動を行うのだが・・・

 なんで動かへんねん (TT)

 だった。

 だが、ある事に気がついた。
  ゲストOSの領域にマウントしているのが原因かも。
 そこでマウントを外せば良いと思った、

マウントを外す
[root@xen]# umount /mnt/ClockDomain
[root@xen]#

 これで良しと思った。
 気を取り直してゲストOSを起動させてみた。

ゲストOSの起動
[root@xen]# xm create -c test
Using config file "./test".
Started domain test
                   Linux version 2.6.18.8-xen (root@xxxx.co.jp) (gcc バージョン 3.4.6 20060404 (Red Hat 3.4.6-3)) #2 SMP Mon Aug 11 17:28:37 JST 2008
BIOS-provided physical RAM map:
 Xen: 0000000000000000 - 0000000008800000 (usable)
0MB HIGHMEM available.
136MB LOWMEM available.
NX (Execute Disable) protection: active
ACPI in unprivileged domain disabled
Allocating PCI resources starting at 10000000 (gap: 08800000:f7800000)
Detected 1596.085 MHz processor.
Built 1 zonelists.  Total pages: 34816
Kernel command line: root=/dev/sda1 ro 4
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Initializing CPU#0
PID hash table entries: 1024 (order: 10, 4096 bytes)
Xen reported: 1595.999 MHz processor.
Console: colour dummy device 80x25
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Software IO TLB disabled
vmalloc area: c9000000-f51fe000, maxmem 2d7fe000
Memory: 124556k/139264k available (2111k kernel code, 6352k reserved, 734k data, 196k init, 0k highmem)
Checking if this processor honours the WP bit even in supervisor mode... Ok.
Calibrating delay using timer specific routine.. 3193.60 BogoMIPS (lpj=15968016)
Security Framework v1.0.0 initialized
Capability LSM initialized
Mount-cache hash table entries: 512
CPU: L1 I cache: 32K, L1 D cache: 32K
CPU: L2 cache: 512K
Checking 'hlt' instruction... OK.
SMP alternatives: switching to UP code
Freeing SMP alternatives: 16k freed
Brought up 1 CPUs
migration_cost=0
checking if image is initramfs... it is
Freeing initrd memory: 1092k freed
NET: Registered protocol family 16
Brought up 1 CPUs
PCI: setting up Xen PCI frontend stub
ACPI: Interpreter disabled.
Linux Plug and Play Support v0.97 (c) Adam Belay
pnp: PnP ACPI: disabled
xen_mem: Initialising balloon driver.
PCI: System does not support PCI
PCI: System does not support PCI
NET: Registered protocol family 2
IP route cache hash table entries: 2048 (order: 1, 8192 bytes)
TCP established hash table entries: 8192 (order: 4, 65536 bytes)
TCP bind hash table entries: 4096 (order: 3, 32768 bytes)
TCP: Hash tables configured (established 8192 bind 4096)
TCP reno registered
IA-32 Microcode Update Driver: v1.14a-xen <tigran@veritas.com>
audit: initializing netlink socket (disabled)
audit(1220086945.578:1): initialized
VFS: Disk quotas dquot_6.5.1
Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
Initializing Cryptographic API
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
Floppy drive(s): fd0 is unknown type 15 (usb?), fd1 is unknown type 15 (usb?)
Failed to obtain physical IRQ 6
floppy0: no floppy controllers found
RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize
loop: loaded (max 8 devices)
Xen virtual console successfully installed as tty1
Event-channel device installed.
netfront: Initialising virtual ethernet driver.
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
PNP: No PS/2 controller found. Probing ports directly.
i8042.c: No controller found.
mice: PS/2 mouse device common for all mice
md: md driver 0.90.3 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: bitmap version 4.39
NET: Registered protocol family 1
NET: Registered protocol family 17
Using IPI No-Shortcut mode
xen-vbd: registered block device major 8
blkfront: sda1: barriers enabled
blkfront: sda2: barriers enabled
XENBUS: Device with no driver: device/console/0
BIOS EDD facility v0.16 2004-Jun-25, 0 devices found
EDD information not available.
Freeing unused kernel memory: 196k freed
Red Hat nash version 4.2.1.8 starting
Mounted /proc filesystem
Mounting sysfs
Creating /dev
Starting udev
Loading scsi_mod.ko module
SCSI subsystem initialized
Loading sd_mod.ko module
register_blkdev: cannot get major 8 for sd
Loading 3w-xxxx.ko module
3ware Storage Controller device driver for Linux v1.26.02.001.
Loading ide-disk.ko module
Loading jbd.ko module
Loading ext3.ko module
Creating root device
Mounting root filesystem
kjournald starting.  Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
Switching to new root
WARNING: can't access (null)
exec of init ((null)) failed!!!: 14
umount /initrd/dev failed: 2
Kernel panic - not syncing: Attempted to kill init!
カーネルパニックが起こってしまった。

 エラーの内容を見て

 なんでやねん (TT)

 全くどこに原因があるのか、わからない。
 それも、そのはず。だって

 仕組みを全然理解してないもーん (^^;;

 色々、調べてみたのだが、仕組みそのものもわかっていないため
本の丸写しの段階から脱却できない。

 ない知恵を絞って考え、ふと思った。
 ゲストOSの設定時に、/bin や /sbin などの実行ファイルの
置き場や、実行ファイル等が入っていない。
 そのため、ゲストOSの起動時に悪影響を及ぼしているのではないか。


 そこで、ゲストOSの領域をマウントして、設定を行う。

ゲストOSに実行ファイルやライブラリをコピーする
[root@xen]# cp -r /bin /mnt/ClockDomain/bin
[root@xen]# cp -r /sbin /mnt/ClockDomain/sbin
[root@xen]# cp -r /lib /mnt/ClockDomain/lib
管理OSの実行ファイルが格納されたディレクトリ「/bin」「/sbin」と
ライブラリが格納されたディレクトリ「/lib」をゲストOSにコピーする。

 そして再度、気をとり直してゲストOSを起動させる。
 だが・・・

ゲストOSの起動
[root@mail xen]# xm create -c test
Using config file "./test".
Started domain test
                   Linux version 2.6.18.8-xen (root@xxxx.co.jp) (gcc バージョン 3.4.6 20060404 (Red Hat 3.4.6-3)) #2 SMP Mon Aug 11 17:28:37 JST 2008
BIOS-provided physical RAM map:
 Xen: 0000000000000000 - 0000000008800000 (usable)
0MB HIGHMEM available.

(途中、省略)

kjournald starting.  Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
Switching to new root
INIT: version 2.85 booting
INIT: No inittab file found
INIT: Entering runlevel: 4
INIT: no more processes left in this runlevel

(ここで止まってしまった)
途中で起動が止まってしまった。
特にエラーが出ているわけでもなかった。

 思わず・・・

 なんでやねん (TT)

 だった。

 だが、ある事に気がついた。
  ゲストOSの領域にマウントを外し忘れていた (^^;;

マウントを外す
[root@xen]# umount /mnt/ClockDomain
[root@xen]#

 これで良しと思った。
 気を取り直してゲストOSを起動させてみた。


 そしてマウントを外して、再度、気をとり直して
ゲストOSを起動させてみる。

ゲストOSの起動
[root@mail xen]# xm create -c test
Using config file "./test".
Started domain test
                   Linux version 2.6.18.8-xen (root@xxxx.co.jp) (gcc バージョン 3.4.6 20060404 (Red Hat 3.4.6-3)) #2 SMP Mon Aug 11 17:28:37 JST 2008
BIOS-provided physical RAM map:
 Xen: 0000000000000000 - 0000000008800000 (usable)
0MB HIGHMEM available.
136MB LOWMEM available.

(途中、省略)

Red Hat nash version 4.2.1.8 starting
Mounted /proc filesystem
Mounting sysfs
Creating /dev
Starting udev
Loading scsi_mod.ko module
SCSI subsystem initialized
Loading sd_mod.ko module
register_blkdev: cannot get major 8 for sd
Loading 3w-xxxx.ko module
3ware Storage Controller device driver for Linux v1.26.02.001.
Loading ide-disk.ko module
Loading jbd.ko module
Loading ext3.ko module
Creating root device
Mounting root filesystem
kjournald starting.  Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
Switching to new root
Enforcing mode requested but no policy loaded. Halting now.
Kernel panic - not syncing: Attempted to kill init!
[root@xen]#
ここでもカーネルパニックが発生した。
でも、先ほどのパニックが起こった場所とは違う事だけはわかった。

 思わず・・・

 なんでやねん (TT)

 だった。
 でも、どうして良いのか、わからず、頭を抱えてしまった。


悪あがきでゲストOSの起動に挑戦  ゲストOSが動かない原因が全くわからないため  こんなの、わからへんやん!  とチャブ台を引っくり返しそうになるが、そこでふと思った。 「Xen徹底入門」(宮本 久仁男・大島孝子・平 初・長谷川 猛:翔泳社) を開いてみた。  ゲストOSの設定が書かれていた。  付属のCD-ROMの中に、ゲストOSが格納されたファイルがあるというのだ。
CD-ROMの sample/cho3にあるファイル

sample/cho3/ClockDomain.tar.gz2


 これをゲストOSとして使ってみようと思った。
 そこで、このファイルを、ゲストOSが格納されるファイルの中で
展開させてみる。

ClockDomain.tar.gz2を展開させてみる
[root@xen]# mount -o loop /home/xen/imgfile /mnt/ClockDomain
[root@xen]# cp ClockDomain.tar.gz2 /mnt/ClockDomain/
[root@xen]# cd /mnt/ClockDomain/
[root@xen]# tar xvfj ClockDomain.tar.gz2
bin/
bin/su
bin/sleep

(途中省略)

var/www/bg0.png
var/www/bg1.png
var/www/bg2.png
[root@xen]# cd
[root@xen]# umount /mnt/ClockDomain
青い部分で、ゲストOSが格納されるファイルの中身に
入っていけるように設定を行う。マウントを使う。
そして、マウントでゲストOSの中身へ入る入口ができたので、
そこの入口(ゲストOSのルートディレクトリー)に、
ゲストOSのファイルをコピする。

そして、赤い部分でゲストOSを展開し、
展開し終わった所で、マウントを外す。

 これでゲストOSを立ち上げてみた。

ゲストOSを起動させる
[root@mail xen]# xm create -c test
Using config file "./test".
Started domain test
                   Linux version 2.6.18.8-xen (root@xxxx.co.jp) (gcc バージョン 3.4.6 20060404 (Red Hat 3.4.6-3)) #2 SMP Mon Aug 11 17:28:37 JST 2008
BIOS-provided physical RAM map:
 Xen: 0000000000000000 - 0000000008800000 (usable)
0MB HIGHMEM available.
136MB LOWMEM available.
NX (Execute Disable) protection: active
ACPI in unprivileged domain disabled
Allocating PCI resources starting at 10000000 (gap: 08800000:f7800000)
Detected 1596.039 MHz processor.
Built 1 zonelists.  Total pages: 34816
Kernel command line: root=/dev/sda1 ro 4
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Initializing CPU#0
PID hash table entries: 1024 (order: 10, 4096 bytes)
Xen reported: 1595.999 MHz processor.
Console: colour dummy device 80x25
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Software IO TLB disabled
vmalloc area: c9000000-f51fe000, maxmem 2d7fe000
Memory: 124556k/139264k available (2111k kernel code, 6352k reserved, 734k data,
 196k init, 0k highmem)Checking if this processor honours the WP bit even in sup
ervisor mode... Ok.
Calibrating delay using timer specific routine.. 3194.05 BogoMIPS (lpj=15970284)
Security Framework v1.0.0 initialized
Capability LSM initialized
Mount-cache hash table entries: 512
CPU: L1 I cache: 32K, L1 D cache: 32K
CPU: L2 cache: 512K
Checking 'hlt' instruction... OK.
SMP alternatives: switching to UP code
Freeing SMP alternatives: 16k freed
Brought up 1 CPUs
migration_cost=0
checking if image is initramfs... it is
Freeing initrd memory: 1092k freed
NET: Registered protocol family 16
Brought up 1 CPUs
PCI: setting up Xen PCI frontend stub
ACPI: Interpreter disabled.
Linux Plug and Play Support v0.97 (c) Adam Belay
pnp: PnP ACPI: disabled
xen_mem: Initialising balloon driver.
PCI: System does not support PCI
PCI: System does not support PCI
NET: Registered protocol family 2
IP route cache hash table entries: 2048 (order: 1, 8192 bytes)
TCP established hash table entries: 8192 (order: 4, 65536 bytes)
TCP bind hash table entries: 4096 (order: 3, 32768 bytes)
TCP: Hash tables configured (established 8192 bind 4096)
TCP reno registered
IA-32 Microcode Update Driver: v1.14a-xen <tigran@veritas.com>
audit: initializing netlink socket (disabled)
audit(1220055393.011:1): initialized
VFS: Disk quotas dquot_6.5.1
Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
Initializing Cryptographic API
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
Floppy drive(s): fd0 is unknown type 15 (usb?), fd1 is unknown type 15 (usb?)
Failed to obtain physical IRQ 6
floppy0: no floppy controllers found
RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize
loop: loaded (max 8 devices)
Xen virtual console successfully installed as tty1
Event-channel device installed.
netfront: Initialising virtual ethernet driver.
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
PNP: No PS/2 controller found. Probing ports directly.
i8042.c: No controller found.
mice: PS/2 mouse device common for all mice
md: md driver 0.90.3 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: bitmap version 4.39
NET: Registered protocol family 1
NET: Registered protocol family 17
Using IPI No-Shortcut mode
xen-vbd: registered block device major 8
blkfront: sda1: barriers enabled
blkfront: sda2: barriers enabled
XENBUS: Device with no driver: device/console/0
BIOS EDD facility v0.16 2004-Jun-25, 0 devices found
EDD information not available.
Freeing unused kernel memory: 196k freed
Red Hat nash version 4.2.1.8 starting
Mounted /proc filesystem
Mounting sysfs
Creating /dev
Starting udev
Loading scsi_mod.ko module
SCSI subsystem initialized
Loading sd_mod.ko module
register_blkdev: cannot get major 8 for sd
Loading 3w-xxxx.ko module
3ware Storage Controller device driver for Linux v1.26.02.001.
Loading ide-disk.ko module
Loading jbd.ko module
Loading ext3.ko module
Creating root device
Mounting root filesystem
kjournald starting.  Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
Switching to new root
INIT: version 2.86 booting
Starting the hotplug events dispatcher: udevd.
Synthesizing the initial hotplug events...done.
Waiting for /dev to be fully populated...done.
Activating swap...done.
Checking root file system...fsck 1.40-WIP (14-Nov-2006)
/lib/init/rw/rootdev: clean, 13600/525312 files, 105108/1048576 blocks
done.
EXT3 FS on sda1, internal journal
Setting the system clock..
Cleaning up ifupdown....
Loading kernel modules...FATAL: Could not load /lib/modules/2.6.18.8-xen/modules
.dep: No such file or directory
Loading device-mapper support.
Checking file systems...fsck 1.40-WIP (14-Nov-2006)
done.
Setting kernel variables...done.
Mounting local filesystems...done.
Activating swapfile swap...done.
Setting up networking....
Configuring network interfaces...Internet Systems Consortium DHCP Client V3.0.4
Copyright 2004-2006 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

modprobe: FATAL: Could not load /lib/modules/2.6.18.8-xen/modules.dep: No such file or directory

modprobe: FATAL: Could not load /lib/modules/2.6.18.8-xen/modules.dep: No such file or directory

SIOCSIFADDR: No such device
modprobe: FATAL: Could not load /lib/modules/2.6.18.8-xen/modules.dep: No such file or directory

eth0: ERROR while getting interface flags: No such device
modprobe: FATAL: Could not load /lib/modules/2.6.18.8-xen/modules.dep: No such file or directory

eth0: ERROR while getting interface flags: No such device
modprobe: FATAL: Could not load /lib/modules/2.6.18.8-xen/modules.dep: No such file or directory

Bind socket to interface: No such device
Failed to bring up eth0.
done.
INIT: Entering runlevel: 4
Starting system log daemon: syslogd.
Starting kernel log daemon: klogd.
* Not starting internet superserver: no services enabled.
Starting OpenBSD Secure Shell server: sshd.
Starting periodic command scheduler: crond.
Starting web server (apache2)...apache2: apr_sockaddr_info_get() failed for domain-U
apache2: Could not reliably determine the server's fully qualified domain name, 
using 127.0.0.1 for ServerName
.

Debian GNU/Linux 4.0 domain-U tty1

domain-U login:
最後の青い部分はログインの表示だ。
見事にゲストOSは立ち上がった。

 この瞬間

 うまくいったやん! (^^)

 と思った。

 早速、ゲストOSにログインして触ってみる事にした。

ゲストOSにログインしてみる
Debian GNU/Linux 4.0 domain-U tty1

domain-U login: root
Last login: Fri Aug 22 08:50:04 2008 on tty1
Linux domain-U 2.6.18.8-xen #2 SMP Mon Aug 11 17:28:37 JST 2008 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@domain-U:~#
管理者のrootでログインしてみる。
するとパスワードなしでログインできた。
青い部分はコマンドプロンプト。

 色々、触ってみる。
 簡単なコマンドは使えている。
 でも、gccやemacsなどは入っていなかった。

 ネットワークに接続できているのかを確認してみる。

pingを打ってみる
root@domain-U:~# ping 192.168.1.YYY
connect: Network is unreachable
root@domain-U:~#
通信ができていない状態を示してみる。

 なんだか、ゲストOSは稼働したけど、実用化には
ほど遠い感じだ。

 さて、ゲストOSを終了させる。
 管理OS側から終了させる事ができる。

ゲストOSの終了
管理OSで操作
[root@xen]# xm shutdown test
[root@xen]#
ゲストOS側の表示
root@domain-U:~#
Broadcast message from root@domain-U (Sat Aug 30 09:23:55 2008):

The system is going down for system halt NOW!
INIT: Switching to runlevel: 0
INIT: Sending processes the TERM signal
Stopping web server (apache2)...apache2: apr_sockaddr_info_get() failed for domain-U
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName.
Stopping periodic command scheduler: crond.
Stopping internet superserver: inetd.
Stopping OpenBSD Secure Shell server: sshd.
Saving the system clock..
Stopping kernel log daemon: klogd.
Stopping system log daemon: syslogd.
Asking all remaining processes to terminate...done.
Killing all remaining processes...done.
Deconfiguring network interfaces...done.
Cleaning up ifupdown....
Deactivating swap...done.
Will now halt.
md: stopping all md devices.
xenbus_dev_shutdown: device/console/0: Initialising != Connected, skipping
System halted.
[root@mail xen]#

 だが、大事な事ができていない。

 ネットワークにつながっていないのだ!

 そこで、どうやればネットワークにつながるのか。
 そこで本を見て、見よう見まねで触ってみた。

 ゲストOSの設定ファイルで、ネットワーク部分を以下のように
記述すれば、うまくいきそうな感じがした。

ゲストOSの設定ファイルの記述

vif = [ '', 'bridge=xenbr0' ]

仮想ネットワークデバイスの設定のようだ。
でも、この辺の知識がないので、本に書いている内容で
これでと思ったのを記述しただけに過ぎない (^^;;

 そして、ゲストOSを起動してみる。
 すると・・・

 エラーが出たのらー (TT)

エラーの内容
[root@xen]# xm create test
Using config file "/etc/xen/test".
Error: Device 0 (vif) could not be connected. Could not find bridge, and none was specified
[root@xen]#

 もしかして、これではダメかもと思って、設定ファイルを
以下のように記述を変えた。

ゲストOSの設定ファイルの記述

vif = [ 'ip=192.168.1.ZZZ' ]
netmask="255.255.255.0"
gateway="192.168.1.AAA"

ブリッジを使わない場合は、IPなどを直接入れるという。
でも、この時点ではブリッジの意味がわからなかったので
見よう見まねで入力しただけだった (^^;;

 それでも

 同じエラーが出るのだ (TT)

 どうして良いのかわからない。
 そこで色々、検索サイトなどを使って調べてみたのだが・・・

 全然、見つからへん (TT)

 だった。


 全然、わからないし、調べるだけの執念が起こらなかった。
 Xen以外の選択肢がなければ必死になるのだが、

 VMware Serverという選択肢があるのだ (^^)

 そして、事実、Xenの導入を直前になって諦めた。

 という事で、あっさりと力尽きてしまった。
 Xenについては、時間を置いて調べてみようと思った。


Xenの関する補足

Xenの導入を断念せざる得なかった。  だが、あまりにも本の丸写しなので、少しは勉強した事を示すために、 自己満足(?)で、Xenについての話に触れたいと思います。  まずはゲストOSのディスクについて触れます。 CentOS5.1でXenをインストールした後、ゲストOSを インストールする際、ゲストOSが格納される領域を確保します。
ゲストOSが格納される領域を確保

 次にディスクパーティションを選びます。
 その際、ディスクのデバイス名が出てきます。

ゲストOSのディスクのデバイス名
xvdaというデバイス名になる。
「xvd」は「Xen Virtual Disk」の略だと思う。自信はないが (^^;;

 ゲストOSのインストール後、ゲストOSを起動させてみて
dfコマンドを使ってみる。

ゲストOS上でdfコマンドを使ってみる
[root@guestos]# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/xvda2             7578540   2349576   4837784  33% /
/dev/xvda1              101086      8098     87769   9% /boot
tmpfs                   256084         0    256084   0% /dev/shm
[root@guestos]# 

 これでデバイスの名前を知った (^^)


 次にネットワーク部分について。
 CentOS5.1でXenをインストールした後、ゲストOSのインストールで
ネットワークの設定の画面を見てみる。

ネットワークの設定
共有物理デバイスを使った場合、デバイス名が「xenbr0」だ。
これを選択すると、ゲストOSが独自のIPアドレスを持たせる事が可能だ。

 ところで共通物理デバイスとは、どういう役目なのか。
 図式化してみると、以下の通りになる。

ブリッジを経由する接続
共通物理デバイス「xenbr0」は、パケットのやりとりで
該当のゲストOSへ振り分けるための役目を行う。
ネットワークの第二層で振り分けるブリッジの役目から
この形態の接続を「ブリッジを経由する接続」と呼ぶ。

 そしてインストール後、ゲストOSを起動させて、
ネットワークの設定を見てみる。

ゲストOSのネットワークの設定
ネットワークのハードウェアの名前が
「Xen virtual ethernet」となっている。

 さて、ネットワークの状態を簡単に見るため
ゲストOS上で、ifconfigコマンドを使ってみる。


ゲストOS上で、ifconfigコマンドを使う
[root@guestos]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3E:2A:51:15  
          inet addr:192.168.1.XXX  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fe2a:5115/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1649 errors:0 dropped:0 overruns:0 frame:0
          TX packets:112 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:298712 (291.7 KiB)  TX bytes:13578 (13.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1292 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1292 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2137768 (2.0 MiB)  TX bytes:2137768 (2.0 MiB)

[root@guestos]# 

 なんら変わった表示がないなぁと思った。
 そこで管理OS側で、ifconfigコマンドを使ってみた。

管理OS上で、ifconfigのコマンドを使う
[root@xen]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:1E:68:CA:10:8F  
          inet addr:192.168.1.AAA  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::21e:68ff:feca:108f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3314 errors:0 dropped:0 overruns:0 frame:0
          TX packets:441 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:719709 (702.8 KiB)  TX bytes:2006919 (1.9 MiB)

(途中、省略)

xenbr0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF  
          inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:2563 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:214913 (209.8 KiB)  TX bytes:0 (0.0 b)

[root@xen]# 
青い部分が共通物理デバイス名だ。
このデバイスを使って、各ゲストOSにパケットを振り分けている。


 ゲストOSのネットワークの接続形態で、もう1つある。
 ブリッジを経由しない接続(仮想ネットワーク)と呼ばれるものだ。

ブリッジを経由しない接続(仮想ネットワーク)
CentOS5.1上でゲストOSをインストールする時に出てくる画面。
ここで仮想ネットワークを選択すれば、ブリッジを経由しない接続になる。

 これは、どんな接続形態なのか図式化する事にした。

ブリッジを経由しない接続
管理OSがNATの役目を果たす。
そのためゲストOSが外部のマシンと接続した際、
IPアドレスが変換される。変換後のIPは管理OSのIPアドレスだ。

 論より証拠でtelnetで、他のマシンへ接続してみた。

ゲストOSからtelnetで接続してみる
[root@guestos]# telnet 192.168.1.XXX
Trying 192.168.1.XXX...
Connected to aaaa.bbbb.co.jp (192.168.1.XXX).
Escape character is '^]'.
CentOS release 4.4 (Final)
Kernel 2.6.9-42.EL on an i686
login: suga
Password: 
Last login: Thu Nov 20 11:52:53 from 192.168.1.YYY
[suga@machine]$ 
[suga@machine]$ last | more
suga     pts/6        192.168.1.AAA    Thu Nov 20 11:52   still logged in   
root     pts/5        :0.0             Wed Nov 19 18:33   still logged in   
root     pts/5        :0.0             Wed Nov 19 10:40 - 18:33  (07:53)    

ゲストOSから他のマシンに接続してみる。
そして、lastコマンドで、最後にログインした接続元のマシンのIPを見ると
管理OSのIPだった。

 そして管理OSのルーティングを見てみる。

管理OSのルーティングを見てみる
[root@xen]# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         192.168.1.252   0.0.0.0         UG        0 0          0 eth0
[root@xen]#
赤い部分が、ゲストOSのパケット宛のルーティングだ。
「192.168.122.0/255.255.255.0」の範囲を割り当てられるのがわかる。


CentOS5.1でゲストOSを入れた時の設定ファイル 設定ファイルの内容が理解できずにいた。  だって難しいもーん (^^)  と完全に開きなおる私。  でも思った。  正常に動くゲストOSの設定ファイルを見てみよう。  なので、CentOS5.1でXenをインストール後に、GUIでゲストOSを インストールした後の生成された設定ファイルを見てみる事にした。  ネットワークは共通物理デバイスにした。
ゲストOSの設定ファイル
name = "centos"
uuid = "6a85f946-aea1-60ad-27eb-1a1462ae5c79"
maxmem = 500
memory = 500
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
vfb = [ "type=vnc,vncunused=1,keymap=ja" ]
disk = [ "tap:aio:/var/lib/xen/images/centos.img,xvda,w" ]
vif = [ "mac=00:16:3e:2a:51:15,bridge=xenbr0" ]

 うーん、こんな簡素な感じになるのか・・・。
 そう思いながら、Xenという壁を乗り越えられない自分がいた。


編集後記  Xenの導入。  最初、仮想化技術導入の際はXenを考えていました。  でも、途中で原因不明のエラーが発生し、断念しました。  今回は撤退しましたが、もしかすると、将来、使う技術かもしれないため その機会が来たら、再度、取り上げようと思います。

次章:「Linuxシステム起動スクリプト(inittab、rc.sysinit、rc)」を読む
前章:「VMware Serverの設定とインストール。仮想化入門」を読む
目次:システム奮闘記に戻る

Tweet