3. 起動

実機(USB ドライブ+EFI シェル)と QEMU での起動手順

実機での起動(USB ドライブ+EFI シェル)

実機での最も簡単な方法は、USB ドライブに EFI シェルを用意して BitVisor を起動することです。

USB ドライブの準備

USB ドライブを FAT32 でフォーマットし、以下のフォルダ構成を作ります:

USB ドライブ/
├── EFI/
│   └── boot/
│       └── bootx64.efi     ← EFI シェルを bootx64.efi にリネームして配置
└── bitvisor/
    ├── loadvmm.efi          ← UEFI ローダー
    └── bitvisor.elf         ← ハイパーバイザ本体

EFI シェルは Arch Linux Wiki などからビルド済みバイナリを入手できます(x86_64 用を選択してください)。

UEFI ファームウェアが外部ドライブから起動する際、デフォルトで EFI\boot\bootx64.efi を探します。 シェルの EFI ファイルを bootx64.efi にリネームして配置してください。

EFI シェルからの起動

USB ドライブから起動すると EFI シェルが表示されます。 画面に fs0, fs1 などのファイルシステム情報が表示されます (内蔵ドライブが先に表示され、外部ドライブがその後に続くのが一般的です)。

ファイルシステムを切り替えてから BitVisor を起動します:

Shell> fs1:              ← USB ドライブに対応する番号に変更
fs1:\> cd bitvisor
fs1:\bitvisor\> loadvmm.efi

BitVisor が起動すると次のようなログが表示されます:

Copyright (c) 2007, 2008 University of Tsukuba
All rights reserved.
ACPI DMAR not found.
...
Starting a virtual machine.

syslog の設定が正しければ、受信側の /var/log/bitvisor.log にも以下のようなログが記録されます:

Feb  3 17:30:45 host bitvisor: Starting a virtual machine.
Feb  3 17:30:45 host bitvisor: IP address changed: 0.0.0.0 -> 192.168.0.7
Feb  3 17:30:45 host bitvisor: telnet server "dbgsh" ready

BitVisor の起動後、exit で EFI シェルを終了すれば通常の OS ブートが続きます。 または手動で OS の EFI ローダーを指定することもできます:

  • Linux: EFI\ディストリ名\grubx64.efi
  • Windows: EFI\Microsoft\Boot\bootmgfw.efi

QEMU での起動(x86_64)

QEMU を使えばすぐに試すことができます。 bitvisor.elf と loadvmm.efi を同じフォルダ(例: ~/x86_test/)に置いてください。

qemu-system-x86_64 \
  -cpu host -enable-kvm \
  -bios /path/to/OVMF.fd \
  -drive file=fat:rw:~/x86_test/,format=raw \
  -cdrom /path/to/bootable.iso \
  -nic user,model=e1000e \
  -M q35 -m 4096
  • -bios には OVMF(UEFI ファームウェアイメージ)を指定します
  • NIC は e1000e(Intel エミュレーション)なので pro1000 ドライバを有効にしてください
  • 起動時に ESC キーを連打してセットアップメニューから EFI シェルを選択します (-boot menu=on を追加すると起動遅延が増え操作しやすくなります)

KVM 使用時の注意

近年の Intel CPU では、kvm_intel の enable_apicv=Y の状態で BitVisor を起動すると、 ゲスト OS でタイマーパニックや SMP 起動の問題が発生することがあります。 apicv を一時的に無効化するには:

sudo modprobe -r kvm-intel && sudo modprobe kvm-intel enable_apicv=N

また、defconfig で .localapic_intercept = 1 を設定することで QEMU + KVM 上の問題を回避できます。


QEMU での起動(AArch64 実験的)

AArch64 BitVisor は現在実験的な状態です。現時点では neoverse-n1 または a64fx CPU で起動できます。

qemu-system-aarch64 \
  -m 8G \
  -M virt,gic-version=3,virtualization=true \
  -cpu neoverse-n1 \
  -bios /path/to/aarch64/qemu_efi.fd \
  -drive file=fat:rw:/path/to/bitvisor_dir/,format=raw \
  -cdrom /path/to/aarch64/linux.iso \
  -nic user,model=e1000e \
  -serial vc:1024x768 \
  -smp 4

-cpu max は現在未対応のオプション機能を有効化するため使用できません。

起動後は x86_64 の場合と同様に EFI シェルから loadvmm.efi を実行します。

デバイスツリーを使う場合は -M に acpi=off を追加し、 Kconfig で CONFIG_DEVICETREE=y を有効にしてください。