虚拟化技术


虚拟化基础

本章重点

  • 什么是虚拟化?虚拟化的作用?
  • 虚拟化的原理?
  • 虚拟化分类?怎么区分?各有啥优缺点?
  • 硬件为虚拟化提供了哪些支持?

引言

美国环境保护署 (EPA)报告的一组有趣的统计数据发现,实际上服务器只有5%的时间是在工作的。在其他时间,服务器都处于“休眠”状态。

什么是虚拟化

背景:随着计算机硬件技术的发展,物理资源的容量越来越大而价格越来越低,在既有的计算元件架构下,物理资源不可避免地产生了闲置和浪费。
image.png

所以有了虚拟化,虚拟化目的:为了充分利用计算机资源(硬件资源和软件资源)

虚拟化方式:在之前的操作系统层在加一个虚拟层,然后同时可运行多个操作系统。

虚拟化是构建云基础架构不可或缺的关键技术之一。虚拟化在资源的有效利用、动态调配和高可靠性方面有着巨大的优势。

个人理解: 虚拟化其实就是集群的相反工作。一个是为了多台设备并行运算。一个是为了1台设备多用户使用。

虚拟化原理

虚拟化技术引入一个新的虚拟化层,对下管理真实的物理资源,对上提供虚拟的系统资源。
X86平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(VirtualMachine Monitor,VMM),也叫做Hypervisor

虚拟机监控器运行的环境,也就是真实的物理平台,称之为宿主机(Host)。而虚拟出来的平台通常称为客户机(Guest),里面运行的系统对应地也称为客户机操作系统。

虚拟化的原理:在OS中加入一个虚拟化层(VMM),虚拟化层可以对下层(HostOS)硬件资源(物理CPU、内存、磁盘、网卡、显卡等)进行封装、隔离,抽象为另一种形式的逻辑资源,再提供给上层(GuestOS)使用。所以你可以理解VMM其实就是联系HostOS和GuestOS的一个中间件,当然虚拟化可以将一份资源抽象为多份,也可以将多份资源抽象为一份。

虚拟化的分类

软件虚拟化和硬件虚拟化

  • 软件虚拟化:就是纯软件实现VMM层,比如qemu(不启用硬件虚拟化辅助时),可以通过纯软件测试各个平台,二进制指令被软件翻译成宿主机二进制指令。
    软件虚拟化优点:不依赖平台和硬件支持。 缺点: 性能极差。
  • 硬件虚拟化:为了提高虚拟化效率,硬件上做了虚拟化支持,比如Intel VT-x等为了VMM提供权限访问,EPT拓展页表等。 比如Intel VT-d 为IO设备直接透传到虚拟机中做了支持等。
    硬件支持虚拟化优点:性能好。缺点:依赖平台和硬件支持。

半虚拟化和全虚拟化

虚拟化的最好体验是:

  • 客户机完全不知道自己运行在虚拟化环境中,还以为自己运行在原生环境里。
  • 完全不需要VMM介入客户机的运行过程

全虚拟化(Full Virtualization)和准虚拟化(para-virtualization)的区别:

  • FV: 不需要对GuestOS操作系统软件的源代码做任何的修改,就可以运行在这样的VMM中。
  • PV: 需要对GuestOS的内核代码做一定的修改,才能够将GuestOS运行在半虚拟化的VMM中。

可以看到PV没有达到“客户机完全不知道自己运行在虚拟化环境中”的体验,主要是为了 提升性能和 简化VMM复杂度。 因为intel-VT等技术未支持,只能用软件来实现虚拟化技术,比较复杂。 比如:virtio,属于比较早期的虚拟化技术,

但FV在硬件虚拟化支持之后,性能远超了PV。

Bare-metal虚拟化和Host OS虚拟化方式

image.png

  • Host OS类型将Hypervisor虚拟化层安装在传统的操作系统中,虚拟化软件以应用程序进程形式运行在Windows和Linux等主机操作系统中。在Hypervisor虚拟化环境下,部署在物理服务器上的系统称为Host OS,而部署在Hypervisor上的虚拟机操作系统称为Guest OS。
  • Bare-metal类型的Hypervisor虚拟化环境中无须完整的Host OS,直接将Hypervisor部署在裸机上并将裸机服务器的硬件资源虚拟化,也可以将Hypervisor理解为仅对硬件资源进行虚拟和调度的薄操作系统,其并不提供常规Host OS的功能

Host OS虚拟化我们比较常见的就是:virmware/virtualbox

硬件虚拟化支持

Inte Virtualization支持概述

