ラベル xen の投稿を表示しています。 すべての投稿を表示
ラベル xen の投稿を表示しています。 すべての投稿を表示

2009/09/21

Xenのdebianでapt-get時にGPG errorになる

いままでうまく動いていたのと思うのですが、XenのVMで動いているdebian etchでapt-get時にエラーがでるようになってしまいました。

W: GPG error: http://ftp.jp.debian.org etch Release: 
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 9AA38DCD55BE302B

gpgを使って鍵ファイルを/etc/apt/trusted.gpg辺りに入れて上げれば良いのですが、そもそもこのファイルがなかったのでパッケージを追加する事で解決しました。

$ sudo apt-get install debian-keyring debian-archive-keyring

これで標準的に必要な鍵ファイルは手に入って、更新の手間が省けます。

2009/03/01

Ubuntu 8.04のrinseでCentOS-5のイメージを作成する

rinseでcentosのイメージは簡単にできるだろうと思って、試したところうまく動きませんでした。CentOS-4ではURLの指定間違いなんかが報告されているようです。[Wrong server path for CentOS-4 in rinse.conf]
なにしろUbuntu 8.04で導入されるrinseのバージョンは0.9で最新版が1.5ですから、いろいろ不具合があるという事なのでしょう。[“rinse” source package in Ubuntu]
Vine Linux 4.2を導入する時にだいたい処理の流れはわかったので、動くようにしてみました。

PRMダウンロード先の変更

トラフィックを減らすためにRingサーバーにイメージの取得先を変更しています。 これは必須ではないですが、まぁ日本に住んでいるならRingサーバーにあるものは使いましょう、という事で…。
/etc/rinse/rinse.confを編集しました。

[centos-4]
mirror = http://ftp.iij.ad.jp/pub/linux/centos/4/os/i386/CentOS/RPMS/
mirror.amd64 = http://ftp.iij.ad.jp/pub/linux/centos/4/os/x86_64/CentOS/RPMS/
[centos-5]
mirror = http://ftp.iij.ad.jp/pub/linux/centos/5/os/i386/CentOS/
mirror.amd64 = http://ftp.iij.ad.jp/pub/linux/centos/5/os/x86_64/CentOS/

CentOS5用/etc/xen-tools/xen-tools.confの準備

Vine同様にdistributionにcentos-5を指定したファイル(/etc/xen-tools/xen-tools.centos5.conf)を作成します。

$ sed -e '/^#/d' -e '/^$/d' /etc/xen-tools/xen-tools.centos5.conf
dir = /home/xen
install-method = rinse
size   = 4Gb      # Disk image size.
memory = 128Mb    # Memory size
swap   = 128Mb    # Swap size
fs     = ext3     # use the EXT3 filesystem for the disk image.
dist   = centos-5     # Default distribution to install.
image  = sparse   # Specify sparse vs. full disk images.
gateway   = 192.168.1.1
netmask   = 255.255.255.0
broadcast = 192.168.1.255
kernel      = /boot/vmlinuz-`uname -r`
initrd      = /boot/initrd.img-`uname -r`
mirror = http://ftp.jp.debian.org/debian/
ext3_options   = noatime,nodiratime,errors=remount-ro
ext2_options   = noatime,nodiratime,errors=remount-ro
xfs_options    = defaults
reiser_options = defaults
serial_device = xvc0
disk_device = xvda  #default

/etc/rinse/centos-5.packagesの変更

なぜか基本的なライブラリが不足していたので、パッケージを加えました。

e2fsprogs-libs
yum-metadata-parser

この状態で以前のようにxen-create-imageを実行すると、起動はできますが、コンソールからのrootでのログインが行なえないため実質的には使えません。

$ sudo xen-create-image --config /etc/xen-tools/xen-tools.centos5.conf --hostname xen68 --ip 192.168.1.68

これは/etc/shadowでrootのパスワードが設定されていないために発生します。Vineやdebianのイメージではrootはパスワードなしで作成されるため、すぐにパスワードを設定するようにしていました。

解決策1:作業用IDを手作業で作成する

作ってしまったイメージを消すのも、もったいないのでそのまま作業用IDを加えてみます。

ディスクイメージが /home/xen/domains/xen68/disk.imgにあると仮定しています。 まずはこのディスクイメージをマウントします。

$ sudo mount -o loop /home/xen/domains/xen68/disk.img /mnt
$ sudo chroot /mnt

作業用のID"user1"を加えます。実際には自分が普段使っているIDを指定しています。

# /usr/sbin/useradd -m user1
# passwd user1
# /usr/sbin/usermod -G wheel user1

最後に"visudo"を起動して、wheelグループ(%wheel) のユーザーがsudoを実行できるようにします。 次の1行を加えます。

# visudo
%wheel ALL = (ALL) ALL

xenのイメージを起動する前にイメージをアンマウントします。

# exit
$ sudo umount /mnt
これでXenを起動して無事にログインできる事を確認しました。
$ sudo xm create -c /etc/xen/xen68.cfg

解決策(?)2:xen-create-imageのaccountオプション

rinseはXen dom0が稼働しているUbuntu 8.04上のアカウントをコピーする機能自体は一応持っているので、試してみる事にしました。

$ sudo xen-create-image --config /etc/xen-tools/xen-tools.centos5.conf --accounts --hostname xen68 --ip 192.168.1.68

ログファイルは"/var/log/xen-tools/xen68.log"にあって、どうもエラーを大量に掃き出している模様です。関係ないデーモン系のユーザーIDも以降しようとして、何かうまくいっていないようです。
このまま起動してもsudoの設定はされていないので、ログインができるだけで特権ユーザーにはなる術がありませんでした。実際には解決策1と同じ事をする必要がありそうです。
大量のIDを移行したいといった要求がなければ、これを修正してどうにかする必要性はないでしょう。

わざわざrootのパスワードを外すのも嫌なので、手動で自分用のIDを作成する事で回避します。この解決策2は使えないですね…。

2009/02/28

Ubuntu 8.10以降はXenではなく、KVMがサポートされる件について

既にUbuntuではXenに代りKVMを8.10以降でサポートし、XenはKVM上でブリッジが提供されているもののXen自体のサポートは打ち切られています。[xenner], [Xen 3.2(Fedora 9付属Xenner編)]

