当前位置: 首页 > news >正文

【虚拟化】内核级虚拟化技术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

相关文章:

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

【虚拟化】内核级虚拟化技术KVM介绍&#xff0c;全/半虚拟化的区别&#xff0c;使用libvirt搭建虚拟化平台&#xff08;go/java/c&#xff09; 文章目录 1、虚拟化技术分类与架构&#xff08;KVM&#xff0c;Xen&#xff09;&#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…...

C++类成员变量的初始化

1、优先使用或{} 类的非静态数据成员在声明时&#xff0c;使用或{}进行初始化执行默认初始化&#xff0c;构造函数只处理一些特殊成员。 2、直接初始化 使用()进行初始化、new运算符和类构造函数的初始化列表。 3、拷贝初始化 使用进行初始化、函数传参、函数返回值。 隐式调用…...

Golang 中的强大 TUI 库 ——tview

在命令行界面下创建丰富的用户交互界面是许多开发者的需求&#xff0c;而 Golang 语言中有一个非常出色的 TUI&#xff08;文本用户界面&#xff09;库 ——tview。本文将详细介绍 tview 库&#xff0c;并与其他流行的 TUI 库进行对比&#xff0c;最后进行总结。 一、tview 库介…...

电层相关 -- 支路板与线路板

华为OTN产品系列支持 支路板、线路板分离架构 。支路/线路板和集中交叉单板配合使用&#xff0c;除了可以完成OTU单板功能外&#xff0c;还可通过集中交叉单板进行各级别ODUk颗粒业务调度&#xff0c; 实现更加灵活的电层信号调度及更高的带宽利用率。 支路板 功能 实现客户…...

leetcode 93.复原ip地址

1.题目要求&#xff1a; 2.题目代码: class Solution { public:vector<string> result;// 记录结果// startIndex: 搜索的起始位置&#xff0c;pointNum:添加逗点的数量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum 3) { // 逗点数…...

AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案

随着信息技术的飞速发展和智能制造的深入推进&#xff0c;火电制造行业作为国民经济的重要组成部分&#xff0c;正面临着智能化转型的迫切需求。为了提升生产效率、保障设备安全、优化管理流程&#xff0c;火电制造企业迫切需要引入先进的视频监控与人工智能技术。EasyCVR安防监…...

UIP协议栈 TCP Server Client通信成功案例

文章目录 这里边有相当好的 [UIP 文档资料&#xff0c;文档位置在仓库的UIP/uip doc &#xff0c;括号内是仓库地址&#xff08;https://gitee.com/free-people-in-time-and-space/net-work-learn-note.git &#xff09;TCP Server1.main循环里做的事2.以下是main循环里相关函数…...

Android Studio Koala Feature Drop 稳定版现已推出

作者 / Android Studio 产品经理 Sandhya Mohan Android Studio Koala Feature Drop (2024.1.2) 现已推出&#xff01;&#x1f428; &#x1f517; Android Studio https://developer.android.google.cn/studio 今年早些时候&#xff0c;我们宣布每个 Android Studio 动物版本…...

胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮

AI评估的迷雾&#xff0c;LightEval能否拨云见日&#xff1f; 想象一下&#xff0c;你是一位AI模型的开发者&#xff0c;精心打造了一个智能助手&#xff0c;却在最终评估阶段遭遇了意外的“滑铁卢”。 问题出在哪里&#xff1f;是模型本身不够聪明&#xff0c;还是评估标准太过…...

Python安装|PyCharm Professional 下载安装教程。2024最新版,亲测使用!

一、下载地址&#xff1a; 二、Python的下载及安装&#xff1a; 1、从上面网址进入Python官网 2、安装流程图&#xff1a; 双击已经下载好的python-*.*.*-amd64.exe文件&#xff0c;开始安装 最后就等它自己安装完成就好了 3、检验是否安装完成&#xff1a; windowsR快捷键…...

JavaSwitch控制流语句

在Java中&#xff0c;switch语句是一种控制流语句&#xff0c;用于根据变量的不同值执行不同的代码块。它提供了一种替代if-else语句的方式&#xff0c;使代码更简洁和易于阅读。以下是switch语句的基本语法和使用示例。 基本语法 switch (expression) {case value1:// 执行代码…...

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…...

肺结节分割与提取系统(基于传统图像处理方法)

Matlab肺结节分割(肺结节提取)源程序&#xff0c;GUI人机界面版本。使用传统图像分割方法&#xff0c;非深度学习方法。使用LIDC-IDRI数据集。 工作如下&#xff1a; 1、读取图像。读取原始dicom格式的CT图像&#xff0c;并显示&#xff0c;绘制灰度直方图&#xff1b; 2、图像…...

ESP32 COAP 客户端观察者模式下,GET服务器的例程

目录 环境准备 示例代码 代码解释 初始化: CoAP 上下文和会话: 注册响应处理函数: 创建和发送 GET 请求: 处理响应: 主循环: 注意事项 ESP32 是一款功能强大的微控制器,支持多种通信协议,包括 CoAP(Constrained Application Protocol)。CoAP 是一种专为物联…...

【Kubernetes】常见面试题汇总(五十七)

目录 125. K8S 创建服务 status 为 ErrlmagePull&#xff1f; 126.不能进入指定容器内部&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 …...

Java 设计模式 构建者模式

文章目录 1 概念2 使用方法1 创建步骤&#xff1a;2 使用步骤&#xff1a; 参考 1 概念 builder模式又叫建造者模式&#xff0c;属于创建型模式 作用&#xff1a;将一个复杂对象的构建与他的表示分离&#xff0c;可以一步一步构建对象&#xff0c;而不是使用构造函数构造一次…...

建设企业网站如何建

首先&#xff0c;企业网站是企业数字化转型的重要组成部分。在数字化浪潮的冲击下&#xff0c;企业需要通过建设网站来实现信息化管理&#xff0c;提高工作效率。通过企业网站&#xff0c;企业可以便捷地发布最新产品信息、公司新闻、招聘信息等&#xff0c;极大地提升了信息传…...

C++ inline 的更进一步理解

文章目录 1.概述2.ODR(One Definition Rule)问题3.范例测试代码4.好坏分析 ODR: One Definition Rule&#xff0c;即单一定义规则&#xff0c; C 语言中非常重要的一项规则&#xff0c;它确保程序的行为一致性并避免链接时出现冲突。ODR 的核心思想是在整个程序中&#xff0c;每…...

海康威视云台相机图像获取

直接上代码&#xff1a; import cv2# 替换为正确的RTSP链接 rtsp_url rtsp://admin:abcd12345192.168.1.64:554/h264/ch1/main/av_stream cap cv2.VideoCapture(rtsp_url)if not cap.isOpened():print("无法打开视频流&#xff0c;检查RTSP URL和凭证") else:whil…...

什么是词嵌入(Word Embedding)

1. 什么是词嵌入(Word Embedding) ⾃然语⾔是⼀套⽤来表达含义的复杂系统。在这套系统中&#xff0c;词是表义的基本单元。顾名思义&#xff0c;词向量是⽤来表⽰词的向量&#xff0c;也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌⼊&#xff08;word e…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...