chakokuのブログ(rev4)

日々のごった煮ブログです

Xen(4.1.4)をビルドしてみる(試行錯誤編)

前回、解説本に従い最小のKernelを作ってみたけど、xm create を実行すると、扱えないXenバージョンだと怒られた。Xenのソースを見ているとサンプルカーネル(mini-os)があるので、一度Xenをビルドしてみることにした(コンパイルXenDomU上で動作しているUbuntu 12.04.3)。

これは作業経過をそのまま記録していて読みにくいので、別途まとめ編を作ります。


1.Debianで走っているXenと同じバージョン(4.1.4)のソースをサイトから入手、 xen-4.1.4.tar.gzを展開
2.READMEに以下の手順で構築しろとあるので実行してみる


# make world
# make install
3.make world実行後、お決まりのエラー発生

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はすでに入っている(以下より)


$ dpkg --list | grep zlib
ii zlib1g 1:1.2.3.4.dfsg-3ubuntu4 compression library - runtime
headerの問題と思われ、以下をインストール

$ apt-cache search zlib | grep dev
*略*
zlib1g-dev - compression library - development
# apt-get install zlib1g-dev
エラーが出たディレクトリでMakeしてみる。。不足パッケージが一杯ありそうだ

$ 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

不足するヘッダ類を追加インストール

# 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の初期エラーは消えてコンパイルが実行されたけど、最後にエラーが発生

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)でググって対策


# apt-get install gcc-multilib
再度Makeでエラー

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

これは虎の巻に書かれている


# apt-get install iasl
Makeでエラー(これは分かりやすい!)

xen/lowlevel/xc/xc.c:7:20: fatal error: Python.h: No such file or directory
対策して、、

apt-get install python-dev
Make... toolsディレクトリ配下はMakeが完了した。
というわけで、親のディレクトリで再度 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)はコンパイルされていないのであった。ここは別途コンパイルしろということか。。


dir:xen-4.1.4/extras/mini-os
READMEには、just type make とあるので、 makeと打ち込んだ。。するとkernelができた

-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