2005年以后,Intel和AMV等分别在在虚拟化上加入了硬件支持

参考文献: 英特尔VT具体包括分别针对处理器、芯片组、网络的VT-X、VT-D和VT-C技术。

  • 处理器:英特尔虚拟化技术(英特尔VT-x),包括英特尔虚拟化灵活迁移技术(Intel VT FlexMigration)、英特尔VT FlexPriority、英特尔VT 扩展页表(Extended Page Tables)
  • 芯片组:英特尔支持直接 I/O 访问的 VT虚拟化技术(英特尔VT-d)
  • 网络:支持连接的英特尔虚拟化技术(英特尔VT-c),包括虚拟机设备队列(VMDq)、 虚拟机直接互连(VMDc)

image.png

VT,VT-x,VT-d,VT-c:

  • VT-x (Intel Virtualization Technology),x其实是X86平台,是虚拟化支持的基础
  • VT-d (Virtualization Technology for Directed I/O),其实就是后边说的IO设备独占
  • VT-c (Virtualization Technology for Connectivity),也就是后边说的IO设备共享,主要用在网卡

VT 是 Virtualization Technology 的缩写

VT-x 其实就是 Intel Virtualization Technology 至于为什么后边有个 x 呢?是因为英特尔在起名字的时候,将x86平台上的VT技术,称之为VT-x;在Itanium平台上的VT技术,称之为VT-i。 VT-x 是 Intel CPU 的硬件虚拟化技术,提供内存以及虚拟机的硬件隔离,这也是平常我们想在 intel 平台上做虚拟化最基本需要支持的技术。 VT-x不仅需要处理器的支持,也需要主板、BOIS的支持

VT-d 英文全程为 Virtualization Technology for Directed I/O 其中,d代表Directed VT-d 的 Intel 官方中文名称是 定向 I/O 虚拟化技术 这个技术就是俗称的虚拟化直通技术,就是允许宿主机将某些硬件资源(比如硬盘、显卡、网卡)的管辖权直接移交给虚拟机,此时宿主机将不能再使用此硬件,虚拟机会以直通独占的方式使用它们. 这种直通的技术带来的好处就是,虚拟机中使用该硬件的性能损耗是极小的, 改善了 I/O 设备在虚拟化环境中的性能并且隔离更加彻底提高了系统的安全性

VT-c 英文全程为 Virtualization Technology for Connectivity VT-c 主要是针对提高网络 I/O提供的虚拟化技术,它可以在一个物理网卡上,建立针对虚拟机的设备队列,最大限度的提高 I/O 吞吐率。

网上文章千篇一律的都只是官方的介绍一下 VMDq 和 VMDc ,甚至搞不清 VT-d 和 VT-c 到底有什么区别,其实这个很简单 一个数据包的处理,传统方式是由虚拟机管理系统(CPU处理)来分配这个数据包到底给到哪台虚拟机,现在是由网卡的硬件直接来处理,所以减少了处理延迟,提高了效率.类似VT-d

VT-c和 VT-d 有什么区别? VT-d 是可以将一个物理网卡直通给一个虚拟机。 VT-c 就很厉害了,可以将一个物理网卡分成十份,分别直通给10个虚拟机,并且这十份都是隔离互不影响的,注意,这里我用了直通两个字,也就是分割成十份这个操作是不经过虚拟机管理系统的(也就是不经过CPU),所以 I/O 性能很高,并且减少CPU的负载

CPU虚拟化支持-主要是特权访问

Intel在处理器级别提供了对虚拟化技术的支持,被称为VMX(virtual-machineextensions)。
有两种VMX操作模式:VMX根操作(root operation)与VMX非根操作(non-root operation)
image.png
Intel CPU和ARMv8一样,分为RING0-RING3四种特权模式,所以需要专用指令来切换到更高特权模式。
image.png
好像也只用到RING0和RING3,区分特权模式和非特权模式而已。

内存拓展页表支持

内存虚拟化就是要将客户机虚拟地址(GVA)转化为最终能够访问的宿主机上的物理地址(HPA)-如下图,虚拟机监控器就需要维护从客户机虚拟地址到宿主机物理地址之间的一个映射关系,在没有硬件提供的内存虚拟化之前,这个维护映射关系的页表叫作影子页表(Shadow Page Table)

  • 1)客户机虚拟地址,GVA(Guest Virtual Address
  • 2)客户机物理地址,GPA(Guest Physical Address)
  • 3)宿主机虚拟地址,HVA(Host Virtual Address)
  • 4)宿主机物理地址,HPA(Host Physical Address)

