KVM(五)libvirt 介绍
1. Libvirt 是什么
为什么需要Libvirt?
- Hypervisor 比如 qemu-kvm 的命令行虚拟机管理工具参数众多,难于使用。
- Hypervisor 种类众多,没有统一的编程接口来管理它们,这对云环境来说非常重要。
- 没有统一的方式来方便地定义虚拟机相关的各种可管理对象。
Libvirt提供了什么?
- 它提供统一、稳定、开放的源代码的应用程序接口(API)、守护进程 (libvirtd)和和一个默认命令行管理工具(virsh)。
- 它提供了对虚拟化客户机和它的虚拟化设备、网络和存储的管理。
- 它提供了一套较为稳定的C语言应用程序接口。目前,在其他一些流行的编程语言中也提供了对libvirt的绑定,在Python、Perl、Java、Ruby、PHP、OCaml等高级编程语言中已经有libvirt的程序库可以直接使用。
- 它对多种不同的 Hypervisor 的支持是通过一种基于驱动程序的架构来实现的。libvirt 对不同的 Hypervisor 提供了不同的驱动,包括 Xen 的驱动,对QEMU/KVM 有 QEMU 驱动,VMware 驱动等。在 libvirt 源代码中,可以很容易找到 qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c 这样的驱动程序源代码文件。
- 它作为中间适配层,让底层 Hypervisor 对上层用户空间的管理工具是可以做到完全透明的,因为 libvirt 屏蔽了底层各种 Hypervisor 的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。
- 它使用 XML 来定义各种虚拟机相关的受管理对象。
目前,libvirt 已经成为使用最为广泛的对各种虚拟机进行管理的工具和应用程序接口(API),而且一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如OpenStack、OpenNebula、Eucalyptus等)都在底层使用libvirt的应用程序接口。
(SLE 11)
1.1 Libvirt C API
1.1.1 Libvirti API 所管理的主要对象
对象 | 解释 |
Domain (域) | 指运行在由Hypervisor提供的虚拟机器上的一个操作系统实例(常常是指一个虚拟机)或者用来启动虚机的配置。 |
Hypervisor | 一个虚拟化主机的软件层 |
Node (主机) | 一台物理服务器。 |
Storage pool (存储池) | 一组存储媒介的集合,比如物理硬盘驱动器。一个存储池被划分为小的容器称作卷。卷会被分给一个或者多个虚机。 |
Volume (卷) | 一个从存储池分配的存储空间。一个卷会被分给一个或者多个域,常常成为域里的虚拟硬盘。 |
1.1.2 对象的管理模型
对象名称 | 对象 | Python 类 | 描述 |
Connect | 与 Hypervisor的连接 |
virConnectPtr |
在调用任何 API 去管理一个本地或者远端的Hypervisor前,必须建立和这个Hypervisor的连接。 |
Domain | Guest domain |
virDomainPtr |
用于列举和管理已有的虚机,或者创建新的虚机。唯一标识:ID,Name,UUID。一个域可能是暂时性的或者持久性的。暂时性的域只能在它运行期间被管理。持久性的域在主机上保存了它的配置。 |
Virtual Network | 虚拟网络 |
virNetworkPtr |
用于管理虚机的网络设备。唯一标识:Name,UUID。一个虚拟网络可能是暂时性的或者持久性的。每个主机上安装libvirt后,它都有一个默认的网络设备“default”。它向该主机上运行的虚机提供DHCP服务,以及通过NAT连接到主机上。 |
Storage Pool | 存储池 |
virStoragePoolPtr |
用于管理虚拟机内的所有存储,包括 local disk, logical volume group, iSCSI target, FibreChannel HBA and local/network file system。唯一标识:Name,UUID。一个存储池可能是暂时性的或者持久性的。Pool 的 type 可以是 dir, fs, netfs, disk, iscsi, logical, scsi,mpath, rbd, sheepdog, gluster 或者 zfs。 |
Storage Volume | 存储卷 |
virStorageVolPtr |
用于管理一个存储池内的存储块,包括一个池内分配的块、磁盘分区、逻辑卷、SCSI/iSCSI Lun,或者一个本地或者网络文件系统内的文件等。唯一标识:Name,Key,Path。 |
Host device | 主机设备 |
virNodeDevPtr |
用于管理主机上的物理硬件设备,包括 the physical USB or PCI devices and logical devices these provide, such as a NIC, disk, disk
controller, sound card, etc。唯一标识:Name。 |
1.1.3 API 的简单分类
Libvirt API 就是对各种对象的各种操作,包括基本的增、删、改、查操作和其它操作。
对象 | 增 | 删 | 改 | 查 | 其它 |
Connect | virConnectOpen virConnectOpenAuth virConnectOpenReadOnly |
virConnectClose | virConnectSetKeepAlive | ||
Strorage pool | virStoragePoolBuild virStoragePoolCreate virStoragePoolCreateXML virStoragePoolDefineXML |
virStoragePoolDelete virStoragePoolDestroy virStoragePoolFree virStoragePoolUndefine |
virStoragePoolRefresh virStoragePoolSetAutostart |
virConnectFindStoragePoolSources virConnectListAllStoragePools virConnectListDefinedStoragePools virConnectListStoragePools virConnectNumOfDefinedStoragePools virConnectNumOfStoragePools virStoragePoolGetInfo/Name/UUID/UUIDString/XMLDesc |
virStoragePoolGetAutostart virStoragePoolGetConnect virStoragePoolNumOfVolumes virStoragePoolListAllVolumes virStoragePoolListVolumes |
Storage volume | virStorageVolCreateXML virStorageVolCreateXMLFrom |
virStorageVolDelete virStorageVolFree |
virStorageVolResize virStorageVolUpload virStorageVolWipe virStorageVolWipePattern |
virStorageVolGetConnect/Info/Key/Name/Path/XMLDesc virStorageVolLookupByKey/Name/Path virStorageVolRef |
virStorageVolDownload |
Network | virNetworkCreate virNetworkCreateXML virNetworkDefineXML |
virNetworkDestroy virNetworkFree virNetworkUndefine |
virNetworkSetAutostart virNetworkUpdate |
virConnectListAllNetworks virConnectListDefinedNetworks virConnectListNetworks virConnectNumOfDefinedNetworks virConnectNumOfNetworks virNetworkGetBridgeName/DHCPLeases/Name/UUID/UUIDString/XMLDesc virNetworkGetConnect |
virConnectNetworkEventDeregisterAny virConnectNetworkEventGenericCallback virNetworkDHCPLeaseFree |
Domain snapshot | virDomainSnapshotCreateXML | virDomainSnapshotDelete virDomainSnapshotFree |
virDomainRevertToSnapshot | virDomainHasCurrentSnapshot virDomainListAllSnapshots virDomainSnapshotCurrent virDomainSnapshotGetConnect/Domain/Name/Parent/XMLDesc virDomainSnapshotHasMetadata virDomainSnapshotIsCurrent virDomainSnapshotListAllChildren virDomainSnapshotListChildrenNames virDomainSnapshotListNames virDomainSnapshotLookupByName virDomainSnapshotNum virDomainSnapshotNumChildren virDomainSnapshotRef |
|
Host | virInitialize virNodeSetMemoryParameters virNodeSuspendForDuration |
virConnectBaselineCPU virConnectCompareCPU virConnectGetCPUModelNames/Capabilities/Hostname/LibVersion/MaxVcpus/Sysinfo/Type/URI/Version virConnectIsAlive virConnectIsEncrypted virConnectIsSecure virGetVersion virNodeGetCPUMap/CPUStats /CellsFreeMemory/FreeMemory/Info/MemoryParameters/MemoryStats / virNodeGetSecurityModel |
virTypedParamsAddBoolean virTypedParamsAddDouble virTypedParamsAddFromString virTypedParamsAddInt virTypedParamsAddLLong virTypedParamsAddString virTypedParamsAddUInt virTypedParamsAddULLong virTypedParamsClear virTypedParamsFree virTypedParamsGet |
||
Interface | virInterfaceCreate virInterfaceDefineXML |
virInterfaceDestroy virInterfaceFree virInterfaceUndefine |
virInterfaceChangeBegin virInterfaceChangeCommit virInterfaceChangeRollback |
virConnectListAllInterfaces virConnectListDefinedInterfaces virConnectListInterfaces virConnectNumOfDefinedInterfaces virConnectNumOfInterfaces virInterfaceGetConnect virInterfaceGetMACString virInterfaceGetName virInterfaceGetXMLDesc virInterfaceIsActive virInterfaceLookupByMACString virInterfaceLookupByName virInterfaceRef |
|
Net Filter | virNWFilterDefineXML | virNWFilterFree virNWFilterUndefine |
virConnectListAllNWFilters virConnectListNWFilters virConnectNumOfNWFilters virNWFilterGetName virNWFilterGetUUID virNWFilterGetUUIDString virNWFilterGetXMLDesc virNWFilterLookupByName virNWFilterLookupByUUID virNWFilterLookupByUUIDString virNWFilterRef |
||
Domain Event | virConnectDomainEventDeregister virConnectDomainEventDeregisterAny virConnectDomainEventDeviceAddedCallback virConnectDomainEventDeviceRemovedCallback |
virConnectDomainEventAgentLifecycleCallback virConnectDomainEventBalloonChangeCallback virConnectDomainEventBlockJobCallback virConnectDomainEventCallback virConnectDomainEventDiskChangeCallback virConnectDomainEventGenericCallback virConnectDomainEventGraphicsCallback virConnectDomainEventIOErrorCallback virConnectDomainEventIOErrorReasonCallback virConnectDomainEventPMSuspendCallback virConnectDomainEventPMSuspendDiskCallback |
|||
Domain | virDomainCreate virDomainCreateLinux virDomainCreateWithFiles virDomainCreateWithFlags virDomainCreateXML virDomainCreateXMLWithFiles virDomainDefineXML virDomainDefineXMLFlags |
virDomainDestroy virDomainDestroyFlags virDomainFree |
virDomainAbortJob virDomainAddIOThread virDomainDelIOThread virDomainAttachDevice virDomainBlockCommit virDomainCoreDump virDomainFSFreeze virDomainInterfaceFree virDomainManagedSave virDomainMigrate virDomainMigrateSetCompressionCache virDomainOpenChannel virDomainPMWakeup virDomainReboot virDomainShutdown virDomainSetAutostart |
virConnectGetAllDomainStats virConnectGetDomainCapabilities virConnectListAllDomains virConnectListDefinedDomains virConnectListDomains virConnectNumOfDefinedDomains virConnectNumOfDomains virDomainBlockStats virDomainGetAutostart virDomainGetFSInfo virDomainGetInterfaceParameters virDomainGetNumaParameters virDomainGetSecurityLabel virDomainGetXMLDesc virDomainInterfaceAddresses virDomainIsActive virDomainLookupByID virDomainMemoryPeek virDomainMigrateGetCompressionCache virDomainPinEmulator ? virDomainSaveImageGetXMLDesc |
virConnectDomainXMLFromNative virConnectDomainXMLToNative |
Secret | virSecretDefineXML | virSecretFree virSecretUndefine |
virSecretSetValue | virConnectListAllSecrets virConnectListSecrets virConnectNumOfSecrets virSecretGetConnect/UUID/UUIDString/UsageID/UsageType/Value/XMLDesc virSecretLookupByUUID/UUIDString/Usage virSecretRef |
|
Stream | virStreamNew | virStreamFree | virStreamFinish
virStreamAbort virStreamRecv virStreamRecvAll virStreamSend virStreamSendAll |
virStreamSinkFunc virStreamSourceFunc |
1.2 Libvirt XML 定义
Libvirt 使用 XML 来定义各种对象,其中,与 OpenStack Nova 关系比较密切的有:
disk (磁盘) | 任何磁盘设备,包括软盘(floppy)、硬盘(hard disk)、光驱(cdrom)或者半虚拟化驱动都使用 元素来定义。 方式:
(1)”volume“ 类型的 disk 'volume' device='disk'> (2)”file“ 类型的 disk 'file' snapshot='external'> (3)”block“ 类型的 disk 'block' device='cdrom'> (4)”network“ 类型的 disk 'network' device='cdrom'> |
|
Host device assignment (主机设备分配) |
'subsystem' type='usb'> #USB 设备直接分配 'optional'> |
|
Network interface (网卡) |
#virsh:attach-interface --domain d- --type network --source isolatednet1 --mac :::4b::6f --config <interface type='network'> #virsh:attach-interface --domain d- --type network --source isolatednet1 --mac :::4b::6f --config
<interface type='bridge'> #连接到 br0 'br0'/> #virsh:attach-interface --domain d- --type bridge --source virbr0 --mac ::::: --config (3)type=‘ethernet’ 定义一个使用指定脚本连接到 LAN 的 interface <interface type='ethernet'> (4)type=‘direct’ 定义一个直接连到物理网卡(Direct attachment to physical interface)的 interface:需要 Linux macvtap 驱动支持 <interface type='direct' trustGuestRxFilters='no'> (5)type=‘hostdev’ 定义一个由主机PCI 网卡直接分配(PCI Passthrough)的 interface: 分配主机上的网卡给虚机 <interface type='hostdev' managed='yes'>
|
|
network (网络) |
1. bridge:定义一个用于构造该虚拟网络的网桥。 2. domain:定义 DHCP server 的 DNS domain。 3. forward: 定义虚拟网络直接连到物理 LAN 的方式. ”mode“指转发模式。 (1) mode=‘nat’:所有连接到该虚拟网络的虚拟的网络都会经过物理机器的网卡,并转换成物理网卡的地址。 default 也可以指定公共的IP地址和端口号。 <forward mode='nat'><address start='1.2.3.4' end='1.2.3.10'/> (2) mode=‘route’:类似于 NAT,但是不使用NAT,而是使用routing table。 local (3) mode=‘bridge’:使用不受libvirt管理的bridge,比如主机上已有的bridge;open vswitch bridge;使用 macvtap's "bridge" 模式 host-bridge (4) mode=‘passthrough’:使用 a macvtap "direct" connection in "passthrough" mode 指定主机上的特定网卡用于虚拟网络 <forward mode='passthrough'> (5) mode=‘hostdev’:直接分配主机上的网络设备。 <forward mode='hostdev' managed='yes'> |
详细的 XML 定义说明在 https://libvirt.org/format.html。
1.3 Libvirt API 的实现
libvirt API 的实现是在各个 Hypervisor driver 和 Storage dirver 内。Hypervisor 驱动包括:
- LXC - Linux Containers
- OpenVZ
- QEMU
- Test - Used for testing
- UML - User Mode Linux
- VirtualBox
- VMware ESX
- VMware Workstation/Player
- Xen
- Microsoft Hyper-V
- IBM PowerVM (phyp)
- Parallels
- Bhyve - The BSD Hypervisor
1.4 Libvirt 的 Python 绑定
python-libvirt 包含 Libvirt 的 Python 语言绑定。安装 libvirt 时,默认会安装 python-libvirt 。 来源: https://libvirt.org/python.html https://pypi.python.org/pypi/libvirt-python
Python API 和 C API 之间几乎是一对一的映射关系,比如:
#C API int virConnectNumOfDomains (virConnectPtr conn); int virDomainSetMaxMemory (virDomainPtr domain, unsigned long memory); #Python API virConnect::numOfDomains(self) virDomain::setMaxMemory(self, memory)
因此,libvirt 官网并没有提供详细的 python API 描述。
2. QEMU/KVM libvirt 驱动
2.1 架构
?Libvirtd 是一个 daemon 进程,可以被本地的virsh调用,也可以被远程的virsh调用
?Libvirtd 调用 qemu-kvm 操作KVM 虚拟机
这里有一个 virsh 命令、Libvirt C API、 QEMU driver 方法 和 QEMU Monitor 命令的对照表(部分):
virsh command | Public API | QEMU driver function | Monitor command |
---|---|---|---|
virsh create XMLFILE | virDomainCreateXML() | qemudDomainCreate() | info cpus, cont, change vnc password, balloon (all indirectly) |
virsh suspend GUEST | virDomainSuspend() | qemudDomainSuspend() | stop |
virsh resume GUEST | virDomainResume() | qemudDomainResume() | cont |
virsh shutdown GUEST | virDomainShutdown() | qemudDomainShutdown() | system_powerdown |
virsh setmem GUEST MEM-KB | virDomainSetMemory() | qemudDomainSetMemory() | balloon (indirectly) |
virsh dominfo GUEST | virDomainGetInfo() | qemudDomainGetInfo() | info balloon (indirectly) |
virsh save GUEST FILENAME | virDomainSave() | qemudDomainSave() | stop, migrate exec |
virsh restore FILENAME | virDomainRestore() | qemudDomainRestore() | cont |
virsh dumpxml GUEST | virDomainDumpXML() | qemudDomainDumpXML() | info balloon (indirectly) |
virsh attach-device GUEST XMLFILE | virDomainAttachDevice() | qemudDomainAttachDevice() | change, eject, usb_add, pci_add (all indirectly) |
virsh detach-device GUEST XMLFILE | virDomainDetachDevice() | qemudDomainDetachDevice() | pci_del (indirectly) |
virsh migrate GUEST DEST-URI | virDomainMigrate() | qemudDomainMigratePerform() | stop, migrate_set_speed, migrate, cont |
virsh domblkstat GUEST | virDomainBlockStats() | qemudDomainBlockStats() | info blockstats |
- | virDomainBlockPeek() | qemudDomainMemoryPeek() | memsave |
2.2 安装
有三种方式来安装 libvirt:
(1)下载 libvirt 的源代码,然后编译和安装
(2)从各 Linux 的发行版中直接安装,比如 Ubuntu 上运行 apt-get install libvirt-bin
(3)从 git 上克隆 libvirt 的代码,然后编译和安装
2.3 libvirt log
这篇文章 描述了 livbirt log。设置所有日志的方法是在 /etc/libvirt/libvirtd.conf 中添加下面的配置然后重启 libvirt:
log_filters="1:libvirt 1:util 1:qemu" log_outputs="1:file:/var/log/libvirt/libvirtd.log"
3 使用 libvirt 编程来管理 KVM 虚机的实例
这里只描述基本的过程。具体的过程,下一篇文章会具体分析 Nova 中 libvirt 的使用。
- 定义虚机的基本配置,包括 vCPU、内存、磁盘或者cdrom以及启动顺序,生成 xml 配置,调用 virDomainCreateXML API 启动一个虚机
- 使用 Domain 相关的 API 来管理虚机的生命周期。我的这篇文章有虚机生命周期的详细介绍。
- 添加磁盘:定义一个 disk 的 xml 配置,使用 virDomainAttachDevice API 将它挂载到虚机上。如果不是本地的源磁盘,需要提前准备好。
- 添加interface:使用 Network API 定义一个虚拟网络(需要提前准备好物理网络),然后定义一个 interface 的 XML 配置,使用 virDomainAttachDevice API 将它加到虚机。
- 按照需要,重复2、3、4步骤。
KVM(五)libvirt 介绍的更多相关文章
- KVM 介绍(5):libvirt 介绍 [ Libvrit for KVM/QEMU ]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- KVM+Qemu+Libvirt实战
上一篇的文章是为了给这一篇文件提供理论的基础,在这篇文章中我将带大家一起来实现在linux中虚拟出ubuntu的server版来 我们需要用KVM+Qemu+Libvirt来进行kvm全虚拟化,创建虚 ...
- 深入浅出 kvm qemu libvirt
在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvmkvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备:qemu是模拟IO设备(网卡,磁盘),kvm加上 ...
- KVM工具libvirt、virsh、virt-manager的简单介绍
KVM虚拟化中libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口,而且一些常用的虚拟机管理工具(virsh.virt-install.virt-manager等)和云计算框架 ...
- kvm/qemu/libvirt学习笔记 (1) qemu/kvm/libvirt介绍及虚拟化环境的安装
kvm简介 kvm最初由Quramnet公司开发,2008年被RedHat公司收购.kvm全称基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux的一个内核模块 ...
- KVM&Libvirt基本概念及开发杂谈
导读 大家好,本次肖力分享的主题是KVM&Libvirt基本概念及开发杂谈,内容有些凌乱松散,主要基于自己早期整理的笔记内容和实践感悟,有些内容难免有失偏颇,望见谅.前面先介绍下需要了解的基本 ...
- QEMU,KVM及QEMU-KVM介绍
What's QEMU QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交 ...
- python nose测试框架全面介绍五--attr介绍
之前写了一系列nose框架的,这篇介绍下attr tag 在nose框架中attr用来标识用例,使得在运行时可以通过标识来执行用例,之前在nose测试框架全面介绍四中有说明,但没有说明清楚,这里再总结 ...
- kvm qemu内幕介绍
转自:http://blog.csdn.net/wj_j2ee/article/details/7978259目录 1 硬件虚拟化技术背景 2 KVM的内部实现概述 2.1 KVM的抽象对象 2.2 ...
随机推荐
- lubuntu 使用USB摄像头
http://liangbing8612.blog.51cto.com/2633208/598762 Most of the camera driver has integrated in the k ...
- 软工实践Beta冲刺(6/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- Android调用Java WebSevice篇之一
一.服务端WebService 1.服务端环境配置 MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...
- javascript string对象方法replace
最简单的replace用法是: var str = 'aaaaa9876b0000'; str.replace(/a/g,'A'); 有时候我们希望只是在匹配的位置添加特定的字符: var str = ...
- 子查询 做where条件 做 from的临时表 ,做select的一个字段 等
子查询 做where条件 做 from的临时表 ,做select的一个字段 等
- ElasticSearch1.7.1拼音插件elasticsearch-analysis-pinyin-1.3.3使用介绍
ElasticSearch拼音插件elasticsearch-analysis-pinyin使用介绍 https://my.oschina.net/xiaohui249/blog/214505 摘要: ...
- JSON使用(4)
把JSON文本转换为JavaScript对象 JSON最常见的用法之一,是从web服务器上读取JSON数据(作为文件或作为HttpRequest),将JSON数据转换为JavaScript对象,然后在 ...
- 【BZOJ 3907】网格 组合数学
大家说他是卡特兰数,其实也不为过,一开始只是用卡特兰数来推这道题,一直没有怼出来,后来发现其实卡特兰数只不过是一种组合数学,我们可以退一步直接用组合数学来解决,这道题运用组合数的思想主要用到补集与几何 ...
- EditPlus直接连接Linux服务器编辑文本文件
填写好:描述,ip地址,用户名,密码, 然后点下面的高级选项: 然后返回上一个页面,继续 确定 OK: 然后,在主界面左侧点倒三角: 就可以选择我们之前配置的远程服务器地址,弹出提示框 点确定, 就连 ...
- C语言指针大杂烩
By francis_hao Oct 31,2016 指针数组和数组指针 指针数组本身是个数组,数组的内容是指针.形如char *pa[].由于[]优先级高于*,pa先于[]结合表示pa是一个数组,p ...