1. Introduction

kvm-unit-tests是kvm的unit tests。kvm-unit-tests是小型的guest操作系统,通常仅执行数十行C和汇编程序测试代码就能获得测试结果。

kvm-unit-tests可以用来测试开发,同时,对于初学者,例如根据vmx的测试,去kvm源码中仔细研究这部分功能的实现,有助于找到入口点。

2. 编译

1
2
3
git clone https://gitlab.com/kvm-unit-tests/kvm-unit-tests.git
./configure
make

编译成功后,会发现x86 目录中有很多* .elf文件,每个文件都是在特定环境下进行测试的测试用例。假设我们用x86/apic.elf作为测试用例。

3. 运行kvm-unit-tests

软件安装:

1
sudo apt-get install grub-pc-bin xorriso

构建image

1
2
3
mkdir -p iso/boot/grub/bin
cp x86/apic.elf iso/boot/grub/bin/ 
echo > iso/boot/grub/grub.cfg

edit iso/boot/grub/grub.cfg:

1
2
3
4
5
6
7
8
set default=0
set timeout=3
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
menuentry ACRN hypervisor {
echo Load apic ...
multiboot --quirk-modules-after-kernel /boot/grub/bin/apic.elf
}
1
grub-mkrescue -o test.img iso

4. result

1
2
3
4
5
qemu-system-x86_64 -machine q35,kernel_irqchip=split,accel=kvm \
-m 4G -smp cpus=4 -enable-kvm \
-device isa-debug-exit -device intel-iommu,intremap=on,caching-mode=on,device-iotlb=on \
-debugcon file:/dev/stdout -serial mon:stdio -display none \
-cdrom test.img

  • 当需要enable vnc时,qemu无需-display none项。

  • 当需要在qemu中运行hypervisor时,qemu需要添加-cpu host

    • 如果出现问题,则cat /sys/module/kvm_intel/parameters/nested。如果显示N,则需要modprobe kvm_intel nested=1

5. new method

运行kvm unit test的另一种方法是:

1
2
3
4
5
6
sudo qemu-system-x86_64 -machine q35,kernel_irqchip=split,accel=kvm \
-m 4G -smp cpus=4 -enable-kvm \
-serial stdio \
-device isa-debug-exit -device intel-iommu,intremap=on,caching-mode=on,device-iotlb=on \
-cpu host \
-kernel ./x86/vmx.flat

or

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash -x
qemu-system-x86_64 \
-enable-kvm \
-m 2048 \
-smp 2 \
-cpu host \
-serial stdio \
-device pc-testdev \
-display none \
-device isa-debug-exit,iobase=0xf4,iosize=0x4 \
-kernel ./x86/xsave.flat


参考资料:

  1. KVM-unit-tests
  2. qemu 跑 kvm-unit-test
  3. KVM虚拟化之嵌套虚拟化nested