image.png
这样不可避免的大大影响了性能,所以:

Intel CPU在硬件设计上就引入了EPT(Extended Page Tables,扩展页表),从而将客户机虚拟地址到宿主机物理地址的转换通过硬件来实现。

image.png

IO虚拟化-Intel VT-d和Intel VT-x

一般情况下VMM支持I/O虚拟化可以通过以下四种方式实现:

  • 设备模拟(纯软件模拟)。即VMM的软件模拟一个现有的I/O设备,老毛病:兼容性好,性能和功能较差。
  • 前后端驱动接口-纯软件模拟,在第一种基础上引入新的I/O操作接口,这些接口针对I/O虚拟化进行一定的优化,这样虽然能够解决一定的性能问题,但是兼容性问题又出现了,因为需要使用新的操作接口。
    这个可以看看后边的virtio半虚拟化。
  • 硬件分配,直接将I/O设备分配给某个VM(Virtual Machine),这样只有指定的VM能够使用该I/O设备,并且I/O设备的驱动位于VM中,并且VM能够直接对I/O设备进行操作,这样性能和兼容性都能达到最佳,但是一个I/O设备只能给一个VM使用。
    这就是Intel VT-d技术
  • I/O设备分享,这是硬件分配方式的一种扩展,主要还是需要I/O设备本身需要支持一定的功能,如能够同时提供多个功能接口,比如PCIe设备的SR-IOV功能,即PCIe设备本身能够将一个物理PCIe设备,变成多个逻辑设备,这多个逻辑设备共享该PCIe设备上的物理资源,并且可以独立地分配给不同的VM。
    这就是Intel VT-c技术

image.png

Intel VT-d和VT-c

Intel VT-d为虚拟机监控器提供了几个重要的能力:I/O设备分配、DMA重定向、中断重定向、中断投递等.

但硬件分配同一时间只能给一台设备使用,所以出现了I/O设备分享,比如SR-IOV功能。


KVM(Kernel-based Virtual Machine)原理

KVM是基于内核的虚拟机,是采用硬件虚拟化技术的全虚拟化,属于bare-metal虚拟化==解决方案。
它以内核模块的形式加载之后,就将Linux内核变成了一个Hypervisor,但硬件管理等还是通过Linuxkernel来完成的。

KVM对硬件最低的依赖是CPU的硬件虚拟化支持,比如:Intel的VT技术和AMD的AMD-V技术,而其他的内存和I/O的硬件虚拟化支持,会让整个KVM虚拟化下的性能得到更多的提升。

KVM组成部分

==KVM内核部分+QEMU(应用)组成 ==

  • KVM内核模块,它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责CPU和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU执行模式的切换、vCPU寄存器的访问、vCPU的执行。
  • QEMU用户态工具,它是一个普通的Linux进程,为客户机提供设备模拟的功能,包括模拟BIOS、PCI/PCIE总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。同时它通过ioctl系统调用与内核态的KVM模块进行交互

注:- Qemu默认采用纯软件方式,如果要使能KVM进行支持,则带参数 -enable-kvm

image.png

KVM内核部分也分为两个模块:

  1. [baiy@server_202 linux-5.7.14]$ lsmod | grep kvm
  2. kvm_intel 174250 0
  3. kvm 570658 1 kvm_intel # 处理器架构相关的部分
  4. irqbypass 13503 1 kvm # 处理器架构无关的部分
  5. ls -al /dev/kvm # 也应该创建了kvm设备节点
  6. kvm-ok命令进行测试

KVM的主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。


构建KVM环境

包括:硬件系统的配置、宿主机(Host)操作系统的安装、KVM的编译与安装、QEMU的编译与安装、客户机(Guest)的安装,直到最后启动你的第一个KVM客户机.

详细构建步骤:https://abelsu7.top/2019/04/16/kvm-in-action-1/

KVM环境快速确定

  1. baiy@baiy-ThinkPad-E470c:~$ grep -E 'svm|vmx' /proc/cpuinfo # 确定硬件CPU支持虚拟化
  2. flags : ..... vmx .....
  3. (base) baiy@inno:bin$ lsmod | grep kvm # 确定安装了kvm驱动模块
  4. kvm_intel 253952 6
  5. kvm 655360 1 kvm_intel
  6. (base) baiy@inno:bin$ ls -al /dev/kvm # 确定安装kvm驱动模块2
  7. crw-rw---- 1 root kvm 10, 232 9 4 13:34 /dev/kvm
  8. (base) baiy@inno:bin$ kvm-ok # 初步验证kvm环境OK
  9. INFO: /dev/kvm exists
  10. KVM acceleration can be used

