简单的qemu编译说明, 其它有关的网络和管理配置等 :)

qemu编译

  1. 登录官方网站直接下载源码包(例如文件名为qemu-2.8.0.tar.bz2)

  2. 解压文件tar –jxvf qemu-2.8.0.tar.bz2

  3. 安装 依赖库
    Ubuntu系统

    1
    2
    3
    4
    5
    6
    7
    8
    sudo apt-get install -y zlib1g-dev 
    sudo apt-get install -y libglib2.0-dev
    sudo apt-get install -y autoconf2.13
    sudo apt-get install -y libtool
    sudo apt-get install -y libgtk2.0-dev
    以下组件可选, 针对更新的版本, 比如5.x, 6.x
    sudo apt-get install ninja-build
    sudo apt-get install libpixman-1-dev

    Centos系统

    1
    2
    3
    4
    5
    6
    7
    8
    9
    yum install zlib-devel.x86_64 -y 
    yum install gtk2-devel –y
    yum install autoconf
    yum install gettext
    yum install flex
    yum install bison
    以下安装包可选
    yum install ninja-build
    yum install spice-server-devel
  4. 编译安装

    1
    2
    3
    4
    cd qemu-2.8.0 
    ./configure --enable-kvm --enable-debug --target-list=x86_64-softmmu
    make -j 4 #注意, 此处的4与虚拟机或者物理机的逻辑处理器个数一样. 可以比物理的数量更小,不要超过.
    sudo make install

kvm

Ubuntu系统 sudo apt install qemu-kvm
其它Linux系统 yum install qemu-kvm.x86_64
注意查看cat /proc/cpuinfo |grep -E "vmx|svm" 是否有结果, 如果没有, 记得启动vmware的cpu的虚拟化intel VT-x选项.

创建虚拟机

假设创建一个虚拟机硬盘为10G:
qemu-img create -f qcow2 centos.img 10G

通过iso创建安装系统
qemu-system-x86_64 -m 256 -hda centos.img -cdrom winxpsp2.iso -enable-kvm

如果默认没有虚拟机界面, 可以安装vncviewer查看

1
sudo apt-get install tigervnc-viewer

安装完成后, 启动qemu会提示连接 127.0.0.1:5900, 我们使用vncviewer ::5900 连接即可

使libvirt启动我们编译的qemu版本

如果使用libvirt创建过虚拟机, 那么可以在 /etc/libvirt/qemu/找到虚拟机对应的xml文件. 修改下列参数:

1
<emulator>/usr/bin/qemu-system-x86_64</emulator>

改成自己编译的qemu文件目录. 比如/home/vv/qemu-6.2.0/build/qemu-system-x86_64

对于ubuntu, 还需要修改沙箱配置, 给libvirt配置访问权限.

先使用sudo aa-status查看是否包含/usr/sbin/libvirtd, 如果包含, 说明启用了apparmor.

修改以下文件/etc/apparmor.d/usr.sbin.libvirtd, 在下列类似列后面添加以下内容:

1
2
/usr/bin/kvm rmix, 这行默认就有
/home/vv/qemu-6.2.0/** rmix, 将我们的qemu目录添加到沙箱

还有/etc/apparmor.d/abstractions/libvirt-qemu:

1
2
/usr/bin/kvm rmix, 这行默认就有
/home/vv/qemu-6.2.0/** rmix, 将我们的qemu目录添加到沙箱

之后重新加载规则sudo systemctl reload apparmor

这样libvirt应该就可以正常启用它了.

如果没有启用apparmor还存在权限问题, 就把selinux暂时关闭: setenforce 0

更多apparmor的语法规则, 参考 Apparmor 配置文件组件和语法

如果希望virt-manager能启用我们的qemu, 还需要为qemu添加两个编译组件:

1
2
yum install qemu-device-usb-redirect.x86_64 usbredir.x86_64 usbredir-devel.x86_64 
yum install spice-server-devel spice-protocol spice-server

如果是ubuntu, 请使用sudo apt install libspice-server-dev libusbredirparser-dev .

并确保./configure --enable-kvm --enable-debug --target-list=x86_64-softmmu --enable-spice 输出以下内容:

1
2
3
spice support: YES
libusb: YES
usb net redir: YES

之后重新编译qemu.

然后在virt-manager的 Edit->Preferences->General勾选 Enable XML editing. 之后按照如下修改:

下一次启动虚拟机就可以生效了(使用virt-manager也需要设置沙箱权限).

参考: Changing libvirt emulator: Permission denied

其它使用和研究参考资料

qemu及kvm软件安全研究简介

qemu命令行网络相关参数详解

给qemu配置tap

配置tap前记得先安装 bridge-utils, uml-utilities

virtualhole——qemu安全入门练习题

这个练习题既可以加深你对虚拟化漏洞的理解, 也可以提高你的利用技巧, 虚拟化入门必选

Scavenger: Misuse Error Handling Leading to Qemu/KVM Escape

CVE-2020-14364-Qemu逃逸漏洞分析及两种利用思路

Slirp QEMU escape

Virtio and Vhost Architecture part1

Virtio and Vhost Architecture part2

错误处理

ERROR: glib-2.56 gthread-2.0 is required to compile QEMU

这个应该是没有装好glib相关的东西, 执行sudo apt install libglib2.0-dev安装, 如果出现如下错误:

1
2
3
4
5
The following packages have unmet dependencies:
libglib2.0-dev : Depends: libglib2.0-0 (= 2.64.6-1~ubuntu20.04.3) but 2.64.6-1~ubuntu20.04.4 is to be installed
Depends: libglib2.0-bin (= 2.64.6-1~ubuntu20.04.3)
Depends: zlib1g-dev but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

先安装libglib2.0-0, sudo apt install libglib2.0-0=2.64.6-1~ubuntu20.04.3

警告!!! 更改libglib2.0-0的版本可能导致ubuntu 20.04的桌面启动出问题, 重启后将进不了桌面.

Depends: zlib1g (= 1:1.2.11.dfsg-2ubuntu1) but 1:1.2.11.dfsg-2ubuntu1.2 is to be installed

如果安装zlib1g-dev失败出现如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo apt install zlib1g-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
zlib1g-dev : Depends: zlib1g (= 1:1.2.11.dfsg-2ubuntu1) but 1:1.2.11.dfsg-2ubuntu1.2 is to be installed
E: Unable to correct problems, you have held broken packages.

又提示依赖的版本不对, 用如下方法安装

1
sudo apt install zlib1g=1:1.2.11.dfsg-2ubuntu1

再重新安装sudo apt install zlib1g-dev libglib2.0-dev