今更なんだけど

xenでinitrdをDom0とDomUで同じのを使うのは基本的にはNGっていう。
というのも、DomUの(仮想)ハードウェア構成は当然Dom0とは異なる。
従って、DomUのinitrdはDomUで作成したものを利用するべきなわけだ。

んだけども、DomUで作成したものはDomUのファイルシステムにおかれるわけで、これはDomUが起動していないときならマウントして中身をみることは可能だけども、 起動しているときは当然みれず、起動前にマウントしていたら当然DomUは起動できない。
実際のところDom0から見える必要があるのは起動時だけなんだけども、起動時にDom0から見える=DomUのファイルシステムがマウントされている=DomUは起動できない。

となると、DomUで使うカーネルやら初期RAMディスクやらをDom0のファイルシステム上に配置するのがたぶんまともな解決方法。
だけどそれらは一度配置したあとなかなか更新がかからないなら、scpやらなんやらで移してやればいいんだけども、sidなんかで運用している場合は意外とちょいちょい更新があり面倒。
じゃあ自動で転送する仕組みを作ろう。

とここまで書いてはや数時間。
どうしたらいいものか悩んでいる。
とりあえず、転送自体はscpなりでやればよく、それはスクリプトを書けばいい。
問題はスクリプトを実行するタイミングだ。
cronで回すのはスマートじゃないし、やっぱりinitramfs-toolsが動いた後に動いてほしい。
そうすると。。。かれこれ数時間悩んだが、思いつかない。

initramfs-toolsのmanページを眺めまくったがなんとも。

とりあえず、転送スクリプトだけでも作る。

とおもったところで閃いた。

DomUを起動する時に、いったんDomUのファイルシステムをマウントして、initrdとかをDom0にコピーしてから起動するようにすればいいはずだ。

と思って何とかならないかごちゃごちゃ調べていたら、見つかった。
DomUの設定ファイルはpythonスクリプトを実行できる。
これでかつる。(pythonとか全然書き方しらないけど)

さて、pythonのお勉強を始めるのもあれなので、pythonでシェルスクリプト呼び出す方法を調べた。
osモジュールをimportしてやってos.system関数を呼び出してやればいけるようだ。
ということで、シェルスクリプトを書く。

シェルスクリプトの内容は以下のようにする。

  • DomUが利用するファイルシステムをマウント
  • マウントポイント/bootからkernelとinitrdをコピー
  • アンマウント

ということで、途中いろいろ試行錯誤はあったものの、最終的には以下のようなシェルスクリプトを書いた。

#!/bin/sh

# usage
# kernelfetch.sh DomU_Disk mount_point arch kernel_dist
# DomU_disk_path - path to DomU disk which contains DomU kernel and initrd
# mount_point - path to mount point where DomU_Disk will be mounted
# kernel_dist - Path to the directory where DomU kernel and initrd will be saved

# args check
if [ $# -ne 3 ]; then
 echo "usage: $0 DomU_Disk_path mount_point kernel_dist"
 exit 1
fi

if [ ! -d $2 -o ! -d $3 ]; then
 echo "directory not found"
 exit 2
fi

if [ -f $1 ]; then
 MOUNT_OPT="-o loop"
elif [ ! -b $1 ]; then
 echo "DomU disk not found"
 exit 3
fi

# kernel paths and names
BOOT_DIR="$2/boot/"
KERNEL_PREFIX="vmlinuz-"
INITRD_PREFIX="initrd.img-"

# mount DomU disk which contains kernels
if ! mount ${MOUNT_OPT} $1 $2; then
 echo "mount failed"
 exit 4
fi

# copy the kernel
if ! cp ${BOOT_DIR}${KERNEL_PREFIX}* ${BOOT_DIR}${INITRD_PREFIX}* $3; then
 echo "copy failed"
 umount $2
 exit 5
fi

umount $2

exit 0

このシェルスクリプトは、指定されたディスクイメージあるいはデバイスを、指定ディレクトリにマウントして、指定ディレクトリ/bootからカーネルイメージと初期RAMディスクイメージを指定したディレクトリにコピーして、アンマウントする、という流れになっている。

で、DomUの設定ファイルでこのスクリプトを実行し、持ってきたイメージを使うように書き換える。

import os

os.system('/etc/xen/scripts/kernelfetch.sh /dev/fileserver/fileserver /mnt/xentmp /etc/xen/kernel/file')

kernel      = '/etc/xen/kernel/file/vmlinuz-2.6.26-2-xen-amd64'
ramdisk     = '/etc/xen/kernel/file/initrd.img-2.6.26-2-xen-amd64'

そのほかの部分は通常のDomUの設定と同じ。
ようやくうまく動いた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>