硬件配置

BIOS中Security->Virtualization选项使能:

  • Intel(R)Virtualization Techology // VT-x
  • Intel (R) VT-d Feature // VT-d

验证是否支持硬件虚拟化

  1. # Intel系列CPU支持虚拟化的标志为“vmx”,AMD系列CPU的标志为“svm”
  2. baiy@baiy-ThinkPad-E470c:~$ grep -E 'svm|vmx' /proc/cpuinfo
  3. flags : ..... vmx .....
  4. baiy@inno-NUC8i3BEH:qemu-5.1.0-rc3$ lsmod | grep kvm # intel
  5. kvm_intel 253952 0
  6. kvm 655360 1 kvm_intel
  7. inno@inno-MS-7B89:~/workspace/qemu-kvm$ lsmod | grep kvm # amd
  8. kvm 651264 0
  9. irqbypass 16384 1 kvm

Ubuntu环境安装

KVM and Libvirt on Ubuntu20.04
安装命令:

  1. sudo apt-get install -y bridge-utils qemu-kvm virtinst libvirt-daemon virt-manager libsdl2-dev libcurl4-openssl-dev libusbredirhost-dev libpixman-1-dev

安装完成测试:

  1. baiy@inno-NUC8i3BEH:vaapi$ sudo kvm-ok
  2. INFO: /dev/kvm exists
  3. KVM acceleration can be used

编译和安装KVM

如果没有 “/dev/kvm”的话,可能需要更换vmlinux和kvm驱动(因为Ubuntu新版本包含这部分,所以暂时跳过)

  1. # 以下两种方式都可以
  2. git clone https://git.kernel.org/pub/scm/virt/kvm/kvm.git
  3. git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.git

详情参考:https://abelsu7.top/2019/04/16/kvm-in-action-1/ (目前主流系统都已支持KVM,不在详细列举)

编译QEMU

Qemu命令相关

注: qemu-kvm和qemu-system-xxx

在老版本中有单独的qemu-kvm模块存在,结合qemu一起做虚拟机工作。 在后续新版本中,已经将qemu-kvm模块完全合并到qemu中去。 因此当需要使用kvm特性时候,只需要qemu-system-x86_64 启动命令中增加参数 –enable-kvm参数使能即可

  1. git clone git://git.qemu.org/qemu.git

之前使用qemu测试嵌入式设备,回顾下.

  1. sudo apt-get install libpixman-1-dev # 需要依赖 pixman
  2. mkdir qemu-x86-64-bin && realpath qemu-x86-64-bin/
  3. 首先:配置, target为自己的架构,prefix为安装路径
  4. ./configure --prefix=/home/inno/workspace/qemu-kvm/qemu-system-x86 \
  5. --enable-kvm \
  6. --enable-libusb \
  7. --enable-usb-redir \
  8. --enable-debug \
  9. --enable-debug-info \
  10. --enable-curl \
  11. --enable-sdl \
  12. --enable-vhost-net \
  13. --enable-spice \
  14. --enable-vnc \
  15. --enable-opengl \
  16. --target-list=x86_64-softmmu
  17. 然后:编译和安装
  18. make && make install
  19. 可以看生成结果
  20. baiy@baiy-ThinkPad-E470c:qemu$ ls qemu-x86-64-bin/bin/qemu-system-x86_64
  21. qemu-x86-64-bin/bin/qemu-system-x86_64

创建CentOS

因为一直玩Ubuntu,也弄个CentOS KDE环境玩玩

  1. wget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-LiveKDE-2003.iso
  2. # 创建一个40G的磁盘空间-根据实际使用动态拓展空间
  3. # 玩过VMware都知道:根据实际使用大小来动态拓空间,本身不占空间
  4. qemu-img create -f raw centOS7.img 40G
  5. baiy$:virt$ qemu-img create -f raw centOS7.img 40G
  6. Formatting 'centOS7.img', fmt=raw size=42949672960
  7. baiy$:virt$ ls -alh centOS7.img
  8. -rw-r--r-- 1 baiy baiy 40G 8 26 06:19 centOS7.img
  9. baiy$:virt$ du -h centOS7.img
  10. 0 centOS7.img
  11. # 创建一个40G的磁盘空间-根据实际使用动态拓展空间
  12. qemu-img create -f raw -o preallocation=full centOS7.img 40G

这里使用raw格式,也支持其他格式

