Xen

January 20, 2009

[Xen] DomainUとの通信が途切れる

ネットワークに障害が無いのにも関わらず、新規に立ち上げたDomain Uとの通信が途切れる、という現象が発生しました。

sshでログインして作業していると、突然フリーズしたようになり、数十秒から数分後に復帰する、という現象です。

原因は、MACアドレスの競合でした。

Domain Uの仮想ネットワークインターフェイスのMACアドレスは、コンフィグファイルで
vif = [ "mac=00:16:3e:01:59:4d,bridge=xenbr0" ]
のように指定することができますが、同一のMACアドレスが複数のインスタンスで指定されていると、ネットワークに障害が発生します。(当たり前ですが)

一方の設定を変更して再起動したところ、現象は発生しなくなりました。

matssaku at 22:22|PermalinkComments(0)TrackBack(0)clip!

August 20, 2008

[AWS] EC2の仮想マシンイメージを作った

Amazon EC2は、Amazonのインフラ上で、仮想マシンを好きな数だけ起動できるサービスです。
料金は各マシンの起動時間の合計に比例するため、例えば大量のマシンを短時間起動して並列処理、など色々な使い方ができるようです。

使用できる仮想マシンはAmazonから提供されているのですが、自分でイメージファイルを作成してアップロードすることもできます。

作成手順は、Amazon Elastic Compute Cloud Developer Guideの「Creating an AMI through a Loopback File」が参考になります。
EC2のバックエンドもXenなので、Xenのイメージファイルの作成手順とほとんど同じです。

手順を参考にCentOS5のイメージを作成したのですが、いくつかつまずいたところがあったので、メモしておきます。

■gsg-keypairでログインできない
EC2には、ec2-add-keypairコマンドでopensshキーを発行し、公開鍵をAmazon側に登録しておく仕組みがあるのですが、自作した仮想マシンイメージでは、登録したキーでのログインができません。
検索したところ、仮想マシン側で公開鍵を取得して.ssh/authorized_keyなどに登録する処理はスクリプトで追加する必要があるようです。
参考URL:http://developer.amazonwebservices.com/connect/message.jspa?messageID=76910
上記のURLを参考にget-credentials.shを作成し、/etc/rc.localで実行するようにしたところ、登録したキーでのログインができるようになりました。

■ec2-bundle-volが実行できない
EC2では、仮想マシン上でのファイルの変更は、インスタンスを停止した際に消えてしまうため、バックアップの方法を考える必要があります。Amazonから提供されている手段として、ec2-bundle-volコマンドで現在の実行環境をイメージファイルに書き出し、ec2-upload-bundleコマンドで、S3に保存する方法が提供されています。が、自作した仮想マシンイメージではec2-bundle-volコマンドが
mount: Could not find any loop device. Maybe this kernel does not know
about the loop device? (If so, recompile or `modprobe loop'.)
execution failed: "mount -o loop /mnt/image /mnt/img-mnt"
ec2-bundle-vol failed.
とエラーが出て、実行することができませんでした。
エラーメッセージにしたがって
# modprobe loop
を実行しても、
FATAL: Could not load /lib/modules/2.6.16-xenU/modules.dep: No such file or directory
でこれもエラーになってしまいます。どうも、2.6.16-xenUに対応したモジュールが必要なようです。これも検索したところ、http://s3.amazonaws.com/ec2-downloads/modules-2.6.16-ec2.tgzからモジュールをダウンロードして解凍した後、
depmod -a
modules.depを生成すればよいことがわかりました。
参考URL:http://developer.amazonwebservices.com/connect/entry.jspa?externalID=798



matssaku at 00:26|PermalinkComments(0)TrackBack(0)clip!

June 02, 2008

[自分メモ]ubuntu 7.04を8.04にアップグレード with xen

開発用にubuntu7.04にXenをインストールして使っています。

動作は安定していたのですが、7.04は2008年10月でサポートが切れてしまう上に、バージョンが古いことで不便なこともありました。

新バージョンをインストール、データ移行、というのも考えたのですが、その前にアップグレードに挑戦してみました。

予想通りトラブルが続出したのですが、何とか正常動作に持っていくことができました。

とにかくエラーが多過ぎて全ては記憶していないのですが、覚えている分だけメモしておきます。

■アップグレード手順
公式サイトの手順通りに進めます。サーバ機にGUIは入れない主義なので、コマンドラインツールを使います。
# sudo aptitude install update-manager-core
# sudo do-release-upgrade
7.04→7.10→8.04と二回のアップグレードのためdo-release-upgradeは二回実行する必要があります。

■アップグレード中に発生したトラブル
一回目のdo-release-upgrade、つまり7.04から7.10のアップグレードの最中に、Segumentation faultが発生し、アップグレードが正常に行われないトラブルが発生しました。
どうやらlibcをxen用のものに入れ替える必要があるようです。以下のコマンドで解決しました。
# aptitude remove libc-i686
# aptitude install libc6-xen

参考URL

■Xen DomainU起動時のトラブル
ubuntuが無事に8.04にアップグレードできたあとも、DomainUを起動させるまでにいくつかトラブルが発生しました。
1. xm createに失敗
以下のようなエラーメッセージでxm createが失敗しました。
Error: Device 5632 (vbd) could not be connected. losetup ・・・ failed
原因はDomainU用のコンフィグファイルの内、イメージファイルの指定方法にあるようです。以下のように変更しました。
7.04の指定方法
disk = [ 'file:/etc/xen/images/xen00.d/root,ioemu:sda1,w']

8.04の指定方法
disk = [ 'tap:aio:/etc/xen/images/xen00.d/root,sda1,w']


2. DomainUの起動が途中で止まる、その1
xm create -cでDomainUのコンソールに移行後、xenの起動メッセージが
EXT3-fs: mounted filesystem with ordered data mode.
でストップしてしまう現象が発生しました。DomainU用のコンフィグファイルに以下の設定を付け加えることで、起動が先に進むようです。
extra='xenconsole=tty'

参考URL

3. DomainUの起動が途中で止まる、その2
xm create -cでDomainUのコンソールに移行後、xenの起動メッセージが
Setting clock
でストップしてしまう現象が発生しました。どうやらUbuntu版のXenカーネルにはシステム時間の設定の際にストップしてしまう不具合があるようです。イメージファイルをマウントし、DomainUの/etc/default/rcSに以下の記述を加えました。
HWCLOCKACCESS=no

参考URL

4. DomainUからネットワークが繋がらない
DomainU起動後、DomainUの外側からDomainUに対しては接続できるのに、DomainU側からはネットワークに接続できない、という現象が発生しました。どうやらこれもUbuntu版のXenカーネルの内、特定のバージョンに存在する不具合のようです。私の環境では2.6.22-14-xenを使うことで正常に動作させることができました。
参考URL



matssaku at 05:16|PermalinkComments(0)TrackBack(0)clip!

February 21, 2008

[自分メモ]xen環境 ubuntu6.06 dapper上にCentOS4

CentOS4をdomainUとして、Xen環境を作成した時のメモです。
基本的にはdebianをDomainUとして作成する場合と同様の手順になります。
違いはベースシステムのインストール方法です。
debianの場合はdebootstrapを用いましたが、CentOSではyumを使います。
ubuntuではapt-getyumをインストールできます。
$ sudo apt-get install yum

/etc/yum.confは次のようになっています。
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=centos-release
tolerant=1
exactarch=1
retries=20
obsoletes=1
gpgcheck=1
[base]
name=CentOS-4 - Base
mirrorlist=http://mirrorlist.centos.org/?release=4&arch=i386&repo=os
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#released updates
[update]
name=CentOS-4 - Updates
mirrorlist=http://mirrorlist.centos.org/?release=4&arch=i386&repo=updates
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

イメージファイルをマウントしたら、以下のコマンドでCentOSのベースシステムをインストールできます。
$ sudo yum -y --installroot=/path/to/mnt groupinstall core base

--installrootには絶対パスを記述する必要があります。

インストール後に編集すべきファイルとしては、
・etc/fstab
・etc/hosts
・etc/sysconfig/network
・sysconfig/network-scripts/ifcfg-ethx
・etc/yum.conf
あたりでしょうか。
それ以外は、debianをDomainUとして作成する場合と同様の手順でOKだと思います。


matssaku at 04:42|PermalinkComments(0)TrackBack(0)clip!

February 09, 2008

[自分メモ]xen環境 DomainUをイメージファイルで作るリスク

ちなみに、xenのDomainUの作成方法として、ddでイメージファイルを作る方法とDomainU用のパーティションを別途用意してインストールする方法がありますが、信頼性が要求される場面では、DomainU用のパーティションを用意してインストールするべきです。
イメージファイルは結構壊れます。
わたし自身、DomainUの再起動時にエラー+fsckで大量のファイルがlost+found行き、という事態に何度か遭遇しました。

matssaku at 00:54|PermalinkComments(0)TrackBack(0)clip!

[自分メモ]xen環境 ubuntu6.06 dapper上にdebian etch

ソフトウェア開発の過程では効率化のために
・開発・デバッグ用
・テスト用
・顧客向けデモ用
の様に、プロジェクトの中で複数のホストを用意したい場合がよくあります。
ただ、開発に使えるリソースは限られるため、要求に応じて複数台のマシンを用意、というわけにはなかなかいきません。
そんな時にXenは非常に便利です。
職場ではUbuntu6.06 dapper-server版の上に
・Ubuntu
・debian
・CentOS
など、色々なOSを載せて活用しています。
Domain0の設定、およびUbuntuをDomainUとして用いる場合の手順はこちら(英語)が参考になります。
以下はUbuntu6.06 dapper-server版をDomain0、debian etchをDomainUとして作成した時のメモです。

1. まず、Xen仮想マシンのイメージファイルの元をddコマンドで作成します。ここではルートパーティション10GBとswapパーティション1GBを作成します。
# dd if=/dev/zero of=root bs=1M count=10000
# dd if=/dev/zero of=swap bs=1M count=1000

2. 作成したイメージファイル上にファイルシステムを構築します。
# mkfs.ext3 root
# mkswap swap

3. ルートパーティション用イメージファイルをマウントし、debootstrapコマンドを用いてdebianのベースシステムをインストールします。
# mkdir mnt
# mount root mnt -o loop
# debootstrap etch mnt http://ftp.jp.debian.org/debian/

4. 作成したベースシステム上にモジュールファイルをコピーしておきます。(必須かどうかは不明)
# cp -a /lib/modules/2.6.19-4-server/ ./mnt/lib/modules/

5. 作成したベースシステム上のファイルを編集し、環境設定を行います。必要なのは
(1)etc/hostname
(2)etc/hosts
(3)etc/network/interfaces
(4)etc/fstab
あたりだと思います。(1)〜(3)は、作成したい仮想マシン環境に合わせて適切に設定します。
fstabの内容は以下の通り。
proc /proc proc defaults 0 0
/dev/sda1 / ext3 defaults,errors=remount-ro 0 1
/dev/sda2 none swap sw 0 0

6. イメージファイルをアンマウントします。
# umount mnt

7. DomainU起動用の設定ファイルを用意します。私の環境の場合は以下のファイルをxen00.cfgとして作成しました。
# Debian etch.
kernel = "/boot/vmlinuz-2.6.19-4-server"
ramdisk = "/boot/initrd.img-2.6.19-4-server"
builder='linux'
memory = 512
name = "xen00"
vcpus = 1
vif = [ '' ]
disk = [ 'file:/etc/xen/images/xen00.d/root,ioemu:sda1,w',
'file:/etc/xen/images/xen00.d/swap,ioemu:sda2,w',
]
root = "/dev/sda1 ro"
memory、nameは任意の値に設定できます。diskのパスはイメージファイルの場所に合わせて設定して下さい。

8. いよいよDomainUを起動します。
# xm create -c xen00.cfg
起動に成功した場合は、DomainUのコンソールに移行します。
起動メッセージに続いてログインプロンプトが表示されます。
起動直後は最小構成の状態です。
sshなど、必要なソフトはapt-getで別途インストールする必要があります。
xenコンソールからは、ctrl + ]で抜けることができます。
DomainUの起動・終了については、
$ man xm
を確認します。

以下は発生したトラブルです。

トラブルその1.
xenコンソール:
xm create -c
xm console
で操作したとき、viの動作がおかしい。
具体的には、コロン(:)のキーが使えないのです。これはコンソールエミュレータ(Poderosa)のせいなのかもしれませんが、原因がわかりませんでした。
とりあえずxenコンソールではnanoを使うことにしました。

トラブルその2.
sshログイン時
stdin is not a tty
と表示され、入力内容が表示されない。
どうやらudevをインストールする必要があるようです。
# apt-get install udev


トラブルその3.
udevインストール後、再起動するとネットワークインタフェースが起動しない。エラーメッセージは
SIOCSIFADDR: No such device

どうやら、udevが勝手にネットワークインタフェースの名前を変えてしまうようです。
# ifconfig -a
の内容に合わせて
/etc/network/interfacesの内容を書き換えるか、udevの設定ファイル/etc/udev/rules.d/z25_persistent-net.rulesを編集し、
# ifup インタフェース名
を実行する必要があります。

matssaku at 00:41|PermalinkComments(0)TrackBack(0)clip!