【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

文章目录

      • 1、虚拟化技术分类与架构(KVM,Xen),全/半虚拟化的区别
      • 2、libvirt介绍
      • 3、使用libvirt搭建虚拟化平台

1、虚拟化技术分类与架构(KVM,Xen),全/半虚拟化的区别

根据运行介质分类:裸金属虚拟化,主机虚拟化(多套了一层操作系统)
根据虚拟化技术原理分类: 全虚拟化(KVM为主,模拟一套真实的硬件设备),半虚拟化(Xen为主, 或者KVM+VirtIO,性能更高,通过调度策略优化资源使用)

虚拟化定义:

  • 虚拟化主要指的是特殊的技术,通过隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)(IBM定义)。虚拟化为有效利用大型机的资源提供了技术支持。

面向主机的的虚拟机 vs 面向裸机的虚拟机

  • 可以通过是否在裸机上部署来分为面向主机的的虚拟机和面向裸机的虚拟机。面向主机的虚拟机是指的在一台已经安装操作系统的主机上安装虚拟机管理(VMM)程序,而面向裸机的是指在裸机上直接安装虚拟机管理程序。
  • 所有的虚拟机调用都是直接由虚拟机管理程序来负责,没有了操作系统这一步,所以这种方式在效率上要高于面向主机的。不过,比较流行的技术比如vmware,xen都是面向主机的
    在这里插入图片描述在这里插入图片描述

全虚拟化 vs 半虚拟化

  • Full Virtualization(全虚拟化):几乎是完整地模拟一套真实的硬件设备。大部分操作系统无须进行任何修改即可直接运行在全虚拟化环境中。像kvm等技术是全虚拟化
  • Paravirtualization(半虚拟化):不对硬件设备进行模拟,虚拟机拥有独立的运行环境,通过虚拟机管理程序共享底层的硬件资源。大部分操作系统需要进行修改才能够运行在半虚拟化环境中。
    它的性能要稍微高于全虚拟化。像Xen。因为需要改动托管系统的内核,所以xen是不支持win虚拟机的。
    操作系统通过特定的Hypercall(与全虚拟化不同)来直接与Hypervisor通信,以执行敏感操作(如内存分配、设备连接等)。
    对于多核处理,KVM通过调度策略优化CPU资源的使用。
  • Partial Virtualization(部分虚拟化):仅仅提供了对关键性计算组件或者指令集的模拟。操作系统可能需要做某些修改才能够运行在部分虚拟化环境中。
  • (补充):Hypercall 是一种机制,允许虚拟机(VM)直接与Hypervisor进行通信。
    Hypercalls的功能类似于系统调用(system call),但针对的是运行在虚拟化环境中的客户机操作系统与Hypervisor之间的交互。通过hypercall,虚拟机可以请求Hypervisor提供特定的服务。
    Hypervisor 又称为虚拟机监控器,是一层运行在物理硬件上或操作系统上方的虚拟化软件。它负责创建、管理和调度虚拟机,并提供对物理资源的访问
    Hypercall是虚拟机与Hypervisor之间的通信接口,而Hypervisor是负责管理虚拟机与物理计算资源的软件组件。通过hypercall,虚拟机可以高效地请求Hypervisor的服务。
    在这里插入图片描述

传统虚拟化架构(半虚拟化)和 KVM虚拟化架构(全虚拟化)

  • 内核级虚拟化技术:Kernel-based Virtual Machine,简称KVM
    嵌入到Linux正式Kernel(提高兼容性) 代码级资源调用(提高性能) 虚拟机就是一个进程(内存易于管理) 直接支持NUMA技术(提高扩展性)
  • KVM只是虚拟化解决方案的一部分,想要实现全虚拟化,还需要的条件是:
    1) CPU处理器提供的虚拟化支持(VT-x 硬件辅助虚拟化,可以为GuestOS创建虚拟化处理器,本质是对寄存器的隔离模拟和对指令集的划分)。
    2) 内存可以通过kvm虚拟化成独立的虚拟化地址(/dev/kvm)
    3)I/O虚拟化(QEMU)  
    所以说: KVM虚拟化 = KVM内核模块 + /dev/kvm + QEMU
    在这里插入图片描述在这里插入图片描述