使用QEMU加载CentOS

  1. sudo qemu-system-x86_64 -enable-kvm -m 4G -smp 4 -boot once=d -cdrom CentOS-7-x86_64-LiveKDE-2003.iso centOS7.img
  2. -m 4G是给客户机分配8G内存,
  3. -smp 4是指定客户机为对称多处理器结构并分配4CPU
  4. -boot once=d是指定系统的启动顺序为首次光驱,以后再使用默认启动项,
  5. -cdrom**是分配客户机的光驱

第一次用和装虚拟机一样,后边执行:

  1. sudo qemu-system-x86_64 -enable-kvm -m 4G -smp 4 ./centOS7.img

ctrl+alt+1 虚拟机模式
ctrl+alt+2 qemu调试模式, 可通过 info xxx查看虚拟机状态

qemu加载裸的X86内核

用Qemu搭建x86学习环境

  1. make x86_64_defconfig
  2. make make menuconfig # 没啥要配置的
  3. make

文件系统搭建

目前文件系统肯定还有问题,不过能跑起来,后期再看吧

  1. sudo qemu-system-x86_64 -smp 4 -m size=10G --enable-kvm -kernel ./arch/x86/boot/bzImage -hda qemu_rootfs.img -append "root=/dev/sda rootfstype=ext4 rw rdinit=/linuxrc"

https://www.cnblogs.com/dion-90/articles/8522718.html


附录

附录1 qemu安装配置

qemu配置

