libvirt and QEMU
作者:互联网
libvirt and QEMU
零、前言
我们知道,操作系统上的程序分为两种,一种是用户态的程序,例如 Word、Excel 等,一种是内核态的程序,例如内核代码、驱动程序等。
为了区分内核态和用户态,CPU 专门设置四个特权等级 0、1、2、3 来做这个事情。大牛们在写 Linux 内核的时候,如果用户态程序做事情,就将扳手掰到第 3 等级,一旦要申请使用更多的资源,就需要申请将扳手掰到第 0 等级,内核才能在高权限访问这些资源,申请完资源,返回到用户态,扳手再掰回去。这个程序一直非常顺利地运行着,直到虚拟机出现了。
一、虚拟化框架
“虚拟化 ” 是一个描述运行软件的广义计算机术语,通常体现为在单一系统上运行多个操作系统,这些操作系统同时运行,而每个操作系统又是相互独立的。大多数现行的虚拟化实现使用一个 “虚拟机管理程序 ”(hypervisor),即一个软件层或子系统,该子系统控制硬件并向 “客机操作系统 ” 提供访问底层硬件的途径。通过向客机操作系统提供虚拟化的硬件虚拟机管理程序允许多种操作系统在相同的物理系统中运行,该虚拟机管理系统称为 “客机 ”(guest)。
文康说:通过虚拟化,可以将单台计算机划分成多台虚拟机,每台虚拟机拥有自己的操作系统。从物理机角度上看,它们彼此是独立的。具体来说就是具有自己的网络接口和IP地址、文件系统以及其他外围设备。(特指完全虚拟化环境下)从每个操作系统的角度来看,他们运行在自己的专有硬件(虚拟出来的硬件)上。它们认为自己是和硬件直接在打交道,但其实是同
qemu
模拟出来的硬件打交道,并且qemu
会将这些指令 转译(中间人)给真正的硬件。
hypervisor
是管理和支持虚拟化环境的软件,可为每个操作系统运行虚拟机,并且为每个虚拟机提供虚拟 CPU、内存、磁盘、网络和其他外围设备的访问权限。同时限制虚拟机,使其无法直接访问实际硬件以及互相直接访问。提供
hypervisor
的物理计算机或操作系统称为host
计算节点。客户机guest
是在hypervisor
上运行的虚拟机
二、虚拟化细节
Q:不用虚拟化,能不能在一台机器上跑多台系统?
A:不能同时,只能跑一台。
每一个操作系统都有一个内核 kernel ,而这个 kernel 是需要对 CPU 的 ring0 进行操作的。如果没有任何限制,运行多台虚拟机则会出现多个操作系统同时抢占 CPU。所以运行多台虚拟机就需要一个调度程序去进行调度,它被称为 hypervisor (虚拟机控制软件)。
通过这样处理以后,我们就得到了虚拟机,而虚机运行在 ring3 环。反过来说。在 ring3 称为用户模式下的 全虚拟化 虚拟机,而 ring2 使用 hypervisor 实现资源调度;多台同时运行在 ring0 下的 半虚拟化
虚拟机容易崩。
1、虚拟化类型
虚拟化主要分为三种类型:完全虚拟化、半虚拟化和软件虚拟化。
- 完全虚拟化使用系统 CPU 的硬件特性为虚拟客户提供底层物理系统的完全抽象。
- 完全虚拟化(full virtualization) : 允许未修改的操作系统和软件在虚拟机上的运行,就像直接在真实硬件上的运行。
- 配备虚拟外围设备后,虚拟机环境看起来就像是裸机一样。物理硬件的访问权限由 hypervisor 控制,因此虚拟机不会互相干扰。
- 半虚拟化使用呈现给虚拟客户的软件和数据结构的集合,要求客户中的软件修改以使用半虚拟化环境。
- 半虚拟化(Paravirtualization): 允许hypervisor为客户机操作系统提供特殊接口,以便其更有效地与hypervisor进行通信。通常,这需要对客户机操作系统或特殊hypervisor 感知型驱动程序的安装进行修改。
- 半虚拟化应用一系列呈现给虚拟机的软件和数据结构,需要客机中的软件修改以使用半虚拟环境。
- 半虚拟化包含整个内核,就像 Xen 准虚拟机,或者虚拟化 I/O 设备的驱动程序一样。
- 软件虚拟化使用较慢的二进制转换和其他仿真技术来运行未经修改的操作系统。像直接使用 QEMU 这种仿真技术。
- Red Hat Enterprise Linux 不支持软件虚拟化。
- 原生虚拟化(native virtualization)或硬件辅助完全虚拟化(hardware-assisted fullvirtualization)允许几乎所有的代码都可未经更改地由CPU直接运行,从而提高效率。
- hypervisior 只需在代码在使用干涉系统管理程序的状态或其支持环境的敏感指令时介入
- 当今32位和64位x86 处理器上的Intel 虚拟化技术(VT-x)和AMD虚拟化(AMD-V)的发展使硬件辅助完全虚拟化成为可能。利用处理器的硬件特性,向客机提供底层实体系统的总抽象。这创建了新的虚拟系统,被称为一个 “虚拟机 ”(virtual machine),它允许客机操作系统在无需修改的情况下运行。客机操作系统和任何在客机虚拟机器中的应用并不会察觉出虚拟化环境并正常运作。
原生虚拟化,性能更好。允许几乎所有的代码都可未经更改地由 CPU 直接运行,从而提高效率。
也是工程师不断的在改进的地方,要更好的支持原生虚拟化。让虚拟化的速度和物理机一样,无论是 CPU 还是 IO or RAM。
2、硬件辅助虚拟化技术(HVM)
为了让虚拟机达到原生虚拟化的目的,需要使用硬件辅助虚拟化技术。
在第一代技术中,支持Intel VT/AMD-V的CPU上提供新处理器指令,可将CPU置入新的执行模式。为硬件辅助虚拟机执行指令时, CPU将切换到非root或客户机模式,在该模式下虚拟机的内核能够以级别0运行,而用户空间能够以级别3运行。
对于虚拟机内核来讲,只要将标志位设为虚拟机状态,我们就可以直接在 CPU 上执行大部分的指令,不需要虚拟化软件在中间转述,除非遇到特别敏感的指令,才需要将标志位设为物理机内核态运行,这样大大提高了效率。
这样操作以后,就出现了 CPU 快而 RAM 慢的情况。
第二代x86 硬件虚拟化支持内存管理单元(MMU)虚拟化。通常,CPU需要花费很多周期来处理内存页面与虚拟机的映射。MMU 虚拟化允许将工作负载转移到特殊硬件,从而提高性能。Intel将此技术称为扩展页表(ERT),在Nehalem微型架构处理器中引入。AMD将此技术称为快速虚拟化索引(RVi), 于2007年在四核Opteron处理器中引入。
这样 CPU 和 RAM 就都解决掉了。
第三代x86 硬件虚拟化支持集中于I/0虚拟化。主板芯片集上的使能技术为安全PCI穿透,允许将物理PCI设备直接连接到虚拟机。该技术可为虚拟机提供近似原生的I/O性能。在Intel中,这称为直接1/O虚拟化技术(VT-d);在AMD中,称为1/0虚拟化技术(AMD- Vi)(最初称为IOMMU)
之前,网卡 nic 还是要通过 hypervsor 交给虚拟机来用 vm ,到了千兆上不去。现在,新技术 SR-IOV 的网卡划48个口,跨过 hypervisor 直接给 vm 调用。很多通道的处理,直接交给网卡自己来做。通过这种技术,就解决了 IO 性能问题。
三、虚拟化组件
KVM
对于 KVM(英文 Kernel-based Virtual Machine 的缩写) 来说,其是一款支持虚拟机技术,而且是 linux 内核中的一个功能模块。它在 linux2.6.20 之后的任何 linux 分支中都被支持。
-
KVM 是基于内核的虚拟机,直接集成到Linux内核中。它允许 Linux 内核在裸机上运行,并直接自行充当 hypervisor。
-
KVM 项目由 Qumranet(现属于红帽) 于2006年10月启动。从 RHEL 5.4 开始,在 x86-64 架构上运行的红帽企业 Linux 中完全支持 KVM
-
KVM 设计性能十分优异,hypervisor 所需的许多功能都已通过 Linux 内核实施,如处理器调度、内存管理、物理设备驱动程序等
-
KVM 需要芯片支持虚拟化技术(英特尔的 VT 扩展或者 AMD 的 AMD-V 扩展)
-
对于是否支持也可以通过命令行查看:egrep '(vmx|svm)' --color=always /proc/cpuinfo
- 在 bios 中是默认设置不打开该功能的,要去 bios 设置其为 enable
-
如果有任何内容则说明当期硬件架构是支持 kvm 的,否则就不支持。
-
Q:为什么还要 yum install libvirt*
A:操作系统装以后,天生就可以安装虚拟机了。但是,内核支持虚拟化,不代表应用就能直接访问虚拟化。应用需要调用 lib 来使用虚拟化,这是免费的。
Q:英特尔的 VT 扩展或者 AMD 的 AMD-V 扩展
是做什么的?
A:因为完全虚拟化是非常慢的,所以要使用硬件辅助虚拟化技术 Intel-VT,AMD-V,所以需要 CPU 硬件开启这个标志位,一般在 BIOS 里面设置。当确认开始了标志位之后,通过 KVM,GuestOS 的 CPU 指令不用经过 Qemu 转译,直接运行,大大提高了速度。所以,KVM 在内核里面需要有一个模块,来设置当前 CPU 是 Guest OS 在用,还是 Host OS 在用。
libvirt
libvirt 程序包是一个与
虚拟机监控程序
相独立的虚拟化应用程序接口
,它可以与操作系统的一系列虚拟化性能进行交互。libvirt 是一个管理虚拟化平台的工具包,可从 C、Python、Perl、Go 等访问。
——提供简单虚拟化API的库
# yum info libvirt
Available Packages
Name : libvirt
Arch : x86_64
Version : 4.5.0
Release : 36.el7_9.5
Size : 204 k
Repo : updates/7/x86_64
Summary : Library providing a simple virtualization API
URL : https://libvirt.org/
License : LGPLv2+
Description : Libvirt is a C toolkit to interact with the virtualization
: capabilities of recent versions of Linux (and other OSes). The
: main package includes the libvirtd server exporting the
: virtualization support.
libvirt 项目旨在为运行在不同虚拟机管理程序技术上的虚拟管理工具提供长期稳定的 C API。
也有 Python 写好的
libvirt-python
软件包,来调用 libvirt 库接口,从而方便自己的应用程序更好的使用虚拟化功能。libvirt 程序包在 GNU 较宽松公共许可证下,可作为免费软件使用。
Red Hat Enterprise Linux 7 支持 libvirt 以及其包括的基于 libvirt 的工具作为默认虚拟化管理(如 Red Hat Enterprise Virtualization 管理),例如 virt-manager
与 virsh
命令行管理工具。
libvirt 的主要功能:
-
一个稳定的通用层来安全地管理主机上的虚拟机。
-
一个管理本地系统和连网主机的通用接口。
-
提供 API 来列举、监测和使用管理节点上的可用资源,其中包括 CPU、内存、储存、网络和非一致性内存访问(NUMA)分区。
- 部署、创建、修改、监测、控制、迁移以及停止虚拟机操作都需要这些 API。
-
尽管 libvirt 可同时访问多个主机,但 API 只限于单节点操作。
-
管理工具可以位于独立于主机的物理机上,并通过安全协议和主机进行交流。
从该图可以看出,libvirt 的设计理念,是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。在 libvirt api 之上会有很多个 driver,对于每一种虚拟机技术都会有一种 driver,用来充当该虚拟机技术与 libvirt 之间的包装接口。如此设计就可以避免 libvirt 需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用 libvirt 提供的接口来完成自己所需要的功能。不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且 libvirt 提供了多种语言的编程接口,可以直接通过编程,调用 libvirt 提供的对外接口实现对虚拟机的操作。
QEMU
—— QEMU 是一个通用的开源机器模拟器和虚拟器。
-
QEMU 有整套的虚拟机实现,由以下部分构成
-
处理器模拟器(x86、IBM Z、PowerPC、Sparc)
-
模拟的设备(显卡、网卡、硬盘、鼠标)
-
用于将被模拟设备连接到相关主机设备的通用设备
-
被模拟计算机(PC、Power Mac)的说明
-
调试程序
-
用来与模拟器交互的用户界面
-
-
QEMU 是一个用户空间的进程,需要通过特定的接口才能调用到 KVM 模块提供的功能。
-
从 QEMU 角度来看,虚拟机运行期间,QEMU 通过 KVM 模块提供的系统调用接口进行内核设置,由 KVM 模块负责将虚拟机置于处理器的特殊模式运行。QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化加速以提高虚拟机的性能。
-
当用作虚拟器时,QEMU 通过直接在主机 CPU 上执行来宾代码来实现接近原生的性能。在 Xen 管理程序下执行或在 Linux 中使用 KVM 内核模块时,QEMU 支持虚拟化。使用 KVM 时,QEMU 可以虚拟化 x86、服务器和嵌入式 PowerPC、64 位 POWER、S390、32 位和 64 位 ARM 以及 MIPS 客户机。
Q:KVM 和 QEMU 有什么区别?
A:QEMU 使用仿真;KVM 使用处理器扩展 (HVM) 进行虚拟化。
Q:QEMU 和 KVM 是独立的吗?
A:是,但不完全是。KVM 模块的职责就是打开并初始化 VMX 功能,提供相应的接口以支持虚拟机的运行。 QEMU(quick emulator) 本身并不包含或依赖 KVM 模块,而 是一套由 Fabrice Bellard 编写的模拟计算机的自由软件。 QEMU 虚拟机 是一个纯软件的实现,可以在没有 KVM 模块的情况下独立运行,但是性能比较低。
Q:那为何还会有 qemu-kvm 这个名词?
A:单纯的使用 Qemu 属于完全虚拟化,性能特别低。所以 Qemu 将 KVM 整合进来,将有关 CPU 指令的部分交由内核模块来做,就是 qemu-kvm (qemu-system-XXX)。另外 Qemu 还会模拟其他的硬件,如网络和硬盘。同样,全虚拟化的方式也会影响这些设备的性能。这个时候就需要让 GuestOS 知道自己是虚拟机,需要加载特殊的半虚拟化驱动来提高性能。总之 qemu-kvm 就是这样的一种技术。它补充了 kvm 技术的不足,而且在性能上对 kvm 进行了优化。
Q:QEMU 和 KVM 到底有什么联系?
A:KVM 只是内核模块,用户并没法直接跟内核模块交互,需要借助用户空间的管理工具,而这个工具就是 QEMU。KVM 和 QEMU 相辅相成,QEMU 通过 KVM 达到了硬件虚拟化的速度,而 KVM 则通过 QEMU 来模拟设备。简单直接的理解就是:QEMU 是个计算机模拟器,而 KVM 为计算机的模拟提供加速功能。
Q:QEMU 又和 libvirt 有什么关系?
A:对于 KVM 来说。其匹配的用户空间工具并不仅仅只有 QEMU 作为唯一选择,还有 RedHat 开发的 libvirt、virsh、virt-manager 等。
四、创建虚拟机
1、创建镜像
在 KVM 中,创建一个虚拟机镜像,大小为 8G,其中 qcow2 格式为动态分配,raw 格式为固定大小。
# qemu-img create -f qcow2 ubuntutest.img 8G
2、创建虚拟机
创建虚拟机:名字叫 ubuntutest,内存大小为 1024M,使用动态分配的 8g 大小的磁盘,挂载 Ubuntu 的 ISO 光盘,VNC 端口为 5919
qemu-system-x86_64 -enable-kvm -name ubuntutest -m 2048 -hda ubuntutest.img -cdrom ubuntu-14.04-server-amd64.iso -boot d -vnc :19
3、创建网络
# brctl addbr br0
# ip link set br0 up
# tunctl -b
# ip link set tap0 up
# brctl addif br0 tap0
4、虚拟机启用网络
# qemu-system-x86_64 -enable-kvm -name ubuntutest -m 2048 -hda ubuntutest.qcow2 -vnc :19 -net nic,model=virtio -nettap,ifname=tap0,script=no,downscript=no
# ifconfig br0 192.168.57.1/24 # 虚拟机启动后,网卡没有配置,所以无法连接外网,先给 br0 设置一个 ip。
# sysctl -p
net.ipv4.ip_forward = 1
# sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 在 Host 上设置 NAT,并且 enable ip forwarding
五、虚拟化细节
1、内存
内存管理和内核同页合并(KSM):
- 允许在进程间共享相同的内存页面
- 对于同一个模板部署出来的虚拟机有用,对异构的没有效果。
- KVM 使用该机制来允许内存过量使用。在两个相似的虚拟机中,内存中很有可能有许多相同页面。KSM允许主机扫描虚拟机内存来查找相同页面,并将它们整合成一个共享内存页面,从而减少物理内存消耗
- 同一个虚拟机模板运行10个虚拟机,大量页是相同的,可以合并成一份。如果修改了一些东西,发生了变化就多占用一些。
2、存储
虚拟机的储存从虚拟机使用的物理储存中提取。它通过使用半虚拟化或仿真块设备驱动与虚拟机相连。
2.1. 储存池
“储存池 ”(storage pool)即一个由 “libvirt” 管理的文件、目录或储存设备,其目的是为虚拟机提供储存空间。储存池被分隔为存储 “卷 ”(volume),可以用来存储虚拟机镜像或附加到虚拟机作为额外额存储。多个客机可共享同一储存池,允许储存资源得到更好分配。
-
本地储存池
本地储存池直接连接到主机服务器。它们包括本地目录、直接连接的磁盘、物理分区和本地设备上的 LVM 卷组。本地储存池对开发、测试及不需要迁移或具有大量虚拟机的小型部署十分有用。因为本地储存池不支持实时迁移,所有它可能不适用于某些生产环境。
-
网络(共享)储存池
网络储存池包括在网络上使用标准协议共享的储存设备。使用 virt-manager 在主机间进行虚拟机的迁移需要网络储存,但是当使用
virsh
迁移时,它是可选的。网络储存池由 libvirt 进行管理。
2.2. 储存卷
储存池进一步划分为 “储存卷 ”(storage volume)。储存卷是物理分区、LVM 逻辑卷、基于文件的磁盘镜像及其它由 libvirt 控制的储存形式的抽象层。不论基于何种硬件,储存卷会作为本地储存设备呈现给虚拟机。
2.3. 仿真储存设备
虚拟机可以被提供一系列经主机仿真的储存设备。每种储存设备都适用于特定的使用情况。具有可以选择不同种类储存设备的功能,可以使灵活性以及与客机操作系统的兼容性达到最大化。
-
virtio-scsi
virtio-scsi 是为使用大量磁盘或高级储功能(如 TRIM)的客机推荐使用的半虚拟化设备。使用除 Red Hat Enterprise Linux 7 以外操作系统的客机可能需要安装相应的客机驱动。
-
virtio-blk
virtio-blk 是适用于向客机提供镜像文件的半虚拟化储存设备。virtio-blk 可以为虚拟机提供最好的磁盘 I/O 性能,但比 virtio-scsi 的功能少。
-
IDE
IDE 是推荐给不支持 virtio 驱动的旧客机用的。IDE 性能不如 virtio-scsi 或 virtio-blk,但它与不同系统广泛兼容。
-
CD-ROM
ATAPI CD-ROM 与 virtio-scsi CD-ROM 都能向客机提供 ISO 文件或主机 CD-ROM 驱动。virtio-scsi CD-ROM 可以与安装了 virtio-scsi 驱动的客机一同使用。ATAPI CD-ROM 兼容性广泛但性能较低。
-
USB 存储设备和软盘
如需要可移动介质,可使用 USB 存储设备和软盘。USB 存储设备由于其较大的容量比软盘更受欢迎。
-
AHCI
仿真 AHCI(高级主机控制器接口,Advanced Host Controller Interface)总线是 IDE 的一种替代品,它的特征增多、性能提高,包括与串行 ATA(SATA)设备交流。AHCI 作为一种技术预览包括在 Red Hat Enterprise Linux 7.1 中。
2.4. 主机存储
磁盘镜像可以储存在一系列和主机相连的本地或远程存储中。
-
镜像文件
镜像文件储存在主机文件系统中。它可以储存在本地文件系统中,如 ext4 或 xfs;或网络文件系统中,如 NFS 。例如 libguestfs 这样的工具,能管理、备份及监控文件。KVM 上的磁盘镜像格式包括:rawraw 镜像文件指不包含附加元数据的磁盘内容。假如主机文件系统允许,raw 文件可以是预分配(pre-allocated)或稀疏(sparse)。稀疏文件根据需求分配主机磁盘空间,因此它是一种精简配置形式(thin provisioning)。预分配文件的所有空间需要被预先分配,但它比稀疏文件性能好。当对磁盘 I/O 性能要求非常高,而且通常不需要通过网络传输镜像文件时,可以使用 raw 文件。qcow2qcow2 镜像文件提供许多高级磁盘镜像特征,如快照、压缩及加密。它们可以用来代表通过模板镜像创建的虚拟机。因为只有虚拟机写入的扇区部分才会分配在镜像中,所以 qcow2 文件的网络传输效率较高。Red Hat Enterprise Linux 7.0 及更新版本支持 qcow2 v3 镜像文件格式。
-
LVM 卷
逻辑卷可用于磁盘镜像,并使用系统的 LVM 工具进行管理。 由于它使用更简单的块储存模式,LVM 比文件系统的性能更高。LVM 精简配置为 LVM 卷提供快照和高效的空间使用,它可以作为 qcow2 的一种替代选择。
-
主机设备
主机设备如物理 CD-ROM、原始磁盘或 LUN 都可以提供给客机。这使得 SAN 或 iSCSI LUN 还有本地 CD-ROM 都可以提供给客机所用。在 SAN 而不是主机上进行储存管理时,可以使用主机设备。
-
分布式存储系统
Gluster 卷可用作磁盘镜像。它提供了高效的、使用网络的集群存储。Red Hat Enterprise Linux 7 包括在 GlusterFS 上对磁盘镜像的原生支援。这使 KVM 主机可以直接从 GlusterFS 卷引导虚拟机镜像,并使用 GlusterFS 卷中的镜像作为虚拟机的数据磁盘。与 GlusterFS FUSE 相比,KVM 原生支持性能更好。
4、数据恢复
- 数据恢复我以前写过一篇文章:Linux 意外操作后如何进行数据抢救
- 磁盘理论部分,晚些单独出篇文章介绍。
5、虚拟化嵌套
从 Red Hat Enterprise Linux 7.5 开始,嵌套虚拟化作为 KVM 来宾虚拟机的技术预览版提供。借助此功能,在物理主机( 0 级或 L0 级)上运行的来宾虚拟机(也称为 1 级或 L1 )可以充当管理程序,并创建自己的来宾虚拟机 ( L2 )。
嵌套虚拟化在各种场景中都很有用,例如在受限环境中调试管理程序以及在有限数量的物理资源上测试更大的虚拟部署。但是,请注意,在生产用户环境中不支持或不推荐使用嵌套虚拟化,它主要用于开发和测试。
嵌套虚拟化依赖于主机虚拟化扩展来运行,它不应与使用 QEMU Tiny Code Generator (TCG) 仿真在虚拟环境中运行来宾混淆,红帽企业 Linux 不支持这种仿真。
-
按照以下步骤启用、配置和开始使用嵌套虚拟化:
-
启用:默认情况下禁用该功能。要启用它,请在 L0 主机物理机上使用以下过程。
对于英特尔:
-
检查您的主机系统上是否可以使用嵌套虚拟化。
$ cat /sys/module/kvm_intel/parameters/nested
如果此命令返回
Y
或1
,则启用该功能。如果命令返回
0
orN
,请使用步骤 ii 和 iii。 -
卸载
kvm_intel
模块:#modprobe -r kvm_intel
-
激活嵌套功能:
#modprobe kvm_intel nested=1
-
嵌套功能现在仅在 L0 主机下一次重新引导之前启用。要永久启用它,请将以下行添加到
/etc/modprobe.d/kvm.conf
文件中:option kvm_intel nested=1
对于 AMD:
-
检查您的系统上是否可以使用嵌套虚拟化:
$cat /sys/module/kvm_amd/parameters/nested
如果此命令返回
Y
或1
,则启用该功能。如果命令返回
0
orN
,请使用步骤 ii 和 iii。 -
卸载
kvm_amd
模块#modprobe -r kvm_amd
-
激活嵌套功能
#modprobe kvm_amd nested=1
-
嵌套功能现在仅在 L0 主机下一次重新引导之前启用。要永久启用它,请将以下行添加到
/etc/modprobe.d/kvm.conf
文件中:option kvm_intel nested=1
-
-
使用以下方法之一为嵌套虚拟化 配置 L1 虚拟机:
-
虚拟管理器
打开预期来宾的 GUI,然后单击 “显示虚拟硬件详细信息”图标。选择Processor菜单,在Configuration部分中,输入
host-passthrough
Model字段(不要使用下拉选择),然后单击Apply。 -
域 XML
将以下行添加到来宾的域 XML 文件中:
<cpu mode='主机直通'/>
如果来宾的 XML 配置文件已经包含一个<cpu>
元素,则重写它。
-
-
要开始使用嵌套虚拟化,请在 L1 来宾中安装 L2 来宾。为此,请遵循与安装 L1 来宾时相同的过程 - 有关详细信息,请参阅第 3 章,创建虚拟机。
-
-
限制和限制
-
强烈建议在 L0 主机和 L1 来宾中运行 Red Hat Enterprise Linux 7.2 或更高版本。L2 来宾可以包含 Red Hat 支持的任何来宾系统。
-
不支持迁移 L1 或 L2 来宾。
-
不支持将 L2 来宾用作管理程序并创建 L3 来宾。
-
并非主机上的所有可用功能都可供 L1 管理程序使用。例如,IOMMU/VT-d 或 APICv 不能被 L1 管理程序使用。
-
要使用嵌套虚拟化,主机 CPU 必须具有必要的功能标志。要确定 L0 和 L1 管理程序是否设置正确,请
cat /proc/cpuinfo
在 L0 和 L1 上使用该命令,并确保为两个管理程序上的相应 CPU 列出以下标志:- 对于 Intel - vmx(硬件虚拟化)和ept(扩展页表)
- 对于 AMD - svm(相当于 vmx)和npt(相当于 ept)
6、虚拟机迁移
分为冷迁移和热迁移,后者不能断电。红帽支持热迁移必须使用共享存储,否则无法实现。实现需要 ip 都在一个子网里,同节点 cpu 相同,操作系统架构(64bit 32bit)。热迁移其实就是拷贝内存。
- 迁移是将正在运行的客户机从一个硬件节点(主机)移至另一个的能力。普通迁移会暂停客户机、将其内存状态复制到另一节点,然后在新节点上恢复客户机
- 实时迁移允许客户机在整个迁移过程中持续运行,通常只在该过程结束时暂停计算机,以完成内存转移并在新节点上恢复客户机。使用现场迁移时,远程客户端不会注意到客户机已更改了计算机
7、虚拟机网络
qemu-kvm,会打开一个 /dev/net/tun 字符设备,物理机上会建立一个网卡
所有发到这个网卡上的网络包会被 qemu-kvm 接收进来,变成二进制串。
qemu-kvm 会模拟一个虚拟机里面的网卡,将二进制的串变成网络包,发给虚拟机里面的网卡。
8、硬件和 VirtIO(这一块不是很懂)
-
每家硬件厂商为每种虚拟化写虚拟化驱动,现在可以写一个标准下的 virtio 驱动程序,使得虚拟化访问 virtio 的虚拟化硬件。
-
虚拟客户机不可以直接访问系统上的物理硬件。这会危及到主机上所有虚拟客户机的安全和隔离KVM hypervisor 不允许客户机拥有物理硬件的低级别访问权限。相反,它会通过设备模型为客户机提供仿真硬件。仅对诸如网络接口、视频卡、磁盘控制器以及BIOS 等外围硬件进行仿真:不对CPU进行仿真
-
QEMU模拟器的改良版本qemu-kvm用作KVM设备模型。所选硬件相对基本且较旧,因此各种客户机操作系统更有可能具有支持它们的驱动程序,其提供的性能通常比仿真原始硬件高
-
设备模型仿真的虚拟硬件的速度不像预期那样快。我们必须通过软件仿真实际硬件这一事实,意味着主机需要占用更多CPU资源来仿真硬件,并且虚拟客户机中实现的性能达不到理想状态。
-
很多不同的hypervisor提供不同的接口供半虚拟化设备与其hypervisor接口,进而要求客户机使用不同的驱动程序
-
IBM和红帽领导开展了VirtIO项目,为独立于hypervisor和总线的半虚拟化驱动程序开发一个开放式标准框架。KVM当前已采用此标准。
-
上游Linux内核包含用于Linux虚拟客户机的virtio驱动程序,其中包括网络驱动程序、block设备驱动程序和时钟驱动程序。这些驱动程序已反向移植到红帽企业Linux 5.3/4.8及更高版本中提供的内中。在安装虚拟客户机期间,内核应自动检测提供的半虚拟化设备,并加载virtio驱动程序。红帽 还为Microsoft Windows 提供 Virtio 驱动程序。
六、工具的使用(已熟练使用)
1、virsh
-
virsh 是一个用于监控系统程序和客户机虚拟机器的命令行接口(CLI)工具。
virsh
命令行工具建立在 libvirt 管理 API,并作为可选择的一个运行方式来替代qemu-kvm
命令和图形界面的 virt-manager 应用。无特权的用户以只读的方式使用virsh
命令;有根用户权限的用户可以使用该命令的所有功能。virsh
是一个对虚拟环境的管理任务进行脚本化的理想工具。另外,virsh
工具是virsh
客机域的一个主要管理接口,可以用于创造、暂停和关闭 “域”,或罗列现有域。这一工具作为 libvirt-client 软件包中的一部分被安装。- # virsh list --all
- # virsh destroy servername
- # virsh start servername
- # virsh snapshot-create
- # virsh reboot
- # virsh shutdown
- # virsh dumpxml servername
- # virsh define 使用一个xml文件来创建虚拟机
- # virsh create 使用一个xml文件来创建并启动虚拟机
2、virt-install
- virt-install是一个命令行工具,它提供了一种将操作系统配置到虚拟机中的简单方法。
- virt-install 是一个用来配置新的虚拟机器的命令行工具。它通过使用连续的控制台、SPICE 或 VNC 客户 / 服务器成对图形,支持基于文本和图形的安装。安装介质可以是本地的,或已有的远程 NFS、HTTP 或 FTP 服务器。考虑到便捷的自动化安装,还可以通过配置此工具实现在无需人工参与的情况下运行,并在安装完成时快速启动客机。此工具以 python-virtinst 软件包的一部分进行安装。
3、virt-manager
- virt-manager应用程序是一个桌面用户界面,用于通过 libvirt 管理虚拟机。它主要针对KVM虚拟机,但也管理Xen和LXC(Linux 容器)。它提供了正在运行的域、它们的实时性能和资源利用率统计信息的摘要视图。向导可以创建新域,以及配置和调整域的资源分配和虚拟硬件。嵌入式 VNC 和 SPICE 客户端查看器向来宾域提供完整的图形控制台。
- virt-manager 是一个用于管理虚拟机器的简单的图形工具。它所提供的功能用以控制现有机器寿命周期、储备新机器、管理虚拟网络、访问虚拟机器的图形控制台并查看性能数据。这个工具包括在同名的软件包中,称为 virt-manager。
4、virt-viewer
- virt-viewer是一个轻量级的 UI 界面,用于与虚拟客户操作系统的图形显示进行交互。它可以显示 VNC 或 SPICE,并使用 libvirt 查找图形连接详细信息。
- Virt Viewer 用于使用 SPICE 远程桌面协议访问 KVM 虚拟机。它是用于 KVM 虚拟化解决方案(如 Proxmox)的 VMware 远程控制台 (VMRC) 的替代方案。Virt Viewer 具有许多高级功能,例如 VMware Remote Console (VMRC)。
参考
1、红帽
2、官网
3、社区
【虚拟机】虚拟化技术以及 KVM、QEMU 与 libvirt 介绍
4、口述
标签:虚拟化,虚拟机,KVM,libvirt,硬件,QEMU 来源: https://www.cnblogs.com/itxdm/p/libvirt_and_QEMU.html