今後はKVM+libvirtが使われていくのでしょうけれど、我が家のサーバーはSocket939なAthlon64 3500+マシンなので/proc/cpuinfoにはvxmもsvmもflagが立っていません。
vxmやsvmは完全仮想化環境を提供するKVMを使うための前提ですが、 物理的に我が家のサーバーはXenを使わざるを得ない状況に置かれています。

実際のところ簡単にOSイメージが作成できるのは便利なのですが、 直接キーボードを触らずにサーバーとして使っているからでしょうね。
デスクトップ用途としてVMWareの代替にするにはKVMによる完全仮想化が必要だと思います。 実験のためにVMWare上でCloneを作成してもNIC周りは再設定が必要なので、いまのところ総合的にはXenが自分の目的には合っているのでしょう。

KVM優位の流れでも完全仮想化と準仮想化のどちらが良いのかは、微妙な問題です。 開発時のお試しサーバー目的なら完全仮想化である必要はないですが、もし(dom0でもdomUでも)デスクトップとしての機能を何かしら必要とするのであれば完全仮想化以外意味がないと思われます。

ちょっとした小さいグループで、自由にOSインスタンスを作成させて試せる環境を提供するのであれば、自動化する事もできるし、このレベルのXenで満足しています。

でも時代はKVMなんですよね。どこかでKVM入れないとなぁ。

2009/02/27

引き続き、Ubuntu 8.04なXenにVine Linux 4.2を導入してみる (後半)

xen-create-imageコマンドからのVine4.2イメージの作成環境を構築するために必要な作業は以下の流れで行ないます。

  1. Vine4.2用の/etc/xen-tools/xen-tools.confの準備
  2. /usr/lib/xen-tools/vine42.dディレクトリともろもろセットアップスクリプトの配置

Vine4.2用の/etc/xen-tools/xen-tools.confの準備

"xen-create-image"コマンドを使って導入しますが、どうも"--dist"オプションを指定してもちゃんと動いてくれないので、原因は調べずにVine用のxen-tools.confファイルを別に準備します。

$ cp /etc/xen-tools/xen-tools.conf /etc/xen-tools/xen-tools.vine.conf
変更した点はdistributionに"vine42"を加えて、install-methodに"debootstrap"に変えて"rinse"を指定しています。
$ diff xen-tools.conf xen-tools.vine.conf 
83c83
< install-method = debootstrap
---
> install-method = rinse
133c133
< dist   = etch     # Default distribution to install.
---
> dist   = vine42   # Default distribution to install.
ここまでで、"xen-create-image"コマンドはrinseを呼び出してディスクイメージを作成してくれるようになります。

/usr/lib/xen-tools/vine42.dディレクトリともろもろセットアップスクリプトの配置

rinseのセットアップでは具体的なサーバー名やら、IPアドレスやらの設定はしてくれません。そのため具体的なサーバーインスタンスの情報を設定するためのスクリプトが/usr/lib/xen-tools/ 以下に各ディストリビューション毎に分けられています。
とりあえずfedora-core-6.dをディレクトリ毎コピーしてきて、順番にyum関連の処理をapt-getで置き換えるといった変更をしていきます。

20-setup-yum -> 20-setup-apt

yumではなくapt-getを使うのですが、元々がRedHat Linuxの系統ですから、内部構造はfedoraと似ているので、20-setup-yumを20-setup-aptに変更して進めていきます。

43c43
< chroot ${prefix} /usr/bin/yum update
---
> chroot ${prefix} /usr/bin/apt-get update
でも、ここでupdateする必要性がわからないんですよね。 元々のイメージがrinseとrpmstrapのどちらで導入されたかわからないから、 何か前提があるのかなぁ…。

35-setup-users

このファイルでは、現在このXen dom0が稼働しているUbuntu 8.04の/etc/passwdと/etc/shadowの中から"--accounts"オプションで指定したユーザーについて、ゲストOSの/etc/passwd, /etc/shadowに内容をコピーするところです。 いまのところ使っていないので、ここはスルーします。

55-create-dev

いろいろ細かいところにツッコミを入れていると先にすすまないので、例としてひとつだけ。一連のスクリプトの中には間違いが沢山あります。 大抵はどうでも良いので修正していませんが、これはないと困るデバイスファイルを作っているところです。
まだこの時点ではrpm2cpioで展開されただけなので、シンボリックリンクは正確に張られていません。rinseの方で"apt-get upgrade"なんかをちゃんとやっていなかったせいではありますが…。そのため"/dev/MAKEDEV"はまだ存在しないはずで、"/sbin/MAKEDEV"を実行するようにします。 また$iを展開させたいのに、シングルクオートで囲ってしまっているところをダブルクオートに変更します。

45,47c45,47
< chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV console'
< chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV null'
< chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV zero'
---
> chroot ${prefix} /bin/sh -c 'cd /dev && /sbin/MAKEDEV console'
> chroot ${prefix} /bin/sh -c 'cd /dev && /sbin/MAKEDEV null'
> chroot ${prefix} /bin/sh -c 'cd /dev && /sbin/MAKEDEV zero'
50c50
< chroot ${prefix} /bin/sh -c 'mknod /dev/xvda$i b 202 $i'
---
> chroot ${prefix} /bin/sh -c "mknod /dev/xvda$i b 202 $i"

60-copy-host-files

続いて/etc/hostsファイルをコピーしているのかと思いきや、sudoパッケージを導入しています。とりあえずファイル毎なくなってもらいます。

$ sudo rm 60-copy-host-files

70-install-ssh

なぜかopenssh-serverとpasswdパッケージを明示的に導入しています。 うーん、なんでだろう。なので、ここは消してしまいます。

$ sudo rm 70-install-ssh

99-clean-image

単純にyumを置き換えます。

44c44
< chroot ${prefix} /usr/bin/yum clean all
---
> chroot ${prefix} /usr/bin/apt-get clean

ここまでの結果を確認

"xen-create-image"コマンドで新しいdomUを作成します。

$ sudo xen-create-image --config /etc/xen-tools/xen-tools.vine.conf --hostname xen68 --ip 192.168.1.68 --arch i386

General Information
--------------------
Hostname       :  xen68
Distribution   :  vine42
Partitions     :  swap            128Mb (swap)
                  /               4Gb   (ext3)
