libvirt学习

文章目录

    • libvirt 简介
    • 节点、Hypervisor和域
    • libvirt 安装和配置
    • libvirt的XML配置文件
    • libvirt API
      • Main libvirt APIs
      • Error handling
      • Special specific APIs
    • 建立到Hypervisor的连接
    • libvirt API使用
    • 编译libvirt
    • 工具
      • virsh
      • virt-clone
      • virt-df
      • virt-image
      • virt-install
      • virt-top
      • virt-what
      • virt-p2v
      • virt-v2v
      • virt-manager
      • virt-viewer
      • qt-virt-manager
      • qt-remote-viewer
      • guestfish
      • libguestfs
    • 总结
    • 参考

本文对libvirt概念和原理做简单介绍,作为对libvirt使用入门。

libvirt 简介

libvirt是为了更方便地管理平台虚拟化技术而设计的开放源代码的应用程序接口、守护进程和管理工具,它不仅提供了对虚拟化客户机的管理,也提供了对虚拟化网络和存储的管理。
libvirt支持多种虚拟化方案,既支持包括KVM、QEMU、Xen、VMware、VirtualBox、Hyper-V等在内的平台虚拟化方案,也支持OpenVZ、LXC等Linux容器虚拟化系统,还支持用户态Linux(UML)的虚拟化。
在这里插入图片描述
libvirt本身提供了一套较为稳定的C语言应用程序接口,目前,在其他一些流行的编程语言中也提供了对libvirt的绑定,在Python、Perl、Java、Ruby、PHP、OCaml等高级编程语言中已经有libvirt的程序库可以直接使用。libvirt还提供了为基于AMQP(高级消息队列协议)的消息系统(如Apache Qpid)提供QMF代理,这可以让云计算管理系统中宿主机与客户机、客户机与客户机之间的消息通信变得更易于实现。libvirt还为安全地远程管理虚拟客户机提供了加密和认证等安全措施。

libvirt对多种不同的Hypervisor的支持是通过一种基于驱动程序的架构来实现的。libvirt对不同的Hypervisor提供了不同的驱动:对Xen有Xen的驱动,对QEMU/KVM有QEMU驱动,对VMware有VMware驱动。在libvirt源代码中,可以很容易找到qemu_driver.c、xen_driver.c、xenapi_driver.c、VMware_driver.c、vbox_driver.c这样的驱动程序源代码文件。

ibvirt作为中间适配层,可以让底层Hypervisor对上层用户空间的管理工具是完全透明的,因为libvirt屏蔽了底层各种Hypervisor的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。通过libvirt,一些用户空间管理工具可以管理各种不同的Hypervisor和上面运行的客户机

节点、Hypervisor和域

在libvirt中涉及几个重要的概念,解释如下:

  • 节点(Node)是一个物理机器,上面可能运行着多个虚拟客户机。Hypervisor和Domain都运行在节点上。
  • Hypervisor也称虚拟机监控器(VMM),如KVM、Xen、VMware、Hyper-V等,是虚拟化中的一个底层软件层,它可以虚拟化一个节点让其运行多个虚拟客户机(不同客户机可能有不同的配置和操作系统)。
  • 域(Domain)是在Hypervisor上运行的一个客户机操作系统实例。域也被称为实例(instance,如在亚马逊的AWS云计算服务中客户机就被称为实例)、客户机操作系统(guest OS)、虚拟机(virtual machine),它们都是指同一个概念。

节点、Hypervisor和域的关系:
在这里插入图片描述

libvirt 安装和配置

libvirt的XML配置文件

在使用libvirt对虚拟化系统进行管理时,很多地方都是以XML文件作为配置文件的,包括客户机(域)的配置、宿主机网络接口配置、网络过滤、各个客户机的磁盘存储配置、磁盘加密、宿主机和客户机的CPU特性,等等。本节只针对客户机的XML进行较详细介绍,因为客户机的配置是最基本的和最重要的,了解了它之后就可以使用libvirt管理客户机了。
关于各种配置的XML,可以直接参考libvirt官方文档:XML Format

libvirt API

ibvirt的核心价值和主要目标就是提供一套管理虚拟机的、稳定的、高效的应用程序接口(API)。libvirt API本身是用C语言实现的,本节以其提供的最核心的C语言接口的API为例进行简单的介绍。
从libvirt官方文档看,主要API分成以下几类:

Main libvirt APIs

libvirt-common

common macros and enums for the libvirt and libvirt-admin library

libvirt-domain-checkpoint

APIs for management of domain checkpoints

libvirt-domain-snapshot

