其他分享
首页 > 其他分享> > libvirt and QEMU

libvirt and QEMU

作者:互联网

libvirt and QEMU

零、前言

我们知道,操作系统上的程序分为两种,一种是用户态的程序,例如 Word、Excel 等,一种是内核态的程序,例如内核代码、驱动程序等。

为了区分内核态和用户态,CPU 专门设置四个特权等级 0、1、2、3 来做这个事情。大牛们在写 Linux 内核的时候,如果用户态程序做事情,就将扳手掰到第 3 等级,一旦要申请使用更多的资源,就需要申请将扳手掰到第 0 等级,内核才能在高权限访问这些资源,申请完资源,返回到用户态,扳手再掰回去。这个程序一直非常顺利地运行着,直到虚拟机出现了。

一、虚拟化框架

虚拟化 ” 是一个描述运行软件的广义计算机术语,通常体现为在单一系统上运行多个操作系统,这些操作系统同时运行,而每个操作系统又是相互独立的。大多数现行的虚拟化实现使用一个 “虚拟机管理程序 ”(hypervisor),即一个软件层或子系统,该子系统控制硬件并向 “客机操作系统 ” 提供访问底层硬件的途径。通过向客机操作系统提供虚拟化的硬件虚拟机管理程序允许多种操作系统在相同的物理系统中运行,该虚拟机管理系统称为 “客机 ”(guest)。

image-20220429171147960

文康说:通过虚拟化,可以将单台计算机划分成多台虚拟机,每台虚拟机拥有自己的操作系统。从物理机角度上看,它们彼此是独立的。具体来说就是具有自己的网络接口和IP地址、文件系统以及其他外围设备。(特指完全虚拟化环境下)从每个操作系统的角度来看,他们运行在自己的专有硬件(虚拟出来的硬件)上。它们认为自己是和硬件直接在打交道,但其实是同 qemu 模拟出来的硬件打交道,并且 qemu 会将这些指令 转译(中间人)给真正的硬件。

hypervisor 是管理和支持虚拟化环境的软件,可为每个操作系统运行虚拟机,并且为每个虚拟机提供虚拟 CPU、内存、磁盘、网络和其他外围设备的访问权限。同时限制虚拟机,使其无法直接访问实际硬件以及互相直接访问。

提供 hypervisor 的物理计算机或操作系统称为 host 计算节点。客户机 guest 是在 hypervisor 上运行的虚拟机

二、虚拟化细节

Q:不用虚拟化,能不能在一台机器上跑多台系统?

A:不能同时,只能跑一台。

每一个操作系统都有一个内核 kernel ,而这个 kernel 是需要对 CPU 的 ring0 进行操作的。如果没有任何限制,运行多台虚拟机则会出现多个操作系统同时抢占 CPU。所以运行多台虚拟机就需要一个调度程序去进行调度,它被称为 hypervisor (虚拟机控制软件)。

通过这样处理以后,我们就得到了虚拟机,而虚机运行在 ring3 环。反过来说。在 ring3 称为用户模式下的 全虚拟化 虚拟机,而 ring2 使用 hypervisor 实现资源调度;多台同时运行在 ring0 下的 半虚拟化 虚拟机容易崩。

1、虚拟化类型

虚拟化主要分为三种类型:完全虚拟化、虚拟化和软件虚拟化。

原生虚拟化,性能更好。允许几乎所有的代码都可未经更改地由 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 分支中都被支持。

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的库

libvirt 驱动 256

# 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-managervirsh 命令行管理工具。

libvirt 的主要功能:

img
架构设计思想

从该图可以看出,libvirt 的设计理念,是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。在 libvirt api 之上会有很多个 driver,对于每一种虚拟机技术都会有一种 driver,用来充当该虚拟机技术与 libvirt 之间的包装接口。如此设计就可以避免 libvirt 需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用 libvirt 提供的接口来完成自己所需要的功能。不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且 libvirt 提供了多种语言的编程接口,可以直接通过编程,调用 libvirt 提供的对外接口实现对虚拟机的操作。