Image type     :  sparse
Memory size    :  128Mb
Kernel path    :  /boot/vmlinuz-2.6.24-23-xen
Initrd path    :  /boot/initrd.img-2.6.24-23-xen

Networking Information
----------------------
IP Address 1   : 192.168.1.68 [MAC: xx:xx:xx:xx:xx:xx]
Netmask        : 255.255.255.0
Broadcast      : 192.168.1.255
Gateway        : 192.168.1.1


Creating partition image: /home/xen/domains/xen68/swap.img
Done

Creating swap on /home/xen/domains/xen68/swap.img
Done

Creating partition image: /home/xen/domains/xen68/disk.img
Done

Creating ext3 filesystem on /home/xen/domains/xen68/disk.img
Done
Installation method: rinse
Done

Running hooks
Done

No role scripts were specified.  Skipping

Creating Xen configuration file
Done
All done


Logfile produced at:
  /var/log/xen-tools/xen68.log
次に起動してみます。
$ sudo xm create -c /etc/xen/xen68.cfg
Using config file "/etc/xen/xen68.cfg".
Started domain xen68
                    [    0.000000] Linux version 2.6.24-23-xen (buildd@crested) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Mon Jan 26 03:09:12 UTC 2009 (Ubuntu 2.6.24-4.6-generic)
[    0.000000] Command line: root=/dev/xvda2 ro 2 console=xvc0
....
とりあえず無事にログインできて成功しました。

2009/02/26

引き続き、Ubuntu 8.04なXenにVine Linux 4.2を導入してみる (前半)

とりあえず、rinse環境の構築について、流れは次の通りです。

  1. /etc/rinse/vine42.packagesファイルの準備
  2. /etc/rinse/rinse.confへの導入イメージの配置されているURLの追加
  3. /usr/lib/rinse/vine42ディレクトリとpost-install.shの準備

/etc/rinse/vine42.packagesファイルの準備

単純にパッケージ名からバージョン番号を外したものが羅列されています。既に定義されているcentos-4.packagesの先頭をみると次のようになっています。

#  Packages which we'll need to download for a minimal installation
# of CentOS 4.5
MAKEDEV
SysVinit
これにならってVine Linux 4.2で必要なファイルを並べれば良いのですが、導入用のISOファイルをみると"Vine/base/comps.xml"に導入するべきパッケージの情報が定義されています。

ここから最小構成を選択すれば良いのですが、面倒だったので既にVMWare Workstation上に作成していたVineのイメージのCloneを作成して、"apt-get remove"でほとんどのパッケージを削除する事で必要そうなRPMのリストを作成しました。
結果として得られたファイルは次の通りで、これを/etc/rinse/vine42.packagesの名前で保存しています。

/etc/rinse/vine42.packages の内容

filesystem
device-mapper
gpm-libs
libstdc++3
mingetty
termcap
cracklib
iproute
vine-logos
zlib
grep
readline
sed
sysklogd
udev
apt
gzip
mkinitrd
suspend2
bzip2
libsigsegv
openssl
glibc-common
setup
basesystem
chkconfig
e2fsprogs
glib2
hdparm
libgcc
beecrypt
mktemp
popt
shadow-utils
libtermcap
expat
iputils
ncurses
psmisc
cracklib-dicts
file
cpio
gawk
coreutils
dhcpcd
modutils
procps
gnupg
grub
pam
libuser
slang
sqlite3
rpm
SysVinit
tcsh
usermode
vim-common
vutils
which
console-tools
less
suspend2-userui-fbsplash
sudo
vixie-cron
vine-keyring
openssh
libxml2
kernel-doc
binutils
vine-release
kernel
hwdata
glibc
libexpat
db4
net-tools
pwdb
bash
logrotate
words
install-info
findutils
neon
MAKEDEV
passwd
rpm-libs
tar
util-linux
etcskel
initscripts
openssh-server
kernel-devel
tcp_wrappers

/etc/rinse/rinse.confへの導入イメージの配置されているURLの追加

なかをみれば一目瞭然ですが、ディストリビューション名毎にRPMファイルが導入されているトップディレクトリのURLが指定されています。 rinseはwgetを使ってRPMを取得するため、wgetが理解できるURLである必要があります。
http,https,ftp以外のschemeを受け付けるという情報はなく、実際"file://"なんかは不可なんですよね。かといってこんな実験をするのにオフィシャルサイトにトラフィックを発生させるのも嫌だったので自分のマシンにhttpdを入れてmountしました。

$ sudo mkdir /var/www/iso
$ sudo mount -o loop ~/iso/Vine42-i386.iso /var/www/iso
$ tail -3 /etc/rinse/rinse.conf
[vine42]
mirror = http://192.168.1.3/iso/Vine/RPMS/
mirror.amd64 = http://192.168.1.3/iso/Vine/RPMS/
実際にrinse.confに追加したのは、上の[vine42]から始まる3行です。 wgetを使ってアクセスできるかどうか確認しておきましょう。
$ wget http://192.168.1.3/iso/RELEASE-NOTES.ja
--22:24:45--  http://192.168.1.3/iso/RELEASE-NOTES.ja
           => `RELEASE-NOTES.ja'
Connecting to 192.168.1.3:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9,174 (9.0K) [text/plain]

100%[=============================================================================>] 9,174         --.--K/s             

22:24:45 (320.88 MB/s) - `RELEASE-NOTES.ja' saved [9174/9174]
もっとも一度ダウンロードしたファイルは/var/cache/rinse/vine42.i386以下に保存されているので、そんなに深刻じゃないんですけどね。
後から"apt-get upgrade"した時には、”http://updates.vinelinux.org/apt” に行ってしまうんですよね。やっぱりRingサーバーからダウンロードするようにしようかなぁ…。 その場合は /etc/rinse/rinse.conf はこんな感じでしょうか。
[vine42]
mirror = http://www.t.ring.gr.jp/pub/linux/Vine/Vine-4.2/i386/Vine/RPMS/
mirror.amd64 = http://www.t.ring.gr.jp/pub/linux/Vine/Vine-4.2/i386/Vine/RPMS/

/usr/lib/rinse/vine42ディレクトリとpost-install.shの準備

