文章目录
- 前言
- 什么是QEMU
- QEMU的再认识
- QEMU的安装与下载
- QEMU的源码安装
- QEMU源码结构
- 参考
前言
我们在openstack中会经常使用很多镜像,比如row,row2等。openstack底层支持的虚拟机很多。而qemu就是其中佼佼者,性能,速度,适用性都比较高。特殊情况时,我们无法直接使用openstack创建或者修改镜像,就可以利用qemu,在单机环境下创建镜像,并上传到openstack使用。同时由于qemu出色的性能,即使单独作为一种创建虚拟机的工具来使用,也很不错。
本文分为三个部分,第一部分主要介绍了qemu是什么,给人一个基本印象。第二部分重点介绍其安装。第三部分介绍其架构,这对我们的进一步使用有比较大的好处。
什么是QEMU
QEMU是一种通用的开源计算机仿真器和虚拟器。QEMU共有两种操作模式
- 全系统仿真:能够在任意支持的架构上为任何机器运行一个完整的操作系统
- 用户模式仿真:能够在任意支持的架构上为另一个Linux/BSD运行程序
同时当进行虚拟化时,QEMU也可以以接近本机的性能运行KVM或者Xen。
QEMU的再认识
具体来说,当作为机器仿真器使用时,QEMU可以通过动态代码翻译机制(dynamic translation)在不同的机器上仿真任意一台机器(例如ARM板),并执行不同于主机架构的代码。同时由于动态代码翻译机制,它也能够实现不错的性能。
而当QEMU用作虚拟器时,QEMU的优点在于其实纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,但是也正因为QEMU是纯软件实现的,因此所有指令都需要QEMU转手,因此会严重的降低性能。而可行的办法是通过配合KVM或者Xen来进行加速,目前肯定是以KVM为主。KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 QEMU 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。
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:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。
安装好之后,会生成如下应用程序:
- 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 架构同理。
所以,从宏观上看,源码结构主要包含以下几个部分:
- /vl.c:最主要的模拟循环,虚拟机环境初始化,和 CPU 的执行。
- /target-arch/translate.c:将 guest 代码翻译成不同架构的 TCG 操作码。
- /tcg/tcg.c:主要的 TCG 代码。
- /tcg/arch/tcg-target.c:将 TCG 代码转化生成主机代码。
- /cpu-exec.c:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。
其中,涉及的主要几个函数如下:
知道了这个总体的代码结构,再去具体了解每一个模块可能会相对容易一点。
参考