APIs for management of domain snapshots

libvirt-domain

APIs for management of domains

libvirt-event

APIs for management of events

libvirt-host

APIs for management of hosts

libvirt-interface

APIs for management of interfaces

libvirt-network

APIs for management of networks

libvirt-nodedev

APIs for management of nodedevs

libvirt-nwfilter

APIs for management of nwfilters

libvirt-secret

APIs for management of secrets

libvirt-storage

APIs for management of storage pools and volumes

libvirt-stream

APIs for management of streams

Error handling

virterror

error handling interfaces for the libvirtlibrary

Special specific APIs

admin interface

APIs for management of the libvirt daemons

qemu driver

qemu-driver specific APIs

lxc driver

lxc-driver specific APIs

建立到Hypervisor的连接

对于一个libvirt连接,可以使用简单的客户端-服务器端(C/S)的架构模式来解释,一个服务器端运行着Hypervisor,一个客户端去连接服务器端的Hypervisor,然后进行相应的虚拟化管理。当然,如果通过libvirt API实现本地的管理,则客户端和服务器端都在同一个节点上,并不依赖于网络连接。一般来说(如基于QEMU/KVM的虚拟化方案),不管是基于libvirt API的本地管理还是远程管理,在服务器端的节点上,除了需要运行相应的Hypervisor以外,还需要让libvirtd这个守护进程处于运行中的状态,以便让客户端连接到libvirtd,从而进行管理操作。

由于支持多种Hypervisor,libvirt需要通过唯一的标识来指定如何才能准确地连接到本地或远程的Hypervisor。为了达到这个目的,libvirt使用了在互联网应用中广泛使用的URI(Uniform Resource Identifier,统一资源标识符)来标识到某个Hypervisor的连接。libvirt中连接的标识符URI,其本地URI和远程URI有一些区别,下面分别介绍一下它们的使用方式。

  1. 本地URI
    在libvirt的客户端使用本地的URI连接本系统范围内的Hypervisor,本地URI的一般格式如下:
driver[+transport]:///[path][?extraparameters]

其中,driver是连接Hypervisor的驱动名称(如qemu、xen、xbox、lxc等),transport是选择该连接所使用的传输方式(可以为空,也可以是“unix”这样的值),path是连接到服务器端上的某个路径,?extraparameters是可以额外添加的一些参数(如Unix domain sockect的路径)。

  1. 远程URI
    除了本地管理,libvirt还提供了非常方便的远程的虚拟化管理功能。libvirt可以使用远程URI来建立到网络上的Hypervisor的连接。远程URI和本地URI是类似的,只是会增加用户名、主机名(或IP地址)和连接端口来连接到远程的节点。远程URI的一般格式如下:
driver[+transport]://[user@][host][:port]/[path][?extraparameters]

其中,transport表示传输方式,其取值可以是ssh、tcp、libssh2等;user表示连接远程主机使用的用户名,host表示远程主机的主机名或IP地址,port表示连接远程主机的端口。其余参数的意义与本地URI中介绍的完全一样。
在远程URI连接中,也存在使用system实例和session实例两种方式,这二者的区别和用途,与本地URI中介绍的内容是完全一样的。

更加详细的内容说明可以参考官方文档:Connection URIs

libvirt API使用

如下一个简单的C程序就是通过调用libvirt的API来查询一些关于某个域的信息。该示例程序比较简单易懂,它仅仅是使用libvirt API的一个演示程序,这里不做过多的介绍。不过,这里有三点需要注意:

  1. 需要在示例代码的开头引入<libvirt/libvirt.h>这个头文件;
  2. 由于只是实现查询信息的功能,所以可以使用virConnectOpenReadOnly来建立只读连接;
  3. 这里使用了空值(NULL)作为URI,是让libvirt自动根据默认规则去建立到Hypervisor的连接。这里由于本地已经运行了libvirtd守护进程,并启动了两个QEMU/KVM客户机,所以它默认会建立到QEMU/KVM的连接。
/**
 * Get domain information via libvirt C API.
 * Tested with libvirt-devel-2.0.0 on a RHEL 7.3 host system.
 */
#include <libvirt/libvirt.h>
#include <stdio.h>

