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

news2024/12/23 19:06:37

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

import (
    "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.coloradmin.cn/o/2200964.html

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

相关文章

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十四章 安装 Samba

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

举个栗子!Tableau 技巧(283):用山丘图呈现项目周期

人们常常用爬山来比喻工作中做项目的过程&#xff1a;明确目标、规划路线、团队合作、应对挑战&#xff0c;然后享受登顶并在下山后总结经验教训。 图片来自网络 在 Tableau 中做项目分析时&#xff0c;将一段时期的项目用山丘图来呈现&#xff0c;山丘大小代表项目周期的时间…

RAG(Retrieval-Augmented Generation,检索增强生成)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合信息检索与生成式模型的混合架构&#xff0c;旨在提升自然语言生成任务的准确性、丰富性和知识覆盖范围。它通过在生成过程…

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…

基于Vue3+pinia+vue-router+axios+element-plus等开发的新闻发布管理系统

新闻发布管理系统是一个基于Vue3piniavue-routeraxioselement-plus等开发的系统&#xff0c;主要功能包括&#xff1a;登录模块、注册模块、新闻分类管理模块、新闻管理模块、个人中心模块&#xff08;包括基本资料、更换头像、重置密码功能&#xff09;等。 代码下载&#xf…

指针式表盘指针关键部位分割系统源码&数据集分享

指针式表盘指针关键部位分割系统源码&#xff06;数据集分享 [yolov8-seg-LSKNet&#xff06;yolov8-seg-C2f-EMSC等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Gl…

MAX模型转为las点云模型

在做一个小项目&#xff0c;探测闯入的野生动物。在做案例&#xff0c;需要用到一些野生动物的点云模型。公开的模型像斯坦福等学术机构&#xff0c;以及Thingiverse、Digital Morphology都没有合适的。但是在一些3d数据库中可以下载到max模型&#xff0c;如图1所示。通过3dmax…

英伟达RTX 5090和RTX 5080

英伟达RTX 5090和RTX 5080 一、英伟达RTX 5090和RTX 5080显卡参数的更为详细的介绍&#xff1a; RTX 5090 显卡参数 GPU核心与架构 核心代号&#xff1a;GB202-300-A1。 架构&#xff1a;Blackwell架构&#xff0c;这是英伟达最新的显卡架构&#xff0c;旨在提供更高的性能…

C++内部类和匿名对象

1.内部类 内部类就是定义在一个类的内部的类&#xff0c;比如 #include<iostream> using namespace std; class AA{ public:class BB {public:void print(const AA& A){cout << A.aa1 << " " << A.aa2 << endl;}private:}; priv…

RabbitMQ初识

目录 Kafka RocketMQ RabbitMQ MQ界面(它使用的端口号5672&#xff0c;界面是15672&#xff09; 如何添加一个虚拟机&#xff0c;点击右侧 Topics&#xff08;通配符模式&#xff09; 发布确认机制 持久性(可靠性保证的机制之一) JDK17,Linux服务器Ubuntu 什么是MQ 实…

recyclerView(kotlin)

recyclerView的优点 使用viewHolderRecycledViewPool的方式复用资源&#xff0c;提高性能利用LayoutManager&#xff0c;可根据不同需求使用不同的布局&#xff0c;且可以方便使用对应布局提供的方法&#xff0c;如快速定位item等。RecyclerView 提供了一个 ItemAnimator 接口…

msvcp110丢失怎么解决?三种方法教你修复msvcp110.dll丢失

1. msvcp110.dll 概述 1.1 定义与作用 msvcp110.dll 是 Microsoft Visual C 2012 Redistributable Package 的一部分&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;对运行时环境至关重要。这个文件包含了 C 标准库的实现&#xff0c;为基于 Vis…

ssm智能社区管理系统的设计与实现

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B…

代码质量管理 SonarScanner 扫描分析实战

在软件开发过程中&#xff0c;代码质量管理是一个至关重要但往往被忽视的环节。糟糕的代码不仅会增加维护成本&#xff0c;还可能导致不可预见的Bug和系统崩溃。如何用更有效的工具来保障代码质量呢&#xff1f;今天&#xff0c;我们将聚焦 SonarScanner&#xff0c;一个高效的…

51单片机的智能水温控制系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器LED和按键等模块构成。适用于智能热水器控制、泳池水温控制系统等相似项目。 可实现功能: 1、LCD1602实时显示水温信息和上下限 2、温度传感器DS18B20采集水体温度 3、当温度低于下限&#xff0…

如何更改CubeIDE的字体大小

开门见山&#xff0c;CubeIDE整个软件都是基于eclipse的&#xff0c;所以这种操作完全互通。 代码字体 ①点击Window->Preference ②在这个选项卡内&#xff0c;单击Apperance栏目下的Colors and Fonts&#xff0c;然后选中C/C/Editor栏目下的C/C Editor Text Font&#x…

OBOO鸥柏:布局于为元宇宙AI人工智能产业保障LCD液晶显示终端

新华网快讯&#xff0c;于10月7日消息&#xff0c;有投资者在互动平台向OBOO鸥柏提问&#xff1a;您好 请问作为中国专注于商用液晶显示屏领域的科技公司&#xff0c;公司有哪些工业/商用显示产品应用于数字化元宇宙AI人工智能领域&#xff1f;能否着重介绍下对于AI展馆展厅如何…

springboot宿舍管理-计算机毕业设计源码40740

摘要 宿舍管理系统作为一种利用信息技术改善学生住宿管理的工具&#xff0c;在大学宿舍管理中具有重要的实际意义。本文通过对国内外研究现状的调查和总结&#xff0c;探讨了宿舍管理系统的论文主题、研究背景、研究目的、研究意义以及主要研究内容。 首先&#xff0c;宿舍管理…

Python的pandas库基本操作(数据分析)

一、安装&#xff0c;导入 1、安装 使用包管理器安装&#xff1a; pip3 install pandas 2、导入 import pandas as pd as是为了方便引用起的别名 二、DateFrame 在Pandas库中&#xff0c;DataFrame 是一种非常重要的数据结构&#xff0c;它提供了一种灵活的方式来存储和…

Python数据分析教程09:层次分析法的方根法和求和法的实现

目录 1 求和法计算权重的方法以及代码示例 1.1 理论原理 1.2 代码实现 2 方根法计算权重的方法以及代码示例 2.1 理论方法 2.2 代码实现 感谢B站博主的视频:https://www.bilibili.com/video/BV1At421E7jE 作者详细推导了方根法和求和法两类方案的计算过程,有兴趣的同学…