kvm全虚拟化原理

  • 1)/dev/kvm
    Linux操作系统标准内核中的KVM内核模块生成了一个名为/dev/kvm的设备,有了/dev/kvm设备,使得GuestOS的地址空间(内存地址、磁盘地址)能够独立于标准内核或其他任何GuestOS的地址空间。
    KVM内核模块通过/dev/kvm设备提供了内存虚拟化,给予GuestOS与内核或者其他GuestOS相对独立的地址空间。每个GuestOS都有自己的地址空间,并且这些地址空间是在实例化GuestOS时创建映射的。
    映射给GuestOS的物理内存实际上是映射给这个GuestOS在VMM中相应进程的虚拟内存。   
    所以总的来说,/dev/kvm设备的作用就是:将不同的GuestOS之间的地址隔离,或将GuestOS和HostOS(VMM)之间的地址隔
  • 2)QEMU   
    QEMU是一个I/O虚拟化解决方案,能够对一个完整的计算机物理层环境进行虚拟化(EG. 磁盘、图形适配器、网络设备)。
    在GuestOS中生成的所有I/O请求都会被QEMU中途截获,并重新发送到QEMU进程模拟的User Mode中。
  • 3)Openstack、KVM、QEMU
    KVM 用来模拟 CPU 的运行,但缺少了对 Network 和 I/O 的支持。QEMU-KVM 是一个完整的模拟器,它基于 KVM 上,提供了完整的 Network 和 I/O 支持。
    其中 Openstack 为了跨 VM 性,所以不会直接控制 QEMU-KVM,而是通过 libvit 的库去间接控制 QEMU-KVM 。
    在这里插入图片描述

参考资料:1,

2、libvirt介绍

kvm、libvirt、qemu,三者的关系与区别

  • KVM 是 Linux 系统的虚拟化核心,提供直接的硬件支持,允许多个操作系统在同一物理机上运行。
  • QEMU 是一个 emulator 和 hypervisor,能够模拟多种硬件架构,并与 KVM 结合使用以实现高效的虚拟化。
  • libvirt 是一个底层管理工具集和 API,提供与 KVM 和 QEMU 的交互,使得虚拟机的创建、配置、监视等操作更为便捷。
  • virt-manager 是一个工具,基于 libvirt 提供的功能,提供了图形化管理的便捷性。
  • Proxmox VE 是一个集成平台,它使用 libvirt 来管理 KVM 和 LXC,但提供了更完整的功能和用户界面。
  • VMware ESXi 是一个独立的专有平台,提供全面的虚拟化支持,但相较于前面提到的工具更为封闭

在这里插入图片描述

libvirt 是一个开源的 API,工具和守护进程集,用于管理虚拟化平台
它提供了一种统一的方法来与各种虚拟化技术(如 KVM, QEMU, Xen, LXC 等)进行交互。

  1. 统一接口libvirt 提供了一个一致的 API,使得开发人员可以使用相同的方式管理不同的虚拟化技术。这消除了与多个虚拟化平台直接交互的复杂性。
  2. 支持多个虚拟化技术: - 支持 KVM、Xen、VMware、LXC、OpenVZ、QEMU 等多种后端,允许用户在同一平台上运行多种虚拟机。
  3. 丰富的功能
    虚拟机管理:创建、删除、启动、停止、暂停和恢复虚拟机。
    网络管理:创建和管理虚拟网络,DNS、DHCP 服务等。
    存储管理:管理虚拟磁盘、快照和存储池。
    资源监控:收集虚拟机及宿主机的性能数据。
  4. 安全性
    提供了与 SELinux 和 AppArmor 等安全模块的集成,增强了对虚拟环境的安全管理。
  5. 广泛的语言绑定
    libvirt 提供了多种编程语言的绑定,包括 C, Python, Java, Go 等,方便开发者在自己熟悉的环境中使用。
  6. 图形界面工具
    提供了如 virt-manager 的图形界面工具,简化了虚拟机的管理操作。
  • 使用场景
    数据中心虚拟化:广泛应用于数据中心的虚拟化管理,可以高效地管理和调度多个虚拟机。
    开发与测试环境:开发人员可以快速创建和销毁虚拟机进行测试,而不影响主操作系统。
    私有云解决方案:作为许多云平台的基础组件,libvirt 可以帮助构建和管理私有云基础架构。
    在这里插入图片描述
    在这里插入图片描述
# 虚拟化简单环境
yum:
- qemu-kvm
- libvirt
- virt-install
- virt-manager
- libguestfs-tools
- bridge-utils

参考资料:1,2

3、使用libvirt搭建虚拟化平台