int getDomainInfo(int id) {
  virConnectPtr conn = NULL; /* the hypervisor connection */
  virDomainPtr dom = NULL;   /* the domain being checked */
  virDomainInfo info;        /* the information being fetched */
  /* NULL means connect to local QEMU/KVM hypervisor */
  conn = virConnectOpenReadOnly(NULL);
  if (conn == NULL) {
    fprintf(stderr, "Failed to connect to hypervisor\n");
    return 1;
  }
  /* Find the domain by its ID */
  dom = virDomainLookupByID(conn, id);
  if (dom == NULL) {
    fprintf(stderr, "Failed to find Domain %d\n", id);
    virConnectClose(conn);
    return 1;
  }
  /* Get virDomainInfo structure of the domain */
  if (virDomainGetInfo(dom, &info) < 0) {
    fprintf(stderr, "Failed to get information for Domain %d\n", id);
    virDomainFree(dom);
    virConnectClose(conn);
    return 1;
  }
  /* Print some info of the domain */
  printf("Domain ID: %d\n", id);
  printf(" vCPUs: %d\n", info.nrVirtCpu);
  printf(" maxMem: %d KB\n", info.maxMem);
  printf(" memory: %d KB\n", info.memory);
  if (dom != NULL)
    virDomainFree(dom);
  if (conn != NULL)
    virConnectClose(conn);
  return 0;
}
int main(int argc, char **argv) {
  int dom_id = 1;
  printf("-----Get domain info by ID via libvirt C API -----\n");
  getDomainInfo(dom_id);
  return 0;
}

编译

gcc libvirt-demo.c -o libvirt-demo -lvirt

运行

$ sudo ./libvirt-demo 
-----Get domain info by ID via libvirt C API -----
Domain ID: 1
 vCPUs: 2
 maxMem: 4194304 KB
 memory: 4194304 KB

编译libvirt

libvirt 源码地址:https://gitlab.com/libvirt/libvirt.git
编译过程参考源码中的docs/compiling.rst文档即可,编译完之后在构建目录下有对应的库、管理工具、deamon程序和测试程序。

工具

许多工具都在使用libvirt提供的功能,下面介绍几个常见的工具,更多的介绍参考官方文档:Applications using libvirt。

virsh

libvirt项目的源代码中就包含了virsh这个虚拟化管理工具的代码。virsh 是用于管理虚拟化环境中的客户机和Hypervisor的命令行工具,与virt-manager等工具类似,它也是通过调用libvirt API来实现虚拟化的管理的,是完全在命令行文本模式下运行的用户态工具。
virsh是用C语言编写的一个使用libvirt API的虚拟化管理工具。virsh程序的源代码在libvirt项目源代码的tools目录下,实现virsh工具最核心的一个源代码文件是virsh.c。
通过virsh,我们可以在命令行管理虚拟化环境,如何使用virsh可以通过查看virsh帮助文档或者查看其他资料。

virt-clone

Allows the disk image(s) and configuration for an existing virtual machine to be cloned to form a new virtual machine. It automates copying of data across to new disk images, and updates the UUID, MAC address, and name in the configuration.

virt-df

Examine the utilization of each filesystem in a virtual machine from the comfort of the host machine. This tool peeks into the guest disks and determines how much space is used. It can cope with common Linux filesystems and LVM volumes.

virt-image

Provides a way to deploy virtual appliances. It defines a simplified portable XML format describing the pre-requisites of a virtual machine. At time of deployment this is translated into the domain XML format for execution under any libvirt hypervisor meeting the pre-requisites.

virt-install

Provides a way to provision new virtual machines from a OS distribution install tree. It supports provisioning from local CD images, and the network over NFS, HTTP and FTP.

virt-top

Watch the CPU, memory, network and disk utilization of all virtual machines running on a host.

virt-what

virt-what is a shell script for detecting if the program is running in a virtual machine. It prints out a list of facts about the virtual machine, derived from heuristics.

virt-p2v

Convert a physical machine to run on KVM. It is a LiveCD which is booted on the machine to be converted. It collects a little information from the user, then copies the disks over to a remote machine and defines the XML for a domain to run the guest. (Note this tool is included with libguestfs)

virt-v2v

virt-v2v converts guests from a foreign hypervisor to run on KVM, managed by libvirt. It can convert guests from VMware or Xen to run on OpenStack, oVirt (RHEV-M), or local libvirt. It will enable VirtIO drivers in the converted guest if possible. (Note this tool is included with libguestfs) For RHEL customers of Red Hat, conversion of Windows guests is also possible. This conversion requires some Microsoft signed pieces, that Red Hat can provide.

virt-manager

A general purpose desktop management tool, able to manage virtual machines across both local and remotely accessed hypervisors. It is targeted at home and small office usage up to managing 10-20 hosts and their VMs.

virt-viewer

A lightweight tool for accessing the graphical console associated with a virtual machine. It can securely connect to remote consoles supporting the VNC protocol. Also provides an optional mozilla browser plugin.