header 1 header 2
—target-list 对客户机架构的支持
  1. baiy@inno-NUC8i3BEH:qemu-5.1.0-rc3$ ./configure --help
  2. Usage: configure [options]
  3. Options: [defaults in brackets after descriptions]
  4. Standard options:
  5. --help print this message
  6. --prefix=PREFIX install in PREFIX [/usr/local]
  7. --interp-prefix=PREFIX where to find shared libraries, etc.
  8. use %M for cpu name [/usr/gnemul/qemu-%M]
  9. --target-list=LIST set target list (default: build everything)
  10. Available targets: aarch64-softmmu alpha-softmmu
  11. arm-softmmu avr-softmmu cris-softmmu hppa-softmmu
  12. i386-softmmu lm32-softmmu m68k-softmmu
  13. microblaze-softmmu microblazeel-softmmu mips-softmmu
  14. mips64-softmmu mips64el-softmmu mipsel-softmmu
  15. moxie-softmmu nios2-softmmu or1k-softmmu ppc-softmmu
  16. ppc64-softmmu riscv32-softmmu riscv64-softmmu
  17. rx-softmmu s390x-softmmu sh4-softmmu sh4eb-softmmu
  18. sparc-softmmu sparc64-softmmu tricore-softmmu
  19. unicore32-softmmu x86_64-softmmu xtensa-softmmu
  20. xtensaeb-softmmu aarch64-linux-user
  21. aarch64_be-linux-user alpha-linux-user
  22. arm-linux-user armeb-linux-user cris-linux-user
  23. hppa-linux-user i386-linux-user m68k-linux-user
  24. microblaze-linux-user microblazeel-linux-user
  25. mips-linux-user mips64-linux-user
  26. mips64el-linux-user mipsel-linux-user
  27. mipsn32-linux-user mipsn32el-linux-user
  28. nios2-linux-user or1k-linux-user ppc-linux-user
  29. ppc64-linux-user ppc64abi32-linux-user
  30. ppc64le-linux-user riscv32-linux-user
  31. riscv64-linux-user s390x-linux-user sh4-linux-user
  32. sh4eb-linux-user sparc-linux-user
  33. sparc32plus-linux-user sparc64-linux-user
  34. tilegx-linux-user x86_64-linux-user
  35. xtensa-linux-user xtensaeb-linux-user
  36. --target-list-exclude=LIST exclude a set of targets from the default target-list
  37. Advanced options (experts only):
  38. --cross-prefix=PREFIX use PREFIX for compile tools []
  39. --cc=CC use C compiler CC [cc]
  40. --iasl=IASL use ACPI compiler IASL [iasl]
  41. --host-cc=CC use C compiler CC [cc] for code run at
  42. build time
  43. --cxx=CXX use C++ compiler CXX [c++]
  44. --objcc=OBJCC use Objective-C compiler OBJCC [cc]
  45. --extra-cflags=CFLAGS append extra C compiler flags QEMU_CFLAGS
  46. --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
  47. --extra-ldflags=LDFLAGS append extra linker flags LDFLAGS
  48. --cross-cc-ARCH=CC use compiler when building ARCH guest test cases
  49. --cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests
  50. --make=MAKE use specified make [make]
  51. --install=INSTALL use specified install [install]
  52. --python=PYTHON use specified python [/usr/bin/python3]
  53. --sphinx-build=SPHINX use specified sphinx-build []
  54. --smbd=SMBD use specified smbd [/usr/sbin/smbd]
  55. --with-git=GIT use specified git [git]
  56. --static enable static build [no]
  57. --mandir=PATH install man pages in PATH
  58. --datadir=PATH install firmware in PATH/qemu
  59. --docdir=PATH install documentation in PATH/qemu
  60. --bindir=PATH install binaries in PATH
  61. --libdir=PATH install libraries in PATH
  62. --libexecdir=PATH install helper binaries in PATH
  63. --sysconfdir=PATH install config in PATH/qemu
  64. --localstatedir=PATH install local state in PATH (set at runtime on win32)
  65. --firmwarepath=PATH search PATH for firmware files
  66. --efi-aarch64=PATH PATH of efi file to use for aarch64 VMs.
  67. --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [/qemu]
  68. --with-pkgversion=VERS use specified string as sub-version of the package
  69. --enable-debug enable common debug build options
  70. --enable-sanitizers enable default sanitizers
  71. --enable-tsan enable thread sanitizer
  72. --disable-strip disable stripping binaries
  73. --disable-werror disable compilation abort on warning
  74. --disable-stack-protector disable compiler-provided stack protection
  75. --audio-drv-list=LIST set audio drivers list:
  76. Available drivers: oss alsa sdl pa
  77. --block-drv-whitelist=L Same as --block-drv-rw-whitelist=L
  78. --block-drv-rw-whitelist=L
  79. set block driver read-write whitelist
  80. (affects only QEMU, not qemu-img)
  81. --block-drv-ro-whitelist=L
  82. set block driver read-only whitelist
  83. (affects only QEMU, not qemu-img)
  84. --enable-trace-backends=B Set trace backend
  85. Available backends: dtrace ftrace log simple syslog ust
  86. --with-trace-file=NAME Full PATH,NAME of file to store traces
  87. Default:trace-<pid>
  88. --disable-slirp disable SLIRP userspace network connectivity
  89. --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
  90. --enable-malloc-trim enable libc malloc_trim() for memory optimization
  91. --oss-lib path to OSS library
  92. --cpu=CPU Build for host CPU [x86_64]
  93. --with-coroutine=BACKEND coroutine backend. Supported options:
  94. ucontext, sigaltstack, windows
  95. --enable-gcov enable test coverage analysis with gcov
  96. --gcov=GCOV use specified gcov [gcov]
  97. --disable-blobs disable installing provided firmware blobs
  98. --with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent
  99. --with-win-sdk=SDK-path path to Windows Platform SDK (to build VSS .tlb)
  100. --tls-priority default TLS protocol/cipher priority string
  101. --enable-gprof QEMU profiling with gprof
  102. --enable-profiler profiler support
  103. --enable-debug-stack-usage
  104. track the maximum stack usage of stacks created by qemu_alloc_stack
  105. --enable-plugins
  106. enable plugins via shared library loading
  107. --disable-containers don't use containers for cross-building
  108. --gdb=GDB-path gdb to use for gdbstub tests [/usr/bin/gdb]
  109. Optional features, enabled with --enable-FEATURE and
  110. disabled with --disable-FEATURE, default is enabled if available:
  111. system all system emulation targets
  112. user supported user emulation targets
  113. linux-user all linux usermode emulation targets
  114. bsd-user all BSD usermode emulation targets
  115. docs build documentation
  116. guest-agent build the QEMU Guest Agent
  117. guest-agent-msi build guest agent Windows MSI installation package
  118. pie Position Independent Executables
  119. modules modules support (non-Windows)
  120. module-upgrades try to load modules from alternate paths for upgrades
  121. debug-tcg TCG debugging (default is disabled)
  122. debug-info debugging information
  123. sparse sparse checker
  124. safe-stack SafeStack Stack Smash Protection. Depends on
  125. clang/llvm >= 3.7 and requires coroutine backend ucontext.
  126. gnutls GNUTLS cryptography support
  127. nettle nettle cryptography support
  128. gcrypt libgcrypt cryptography support
  129. auth-pam PAM access control
  130. sdl SDL UI
  131. sdl-image SDL Image support for icons
  132. gtk gtk UI
  133. vte vte support for the gtk UI
  134. curses curses UI
  135. iconv font glyph conversion support
  136. vnc VNC UI support
  137. vnc-sasl SASL encryption for VNC server
  138. vnc-jpeg JPEG lossy compression for VNC server
  139. vnc-png PNG compression for VNC server
  140. cocoa Cocoa UI (Mac OS X only)
  141. virtfs VirtFS
  142. mpath Multipath persistent reservation passthrough
  143. xen xen backend driver support
  144. xen-pci-passthrough PCI passthrough support for Xen
  145. brlapi BrlAPI (Braile)
  146. curl curl connectivity
  147. membarrier membarrier system call (for Linux 4.14+ or Windows)
  148. fdt fdt device tree
  149. kvm KVM acceleration support
  150. hax HAX acceleration support
  151. hvf Hypervisor.framework acceleration support
  152. whpx Windows Hypervisor Platform acceleration support
  153. rdma Enable RDMA-based migration
  154. pvrdma Enable PVRDMA support
  155. vde support for vde network
  156. netmap support for netmap network
  157. linux-aio Linux AIO support
  158. linux-io-uring Linux io_uring support
  159. cap-ng libcap-ng support
  160. attr attr and xattr support
  161. vhost-net vhost-net kernel acceleration support
  162. vhost-vsock virtio sockets device support
  163. vhost-scsi vhost-scsi kernel target support
  164. vhost-crypto vhost-user-crypto backend support
  165. vhost-kernel vhost kernel backend support
  166. vhost-user vhost-user backend support
  167. vhost-vdpa vhost-vdpa kernel backend support
  168. spice spice
  169. rbd rados block device (rbd)
  170. libiscsi iscsi support
  171. libnfs nfs support
  172. smartcard smartcard support (libcacard)
  173. libusb libusb (for usb passthrough)
  174. live-block-migration Block migration in the main migration stream
  175. usb-redir usb network redirection support
  176. lzo support of lzo compression library
  177. snappy support of snappy compression library
  178. bzip2 support of bzip2 compression library
  179. (for reading bzip2-compressed dmg images)
  180. lzfse support of lzfse compression library
  181. (for reading lzfse-compressed dmg images)
  182. zstd support for zstd compression library
  183. (for migration compression and qcow2 cluster compression)
  184. seccomp seccomp support
  185. coroutine-pool coroutine freelist (better performance)
  186. glusterfs GlusterFS backend
  187. tpm TPM support
  188. libssh ssh block device support
  189. numa libnuma support
  190. libxml2 for Parallels image format
  191. tcmalloc tcmalloc support
  192. jemalloc jemalloc support
  193. avx2 AVX2 optimization support
  194. avx512f AVX512F optimization support
  195. replication replication support
  196. opengl opengl support
  197. virglrenderer virgl rendering support
  198. xfsctl xfsctl support
  199. qom-cast-debug cast debugging support
  200. tools build qemu-io, qemu-nbd and qemu-img tools
  201. bochs bochs image format support
  202. cloop cloop image format support
  203. dmg dmg image format support
  204. qcow1 qcow v1 image format support
  205. vdi vdi image format support
  206. vvfat vvfat image format support
  207. qed qed image format support
  208. parallels parallels image format support
  209. sheepdog sheepdog block driver support
  210. crypto-afalg Linux AF_ALG crypto backend driver
  211. capstone capstone disassembler support
  212. debug-mutex mutex debugging support
  213. libpmem libpmem support
  214. xkbcommon xkbcommon support
  215. rng-none dummy RNG, avoid using /dev/(u)random and getrandom()
  216. libdaxctl libdaxctl support

