libvirt介绍和使用

2023-11-11

libvirt介绍和使用

导读:

  • why&&what
  • libvirt具体介绍
  • API 剖析
  • driver 剖析
  • 如何使用libvirt?

why&&what

实现一朵可运行、可运维的云,需要完整的实现三层:VIM层、VNFM层、NFVO层,其中实现对VNF的生命周期管理是VNFM层要实现核心功能。但要做到对VNF的控制管理谈何容易,VIM层中提供的hypervisor技术多种多样,包括kvm,vmware,xen等等,每种技术提供的驱动和API又都不尽相同。即使能够做到单种技术的控制管理,还要实现不同hypervisor下VNF的迁移,困难可想而知。
而Libvirt正是为解决上述问题而生,通过在VIM层和VNFM层提供一个虚拟抽象层,提供统一API供上层调用,下层统一封装不同虚拟机,从而方便地实现对虚拟机的管理。
Libvirt是管理虚拟机、存储、网络的一系列软件集合。它包括了一个API库、一个daemon程序(libvirtd)和一个命令行工具(virsh).主要目标是为各种虚拟化工具提供一套统一可靠的API,让上层可以用一种单一的方式来管理多种不同的虚拟化技术。

libvirt具体介绍

Libvirt目前已被业界广泛应用,应用场景包括各种命令行工具、GUI工具、持续集成、IaaS服务(如openstack)、web应用程序等等。支持多种语言包括C、Python、Perl、Java、Go等,大大便利了开发集成。支持多种虚拟化技术,包括KVM、QEMU、Xen、Virtuozzo、Vmware ESX、LXC等等。
主要提供的功能包括:

  • 虚拟机生命周期管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU。
  • 本地&&远程访问:通过在本地运行libvirt daemon,本机和远程机器,都可以访问并使用libvirt的功能。远程一般通过简单配置SSH即可。
  • 存储管理:除了虚拟机管理,任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享等。
  • 虚拟网络管理:可以用来管理和创建虚拟网络,管理物理和逻辑的网络接口。

API 剖析

Libvirt提供的核心功能就是一套统一的API,所以有必要研究下API的实现。
libvirt的一个节点内部划分如下,包括hypervisor和多个domains,每个domains表示一个客户机实例:

libvirt 的逻辑术语

API被设计用来管控虚拟机的所有资源,从设计类的角度来看可划分为5个大类:

5 objects of libvirt

  • virConnectPtr
    代表和hypervisor进行连接,通常使用virConnectOpen系列的函数来实现和hypervisor的相连,一旦连接建立后,就可以管理该hypervisor内的各种资源如domains等。
  • virDomainPtr
    代表一个active或者提前defined的domain。函数virConnectListAllDomains可以罗列一个hypervisor内的所有domians。
  • virNetworkPtr
    代表一个actvie或者defiend的network。函数virConnectListAllNetworks可罗列一个hypervisor内的所有虚拟网络。
  • virStoragePoolPtr
    代表一个存储池,是一个逻辑区域用来分配和存储storage volume。
  • virStorageVolPtr
    代表一个storage volume,可被用作一个块设备提供给domain来使用。

大多数的object可被以多种方式索引到:

  • name
  • ID
  • UUID

对以上五大类,都提供了支持下述动作的API:

  • Lookup[...LookupBy...]
    可被用来检索查找某个object:
    • virDomainLookupByID
    • virDomainLookupByName
    • virDomainLookupByUUID
    • virDomainLookupByUUIDString
  • Enumeration[virconnectList..., virconnectNumOf...]
    被用来遍历特定hypervisor可访问的对象集合:
    • virConnectListDomains
    • virConnectNumOfDomains
    • virConnectListNetworks
    • virConnectListStoragePools
  • Description[...GetInfo]
    提供一个object的通用信息:
    • virNodeGetInfo
    • virDomainGetInfo
    • virStoragePoolGetInfo
    • virStorageVolGetInfo
  • Accessors[..Get...,...Set...]
    被用来获取或者修改指定的object:
    • virConnectGetType
    • virDomainGetMaxMemory
    • virDomainSetMemory
    • virDomainGetVcpus
    • virStoragePoolSetAutostart
    • virNetworkGetBridgeName
  • Creation[...Create,...CreateXml]
    用来创建和启动object:
    • virDomainCreate
    • virDomainCreateXML
    • virNetworkCreate
    • virNetworkCreateXML
  • Destruction[...Destroy]
    用来关闭、deactivate、销毁一个对象:
    • virDomainDestroy
    • virNetworkDestroy
    • virStoragePoolDestroy