qt-virt-manager

The Qt GUI for create and control VMs and another virtual entities (aka networks, storages, interfaces, secrets, network filters). Contains integrated LXC/SPICE/VNC viewer for accessing the graphical or text console associated with a virtual machine or container.

qt-remote-viewer

The Qt VNC/SPICE viewer for access to remote desktops or VMs.

guestfish

Guestfish is an interactive shell and command-line tool for examining and modifying virtual machine filesystems. It uses libvirt to find guests and their associated disks.

libguestfs

A library and set of tools for accessing and modifying virtual machine disk images. It can be linked with C and C++ management programs, and has bindings for Perl, Python, Ruby, Java, OCaml, PHP, Haskell, and C#. Using its FUSE module, you can also mount guest filesystems on the host, and there is a subproject to allow merging changes into the Windows Registry in Windows guests.

总结

libvirt是一套用于管理硬件虚拟化的开源API、守护进程与管理工具,是目前使用最广泛的虚拟化管理工具,可以协助我们从0到1构建一个基础的虚拟化管理平台。

参考

libvirt
libvirt-git
KVM实战:原理、进阶与性能调优
虚拟化技术之kvm管理工具virsh常用基础命令(一)
虚拟化技术之kvm管理工具virsh常用基础命令(二)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“进制转换”公式大集合

咱们都知道十进制是“逢10进1 ”&#xff0c;同理&#xff0c;N进制就是 “逢N进1”。进制其实就这么简单。它的麻烦之处在于各种进制之间的转换。 一、十进制整数转N进制 1&#xff0e;十进制转二进制 除2取余法&#xff1a;连续除以2&#xff0c;直到商为0&#xff0c;逆序…

线程-3-线程控制

线程资源共享 线程间绝大部分资源都是共享的&#xff08;堆栈共享区&#xff09; 线程间堆空间是共享的 谁拿着堆空间的入口地址&#xff0c;谁就能访问 共享区也是共享的&#xff08;cout&#xff0c;printf库都在共享区&#xff09; 线程间有权限访问/修改其他线程栈数据&…

1、ELK的架构和安装

ELK简介 elk&#xff1a;elasticsearch logstash kibana&#xff0c;统一日志收集系统。 elasticsearch&#xff1a;分布式的全文索引引擎的非关系数据库&#xff0c;json格式&#xff0c;在elk中存储所有的日志信息&#xff0c;架构有主和从&#xff0c;最少需要2台。 …

MetaRename for Mac,适用于 Mac 的文件批量重命名工具

在处理大量文件时&#xff0c;为每个文件手动重命名既耗时又容易出错。对于摄影师、设计师、开发人员等需要频繁处理和整理文件的专业人士来说&#xff0c;找到一款能够简化这一过程的工具是至关重要的。MetaRename for Mac 就是这样一款旨在提高工作效率的应用程序&#xff0c…

方正畅享全媒体新闻采编系统 imageProxy.do 任意文件读取漏洞复现

0x01 产品简介 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、发…

【Unity3d】C#浮点数丢失精度问题

一、float、double浮点数丢失精度问题 Unity3D研究院之被坑了的浮点数的精度&#xff08;一百零三&#xff09; | 雨松MOMO程序研究院 https://segmentfault.com/a/1190000041768195?sortnewest 浮点数丢失精度问题是由于大部分浮点数在IEEE754规范下就是无法准确以二进制…

Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案

Flink CDC 自定义函数处理 SQLServer XML类型数据方案 1. 背景 因业务使用SQLServer数据库&#xff0c;CDC同步到doris 数仓。对于SQLServer xml类型&#xff0c;doris没有相应的字段对应&#xff0c; 可以使用json来存储xml数据。需要进行一步转换。从 flink 自定义函数入手…

详解云桌面3种主流架构

本文简要介绍下云桌面&#xff08;云电脑&#xff09;的3种主流架构&#xff1a;VDI、IDV和VOI&#xff0c;概念、原理和区别&#xff0c;欢迎阅读。 云桌面作为桌面办公和云计算融合发展的产物&#xff0c;在一定程度上替代了传统的办公形式。目前阿里云、华为云、移动云、电…

按照人们阅读Excel习惯来格式化BigDecimal

1、环境/问题描述 使用springboot发送邮件(附件)的方式将月度报表发送给领导查阅&#xff0c;数据是准确的&#xff0c;领导基本满意。 就是对一些数字的格式化提出了改进建议&#xff0c;比如不要让大数字自动转为科学计数法、浮点数小数点后都是0就不要带出来&#xff0c;根…

