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イメージを作成するための準備は終りました。

0 件のコメント: