x86下KVM启动Jailhouse
首先按照官方文档需要关闭linux kernel的iommu:
VT-d IOMMU usage (DMAR) has to be disabled in the Linux kernel, e.g. via the command line parameter:
intel_iommu=off
方法:
修改/etc/default/grub(/etc下的是grub的配置文件,/boot下的真正启动时加载的grub文件),调整GRUB_CMDLINE_LINUX内容
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet amd_iommu=on iommu=pt"
通过grub-mkconfig命令来根据/etc/default/grub文件来更新/boot/grub/grub.cfg:
grub-mkconfig -o /boot/grub/grub.cfg
重启系统,这时再去查看IOMMU状态:
还需要为hypervisor分配连续的RAM以及额外的cell,在/etc/default/grub中添加:
GRUB_CMDLINE_LINUX_DEFAULT="memmap=82M\\\$0x3a000000"
但是通过virt-manager来图形化启动虚拟机无法设置启动IOMMU,于是乎使用命令行启动:
sudo qemu-system-x86_64 -machine q35,kernel_irqchip=split -m 1G -enable-kvm -smp 4 -device intel-iommu,intremap=on,x-buggy-eim=on -cpu host,-kvm-pv-eoi,-kvm-asyncpf,-kvm-steal-time,-kvmclock -drive file=/home/txz/Documents/virtual_learn/ubuntu-server/ubuntu-server.img,format=qcow2,id=disk,if=none -device ide-hd,drive=disk -serial stdio -serial vc -device intel-hda,addr=1b.0 -device hda-duplex -netdev user,id=net -device e1000e,addr=2.0,netdev=net
但是缺少“efi-e1000e.rom”,需要手动安装:
sudo apt install qemu-efi
cd /usr/lib/ipxe/qemu
sudo wget https://github.com/qemu/qemu/raw/master/pc-bios/efi-e1000e.rom
然后去到jailhouse源文件进行编译和安装(需要python,gcc,make等)
注意python需要安装mako:
sudo apt install python-mako
根据官方文档,进行硬件检查:
jailhouse hardware check
但是会出错:
查找到原因:
需要:
export PATH=$PATH:/home/alex/jailhouse/tools
而且需要进入root才能成功正确执行:jailhouse hardware check
然后为目标x86系统生成系统配置文件:
jailhouse config create sysconfig.c
将生成的sysconfig.c文件放到configs/x86/目录下
但是到最后不管怎么样,jailhouse在enable之后都会遇到Ignore NMI IPI的问题,我认为是因为我在启动虚拟机的命令行中缺少-kvm-pv-ipi导致的,但是我安装的kvm版本是不支持-kvm-pv-ipi特性的,无奈之后暂时放弃这种方式,尝试jailhouse官方提供的jailhouse-image;
但是又想了想,我这是在逃避问题啊!!!于是乎各种google发现pv ipi竟然是腾讯的工程师提交给KVM的新特性!看来是需要更新KVM,于是卸载qemu-kvm:
sudo apt remove qemu-kvm
然后去到qemu的官网,下载4.11的qemu,源码编译过程很简单
sudo ./configure
sudo make -j4
sudo make install
这是再使用添加了-kvm-pv-ipi的启动命令:
sudo qemu-system-x86_64 -machine q35,kernel_irqchip=split -m 1G -enable-kvm -smp 4 -device intel-iommu,intremap=on,x-buggy-eim=on -cpu host,-kvm-pv-eoi,-kvm-pv-ipi,-kvm-asyncpf,-kvm-steal-time,-kvmclock -drive file=/home/txz/Documents/virtual_learn/ubuntu-server/ubuntu-server.img,format=qcow2,id=disk,if=none -device ide-hd,drive=disk -serial stdio -serial vc -netdev user,id=net -device e1000e,addr=2.0,netdev=net -device intel-hda,addr=1b.0 -device hda-duplex
大攻告成!!