文章目录

  • 前言
  • 什么是QEMU
  • QEMU的再认识
  • QEMU的安装与下载
  • QEMU的源码安装
  • QEMU源码结构
  • 参考


前言

我们在openstack中会经常使用很多镜像,比如row,row2等。openstack底层支持的虚拟机很多。而qemu就是其中佼佼者,性能,速度,适用性都比较高。特殊情况时,我们无法直接使用openstack创建或者修改镜像,就可以利用qemu,在单机环境下创建镜像,并上传到openstack使用。同时由于qemu出色的性能,即使单独作为一种创建虚拟机的工具来使用,也很不错。

本文分为三个部分,第一部分主要介绍了qemu是什么,给人一个基本印象。第二部分重点介绍其安装。第三部分介绍其架构,这对我们的进一步使用有比较大的好处。

什么是QEMU

QEMU是一种通用的开源计算机仿真器和虚拟器。QEMU共有两种操作模式

  1. 全系统仿真:能够在任意支持的架构上为任何机器运行一个完整的操作系统
  2. 用户模式仿真:能够在任意支持的架构上为另一个Linux/BSD运行程序

同时当进行虚拟化时,QEMU也可以以接近本机的性能运行KVM或者Xen

QEMU的再认识

具体来说,当作为机器仿真器使用时,QEMU可以通过动态代码翻译机制(dynamic translation)在不同的机器上仿真任意一台机器(例如ARM板),并执行不同于主机架构的代码。同时由于动态代码翻译机制,它也能够实现不错的性能。

而当QEMU用作虚拟器时,QEMU的优点在于其实纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,但是也正因为QEMU是纯软件实现的,因此所有指令都需要QEMU转手,因此会严重的降低性能。而可行的办法是通过配合KVM或者Xen来进行加速,目前肯定是以KVM为主。KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 QEMU 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。

qemu使用rbd架构图 qemu入门_linux

QEMU的wiki上这样说道:虽然QEMU本身是通过软件来模拟计算机,但是它也能够使用其他虚拟化技术进行加速。在Xen虚拟机管理程序下执行或在Linux中使用KVM内核模块时,QEMU支持虚拟化。当使用KVM,QEMU可以虚拟化x86架构,服务器和嵌入式 PowerPC,64位POWER,S390,32位和64位的ARM和MIPS guests等。

QEMU的安装与下载

qemu的安装与下载并不复杂,三个版本上安装都比较方便,你可以直接参考官方页面。或者按照我下边的方法进行操作亦可。或者你也可以翻到再下边的源码安装。

官方文档可在此处下载QEMU的各个版本:http : //www.qemu.org/download/,同时该页面也介绍了QEMU在不同操作系统的安装方法。你也可以直接参考下面的方法进行安装和使用。

Windows
QEMU提供了Windows的32位64位安装包。

不过Windows上qemu的性能不佳,这主要是其架构问题,在Windows上将无法使用其他专门负责虚拟化的工具进行加速,因此更好地方式是运行于Ubuntu之上,然后,借用kvm进行有效的加速,而如果需要使用kvm,则需要还需要安装qemu-kvm。

QEMU-KVM,是QEMU的一个特定于KVM加速模块的分支,里面包含了很多关于KVM的特定代码,与KVM模块一起配合使用。不过目前QEMU-KVM已经与QEMU合二为一,所有特定于KVM的代码也都合入了QEMU,当需要与KVM模块配合使用的时候,只需要在QEMU命令行加上 --enable-kvm就可以。

Ubuntu

安装方法如下

sudo apt install qemu
sudo apt install kvm libvirt-clients
# 检查是否已经安装kvm
# egrep -o '(vmx|svm)' /proc/cpuinfo
# 使用kvm启动镜像
sudo kvm -hda gxzy-tf-win7.qcow2 -m 8192 -smp 4
# 检查正在运行的镜像
# virsh -c qemu:///system list

或者,我们也可以直接使用qemu的命令进行操作,使用kvm加速只需要再加上--enable-kvm

Linux各个版本安装命令

在大部分Linux系统中,QEMU都可以通过安装包的形式进行安装。不过由于原生的QEMU性能不佳,因此也可以直接使用qemu-kvm进行操作。目前qemu已经集成了该组件,

  • Arch: pacman -S qemu
  • Debian/Ubuntu: apt-get install qemu
  • Fedora: dnf install @virtualization
  • Gentoo: emerge --ask app-emulation/qemu
  • RHEL/CentOS: yum install qemu-kvm
  • SUSE: zypper install qemu

macOS

QEMU can be installed from Homebrew:brew install qemu QEMU can be installed from MacPorts:sudo port install qemu

QEMU的源码安装

QEMU提供了多个版本的源码,你可以在QEMU全版本源码列表下载有关版本。或者使用以下代码进行安装:

wget https://download.qemu.org/qemu-4.2.0.tar.xz
tar xvJf qemu-4.2.0.tar.xz
cd qemu-4.2.0
./configure
make

又或者,我们可以直接从git上下载和编译QEMU:

git clone https://git.qemu.org/git/qemu.git
cd qemu
git submodule init
git submodule update --recursive
./configure
make

configure 脚本用于生成 Makefile,其选项可以用 ./configure --help 查看。

这里使用到的选项含义如下:

  • –enable-kvm:编译 KVM 模块,使 Qemu 可以利用 KVM 来访问硬件提供的虚拟化服务。
  • –enable-vnc:启用 VNC。
  • –enalbe-werror:编译时,将所有的警告当作错误处理。
  • –target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。

安装好之后,会生成如下应用程序:

qemu使用rbd架构图 qemu入门_虚拟化_02

  • vshmem-client/server:这是一个 guest 和 host 共享内存的应用程序,遵循 C/S 的架构。
  • qemu-ga:这是一个不利用网络实现 guest 和 host 之间交互的应用程序(使用 virtio-serial),运行在 guest 中。
  • qemu-io:这是一个执行 Qemu I/O 操作的命令行工具。
  • qemu-system-x86_64:Qemu 的核心应用程序,虚拟机就由它创建的。
  • qemu-img:创建虚拟机镜像文件的工具,下面有例子说明。
  • qemu-nbd:磁盘挂载工具。

之后通过创建虚拟机操作来对这些工具有个初步的认识。有关内容可以参考我的另外一篇博客Windows下QEMU的安装与使用------留坑暂未填坑,或者一文读懂QEMU虚拟机

QEMU源码结构

Qemu 软件虚拟化实现的思路是采用二进制指令翻译技术,主要是提取 guest 代码,然后将其翻译成 TCG 中间代码,最后再将中间代码翻译成 host 指定架构的代码,如 x86 体系就翻译成其支持的代码形式,ARM 架构同理。

qemu使用rbd架构图 qemu入门_linux_03

所以,从宏观上看,源码结构主要包含以下几个部分:

  • /vl.c:最主要的模拟循环,虚拟机环境初始化,和 CPU 的执行。
  • /target-arch/translate.c:将 guest 代码翻译成不同架构的 TCG 操作码。
  • /tcg/tcg.c:主要的 TCG 代码。
  • /tcg/arch/tcg-target.c:将 TCG 代码转化生成主机代码。
  • /cpu-exec.c:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。

其中,涉及的主要几个函数如下:

qemu使用rbd架构图 qemu入门_qemu_04

知道了这个总体的代码结构,再去具体了解每一个模块可能会相对容易一点。

参考

  1. QEMU 官网下载网页
  2. QEMU官方文档
  3. QEMU 维基百科
  4. 一文读懂Qemu模拟器