附录2:x86平台qemu安装

安装命令

  1. ./configure --prefix=/home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst
  2. make && make install

相关配置和日志

  1. baiy@inno-NUC8i3BEH:qemu-5.1.0-rc3$ ./configure --prefix=/home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst --target-list=x86_64-softmmu
  2. Install prefix /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst
  3. BIOS directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/share/qemu
  4. firmware path /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/share/qemu-firmware
  5. binary directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/bin
  6. library directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/lib
  7. module directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/lib/qemu
  8. libexec directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/libexec
  9. include directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/include
  10. config directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/etc
  11. local state directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/var
  12. Manual directory /home/baiy/workspace/linux-learn/qemu-kvm/x86-qemu-dst/share/man
  13. ELF interp prefix /usr/gnemul/qemu-%M
  14. Build directory /home/baiy/workspace/linux-learn/qemu-kvm/qemu-5.1.0-rc3
  15. Source path /home/baiy/workspace/linux-learn/qemu-kvm/qemu-5.1.0-rc3
  16. GIT binary git
  17. GIT submodules
  18. C compiler cc
  19. Host C compiler cc
  20. C++ compiler c++
  21. Objective-C compiler cc
  22. ARFLAGS rv
  23. CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g
  24. QEMU_CFLAGS -I/usr/include/pixman-1 -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -std=gnu99 -Wold-style-declaration -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs -Wendif-labels -Wexpansion-to-defined -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong -I/usr/include/libpng16 -I$(SRC_PATH)/capstone/include
  25. QEMU_LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -fstack-protector-strong
  26. make make
  27. install install
  28. python /usr/bin/python3 -B (3.6.9)
  29. genisoimage /usr/bin/genisoimage
  30. efi_aarch64 /home/baiy/workspace/linux-learn/qemu-kvm/qemu-5.1.0-rc3/pc-bios/edk2-aarch64-code.fd
  31. python_yaml yes
  32. slirp support internal
  33. smbd /usr/sbin/smbd
  34. module support no
  35. alt path mod load no
  36. host CPU x86_64
  37. host big endian no
  38. target list x86_64-softmmu
  39. gprof enabled no
  40. sparse enabled no
  41. strip binaries yes
  42. profiler no
  43. static build no
  44. safe stack no
  45. SDL support yes (2.0.8)
  46. SDL image support no
  47. GTK support no
  48. GTK GL support no
  49. VTE support no
  50. TLS priority NORMAL
  51. GNUTLS support no
  52. libgcrypt no
  53. nettle no
  54. libtasn1 no
  55. PAM no
  56. iconv support yes
  57. curses support no
  58. virgl support no
  59. curl support yes
  60. mingw32 support no
  61. Audio drivers pa oss
  62. Block whitelist (rw)
  63. Block whitelist (ro)
  64. VirtFS support yes
  65. Multipath support no
  66. VNC support yes
  67. VNC SASL support no
  68. VNC JPEG support yes
  69. VNC PNG support yes
  70. xen support no
  71. brlapi support no
  72. Documentation no
  73. PIE yes
  74. vde support no
  75. netmap support no
  76. Linux AIO support no
  77. Linux io_uring support no
  78. ATTR/XATTR support yes
  79. Install blobs yes
  80. KVM support yes # 默认支持KVM
  81. HAX support no
  82. HVF support no
  83. WHPX support no
  84. TCG support yes
  85. TCG debug enabled no
  86. TCG interpreter no
  87. malloc trim support yes
  88. RDMA support no
  89. PVRDMA support no
  90. fdt support no
  91. membarrier no
  92. preadv support yes
  93. fdatasync yes
  94. madvise yes
  95. posix_madvise yes
  96. posix_memalign yes
  97. libcap-ng support yes
  98. vhost-net support yes
  99. vhost-crypto support yes
  100. vhost-scsi support yes
  101. vhost-vsock support yes
  102. vhost-user support yes
  103. vhost-user-fs support yes
  104. vhost-vdpa support yes
  105. Trace backends log
  106. spice support no
  107. rbd support no
  108. xfsctl support no
  109. smartcard support no
  110. libusb no
  111. usb net redir no
  112. OpenGL support no
  113. OpenGL dmabufs no
  114. libiscsi support no
  115. libnfs support no
  116. build guest agent yes
  117. QGA VSS support no
  118. QGA w32 disk info no
  119. QGA MSI support no
  120. seccomp support no
  121. coroutine backend ucontext
  122. coroutine pool yes
  123. debug stack usage no
  124. mutex debugging no
  125. crypto afalg no
  126. GlusterFS support no
  127. gcov gcov
  128. gcov enabled no
  129. TPM support yes
  130. libssh support no
  131. QOM debugging yes
  132. Live block migration yes
  133. lzo support no
  134. snappy support no
  135. bzip2 support no
  136. lzfse support no
  137. zstd support no
  138. NUMA host support no
  139. libxml2 no
  140. tcmalloc support no
  141. jemalloc support no
  142. avx2 optimization yes
  143. avx512f optimization no
  144. replication support yes
  145. bochs support yes
  146. cloop support yes
  147. dmg support yes
  148. qcow v1 support yes
  149. vdi support yes
  150. vvfat support yes
  151. qed support yes
  152. parallels support yes
  153. sheepdog support yes
  154. capstone internal
  155. libpmem support no
  156. libdaxctl support no
  157. libudev yes
  158. default devices yes
  159. plugin support no
  160. fuzzing support no
  161. gdb /usr/bin/gdb
  162. rng-none no
  163. Linux keyring yes
  164. cross containers no
  165. NOTE: guest cross-compilers enabled: cc

https://abelsu7.top/categories/KVM/