深入解析:谱分解、SVD与PCA在算法中的应用与实现

特征值分解&#xff08;EVD&#xff09;、奇异值分解&#xff08;SVD&#xff09;和主成分分析&#xff08;PCA&#xff09;是矩阵分解技术的三种重要形式&#xff0c;它们在人工智能中扮演了关键角色。随着数据维度的快速增长和信息复杂度的提升&#xff0c;这些技术为处理高维…

连接Milvus

连接到Milvus 验证Milvus服务器正在侦听哪个本地端口。将容器名称替换为您自己的名称。 docker port milvus-standalone 19530/tcp docker port milvus-standalone 2379/tcp docker port milvus-standalone 192.168.1.242:9091/api/v1/health 使用浏览器访问连接地址htt…

记录一个我在idea启动时的报错

这几天我的idea突然就不能用了我就想着下一个新的&#xff0c;但是却一直报错报错内容如下 这个是我在网上截的pycharm的。 我在网上查了很多方法都不能用&#xff0c;今天重写安装发现我点了关联.java 和.pom和创建环境变量 这几个只需要创建一个快捷方式就行。我重新安装之…

使用maven-mvnd替换maven大大提升编译打包速度

先上结论&#xff01;&#xff01;&#xff01; 多模块清理并打包提升&#xff1a;约3.5倍 多模块不清理打包提升&#xff1a;约5.5倍 单模块提升&#xff1a;约2倍 从计算结果来看&#xff0c;多模块提升的效率更高。在使用mvnd package打包多模块式&#xff0c;可在控制台…

【从零开始入门unity游戏开发之——C#篇43】C#补充知识——值类型和引用类型汇总补充、变量的生命周期与性能优化、值类型和引用类型组合使用

文章目录 一、值类型和引用类型汇总补充1、值类型和引用类型汇总2、值类型和引用类型的区别3、简单的判断值类型和引用类型 二、变量的生命周期与性能优化1、**栈和堆的区别**2、**变量生命周期**3、**垃圾回收&#xff08;GC&#xff09;机制**4、**代码示例与优化**4.1. 临时…

65.基于SpringBoot + Vue实现的前后端分离-阿博图书馆管理系统(项目 + 论文PPT)

项目介绍 随着社会的发展&#xff0c;计算机的优势和普及使得阿博图书馆管理系统的开发成为必需。阿博图书馆管理系统主要是借助计算机&#xff0c;通过对图书借阅等信息进行管理。减少管理员的工作&#xff0c;同时也方便广大用户对所需图书借阅信息的及时查询以及管理。 本站…

系统报错:由于找不到msvcp140.dll msvcp140_1.dll无法继续执行问题解决

Java资深小白&#xff0c;不足之处&#xff0c;或者有任何错误欢迎指出。 --蓝紫电脑重装后安装mysql&#xff0c;在执行时mysqld -install时出现系统报错:由于找不到msvcp140.dll无法继续执行、由于找不到msvcp140_1.dll无法继续执行。 尝试了其他博主提出的解决方案要么无效…

【再谈设计模式】策略模式 ~ 算法与行为的灵活调度员

本章内容思维导图&#xff1a; ​ 一、引言 在软件工程&#xff0c;软件开发过程中&#xff0c;我们常常会遇到这样的情况&#xff1a;需要根据不同的条件或者用户输入来执行不同的算法或者操作流程。例如&#xff0c;在一个电商系统中&#xff0c;根据用户的会员等级&#xff…

019-spring-基于aop的事务控制原理

1、事务配置&#xff1a; <tx:annotation-driven transaction-manager"transactionManager"/> transaction-manager 默认是找这个bean&#xff1a;transactionManager 2、从命名空间开始找到对应的解析配置如下&#xff1a; 对应的是这个 后续跟源码没有搞明…

Cursor登录按钮点击没反应

问题 系统&#xff1a;Windows11 Cursor&#xff1a;Cursor 0.44.9 当安装Cursor打开进行登录时&#xff0c;点击Sign in没反应 解决方案 1.打开window11的设置 2.点击应用中的默认应用 3.在设置应用程序的默认值中搜索Google&#xff08;没有Google浏览器的尝试下载一个&a…

30分钟搭建 Typecho 个人博客教程

Typecho是一款PHP博客程序&#xff0c;相比于WordPress&#xff0c;Typecho显得更加的轻量级和简洁。现在越来越多的人倾向于用Typecho来搭建个人博客——众所周知&#xff0c;能跑WordPress的机器都不便宜。 Typecho是一款国人团结打造的开源博客系统&#xff0c;和WordPress…