OpenStack设计与实现(二)Libvirt简介与实现原理

1、Libvirt简介

Libvirt是由Redhat开发的一套开源的软件工具,目标是提供一个通用和稳定的软件库来高效、安全地管理一个节点上的虚拟机,并支持远程操做。它由如下的模块组成:编程

  • 一个库文件,实现管理接口安全

  • 一个守护进程(libvirtd)服务器

  • 一个命令行工具(virsh)网络

基于可移植性和高可靠性的考虑,Libvirt采用C语言开发,可是也提供了对其余编程语言的绑定,包括Python,Perl,Ocaml,Ruby,Java和PHP。所以Libvirt的调用能够被集成到各类编程语言中,适应不一样的环境。
Libvirt支持多种虚拟机,具体状况以下:架构

|名称|注释|
|-|-|
|LXC|轻量级的Linux容器|
|OpenVZ|基于Linux内核的轻量级Linux容器|
|KVM/QEMU|基于Linux的类型2的VMM|
|Xen|开源的类型1的VMM|
|User-mode Linux(UML)|系统调用级别的Linux虚拟机|
|VirtualBox|Oracle开发的类型2的VMM|
|Vmware ESX and GSX|Vmware虚拟化的服务器版本|
|Vmware Workstation and Player|Vmware虚拟化的桌面版本|
|Hyper-V|微软开发的VMM|
|PowerVM|IBM开发的VMM|
|Parallels Workstation|Parallels为Mac开发的VMM|
|Bhyve|FreeBSD 9+上的VMM|ssh

2、Libvirt的结构

Libvirt屏蔽了不一样虚拟化的实现,提供统一管理接口。用户只关心高层的功能,而VMM的实现细节,对于最终用户应该是透明的。Libvirt就做为VMM和高层功能之间的桥梁,接收用户请求,而后调用VMM提供的接口,来完成最终的工做。
Libvirt的层次结构以下:
20160120015330353.png编程语言

为了支持多种VMM,Libvirt采用了基于驱动的架构,如图下图所示。也就是说,每种VMM须要提供一个Driver和Libvirt进行通讯来操控特定的VMM。函数

20160120015408307.jpg

3、Libvirt的实现

Libvirt代码里所定义的主要对象以下图所示。
20160120015453291.png工具

  1. VirConnectPtr:表明了一个特定VMM创建的链接。每个基于Libvirt的应用程序都应该先提供一个URI来指定本地或远程的某个VMM,从而得到一个VirConnectPtr链接。好比xen+ssh://host-virt/表明了经过ssh链接一个在host-virt机器上运行的Xen VMM。拿到virConnectPtr链接后,应用程序就能够管理这个VMM的虚拟机和对应的虚拟化资源,好比存储和网络。spa

  2. VirDomainPtr:表明一个虚拟机,多是激活状态或者仅仅已定义。

  3. VirNetworkPtr:表明一个网络

  4. VirStorageVolPtr:表明一个存储卷,一般被虚拟机当作块设备使用。

  5. VirStoragePoolPtr:表明一个存储池,用来分配和管理存储卷的逻辑区域。

一、本机之间的通讯‘

在初始化的过程当中,全部的驱动被枚举和注册。每个驱动都会加载特定的函数为Libvirt API所调用。以下图所示,Application经过URI调用Public API,而后PublicAPI经过使用Driver提供的API接口调用正真的Driver实现。

20160120015515301.png

二、远程主机之间的通讯

Libvirt的目标是支持远程管理,因此到Libvirt的驱动的访问,都由Libvirt守护进程libvirtd处理,libvirtd被部署在运行虚拟机的节点上,经过RPC由对端的remote Driver管理,以下图所示。

20160120015527301.png

在远程管理模式下,virConnectionPtr实际上链接了本地的remote Driver和远端的特定Driver。全部的调用都经过remote Driver先到达云端的libvirtd,libvirtd访问对应的Driver。

原文连接: http://blog.csdn.net/xingjiarong/article/details/50545826

相关文章
相关标签/搜索