libvirt的使用

  • Libvirt主要由三个部分组成:API库,一个守护进程libvirtd和一个默认命令行管理工具 virsh
  • Tips:在Python、Perl、Java、Ruby、PHP、OCaml等高级编程语言中已经有libvirt的程序库可以直接使用。
  • 守护进程:
    守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。1, 2
    守护进程程序的名称通常以字母d结尾,以指明这个进程实际是守护进程,并与普通的电脑程序区分开来。例如,syslogd就是指管理系统日志的守护进程,sshd是接收传入SSH连接的守护进程。
    什么时候需要写一个 Daemon
    日常工作中,我们经常需要写一个脚本来处理一些事情,例如:消息推送;与商户系统进行对账;数据迁移;商户后台系统健康度监测;其他的一些处理任务,etc
    其实说是 Daemon,但这里更多的案例是定时任务,使用 crontab 定时拉起 Daemon 进行任务处理。
  • libvirtd的使用 1, 2, libvirt sdk
virsh net-start default
systemctl start libvirtd & systemctl enable libvirtd

libvirt-go

package mainimport ("github.com/libvirt/libvirt-go-xml""github.com/libvirt/libvirt-go""log"
)func main() {// 连接到 libvirt 守护进程conn, err := libvirt.NewConnect("qemu:///system")if err != nil {log.Fatalf("Failed to connect to hypervisor: %v", err)}defer conn.Close()// 列出所有虚拟机doms, err := conn.ListAllDomains(0)if err != nil {log.Fatalf("Failed to list domains: %v", err)}for _, dom := range doms {name, _ := dom.GetName()log.Printf("Domain: %s", name)}
}

libvirt-java