libvirt 启动 qemu 的流程图
在这里插入图片描述

driver 剖析

为了支持各种虚拟机监控程序的可扩展性,libvirt实现了一种基于驱动程序的架构,该架构允许用一种通用的API来管理不同的guest OS。下图展示了API和相关驱动程序的层次结构:

架构图

没有使用libvirt的虚拟机管理方式如下图所示:
在这里插入图片描述

libvirt提供两种不同的控制方式:

  1. 本地控制:daemon和管理程序在同一节点上。

    在这里插入图片描述

  2. 远程控制:daemon和管理程序不在同一个节点上,两个节点的通信需要借助于RPC来实现。

  3. 在这里插入图片描述

如何使用Libvirt?

本文的hypervisor以kvm-qemu为例,关于kvm的配置可以参考这里

1 定义虚拟配置文件
本例只是举个简单例子,可以通过xml文件定义域名,guest os的内存大小,虚拟存储器个数,启动的镜像OS,网络接口配置等。实际上libvirt支持的属性更加多样丰富,想具体了解的可以参考官网详细介绍。

1 <domain type='kvm'> 
  2   <name>alice</name>  //域名
  3   <uuid>f5b8c05b-9c7a-3211-49b9-2bd635f7e2aa</uuid>
  4   <memory>1048576</memory>  //内存大小
  5   <currentMemory>1048576</currentMemory>
  6   <vcpu>2</vcpu> //虚拟CPU个数
  7   <os>
  8     <type>hvm</type>
  9     <boot dev='cdrom'/>
 10   </os>
 11   <features>
 12     <acpi/>
 13   </features>
 14   <clock offset='utc'/>
 15   <on_poweroff>destroy</on_poweroff>
 16   <on_reboot>restart</on_reboot>
 17   <on_crash>destroy</on_crash>  //供virsh使用
 18   <devices>
 19     <emulator>/usr/bin/kvm</emulator>
 20     <disk type="file" device="disk">  //镜像OS磁盘路径
 21       <driver name="qemu" type="raw"/>
 22       <source file="/home/rocce/dev/images/alice.img"/>
 23       <target dev="vda" bus="virtio"/>
 24       <address type="pci" domain="0x0000" bus="0x00" slot="0x04" function="0x0"/>
 25     </disk>
 26     <disk type="file" device="cdrom">  //镜像OS路径
 27       <driver name="qemu" type="raw"/>
 28       <source file="/home/rocce/dev/iso/CentOS-7.0-1406-x86_64-Minimal.iso"/>
 29       <target dev="hdc" bus="ide"/>
 30       <readonly/>
 31       <address type="drive" controller="0" bus="1" target="0" unit="0"/>
 32     </disk>
 33     <interface type='bridge'> //网络配置
 34       <source bridge='br0'/>
 35       <mac address="00:0c:30:81:5a:14"/>
 36     </interface>
 37     <controller type="ide" index="0">
 38       <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
 39     </controller>
 40     <input type='mouse' bus='ps2'/>
 41     <graphics type='vnc' port='5920' autoport="no" listen='0.0.0.0'/> //图形界面参数
 42     <console type='pty'>  // 串口配置
 43       <target port='0'/>
 44     </console>
 45   </devices>
 46 </domain> 

2 连接hypervisor
libvirt提供了三种连接方式:

conn = libvirt. open(name)
conn = libvirt.openAuth(uri, auth, flags)
conn = libvirt.openReadOnly(name)

