简单的活着

Qemu 2.6.2

Posted on By Mista Cai

Qemu 2.6.2


为了对接,将QEMU版本切换为2.6.2重新编译。

准备


首先下载,更改2.6.2源码。

wget https://download.qemu.org/qemu-3.1.0.tar.xz
tar xvJf qemu-3.1.0.tar.xz

然后进行编译,花费时间。

cd qemu-3.1.0
./configure --target-list=x86_64-softmmu
sudo make -j4 && sudo make install

编译时可能出现的问题:

  • memfd_create函数问题,glib更新的问题,解决方案
  • cpu_resume_from_signal函数问题,版本问题,解决方案

检查qemu版本。

qemu-img --version

qemu虚拟机

创建qemu镜像文件,分配空间40G。

qemu-img create -f qcow2 windows7.qcow2 40G 

创建win7的qemu虚拟机,64位Win7。

sudo qemu-system-x86_64 -smp 1 -m 4096 --enable-kvm windows7.qcow2 -cdrom Win_Pro_7_64.ISO 

启动虚拟机

sudo qemu-system-x86_64 -smp 1 -m 4096 --enable-kvm windows7.qcow2 

编译驱动

下载VS编译驱动,SDK和WDK版本必须一致。最好先按照SDK,后安装WDK;方便WDK关联SDK,或者直接在WDK配置文件进行关联。

然后按照VS提示进行编译。

安装驱动

sc命令创建驱动,name驱动名字,binPath驱动编译后的.sys文件路径,type = kernel内核驱动。

sc create name binPath= ".sys" type= kernel	

bcdedit工具使系统进入无签名测试模式。

bcdedit /set testsigning on//无签名测试模式开启

启动驱动

sc start name

Trouble 1 QEMU[Stopped]

问题描述:

  • 编译bitbucket上面的2.6.2之后启动QEMU[Stopped];
  • ./recompile.sh之后仍然这样;

探索

  • kvm_handle_v2e() in qemu-2.6.2/kvm-all.c;CPUState结构体在qemu-2.6.2/include/qom/cpu.h;
  • 重要函数:
    • hanld_v2e_violation() in linux-4.10.2\arch\x86\kvm\vmx.c
    • cpu_exec() in qemu-2.6.2\kvm-all.c

问题定位及解决

linux-source/include/uapi/linux/kvm.h里面kvm_run这个结构体需要跟Qemu里面的qemu/linux-headers/linux/kvm.h里面kvm_run保持一致。

里面的成员fault_gfn原本放到最后面,但是它们后面的成员不太一样,因此我放到前面了。

所以把linux内核的fault_gfn放到最前面,然后执行./recomplish.sh,再启动Qemu就没问题了。 –高学长

*qemu/linux-headers/linux/kvm.h里面也要加上fault_fgn成员。:)

T2 VNC

问题如下:


vnc server running on "127.0.0.1: 5900"

通过VNC打开QEMU客户机,可远程操控QEMU GUEST。

T3 recompile.sh

问题:每次重启后需要重新执行sh文件。 这个问题年前就已经解决了,原因是recompile之后没有更新grub。

sudo update-grub2

update 3.21

打开QEMU2.6.2时候,如果不加--enable-kvm,出现蓝屏,qemu console报错信息:

main-loop:WARNING: I/O thread spun for 1000 iterations.

qemu-system-XX的一个bug,网上从qemu 2.3.0开始就有,最终Fix included in qemu-kvm-rhev-2.12.0-5.el7 ,应该是qemu 2.12.0-5.e17版本解决该bug。

solution

vl.cqemu-2.6.2\目录下。

diff -u a/vl.c b/vl.c
--- a/vl.c	2015-11-20 01:45:00.179169442 +0100
+++ b/vl.c	2015-11-20 01:44:22.181778840 +0100
@@ -1914,6 +1914,7 @@
 #endif
     do {
         nonblocking = !kvm_enabled() && !xen_enabled() && last_io > 0;
+        nonblocking = 0;
 #ifdef CONFIG_PROFILER
         ti = profile_getclock();
 #endif

hah,蓝屏和死锁竟然不是一个bug,蓝屏是QEMU(no KVM)启动Windows客户机长存的问题。

qemu-1.2.0时提出的,但是2.6.0已经集成了这个补丁。

solution