import org.libvirt.*;public class LibvirtExample {public static void main(String[] args) {try {// 连接到 libvirt 守护进程Connection conn = new Connect("qemu:///system", false);// 列出所有虚拟机String[] domainIds = conn.listDomains();for (String id : domainIds) {System.out.println("Domain: " + id);}conn.close();} catch (LibvirtException e) {e.printStackTrace();}}
}

libvirt C API

#include <libvirt/libvirt.h>
#include <iostream>int main() {// 连接到 libvirt 守护进程virConnectPtr conn = virConnectOpen("qemu:///system", nullptr);if (conn == nullptr) {std::cerr << "Failed to connect to hypervisor." << std::endl;return 1;}// 获取所有虚拟机名称int numDomains = 0;virDomainPtr* domains;domains = virConnectListAllDomains(conn, &numDomains);for (int i = 0; i < numDomains; i++) {char* name = virDomainGetName(domains[i]);std::cout << "Domain: " << name << std::endl;virDomainFree(domains[i]);}virConnectClose(conn);return 0;
}

参考资料:1, 2, 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同行评审流程详解

同行评审流程中&#xff0c;稿件被拒很正常&#xff0c;可能是由于稿件结构有问题&#xff0c;论据不足&#xff0c;表达不准确等诸多因素&#xff0c;接下来带你走一遍同行评审流程&#xff0c;看论文投稿过程中有哪些拦路虎&#xff0c;掌握拒稿因素&#xff0c;论文投稿才能…

C++类和对象——第四关通关

阅读本文章前建议先阅读博主C专栏的前几篇文文章&#xff0c;以便更好的理解本文章。 目录 &#xff08;1&#xff09;构造函数续 初始化列表&#xff1a; &#xff08;2&#xff09;类类型转换&#xff1a; &#xff08;3&#xff09;staic成员 &#xff08;4&#xff0…

在英伟达NIM中测试OCDRNET

OCDRNET结合了OCR和OCD模型的相关内容&#xff0c; 一、OCRNet 模型概述 1.该模型的作用是从灰度图像中识别字符。OCRNet的基础架构是ResNet50&#xff0c;模型版本有&#xff1a; trainable_v1.0 - Pre-trained model with ResNet backbone on scene text.deployable_v1.0 …

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-ce…

centos系列图形化 VNC server配置,及VNC viewer连接,2024年亲测有效

centos系列图形化 VNC server配置&#xff0c;及VNC viewer连接 0.VNC服务介绍 VNC英文全称为Virtual Network Computing&#xff0c;可以位操作系统提供图形接口连接方式&#xff0c;简单的来说就是一款桌面共享应用&#xff0c;类似于qq的远程连接。该服务是基于C/S模型的。…

Ubuntu QT 交叉编译环境搭建

文章目录 下载安装qtCreatornot a valid identifier 的错误 安装g下载并安装交叉编译器下载交叉编译器安装交叉编译器 下载编译 ARM 的Qt平台源码配置arm的QT平台 下载安装qtCreator 去QT下载官网下载对应需要的QT软件。 这里下载5.12.96版本的 改变安装包权限&#xff0c;…

cocos中Sprite的填充模式

做进度条效果会用到Sprite的填充模式: cocoscreator教程&#xff1a;制作进度条_哔哩哔哩_bilibili

对接优惠折扣影票接口有什么好处?

对接电影票接口可以为开发者、商家和用户提供多种好处&#xff0c;以下是一些主要优势&#xff1a; 便捷性&#xff1a;用户可以直接在应用程序或网站上查询电影信息、选择座位和购票&#xff0c;无需离开平台即可完成整个购票流程。 提高用户粘性&#xff1a;为用户提供一站式…

chrome清除https状态

莫名其妙的http跳转到https的url了。 解决办法 浏览器地址栏输入&#xff1a;chrome://net-internals/#hsts 输入你需要删除的域名即可&#xff01;&#xff01;&#xff01;

uni-app 打包成app时 限制web-view大小

今天对接一个uni-app的app 内置对方h5 web-view的形式 需要对方在web-view顶部加点东西 对方打的app的web-view始终是全屏的状态&#xff0c;对方表示做不到我要的效果 emmmmmm。。。。。。 于是乎 自己搭了个demo 本地h5跑起来审查了下代码&#xff0c;发现web-view是给绝对定…

影刀RPA实战:操作Mysql数据库

1.摘要 影刀RPA&#xff08;Robotic Process Automation&#xff09;是一种软件自动化工具&#xff0c;它可以模拟人类用户执行各种重复性任务&#xff0c;其中包括对数据库的操作。 我们可以使用软件自动化指令&#xff0c;通过获取数据库窗口对象来操作数据库&#xff0c;也…

Java项目:157 基于springboot技术的美食烹饪互动平台的设计与实现(含论文+说明文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本知识管理系统有管理员和用户两个角色 管理员权限操作的功能包括管理美食&#xff0c;对美食留言进行回复&#xff0c;管理美食知识信息&…

安装和配置k8s可视化UI界面dashboard-1.20.6

安装和配置k8s可视化UI界面dashboard-1.20.6 1.环境规划2.初始化服务器1&#xff09;配置主机名2&#xff09;设置IP为静态IP3&#xff09;关闭selinux4&#xff09;配置主机hosts文件5&#xff09;配置服务器之间免密登录6&#xff09;关闭交换分区swap&#xff0c;提升性能7&…

QT QML 练习8-Simple Transformations

简单的转换&#xff08;Simple Transformations&#xff09; 转换操作改变了一个对象的几何状态。QML元素对象通常能够被平移&#xff0c;旋转&#xff0c;缩放。下面我们将讲解这些简单的操作和一些更高级的用法。 我们先从一个简单的转换开始。用下面的场景作为我们学习的开始…

Qt- QSS风格选择器常用属性选择器样式表盒子

1. 风格设置 Qt 提供了 3 种整体风格&#xff0c;使用 QStyleFactory::keys() 来获取 &#xff08;windowsvista 、Windows 、Fusion&#xff09; 可以在 main.cpp 中调用 setStyle 方法对应用程序进行全局风格的设置 int main(int argc, char *argv[]) {QApplication a(arg…

Redis协议详解及其异步应用

目录 一、Redis Pipeline&#xff08;管道&#xff09;概述优点使用场景工作原理Pipeline 的基本操作步骤C 示例&#xff08;使用 [hiredis](https://github.com/redis/hiredis) 库&#xff09; 二、Redis 事务概述事务的前提事务特征&#xff08;ACID 分析&#xff09;WATCH 命…

爱快路由器配置腾讯云动态域名DDNS详细说明

直白点说就是让爱快路由器自动配置当前公网IP地址给域名&#xff0c;动态域名DDNS不清楚的请自行百度&#xff0c; 这里就可以看见操作日志&#xff0c;那么我们一步一步来配置它吧&#xff0c;首先登录爱快路由器&#xff0c;如下图&#xff1a; 那么腾讯云我们怎么找到ID和…

koa知否论坛交流系统的设计与实现---附源码53933

目 录 1 绪论 1.1研究背景 1.2研究意义 1.3论文结构与章节安排 2 知否论坛交流系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4本章小…

Spring Boot环境下的大创项目质量保证系统

3系统分析 3.1可行性分析 通过对本大创管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大创管理系统采用SSM框架&#xff0c;JAVA作为开发语言&#…

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后&#xff0c;按照以下流程完成系统各个服务和应用的启动&#xff1a; 内核加载init进程&#xff0c;一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后&#xff0c;会挂载tmpfs&#xff0c;…