AdventCalendar
BitVisor
BitVisorDay 13

NetBSDでBitVisorをビルドしてみる話

More than 1 year has passed since last update.

BitVisorNetBSDでもビルドできる!という話を聞いたので、さっそくNetBSD-7.0-amd64環境でBitVisorのコンパイルとゲストOS起動までを試してみようと思い立ちました。

が、現状ではBitVisorのビルド(途中まで……)のところで留まっているので、ゲストOS起動はまた日を改めて紹介できればと思います。

NetBSDでBitVisorをビルドする

あらかじめ以下のパッケージをインストールします(他にもいくつか必要なものがあるかも)。ビルド環境とBitVisorインストール環境を分けておくと良いかもしれません。

$ sudo -i pkg_add -v mercurial wget pkg-config grub2

BitVisorのWebサイトから取得したソースコードを展開します。

$ tar zxvf bitvisor-1.4.tar.gz
$ cd bitvisor-1.4

NetBSDでもBitVisor のコンパイルの手順でコンパイルが行えますが、一部コンパイルエラーになってしまいます。

$ make
$ make -C boot/loader
$ make -C boot/uefi-loader

boot/loaderは警告がでるもののコンパイルは通っています。

$ make -C boot/loader
gcc -nostdlib -Wl,--oformat,binary -o bootloader bootloader.s
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400000
gcc -nostdlib -Wl,--oformat,binary -o bootloaderusb bootloaderusb.s
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400000
$ echo $?
0

以下のようにbootloaderが生成されています。

$ find . -name bootloader
./boot/loader/bootloader

$ file ./boot/loader/bootloader
./boot/loader/bootloader: DOS/MBR boot sector

uefi-loaderはビルドエラーが発生してしまいます。

$ make -C boot/uefi-loader
amd64-mingw32msvc-cc -shared -nostdlib -e efi_main@8  -mno-red-zone -mno-sse -nostdinc -s -O  -ffre\
estanding -fno-builtin -fno-stack-protector  -fno-strict-aliasing  -I../../edk/Foundation/Efi/Inclu\
de/  -I../../edk/Foundation/Framework/Include/  -I../../edk/Foundation/Include/  -I../../edk/Founda\
tion/Efi/ -o loadvmm.dll loadvmm.c
make: exec(amd64-mingw32msvc-cc) failed (No such file or directory)
*** Error code 1

Stop.
make: stopped in /home/fpig/work/bitvisor/bitvisor-1.4/boot/uefi-loader

real    0m0.006s
user    0m0.001s
sys     0m0.004s

とはいえ、bitvisor.elfが(最初のmake実行で)生成されており、これをgrubから実行することでBitVisorのバイナリで起動するとこまでは試せそうです。

$ find . -name *.elf
./bitvisor.elf
$ file ./bitvisor.elf 
./bitvisor.elf: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped

ゲストOSの起動(……の前準備)

とりあえずbitvisor.elfが生成できたので、ゲストOS起動(の前準備)を進めてみます。

grub2のインストール

bitvisor.elfはgrub経由で起動させることができるようです。NetBSDではgrubをインストールするところから始めます(なのでBitVisorのコンパイル用VMとインストール用VMを分けておくと良さそう)。

# pkg_add -v grub2

grub-mkconfigを実行したのち、grub-installでgrubをインストールします。

# grub-mkconfig -o /grub/grub.cfg
Generating grub.cfg ...
Found NetBSD kernel: /netbsd
strings: not found
strings: not found
strings: not found
strings: not found
strings: not found
done

筆者の環境では「-f」オプションを付けてgrub-installを実行しないとgrubがブートローダとしてインストールされませんでした。

# df -h | grep wd
/dev/wd0a          8.7G       250M       8.0G   2% /
# disklabel wd0 | head -n1 | awk '{ print $2 }'
/dev/rwd0d:
# grub-install -f --no-floppy /dev/rwd0d
/usr/pkg/sbin/grub-bios-setup: warning: your core.img is unusually large.  It won't fit in the embe\
dding area.
/usr/pkg/sbin/grub-bios-setup: warning: Embedding is not possible.  GRUB can only be installed in t\
his setup by using blocklists.  However, blocklists are UNRELIABLE and their use is discouraged..
Installation finished. No error reported.

こんな感じでgrub2でNetBSDが起動するようになります。このNetBSD起動の部分にBitVisorが一段はさまる感じで動作するのかなと考えています。

スクリーンショット 2015-12-13 5.10.42.png

grub2.confでのBitVisorのmenuentty記述や必要なファイルの指定(このあたりまだ良く把握できていない)などがありますが、これはおいおい調べていこうと思います。

まとめ

ものすごい駆け足での記事になってしまいましたが、NetBSDでのBitVisorのコンパイルを試してみました。grub2側での設定方法についても後々まとめられればと思います。

参考URL