2. BitVisor の設定とビルド

Kconfig とランタイム設定(defconfig)の記述、およびハイパーバイザ・UEFI ローダーのビルド

Kconfig によるコンパイル時設定

ソースディレクトリで以下を実行します:

make config

入門として推奨する設定項目:

- 64                    # 64ビットモード
- CPU_MMU_SPT_1
- CPU_MMU_SPT_USE_PAE
- DBGSH                 # デバッグシェル
- ACPI_DSDT
- DISABLE_SLEEP         # スリープ無効
- ENABLE_ASSERT
- NET_DRIVER            # ネットワークドライバを有効化
  - NET_PRO1000         # Intel NIC の場合
  - NET_RE              # Realtek NIC の場合
  - NET_BNX             # Broadcom NIC の場合
  - NET_AQ              # Aquantia NIC の場合
- NET_VIRTIO_NET        # ゲストに virtio NIC として見せる(推奨)
- ACPI_TIME_SOURCE
- TCG_BIOS
- BACKTRACE
- IP                    # IP スタック
- THREAD_1CPU
- ACPI_IGNORE_ERROR
- DISABLE_VTD
- DMAR_PASS_THROUGH

コンパイル時の警告は外部コードや過去の研究コードに由来するものがあり、 現時点では無視して問題ありません。

ランタイム設定(defconfig)

defconfig.tmpl を defconfig にコピーし、必要なパラメータを編集します:

cp defconfig.tmpl defconfig

defconfig は C 構造体の初期化構文で記述します。 設定構造の定義は include/share/config.h を参照してください。

ネットワーク・syslog の設定例(最小構成)

struct config_data config = {
    .vmm = {
        .tty_mac_address = {
            0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF   /* syslog 受信側のMACアドレス */
        },
        .tty_syslog = {
            .enable     = 1,
            .src_ipaddr = { 192, 168, 0, 7 },     /* BitVisor の送信元 IP */
            .dst_ipaddr = { 192, 168, 0, 1 },     /* syslog 受信側の IP */
        },
        .driver = {
            .pci = "driver=pro1000, net=ippass, tty=1, virtio=1",
        },
    },
    .ip = {
        .use_dhcp = 0,
        .ipaddr   = { 192, 168, 0, 7 },
        .netmask  = { 255, 255, 255, 0 },
        .gateway  = { 192, 168, 0, 1 },
    },
};

net= オプションの説明

値 動作
net=pass BitVisor は IP スタックを使わず、トラフィックはゲストのみに渡る
net=ip BitVisor が IP スタックを使う。トラフィックはゲストには渡らない
net=ippass BitVisor と ゲスト両方がトラフィックを受け取る
net=ippassfilter 可能な限りトラフィックを分離する
net=ippassfilter2 スプリアス割り込み対策付き(bnx, re, aq に推奨)

pro1000 は MSI 割り込みを使うため net=ippass で動作します。 bnx, re, aq はピン割り込みを使うため ippassfilter2 を推奨します。

NIC ドライバの指定

NIC driver= の値
Intel pro1000
Broadcom bnx
Realtek re
Aquantia aq

ハイパーバイザ本体のビルド

make

成功すると bitvisor.elf が生成されます。

UEFI ローダーのビルド

cd boot/uefi-loader
make

成功すると boot/uefi-loader/loadvmm.efi が生成されます。

AArch64 向けのクロスコンパイル(実験的)

x86_64 ホスト上で AArch64 向けにクロスコンパイルする場合:

# ハイパーバイザ本体
CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=aarch64 make

# UEFI ローダー
cd boot/uefi-loader
CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=aarch64 make

CROSS_COMPILE プレフィックスはシステムにインストールされているツールチェインに合わせて変更してください。

生成されたファイルのアーキテクチャを確認:

file bitvisor.elf
# → ELF 64-bit LSB executable, ARM aarch64, ...

file boot/uefi-loader/loadvmm.efi
# → PE32+ executable (DLL) (EFI application) Aarch64, ...