关于每种的使用场景及方法,参考官网介绍即可。
举例如下:

In [2]: conn = libvirt.open("qemu:///system")
In [3]: print conn
<libvirt.virConnect object at 0x7f62dc03fa10>

3 guest domain的生命周期管理
可以使用libvirt来对domain进行整个生命周期的管理。domain在整个生命周期内有以下几个状态:

状态迁移图

  • Undefined这是一个基本的状态。任何没有定义或者没有建立的域的状态。
  • Defined这是一个域已定义但是没有运行的状态。这种状态也可以被描述为停止。
  • Running这是一个已经定义并运行在一个hypervisor上面的域的状态。
  • Paused这个状态是形容一个域系统从运行状态转换为暂停状态。它的内存镜像已经被暂时地存储,它可以恢复到运行状态
  • saved可以将一个域持久化,并再次打开使用。
    比较重要的API包括:
#创建域
virDomainPtr    virDomainCreateXML  (virConnectPtr conn, 
                     const char * xmlDesc, 
                     unsigned int flags)//建立并立即引导启动一个新的临时性的domain
virDomainPtr    virDomainCreateXMLWithFiles (virConnectPtr conn, 
                         const char * xmlDesc, 
                         unsigned int nfiles, 
                         int * files, 
                         unsigned int flags)
virDomainPtr    virDomainDefineXML  (virConnectPtr conn, 
                     const char * xml)//建立一个持久性的域并存储配置文件
virDomainPtr    virDomainDefineXMLFlags (virConnectPtr conn, 
                     const char * xml, 
                     unsigned int flags)

//开启、关闭域
int virDomainCreate         (virDomainPtr domain)//从持久性配置中引导并启动一个预先定义好的域
virDomainPtr    virDomainCreateLinux    (virConnectPtr conn, 
                     const char * xmlDesc, 
                     unsigned int flags)
int virDomainCreateWithFiles    (virDomainPtr domain, 
                     unsigned int nfiles, 
                     int * files, 
                     unsigned int flags)
int virDomainCreateWithFlags    (virDomainPtr domain, 
                     unsigned int flags)
int virDomainShutdown       (virDomainPtr domain)
int virDomainShutdownFlags      (virDomainPtr domain, 
                     unsigned int flags)

#暂停\恢复\保存
int virDomainSuspend        (virDomainPtr domain)
int virDomainResume         (virDomainPtr domain)
int virDomainSave           (virDomainPtr domain, 
                     const char * to)
int virDomainRestore        (virConnectPtr conn, 
                     const char * from)
#销毁域
int virDomainDestroy        (virDomainPtr domain) 
int virDomainDestroyFlags       (virDomainPtr domain, 
                     unsigned int flags)    
int virDomainUndefine       (virDomainPtr domain) //关闭并删除持久性配置
int virDomainUndefineFlags      (virDomainPtr domain, 
                     unsigned int flags)
                     
  1. host信息获取
    virConnection对象提供了多种方法用来获取虚拟主机的信息,包括hostname,max vCPU等等。
    举例如下:
In [5]: print conn.getHostname()
ubuntu
In [8]: print conn.getMaxVcpus(None)
16
In [9]: print conn.getInfo()
['x86_64', 3934L, 8, 3591, 1, 2, 4, 1]
In [13]: print conn.getCellsFreeMemory(0,1)
[312676352L]

In [14]: print conn.getType()
QEMU

In [15]: print conn.getURI()
qemu:///system

In [16]: print conn.isEncrypted()
0

In [17]: print conn.isAlive()
1

In [18]: print conn.isSecure()
1

