共计 1683 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章给大家介绍 Libvirt 概念及实现原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
一、Libvirt 简介
Libvirt 是由 Redhat 开发的一套开源的软件工具,目标是提供一个通用和稳定的软件库来高效、安全地管理一个节点上的虚拟机,并支持远程操作。它由以下的模块组成:
一个库文件,实现管理接口
一个守护进程(libvirtd)
一个命令行工具(virsh)
基于可移植性和高可靠性的考虑,Libvirt 采用 C 语言开发,但是也提供了对其他编程语言的绑定,包括 Python,Perl,Ocaml,Ruby,Java 和 PHP。因此 Libvirt 的调用可以被集成到各种编程语言中,适应不同的环境。Libvirt 支持多种虚拟机,具体情况如下:
名称注释 LXC 轻量级的 Linux 容器 OpenVZ 基于 Linux 内核的轻量级 Linux 容器 KVM/QEMU 基于 Linux 的类型 2 的 VMMXen 开源的类型 1 的 VMMUser-mode Linux(UML)系统调用级别的 Linux 虚拟机 VirtualBoxOracle 开发的类型 2 的 VMMVmware ESX and GSXVmware 虚拟化的服务器版本 Vmware Workstation and PlayerVmware 虚拟化的桌面版本 Hyper- V 微软开发的 VMMPowerVMIBM 开发的 VMMParallels WorkstationParallels 为 Mac 开发的 VMMBhyveFreeBSD 9+ 上的 VMM 二、Libvirt 的结构
Libvirt 屏蔽了不同虚拟化的实现,提供统一管理接口。用户只关心高层的功能,而 VMM 的实现细节,对于最终用户应该是透明的。Libvirt 就作为 VMM 和高层功能之间的桥梁,接收用户请求,然后调用 VMM 提供的接口,来完成最终的工作。Libvirt 的层次结构如下:
为了支持多种 VMM,Libvirt 采用了基于驱动的架构,如图下图所示。也就是说,每种 VMM 需要提供一个 Driver 和 Libvirt 进行通信来操控特定的 VMM。
三、Libvirt 的实现
Libvirt 代码里所定义的主要对象如下图所示。
VirConnectPtr:代表了一个特定 VMM 建立的连接。每一个基于 Libvirt 的应用程序都应该先提供一个 URI 来指定本地或远程的某个 VMM,从而获得一个 VirConnectPtr 连接。比如 xen+ssh://host-virt/ 代表了通过 ssh 连接一个在 host-virt 机器上运行的 Xen VMM。拿到 virConnectPtr 连接后,应用程序就可以管理这个 VMM 的虚拟机和对应的虚拟化资源,比如存储和网络。
VirDomainPtr:代表一个虚拟机,可能是激活状态或者仅仅已定义。
VirNetworkPtr:代表一个网络
VirStorageVolPtr:代表一个存储卷,通常被虚拟机当做块设备使用。
VirStoragePoolPtr:代表一个存储池,用来分配和管理存储卷的逻辑区域。
1、本机之间的通信‘
在初始化的过程中,所有的驱动被枚举和注册。每一个驱动都会加载特定的函数为 Libvirt API 所调用。如下图所示,Application 通过 URI 调用 Public API,然后 PublicAPI 通过使用 Driver 提供的 API 接口调用正真的 Driver 实现。
2、远程主机之间的通信
Libvirt 的目标是支持远程管理,所以到 Libvirt 的驱动的访问,都由 Libvirt 守护进程 libvirtd 处理,libvirtd 被部署在运行虚拟机的节点上,通过 RPC 由对端的 remote Driver 管理,如下图所示。
在远程管理模式下,virConnectionPtr 实际上连接了本地的 remote Driver 和远端的特定 Driver。所有的调用都通过 remote Driver 先到达云端的 libvirtd,libvirtd 访问对应的 Driver。
关于 Libvirt 概念及实现原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。