実は後からこのディレクトリの存在に気がついて、Xenの方で行なっていた作業の一部をこちらに持ってきました。
他のディストリビューションの設定をみると、ここで/etc/resolv.confや/etc/yum.confを作成したりしています。 これらをコピーしてくれば良さそうなのですが、rinseはRPM系のディストリビューションが対象でcentosもfedoraもyumを使っているため、RPM系ながらapt-getを使っているVine用に書き換える必要があります。

エラー処理を省いて適当に書き換えすぎたファイルは以下のようになっています。

$ sed -e '/^#/d' -e '/^$/d' post-install.sh
prefix=$1
if [ ! -d "${prefix}" ]; then
  echo "Serious error - the named directory doesn't exist."
  exit
fi
echo "  Creating resolv.conf"
if [ ! -d "${prefix}/etc/" ]; then
    mkdir -p "${prefix}/etc/"
fi
cp /etc/resolv.conf "${prefix}/etc/"
echo "  Setting up YUM cache"
if [ ! -d ${prefix}/var/cache/apt/archives/ ]; then
    mkdir -p ${prefix}/var/cache/apt/archives/
fi
for i in ${prefix}/*.rpm ; do
    cp $i ${prefix}/var/cache/apt/archives/
done
arch=i386
if [ $ARCH = "amd64" ] ; then
    arch=x86_64
fi
echo "  Mounting /proc"
if [ ! -d "${prefix}/proc" ]; then
    mkdir -p "${prefix}/proc"
fi
mount -o bind /proc ${prefix}/proc
echo "  Bootstrapping apt-get"
chroot ${prefix} /sbin/ldconfig 
vine_keyring_rpm="$(basename ${prefix}/vine-keyring*.rpm)"
chroot ${prefix} /bin/rpm -i --force --nodeps ${vine_keyring_rpm}
chroot ${prefix} /usr/bin/apt-get update 2>/dev/null
chroot ${prefix} /usr/bin/apt-get -yfm dist-upgrade 2>/dev/null
echo "  Cleaning up"
chroot ${prefix} /usr/bin/apt-get clean
kill "$(/bin/pidof udevd)" && sleep 10
umount ${prefix}/proc
/sbin/udevd -d
echo "  Final tidy..."
for i in ${prefix}/*.rpm; do 
    rm -f $i
done
find ${prefix} -name '*.rpmorig' -delete
find ${prefix} -name '*.rpmnew' -delete
この辺りはよく考えて修正する必要がありそうです。

処理の流れで抑えるべきところは"/sbin/ldconfig"を実行しているところです。 これをしないと/lib, /usr/lib以下にlib*so.1などのシンボリックリンクが作成されないため、"chroot ${prefix}"環境で"apt-get"なんかのコマンドを実行する事ができません。

またvine-keyringを導入する事でapt-getの際に必要なRPMパッケージの署名を確認するための公開鍵を取り込んでいます。”/usr/lib/rpm/gpgp-import.sh”を走らせるべきだったのか、ちょっと迷いましたが、rpmコマンドを使って導入しています。

fedora用のスクリプトでは/etc/shadowファイルを作成するためにコマンドを実行していますが、keyringを導入してから"apt-get -ymf dist-upgrade"を実行しています。

この"apt-get dist-upgrade"がトラブルの元なのですが、この中でudevパッケージを導入する際にudevdプロセスを再起動してしまい、このプロセスが${prefix}や${prefix}/procを掴んでしまうため、"umount ${prefix}/proc"の前後でプロセスを立ち上げ直しています。

kill "$(/bin/pidof udevd)" && sleep 10
umount ${prefix}/proc
/sbin/udevd -d

killコマンドは常にプロセスへシグナルを送ってすぐに停止してしまうため、"umount ${prefix}/proc"の実行時にudevdが確実に停止しているように、適当な時間として10秒sleepさせています。この後でudevdがないと、xenの起動にも失敗してしまいますので、udevdは立ち上げています。

とりあえず試す

rinse単独で動くかどうかの確認をする事は簡単です。 centos-4のイメージを作成してみようとすれば…、

$ mkdir /tmp/centos4
$ sudo rinse --directory /tmp/centos4 --distribution centos-4
Failed to fetch : http://anorien.csc.warwick.ac.uk/mirrors/centos/4.5/os/i386/CentOS/RPMS/
 404 Not Found
なるほど…。/etc/rinse/rinse.confを修正して再びトライします。
$ diff -u /etc/rinse/rinse.conf.20090226 /etc/rinse/rinse.conf
14,15c14,15
< mirror = http://anorien.csc.warwick.ac.uk/mirrors/centos/4.5/os/i386/CentOS/RPMS/
< mirror.amd64 = http://anorien.csc.warwick.ac.uk/mirrors/centos/4.5/os/x86_64/CentOS/RPMS/
---
> mirror = http://ftp.iij.ad.jp/pub/linux/centos/4/os/i386/CentOS/RPMS/
> mirror.amd64 = http://ftp.iij.ad.jp/pub/linux/centos/4/os/x86_64/CentOS/RPMS/
$ sudo rinse --directory /tmp/centos4 --distribution centos-4
[18:73] Downloading: ...
...
...
Installation complete.
同じようにvine42も作成してみると、
$ mkdir /tmp/vine42
~$ sudo rinse --directory /tmp/vine42 --distribution vine42
[41:93] Downloading: libgcc-3.3.6-0vl7.i386.rpm ..   
...
...
Installation complete.
まぁいろんなワーニングやら出てくるんですが、いまのところは放っておきます。

試し終ったら、ちゃんと消しておきましょう。

$ sudo rm -r /tmp/vine42 /tmp/centos4
とりあえずこれでrinseでVine Linux 4.2のXen用OSイメージを作成するための準備は終りました。

Ubuntu 8.04なXenにVine Linux 4.2を導入してみる

Ubuntu 8.04でXenを導入してから、以前のようにCentOSのイメージ作成を試していなかったのですが、いつの間にかrpmstrapがなくなってrinseに置き換わっていました。
つい先日Xenとは別にたまたまrinseの説明を読んでいて、導入対象のRPMを指定する際に、パッケージ名をバージョン付きで指定する必要がないので便利だなぁと思っていたところでした。 Ubuntu 7.10でCentOS-4.5を入れる時にはパッケージのバージョン違いで、けっこう苦労したので。

普通にCentOSの導入はどうせできると思ったので、Vine Linux 4.2を導入してみます。 たまーにLatexが必要になった時に安定して動く環境というとVineがやっぱり挙げられるのですが、サーバーを立ててサービスにしてみたいという野望もあったのでXen上にイメージを構築する事にしました。

とはいえ、目指すところはとりあえず使える事。 rinseはrpm2cpioで展開するだけなので、微妙に通常の導入手順とは違ってきます。
それにVMWareみたいに動かそうと思ったらCentOS5かRHEL5でGUIを使って完全仮想化環境のXen上でやればいいだけのこと。 ここでは簡単にイメージを作って走らせるべく、"とりあえず”動くところを目指します。

だいたいの流れはこんな感じになりました。

  • rinse環境の構築
    • /etc/rinse/vine42.packagesファイルの準備
    • /etc/rinse/rinse.confへの導入イメージの配置されているURLの追加
    • /usr/lib/rinse/vine42ディレクトリとpost-install.shの準備
  • xen-create-imageコマンドからのVine4.2イメージの作成環境の構築
    • Vine4.2用の/etc/xen-tools/xen-tools.confの準備
    • /usr/lib/xen-tools/vine42.dディレクトリともろもろセットアップスクリプトの配置
  • 上記の繰り返しによる試行錯誤
最終的には
sudo xen-create-image --config /etc/xen-tools/xen-tools.vine.conf --hostname xen65 --ip 192.168.1.65 --arch i386
みたいな感じで動かす事ができるようになりました。
詳細はまた明日書きましょう。

2008/12/24

Xen上のdebianで使えるperl XML-RPCライブラリー

Ubuntuではなく、Xen上のDebianにapacheを入れてCGIでXML-RPCサービスを作ってみました。そこでクライアントをRuby/PHP/Perlで作ってみた時の感想です。

Rubyでは"xmlrpc/client"を使い、PHPではビルトインのxmlrpc_encode等とファイル関連関数のfile_get_contentsを使い実装してみました。
PHPは低レベルAPIな印象で、使い易くするためにはデータ変換などをあまり考えないで済むようなラッパーがあると便利そうでした。

さて困ったのはPerlでXML-RPCクライアントを作るために何を作ればいいのかという所です。CPANをみてもいくつか"XML", "RPC"というキーワードを持つものがあります。
UbuntuにActivePerlを入れてppmで"XML::RPC"を入れてみたものの、Debianでは適当なパッケージもなく"Frontier::Client"を使う事にしました。 導入自体はapt-getを使って"libfrontier-rpc-perl"パッケージを導入する事で使えるようになります。

$ sudo apt-get install libfrontier-rpc-perl

IBM DeveloperWorksの記事PerlでXML-RPCを始めよう 第1回:WebサービスにXML-RPCを使用するをみても"Frontier::Client"を使っているところをみると、これが妥当そうです。

この他にSOAP::Liteに入っているXMLRPC::Liteを使う方法も紹介ページが多いように感じましたが、好みの問題でしょうか。 元々SOAP::Liteを使って、SOAP1.2なサーバーとのやり取りが難しかったためにXML-RPCを使う事にしたので、個人的にはSOAP::Liteを使うのは避けてみました。SOAP::Liteはよく出来ているんですけどね。

2008/09/21

Ubuntu 8.04 Server(amd64)でXenを動かしてみる

引っ越しやら転職やらで忙しくしていたので、7.04のXenサーバーは使わなくなっていました。そこでまっさらなPCにUbuntu 8.04 Server amd64版を入れたところにXenを構成してみました。リリースされて随分経つのでUbuntu 8.04でXenを稼働させる事には大勢の先達がいらっしゃいます。
今回はその試行錯誤の結果を利用させてもらい、非常に簡単に立ち上げる事ができました。ほんの少しだけ自分なりの工夫を入れてXenでゲストOSを立ち上げる過程のメモを残します。

Ubuntu 8.04 Server amd64版を入れてからの大まかな流れは次のようになりました。

  1. "apt-get update", "apt-get upgrade"による最新版への更新
  2. /etc/modulesを編集してloopデバイスを増殖
  3. "shutdown -r now"による再起動
  4. "apt-get install ubuntu-xen-server"によるXen関連パッケージの一括導入
  5. Xenが有効になったカーネルで起動するため、再び再起動
  6. /etc/xen-tools/xen-tools.confの編集
  7. /usr/bin/xen-create-imageコマンドの修正
  8. xen-create-imageコマンドによるゲストOSイメージの導入
  9. xm createコマンドによるゲストOSの起動

Xenカーネルで起動するまで

まずはまともなUbuntuサーバーとして稼働するように最新版のパッケージに更新します。

$ sudo apt-get update
$ sudo apt-get upgrade
続いてloopデバイスの数を増やすために/etc/modulesファイルを編集します。 "loop"としか書かれていない行を編集して次のようにします。
$ grep loop /etc/modules
loop max_loop=256
upgradeの結果、kernelも新しいものが導入されていたりするので念のため再起動します。
$ sudo shutdown -r now
起動しきたら再びログインし、Xen関連のパッケージを導入します。
$ sudo apt-get install ubuntu-xen-server
無事に起動したらまた再起動します。
$ sudo shutdown -r now

ゲストOSを作る前の手続き

Xenのバージョンがかわり、結果として落とし穴が増えているようです。 試行錯誤の結果は残しませんが、次のようなところではまりました。

  • cfgファイル中でディスクイメージファイルを指定する方法が"file"から"tap:aio"に変更になった点
  • ディスクデバイス名が"sda"から"xvda"に変更になった点
  • シリアルデバイスファイルが"tty1"から”xvc0”に変更になった点
まずは作業を簡素化するために/etc/xen-tools/xen-tools.confを編集し、よく使う値を設定してしまいます。追加した設定行は"dir","gateway","netmask","broadcast","serial_device"の5行。修正したのは"mirror"の1行だけです。変更前後のdiff出力を載せます。unified formatじゃない方が見易いですよね。
$ diff /etc/xen-tools/xen-tools.conf.20080921 /etc/xen-tools/xen-tools.conf
45c45
< # dir = /home/xen
---
> dir = /home/xen
163,165c163,165
< # gateway   = 192.168.1.1
< # netmask   = 255.255.255.0
< # broadcast = 192.168.1.255
---
> gateway   = 192.168.1.1
> netmask   = 255.255.255.0
> broadcast = 192.168.1.255
214c214
< mirror = http://ftp.us.debian.org/debian/
---
> mirror = http://ftp.jp.debian.org/debian/
258c258
< # serial_device = xvc0
---
> serial_device = xvc0
"serial_device"の設定は必ず設定しなければなりません。 これをしないとゲストOSの起動時にコンソールに接続することができなくなります。 まぁsshdは起動しているのでdisk.imgをマウントしてrootにパスワードを設定するか、パスワードなしでのログインを許可すればネットワーク接続できるので、何とかなりますけれど。
さて続いては /usr/bin/xen-create-image コマンドの修正。なぜなら後からcfgファイルを編集して"file:"を"tap:aio:"に変換するのが面倒だから。なのでこれは"serial_device"行の編集と同じで必須ではないです。
変更内容は以下の通りですが、最初の":"(コロン)が削除されるようなので、少し変な感じになっています。
$ diff /usr/bin/xen-create-image.20080921  /usr/bin/xen-create-image

2411c2411
<         $partition->{'imagetype'} = 'file:';
---
>         $partition->{'imagetype'} = 'tap::aio';

ゲストOSの作成と起動

いろいろな試行錯誤の結果が xen-tools.conf と xen-create-image の修正に含まれているため、ここの作業は簡単です。
ここではホスト名を"xen63"、IPアドレスを"192.168.1.63"として、イメージの作成と起動は次のように行なえます。

$ sudo xen-create-image --hostname xen63 --debootstrap --ip 192.168.1.63
$ sudo xm create -c /etc/xen/xen63.cfg
後からxmのコンソールに接続したい場合には:
$ sudo xm console xen63
不具合があって強制終了したい場合には:
$ sudo xm shutdown xen63
"xm shutdown"では終了できず、"xm list"で延々と表示されてしまう向きには:
$ sudo xm destroy xen63
こんな感じで作業完了です。

2007/10/21

Ubuntu 7.10 へのアップグレードとXen 3.1

Ubuntu 7.10がリリースされたので、7.04からアップグレードしてみました。 だいたい流れは次のようになります。

  1. Gnomeデスクトップからアップデートマネージャーを選択し7.10は選択せず最新にする
  2. 再起動後、再びアップデートマネージャーから7.10を選択し進める
  3. Removalなパケージは消去せずに、とりあえず完了後、再起動する
ここで進めて、Ubuntu 7.10になっています。 以前から使っているXenの仮想マシンを起動してみますが、vif周りのエラーで起動しませんでした。
$ sudo xm create -c /etc/xen/xen01.cfg
Error: Device 0 (vif) could not be ...

vif関連のモジュールや設定は7.04->7.10のアップグレードで消えたわけではなかったのですが、パッケージを確認している途中で、Ubuntu 7.10用にはXen 3.1のパッケージが準備されているようでしたが、"dpkg -l"でみると、システムに登録されているものはXen 3.0のもののままだった事がわかりました。

そこで次のように対応します。

  1. $ sudo apt-get install xen-hypervisor-3.1 libxen3.1
  2. $ sudo apt-get autoremove
  3. $ sudo apt-get install libxen3.1-dev xen-utils-3.1 python-xen-3.1 xen-ioemu-3.1 libc6-xen
前半のステップで、xen3.0関連のモジュールを削除し、最後のステップで関連するモジュールを追加します。いきなり"apt-get autoremove"で削除できそうだけれど、確認していません。

ただここで、xen-utils-3.1 と xen-ioemu-3.1 については次のようなメッセージが"apt-get"の際に表示されて正常に導入できません。

Setting up xen-utils-3.1 (3.1.0-0ubuntu18) ...
.........invoke-rc.d: initscript xend, action "start" failed.
xmは導入されているので、仮想マシンを起動してみます。
$ sudo xm create -c /etc/xen/xen01.cfg
Error: Unable to connect to xend: Connection refused. Is xend running?
xendは導入したばかりなので、システムを再起動します。

再起動後は

$ sudo xm create -c /etc/xen/xen01.cfg
が動きますが、その前に先ほど失敗したモジュールを導入しておきます。
  1. $ sudo apt-get install xen-utils-3.1 xen-ioemu-3.1
ここまでで、Ubuntu 7.10 で以前作成した仮想マシンが稼働しました。 とりあえず今のところ問題なく動いています。

2007/09/15

Ubuntu 7.04 loopデバイスを増やしてみる

"max_loop"をキーワードにBlogやhowtoforgeを検索してみると、カーネルパラメーターとして定義していたり、modules.conf に書いていたり、いくつかの方法があるようです。

$ ls /dev/loop*
で確認して、loop0からloop7までの8つしか表示されなければ、デフォルトのままです。 Ubuntu 7.04 (Feisty Fawn)でいくつかの方法を試したところでは、/etc/modules に "loop max_loop=255" と追加した後で再起動すると/dev/loop*が増えていました。
~$ cat /etc/modules
## 
## 他は省略
loop max_loop=255
##
$ echo /dev/loop*
/dev/loop0 /dev/loop1 /dev/loop10 /dev/loop100 ...
この状態で新しいdomUを追加しても、ちゃんとディスクイメージも作成できるし、そのまま起動も問題なくできる。vifデバイスが追加できなかったのもloopデバイス不足が関係していたようにみえます。 これでしばらく遊んでいきましょう。

2007/09/11

引き続き…CentOS on Xen

先日のUbuntu 7.04 XenでCentOS 4.3を導入した件は、その後、xm create -c /etc/xen/xen113.cfg を実行してみるものの、「Device 0 (vif) could not be connected. Hotplug scripts not working.」というエラーを出し続けたのでした。

その後で順調に動いていた他のdomUも停止後、同じメッセージを表示して起動しなくなった事がわかったので、dom0含めてマシンの再起動をかけて回復しました。

その後、.cfgファイルの"arch=i386"をコメントアウトして"arch=x86_64"な状態で"xen-create-image"を実行した直後も同じ状態になり、いまのところ原因がわからず対処療法的にCentOSなイメージを作成した後にマシンの再起動をしています。

"arch=i386"で作成したdomUは、起動してログインできるものの、"yum update"を実行した際に /usr/lib/python2.3/site-packages/rpmmodule.so を探しにいって見つからないとエラーになってしまいました。ログをみると、最初はi386なRPMファイルを導入して作ったイメージに最後でx86_64なアップデートを適用してしまったらしく、i386とx86_64のファイルが混在するという結果になってしまったようです。今回はCentOSを起動する事を優先して、i386はあきらめて、"arch=x86_64"で進めてみます。

前回までと同じように作成したarch=x86_64なイメージは、起動してログインできますが、"yum"コマンドすらみつからず、"rpm -qa"を実行しても何も表示されない動きをしていて、挙動がi386の時と少し違います。

うーん、これはどう理解すればいいのだろう。arch=x86_64で作ったイメージについて/var/log/xen-tools/のログをみると、RPMの導入で"failed"と表示されているところがあります。

....
        python-elementtree is needed by yum-2.4.2-2.centos4.noarch
        python-sqlite is needed by yum-2.4.2-2.centos4.noarch
        urlgrabber is needed by yum-2.4.2-2.centos4.noarch
+ die 'command "rpm --install   --root /tmp/rqcJeEXkQO --dbpath /tmp/rqcJeEXkQO/var/lib/rpm centos-yumconf-4-4.5
.noarch.rpm yum-2.4.2-2.centos4.noarch.rpm"' failed
+ echo 'rpmstrap: critical error: command "rpm --install   --root /tmp/rqcJeEXkQO --dbpath /tmp/rqcJeEXkQO/var/l
ib/rpm centos-yumconf-4-4.5.noarch.rpm yum-2.4.2-2.centos4.noarch.rpm" failed'
rpmstrap: critical error: command "rpm --install   --root /tmp/rqcJeEXkQO --dbpath /tmp/rqcJeEXkQO/var/lib/rpm c
entos-yumconf-4-4.5.noarch.rpm yum-2.4.2-2.centos4.noarch.rpm" failed
....
これは依存関係に少し問題がありそうです。
/usr/lib/rpmstrap/scripts/centos4 を少し編集して、依存関係のあるモジュールを追加しました。さらに"vault.centos.org"は遅いので、理研のミラーサイトに古い4.3のイメージをみつけたので、このURLを追加して、依存関係のあるRPMの情報を追加しています。
$ diff centos4.20070910 centos4
37a38,39
> http://ftp.riken.jp/Linux/centos/4.3/os/i386/CentOS/RPMS/
> http://vault.centos.org/4.3/os/i386/CentOS/RPMS/
46a49,50
> http://ftp.riken.jp/Linux/centos/4.3/os/x86_64/CentOS/RPMS/
> http://vault.centos.org/4.3/os/x86_64/CentOS/RPMS/
262a267,271
> 52:sqlite-3.2.2-1.x86_64.rpm
> 52:expat-1.95.7-4.x86_64.rpm
> 52:python-urlgrabber-2.9.6-2.noarch.rpm
> 52:python-elementtree-1.2.6-4.x86_64.rpm
> 52:python-sqlite-1.1.6-1.x86_64.rpm
さて何とか起動しましたが、やっぱりうまく起動しない。 何かがエラーだと思ったら、/home/xen/domains 以下にある disk.img のサイズがおかしい。 "ls -l"でみると4GBの設定どおり表示されるのは良いとして、du -ks disk.img の結果が 0KBになっていました。うーん、これはわからない。"xen-delete-image"コマンドを実行してから同じ名前で作り直しているから、古いdisk.imgをXenがつかんだままだったりとかしたのか…。いまとなっては状況証拠しかみつからないので、"xen-delete-image"で作成したイメージを消してからマシンを再起動して、再びイメージの作成をやりました。

結果は…、無事にdomUでCentOSが起動して、yumコマンドも存在するし、"rpm -qa"の結果も正しそうです。"yum install gcc"でgccが導入できました。

vif周りのHotplugがちゃんと動かなくてイメージ作る度に、再起動が必要になるし、何かする前にちゃんと"xm destory "でdomUを停止したり、面倒な事が多いから、まだまだ実用には気をつける事が多いかな。…、だからXenSourcesがXen v4.0を売るのか…。うまく使いこなさないとだなぁ。

2007/09/10

Ubuntu 7.04 XenのゲストOS(domU)にCentOSを

どうやら/dev/hdaをCFディスクにした構成では、/dev/hdaが/dev/sdbとして認識されてしまい、dom0がうまく起動しなくなってしまいました。
いろいろ試してみたものの、おとなしく/dev/hdaを外して、/dev/sdaなSATAディスクと/dev/hd{c,d}にCD-RW, DVD-ROMドライブをつけた構成に戻して、Ubuntu 7.04を入れ直す事にしました。

以前試した時と同じ構成になっているので、当然Xenは無事に動き、etchをdomUとして動かす事ができたので、/etc/xen-tools/xen-tools.confの中で dist = centos4 を指定してCentOS 4.1のイメージを動かしています。

単純に/etc/xen-tools/xen-tools.confの中で、"dist = centos4" と変更しただけでは途中でエラーになってしまいます。そこでrpmstrapを導入して、xen-create-imageの引数を少し変更したり、いろいろ試してみました。

現状のxen-tools.confの中身は、次のようになっています。

dir = /home/xen
rpmstrap = 1
size   = 4Gb      # Disk image size.
memory = 128Mb    # Memory size
swap   = 128Mb    # Swap size
fs     = ext3     # use the EXT3 filesystem for the disk image.
dist   = centos4     # Default distribution to install.
image  = sparse   # Specify sparse vs. full disk images.
gateway   = 192.168.1.1
netmask   = 255.255.255.0
kernel = /boot/vmlinuz-2.6.19-4-generic-amd64
initrd = /boot/initrd.img-2.6.19-4-generic-amd64
arch=i386
ここでrpmstrapが必要なので、apt-getで導入してしまいます。
$ sudo apt-get install rpmstrap
xen-create-imageの引数は次のようにしています。
$ xen-create-image --verbose --hostname xen113 --ip 192.168.1.113
さらにwgetでRPMファイルを取得するところで、"-e"というパッケージを取得しようとしてエラーになっていたので、/usr/bin/rpmstrapの1行目を少し変更しています。 変更前
#!/bin/sh
変更後
#!/bin/bash
あとは…、xen-tools.confで"dist = "の後ろに指定した文字列をキーにして/usr/lib/rpmstrap/scripts/の"centos4"ファイルを編集してURLが並んでいるところの先頭にCentOS 4.3のRPMファイルが存在する場所を指定します。
$ diff /usr/lib/rpmstrap/scripts/centos4.20070910 /usr/lib/rpmstrap/scripts/centos4
37a38
> http://vault.centos.org/4.3/os/i386/CentOS/RPMS/
46a48
> http://vault.centos.org/4.3/os/x86_64/CentOS/RPMS/
既存のURLはCentOS 4.1のイメージを指しているようになっているけれど、アクセスするとエラーになってしまったり、ちゃんとRPMファイルにアクセスできない。
その中で指定されているRPMファイルのバージョンを比較すると、どうやら .../4.1/... ディレクトリ以下にあったのは、CentOS 4.3のイメージだったらしい。 時間が経ってポリシーが変更したのか、4.1以下からみつけたREADMEファイルには、4.1が欲しければ http://vault.centos.org/ いいけとあったので、そこの4.3ディレクトリに変更した。

何回か"xen-create-image"を実行して、ようやく順調に流れたけれど、"Executing : xt-customize-image ..."と表示されたところで、進まなくなってしまった。
とりあえず放置して、今日はこのまま寝よう。

2007/09/09

再びUbuntu 7.04でXenを試す

以前Xenを試したPCをCFカード+SATAな構成に変更した上にUbuntu 7.04を入れ直しました。
自分で書いたBlogを見ながら作業をしてみて、最初うまく行かなかったので、元のblogを少し変更しています。

変更のポイントは次のとおりです。

  1. "xen-tools"と"bridge-utils"を"apt-get install"する必要があった
  2. "/etc/xen-tools/xen-tools.conf"の中で"dir = "の指定がないためエラーになった
これからdebian以外のディストリビューションを導入する方法の模索とXenとVMWare Server 1.03を比較してみようと思っています。

2007/04/22

ubuntu 7.04のXenでゲストOSを起動したものの

"xm"コマンドでdebianを起動したものの、ネットワークが認識されない! というわけで迷わず"/etc/network/interface"ファイルをチェックする。

 address 192.168.1.110
 gateway 
 netmask 

gatewayとnetmaskが空ではうまくいかないですね。
適当な値をいれて再設定しました。

$ sudo /etc/init.d/networking restart

ubuntu 7.04でXenを試す

ubuntu 7.04の配付が開始されたので、Xenを試してみました。
空いていたamd64なPCに7.04 x86_64版のDesktopを導入してから、とりあえずいくつか必要そうなパッケージをapt-getで導入しました。

$ sudo apt-get install bridge-utils xen-tools xen-utils xen-image-2.6.19-4-generic-amd64

まずはイメージの作成

Webサイトを参考にしつつ、導入されているxen関連と思われるパッケージからコマンドを探って行きました。
まず眼をつけたのが"xen-create-image"コマンド。 manで調べると、"xt-install-image", "xt-customize-image", "xt-create-xen-config"の処理をまとめてくれるらしい。
とりあえず試すだけなので、イメージの作成はこれを使うことにしました。 manを見ながらも、足りないオプションは催促されるので、出力されるメッセージを良く読むこと。

$ sudo xen-create-image --hostname xen01 --debootstrap --ip 192.168.1.8
しかし、このままだと/boot以下にカーネルイメージがないといったエラーがでてしまう。 どうやら /etc/xen-tools/xen-tools.conf のデフォルト指定が /boot 以下にないファイルを指定しているようだったので、この中の"kernel="と"initrd="の指定先にapt-getで導入したxen用のイメージを指定する。
kernel = /boot/vmlinuz-2.6.19-4-generic-amd64
initrd = /boot/initrd.img-2.6.19-4-generic-amd64
この状態ではまだ"xen-create-image"がエラーになる。xen-tools.confで"dir = "の指定がないと失敗するようです。

ここまでで作成したxen-tools.confの内容。

$ sed -e '/^#/d' -e '/^$/d' /etc/xen-tools/xen-tools.conf
dir = /home/xen
size   = 4Gb      # Disk image size.
memory = 128Mb    # Memory size
swap   = 128Mb    # Swap size
fs     = ext3     # use the EXT3 filesystem for the disk image.
dist   = etch     # Default distribution to install.
image  = sparse   # Specify sparse vs. full disk images.
kernel = /boot/vmlinuz-2.6.19-4-generic-amd64
initrd = /boot/initrd.img-2.6.19-4-generic-amd64
mirror = http://ftp.us.debian.org/debian/
これで再び"xen-create-image"を指定する。 今度は最後まで実行され、無事にイメージが作成できたようだ。

続いてブート

"xen-create-image"コマンドに"--boot"オプションを指定すれば、そのまま起動するようだったけれど、手動で起動してみる。 手動の方法はXenについての古いドキュメントを参考にした。

$ sudo xm create -c /etc/xen/xen01.cfg
...
Error: Device 0 (vif) could not be reconnected. Hotplug scripts not working. 
最後のエラーはまったく困ってしまった。
いろいろ調べてみると、どうやらvifはネットワークをブリッジさせるために使われるという事がわかった。 このメッセージの対処方として、"bridge-utils"をapt-getで導入する、というものがあった。 既に入っているというのに困ったな…。

ネットワーク回りの設定

もう少し"vif"を調べてみると、/etc/xen/xend-config.sxpファイルにbridge networkについて設定があるらしい。 さっそく調べてみると、ascii artでnetwork bridgeの説明がある。 うーん、そっか僕のPCにはNICが合計で3枚付いているから、eth0が普通の役割を果していないんだ。

さっそく設定を変更する。どうやらこれはリスタートで反映されるらしい。 いやxend-config.sxpファイルをみていると、いろいろできそうだから、反映の方法はあるんだろうな。

### (network-script network-dummy)
(network-script network-bridge)
(network-script 'network-bridge netdev=eth2')

再び起動

さて気をとりなおして、起動してみる。

$ sudo xm create -c /etc/xen/xen01.cfg

Debian GNU/Linux 4.0 xen110 tty1

xen110 login: 
これで、ひとまずは成功かな。 IDはrootでパスワードなしでログインができます。