前回、解説本に従い最小のKernelを作ってみたけど、xm create を実行すると、扱えないXenバージョンだと怒られた。Xenのソースを見ているとサンプルカーネル(mini-os)があるので、一度Xenをビルドしてみることにした(コンパイルはXenのDomU上で動作しているUbuntu 12.04.3)。
これは作業経過をそのまま記録していて読みにくいので、別途まとめ編を作ります。
1.Debianで走っているXenと同じバージョン(4.1.4)のソースをサイトから入手、 xen-4.1.4.tar.gzを展開
2.READMEに以下の手順で構築しろとあるので実行してみる
3.make world実行後、お決まりのエラー発生
# make world
# make install
make[2]: Entering directory `/home/foo/lang/c/xen/xen-4.1.4/tools'
set -ex; \
if test -d /home/foo/lang/c/xen/xen-4.1.4/tools/../tools/ioemu-qemu-xen; then \
mkdir -p ioemu-dir; \
else \
if [ ! -d ioemu-remote ]; then \
rm -rf ioemu-remote ioemu-remote.tmp; \
mkdir ioemu-remote.tmp; rmdir ioemu-remote.tmp; \
git clone /home/foo/lang/c/xen/xen-4.1.4/tools/../tools/ioemu-qemu-xen ioemu-remote.tmp; \
if [ "xen-4.1.4" ]; then \
cd ioemu-remote.tmp; \
git branch -D dummy >/dev/null 2>&1 ||:; \
git checkout -b dummy xen-4.1.4; \
cd ..; \
fi; \
mv ioemu-remote.tmp ioemu-remote; \
fi; \
rm -f ioemu-dir; \
ln -sf ioemu-remote ioemu-dir; \
fi
+ test -d /home/foo/lang/c/xen/xen-4.1.4/tools/../tools/ioemu-qemu-xen
+ mkdir -p ioemu-dir
set -e; \
export PREFIX="/usr"; export XEN_SCRIPT_DIR="/etc/xen/scripts"; export XEN_ROOT="/home/foo/lang/c/xen/xen-4.1.4/tools/.."; \
cd ioemu-dir; \
/home/foo/lang/c/xen/xen-4.1.4/tools/../tools/ioemu-qemu-xen/xen-setup
Error: zlib check failed
Make sure to have the zlib libs and headers installed.
sed: can't read config-host.h: No such file or directoryここからは試行錯誤。。
ログから推測しますに、、zlibのライブラリがないか、ヘッダファイルがないのか。。
zlibはすでに入っている(以下より)
headerの問題と思われ、以下をインストール
$ dpkg --list | grep zlib
ii zlib1g 1:1.2.3.4.dfsg-3ubuntu4 compression library - runtime
エラーが出たディレクトリでMakeしてみる。。不足パッケージが一杯ありそうだ
$ apt-cache search zlib | grep dev
*略*
zlib1g-dev - compression library - development
# apt-get install zlib1g-dev
不足するヘッダ類を追加インストール
$ cd /home/foo/lang/c/xen/xen-4.1.4/tools$ make
make[1]: Entering directory `/home/foo/lang/c/xen/xen-4.1.4/tools'
make -C check all
make[2]: Entering directory `/home/foo/lang/c/xen/xen-4.1.4/tools/check'
PYTHON=python LIBXENAPI_BINDINGS=n ACM_SECURITY=n ./chk build
Xen CHECK-BUILD Sat Oct 5 11:19:53 JST 2013
Checking check_crypto_lib: OK
Checking check_curl: unused, OK
Checking check_openssl_devel:
*** check_openssl_devel FAILED: missing openssl headers
Checking check_python: OK
Checking check_python_devel: OK
Checking check_uuid_devel:
*** check_uuid_devel FAILED: missing uuid headers (package uuid-dev)
Checking check_x11_devel:
*** check_x11_devel FAILED: can't find X11 headers
OK
Checking check_xgettext:
*** check_xgettext FAILED: can't find xgettext
Checking check_xml2: unused, OK
Checking check_zlib_devel: OK
Checking check_zlib_lib: OK
make[2]: *** [check-build] Error 1
make[2]: Leaving directory `/home/foo/lang/c/xen/xen-4.1.4/tools/check'
make[1]: *** [subdir-all-check] Error 2
make[1]: Leaving directory `/home/foo/lang/c/xen/xen-4.1.4/tools'
make: *** [subdirs-all] Error 2
Makeの初期エラーは消えてコンパイルが実行されたけど、最後にエラーが発生
# apt-get install zlib1g-dev
# apt-get install libssl-dev
# apt-get install uuid-dev
# apt-get install libx11-dev
# apt-get install gettext
# apt-get install libncurses5-dev
make[2]: Entering directory `/home/foo/lang/c/xen/xen-4.1.4/tools/firmware' =========================================================================== Require dev86 rpm or bin86 & bcc debs version >= 0.16.14 to build firmware! (visit http://www.debath.co.uk/dev86/ for more information) ===========================================================================
道のりは遠くて険しい。。疲れた。。
虎の巻より、対策は以下
またエラー
# apt-get install bin86 bcc
make[9]: Entering directory `/home/foo/lang/c/xen/xen-4.1.4/tools/firmware/rombios/32bit/tcgbios'
gcc -O2 -fomit-frame-pointer -m32 -march=i686 -fno-strict-aliasing -std=gnu99 -Wall -Wstrict-prototypes -Wno-unused-value -Wdeclaration-after-statement -Wno-unused-but-set-variable -D__XEN_TOOLS__ -MMD -MF .tcgbios.o.d -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -mno-tls-direct-seg-refs -DNDEBUG -Werror -fno-stack-protector -fno-exceptions -fno-builtin -msoft-float -I/home/foo/lang/c/xen/xen-4.1.4/tools/firmware/rombios/32bit/tcgbios/../../../../../tools/include -I.. -I../.. -c -o tcgbios.o tcgbios.c
In file included from /usr/include/stdint.h:26:0,
from /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdint.h:3,
from ../rombios_compat.h:8,
from tcgbios.c:24:
/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such file or directory
compilation terminated.
make[9]: *** [tcgbios.o] Error 1エラーメッセージ(bits/predefs.h: No such file or directory)でググって対策
再度Makeでエラー
# apt-get install gcc-multilib
make[7]: Entering directory `/home/foo/lang/c/xen/xen-4.1.4/tools/firmware/hvmloader/acpi' ACPI ASL compiler (iasl) is needed Download and install Intel ACPI CA from http://acpica.org/downloads/ make[7]: *** [iasl] Error 1
これは虎の巻に書かれている
Makeでエラー(これは分かりやすい!)
# apt-get install iasl
対策して、、
xen/lowlevel/xc/xc.c:7:20: fatal error: Python.h: No such file or directory
Make... toolsディレクトリ配下はMakeが完了した。
apt-get install python-dev
というわけで、親のディレクトリで再度 make worldを実行、、で、エラー
make[6]: Entering directory `/home/foo/lang/c/xen/xen-4.1.4/stubdom/newlib-x86_64/etc'
/home/foo/lang/c/xen/xen-4.1.4/stubdom/newlib-1.16.0/missing makeinfo --split-size=5000000 --split-size=5000000 --no-split -I../../newlib-1.16.0/etc -o standards.info ../../newlib-1.16.0/etc/standards.texi
WARNING: `makeinfo' is missing on your system. You should only need it if
you modified a `.texi' or `.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy `make' (AIX,
DU, IRIX). You might want to install the `Texinfo' package or
the `GNU make' package. Grab either from any GNU archive site.これは軽症と思われる。texinfoを作れないと怒っているような。。
パッケージを足して、再度Make
なんとかコンパイルが通った。。
# apt-get install texinfo
最後のバイナリができるまでログを見てましたが、やはりXenはでかいシステムですね。
しかし!!肝心のサンプルKernel(mini-os)はコンパイルされていないのであった。ここは別途コンパイルしろということか。。
READMEには、just type make とあるので、 makeと打ち込んだ。。するとkernelができた
dir:xen-4.1.4/extras/mini-os
-rwxrwxr-x 1 foo foo 2452220 Oct 5 12:09 mini-os -rw-rw-r-- 1 foo foo 118518 Oct 5 12:09 mini-os.gz
バイナリの中を見てみるとヘッダ情報は以下となっており、これはx86_64.Sが使われている。バイナリも64bitコードだ
GUEST_OS=Mini-OS,
XEN_VER=xen-3.0,
VIRT_BASE=0x0,
ELF_PADDR_OFFSET=0x0,
HYPERCALL_PAGE=0x2,
LOADER=generic
サンプルのmini-osを走らせてみた。さすがに何の問題もなく動いた。。ということで、これをお手本に自作Kernelを見直そう。。
# xm create domain_config
Using config file "./domain_config".
Started domain Mini-OS (id=2)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 14926 4 r----- 29.8
Mini-OS 2 32 1 -b---- 0.0
■追記(131005) 自作Kernelその後
mini-osを参考に手直しすると仮想環境で立ち上げまではできた。が、、debugメッセージAPIを動かすと落ちるようだ。32bitと64bitで
引数の積み方が違うようなので、HYPERCALLでアセンブラを呼び出す際に引数がおかしくなって落ちるのかも。
■ご参考URL
エラー対策ページ(虎の巻)
http://ashwinvasani.wordpress.com/2010/12/29/general-errors-and-solutions-while-installing-xen-4-0-1-on-ubuntu/
Xen debugの方法(デバッグ対象がdom0かdomUか?分からず)
http://www-archive.xenproject.org/files/xensummit_intel09/xen-debugging.pdf