In [19]: print conn.getCPUMap()
(8, [True, True, True, True, True, True, True, True], 8

In [21]: print conn.getCPUStats(0)
{'kernel': 109650000000L, 'idle': 265725600000000L, 'user': 150740000000L, 'iowait': 26750000000L}

当然libvirt提供的API不止包括如上介绍,本文只是将比较重要的部分罗列出来,如果想深入研究,请移步官网

libvirt

libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程的virsh调用,Libvirtd调用qemu-kvm操作虚拟机。

wKioL1WdD72RRy8mAAIuDm6sVAY591.jpg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libvirt介绍和使用 的相关文章

  • 套接字发送并发保证

    如果我在两个进程 或两个线程 之间共享一个套接字 并且在这两个进程中我尝试发送一条阻塞的大消息 大于下划线协议缓冲区 是否可以保证这两个消息将按顺序发送 或者消息可以在内核内部交错吗 我主要对 TCP over IP 行为感兴趣 但了解它是
  • 每当调用 malloc/free 时输出到 stderr

    使用 Linux GCC C 每当调用 malloc free new delete 时 我想向 stderr 记录一些内容 我试图了解库的内存分配 因此我想在运行单元测试时生成此输出 我使用 valgrind 进行内存泄漏检测 但我找不到
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • MYSQL插入GB大小的巨大SQL文件

    我正在尝试创建 Wikipedia DB 副本 大约 50GB 但在处理最大的 SQL 文件时遇到问题 我使用 linux split 实用程序将 GB 大小的文件拆分为 300 MB 的块 例如 split d l 50 enwiki 2
  • 使用无效命令进行 fork 会导致 valgrind 中的内存泄漏

    我有以下代码 它在分叉内执行无效命令 以下代码在 valgrind 中返回内存泄漏 include
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • 在单个命令中使用前缀重命名文件夹中的所有文件

    重命名带有前缀的文件夹中的所有文件 Unix 假设一个文件夹有两个文件 a txt b pdf 那么它们都应该从一个命令重命名为 Unix a txt Unix b pdf 如果您的文件名包含没有空格并且你没有任何子目录 你可以使用一个简单
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加

随机推荐

  • 5G/NR 学习笔记: 波束赋形 / beam 管理

    What beam 是对于整列天线电磁波传播的一种样式 一个天线的时候 电磁波的辐射方向是360度传播的 但是一个天线阵列可以实现电磁波单方向传播 天线个数越多 电磁波传播方向越集中 https www rcrwireless com 20
  • 微服务:gateway的使用,和解决跨域问题,用户认证与网关整合

    1 网关介绍 API网关出现的原因是微服务架构的出现 不同的微服务一般会有不同的网络地址 而外部客户端可能需要调用多个服务的接口才能完成一个业务需求 如果让客户端直接与各个微服务通信 会有以下的问题 1 客户端会多次请求不同的微服务 增加了
  • JDK、JRE、JVM三者之间的关系

    jdk java development kit java开发工具包 jre java runtime environment java运行时环境 jvm java virtual machine java虚拟机 jdk环境配置 jdk环境
  • MAPREDUCE的JOB提交流程

    在hadoop1 0版本以前我们的Mapreduce是被当作资源调度和计算框架来使用的 成为了hadoop运行生态圈的瓶颈 所以在hadoop2 0版本以上引入了yarn的概念 使Mapreduce完全成为分布式计算框架 而Yarn成为了分
  • jquery ajax url中有中文,后端乱码的解决方法.txt

    参考 https zhidao baidu com question 2057437468670456147 html url类似 http localhost 8080 floorsNodes 风管 json 方法 在jquery aja
  • HTML标签的分类

    HTML的标签 一 分类 1 排版标签 2 标题标签 3 段落标签 4 水平线标签 5 换行标签 6 文本格式标签 7 标签属性 8 图像标签 二 应用 1 排版标签 与css搭配使用 显示网页结构的标签 是网页布局中的常用标签 2 标题标
  • 验证码拦不住机器人了!谷歌AI已能精准识别模糊文字,GPT-4则装瞎求人帮忙

    丰色 发自 凹非寺量子位 公众号 QbitAI 最烦登网站时各种奇奇怪怪 甚至变态 的验证码了 现在 有一个好消息和一个坏消息 好消息就是 AI可以帮你代劳这件事了 不信你瞧 以下是三张识别难度依次递增的真实案例 而这些是一个名为 Pix2
  • 华退学博士王垠:离开是为了获得力量后再回来

    清华退学博士王垠 离开是为了获得力量后再回来 附万言退学书 只提供一种模具生产 标准化的人 而忽视 教育的多样性 的中国教育界是可悲的 异端王垠用现身说法打破了教育界 沉默的螺旋 文 张洋 王垠出名了 这是迟早的事 但这一次 他的出名更多是
  • MySQL LOAD DATA INFILE - 加载没有主键的文件实战

    首先告诉大家关于 MySQL LOAD DATA INFILE 加载没有主键的文件 是可以操作的 接下来就来实战一把 表imagecode结构可以看到有3列 其中id是自增列 drop table imagecode create tabl
  • ztree异步加载

    1 配置好参数 var setting ztreeSetting view showIcon false 前面文件夹显示状态 data key name MC 数据结构的属性由name改成MC async enable true url u
  • 【NVM】node多个版本管理工具安装步骤以及使用

    1 什么是nvm nvm是一个管理nodejs版本的工具 在实际的开发中 有些项目的开发依赖需要不同版本的nodejs运行环境 此时我们就需要使用nvm来管理nodejs版本 2 安装步骤 2 1 下载nvm https github co
  • linux文件赋予用户权限,Linux 给用户赋予操作权限

    chown Rkeesail keesail local赋予local目录给keesailchmod760 local赋予local目录读写权这个目chmod777文件夹名称 可以把文件夹设置成所有用户都有完全的权限 不过更改系统文件夹下的
  • WSL2的安装详细过程(转载)

    这部分记录了如何安装wsl 以及如何升级到wsl2的心酸历程 文章目录 版本要求 升级windows WSL的安装 升级到WSL2 安装linux分发版 排查安装问题 相关链接 记录所踩的坑 版本要求 安装wsl2对系统版本有硬性的要求 运
  • mysql的行转列和列转行

    一 行转列 即将原本同一列下多行的不同内容作为多个字段 输出对应内容 建表语句 DROP TABLE IF EXISTS tb score CREATE TABLE tb score id INT 11 NOT NULL auto incr
  • 语义分割常用数据集整理

    语义分割的数据集分为三类 2D图片 2 5D图片 RGB D 3D图片 每一个类别的数据集都提供了像素级的标签 可以用来评估模型性能 同时其中一部分工作用到了数据增强来增加标签样本的数量 一 2D数据 1 PASCAL Visual Obj
  • 更换 CentOS 7 的下载源为阿里云

    1 备份 mv etc yum repos d CentOS Base repo etc yum repos d CentOS Base repo backup 2 下载新的CentOS Base repo 到 etc yum repos
  • vue3 hooks的简单使用 组合式函数

    想当于vue2的mixins 我们可以使用hooks代替mixins 官方文档 组合式函数 hooks 特点 vue3 中的 hooks 函数相当于 vue2 里面的 mixin 混入 不同在于 hooks 是函数 vue3 中的 hook
  • 离线脱机局域网环境安装visual studio2019企业版

    我这个文章借鉴了网友的一些方法 自己改编的用于记录以后方便自己用 亲测2022社区版可能因为我电脑的win10系统不完善的原因 无法 安装 最后试了2019企业版成功安装 1 在官网下载安装包 点击跳转 2 点开的网页 我英语不好 我翻译了
  • 终极篇 C++算法到安卓的移植——AS调用VS的so库

    目的 windows平台下的c 算法 需要移植到安卓系统上 平时用惯了Visual Studio 再在其他软件上重新写算法 调试算法 实在头疼 所以我用VS的c 移动开发功能创建动态共享库 将算法内容放入 并实现JNI和JAVA接口部分 最
  • libvirt介绍和使用

    libvirt介绍和使用 导读 why what libvirt具体介绍 API 剖析 driver 剖析 如何使用libvirt why what 实现一朵可运行 可运维的云 需要完整的实现三层 VIM层 VNFM层 NFVO层 其中实现