QEMU

—— QEMU 是一个通用的开源机器模拟器和虚拟器。

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 进行了优化。

img

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、创建网络

img
# 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):

2、存储

虚拟机的储存从虚拟机使用的物理储存中提取。它通过使用半虚拟化或仿真块设备驱动与虚拟机相连。

2.1. 储存池

储存池 ”(storage pool)即一个由 “libvirt” 管理的文件、目录或储存设备,其目的是为虚拟机提供储存空间。储存池被分隔为存储 “ ”(volume),可以用来存储虚拟机镜像或附加到虚拟机作为额外额存储。多个客机可共享同一储存池,允许储存资源得到更好分配。

image-20220429163524349

2.2. 储存卷

储存池进一步划分为 “储存卷 ”(storage volume)。储存卷是物理分区、LVM 逻辑卷、基于文件的磁盘镜像及其它由 libvirt 控制的储存形式的抽象层。不论基于何种硬件,储存卷会作为本地储存设备呈现给虚拟机。

image-20220429163002853

2.3. 仿真储存设备

虚拟机可以被提供一系列经主机仿真的储存设备。每种储存设备都适用于特定的使用情况。具有可以选择不同种类储存设备的功能,可以使灵活性以及与客机操作系统的兼容性达到最大化。

image-20220429163343577

2.4. 主机存储

磁盘镜像可以储存在一系列和主机相连的本地或远程存储中。

4、数据恢复

5、虚拟化嵌套

从 Red Hat Enterprise Linux 7.5 开始,嵌套虚拟化作为 KVM 来宾虚拟机的技术预览版提供。借助此功能,在物理主机( 0 级L0 级)上运行的来宾虚拟机(也称为 1 级L1 )可以充当管理程序,并创建自己的来宾虚拟机 ( L2 )。

嵌套虚拟化在各种场景中都很有用,例如在受限环境中调试管理程序以及在有限数量的物理资源上测试更大的虚拟部署。但是,请注意,在生产用户环境中不支持或不推荐使用嵌套虚拟化,它主要用于开发和测试。

嵌套虚拟化依赖于主机虚拟化扩展来运行,它不应与使用 QEMU Tiny Code Generator (TCG) 仿真在虚拟环境中运行来宾混淆,红帽企业 Linux 不支持这种仿真。

6、虚拟机迁移

分为冷迁移和热迁移,后者不能断电。红帽支持热迁移必须使用共享存储,否则无法实现。实现需要 ip 都在一个子网里,同节点 cpu 相同,操作系统架构(64bit 32bit)。热迁移其实就是拷贝内存。

7、虚拟机网络

imgqemu-kvm,会打开一个 /dev/net/tun 字符设备,物理机上会建立一个网卡

所有发到这个网卡上的网络包会被 qemu-kvm 接收进来,变成二进制串

qemu-kvm 会模拟一个虚拟机里面的网卡,将二进制的串变成网络包,发给虚拟机里面的网卡。

8、硬件和 VirtIO(这一块不是很懂)

六、工具的使用(已熟练使用)

1、virsh

2、virt-install

3、virt-manager

4、virt-viewer

参考

1、红帽

知识库 1344173

产品文档-虚拟化入门指南

产品文档-工具篇

RH318 培训教材

2、官网

man && /usr/share

FAQ - KVM

libvirt

QEMU

virt-manager

3、社区

archlinux.org

suse.com

趣谈 Linux 操作系统

【虚拟机】虚拟化技术以及 KVM、QEMU 与 libvirt 介绍

QEMU 和 KVM 的关系

4、口述

贺老师

标签:虚拟化,虚拟机,KVM,libvirt,硬件,QEMU
来源: https://www.cnblogs.com/itxdm/p/libvirt_and_QEMU.html