libvirt详解

**提要:**虚拟云实现的三部曲:虚拟化技术实现–>虚拟机管理–>集群资源管理(云管理)。

libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程的virsh调用,Libvirtd调用qemu-kvm操作虚拟机。
libvirt详解_第1张图片
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,让上层可以用一种单一的方式来管理多种不同的虚拟化技术。

1、什么是libvirt
Libvirt是管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。位于虚拟机和云管理中间的一个抽象管理层。它包括一个API库,一个守护程序(libvirtd)和一个命令行工具(virsh);libvirt本身构建于一种抽象的概念之上。它为受支持的虚拟机监控程序实现的常用功能提供通用的API。
libvirt的主要目标是为各种虚拟化工具提供一套方便、可靠的编程接口,用一种单一的方式管理多种不同的虚拟化提供方式。

libvirt 的基本操作和大概结构

  • libvirt 组件有一个 shell,被称为 virsh,提供类似 shell 的界面,可以输入 start、shutdown
    等命令操作虚拟机

  • libvirt 有一个守护进程,libvirtd,其对 virsh 的命令做出响应

    • 以 non-root 执行 virsh start 时,将以 qemu://session 的方式运行。libvirtd 将启动一个 non-root 的子进程来与 virsh 进行 socket 通信
    • 以 root 执行 virsh start 时,将以 qemu://system 方式运行,libvirtd 直接与 virsh 进行 socket 通信

无论是上述哪种方式,都会创建多个(一般16个)线程,该线程的的作用是将 socket 传递过来的各个命令和配置进行解析,最终形成一个 cmd。
子线程会将 cmd 通过 pipe 传递给 libvirtd,libvirtd 会 fork 出一个子进程,并 exec cmd
来自https://blog.csdn.net/sdulibh/article/details/90257557

libvirt 启动 qemu 的流程图
libvirt详解_第2张图片
2、主要支持的功能
虚拟机管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU。
远程机器支持:只要机器上运行了libvirt daemon,包括远程机器,所有的libvirt功能就都可以访问和使用。支持多种网络远程传输,使用最简单的SSH,不需要额外配置工作。
存储管理:任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享,等等等等。因为libvirt可以远程工作,所有这些都可以通过远程主机使用。
网络接口管理:任何运行了libvirt daemon的主机都可以用来管理物理和逻辑的网络接口。
虚拟NAT和基于路由的网络:任何运行了libvirt daemon的主机都可以用来管理和创建虚拟网络。

3、支持的虚拟机
libvirt详解_第3张图片
4、体系结构
没有使用libvirt的虚拟机管理方式如下图所示:
libvirt详解_第4张图片
为支持各种虚拟机监控程序的可扩展性,libvirt实施一种基于驱动程序的架构,该架构允许一种通用的API以通用方式为大量潜在的虚拟机监控程序提供服务。下图展示了libvirt API与相关驱动程序的层次结构。这里也需要注意,libvirtd提供从远程应用程序访问本地域的方式。
libvirt详解_第5张图片
libvirt的控制方式有两种:
1)管理应用程序和域位于同一节点上。管理应用程序通过libvirt工作,以控制本地域。
libvirt详解_第6张图片
2)管理应用程序和域位于不同节点上。该模式使用一种运行于远程节点上、名为libvirtd的特殊守护进程。当在新节点上安装libvirt时该程序会自动启动,且可自动确定本地虚拟机监控程序并为其安装驱动程序。该管理应用程序通过一种通用协议从本地libvirt连接到远程libvirtd。
libvirt详解_第7张图片
6、相关工具
virsh(虚拟 shell)的应用程序,基于命令行的管理工具,可以实现简单的资源管理。它构建于libvirt之上,允许以交互方式使用多个libvirt功能。
virsh list 列出给定主机上的活动域域id和状态 查看在运行的虚拟机 /domain?
virsh list --all 查看创建的所有虚拟机
virsh start domain_name 启动名称为domain_name的虚拟机
virsh suspend domain_name 挂起虚拟机
virsh resume domain_name 恢复被挂起的虚拟机
virsh autostart domain_name 开机启动虚拟机,及在虚拟服务libvirt启动时启动虚拟机
virsh auto start --disable domain_name 关闭开机启动虚拟机
virsh shutdown domain_name 关闭虚拟机(需要ACPID服务的支持,ACPI是Advanced Configuration and PowerInterface缩写,高级配置和电源管理接口)
virsh reboot domain_name 重启持久虚拟机
virsh reset domain_name 强制重启虚拟机
virsh destroy domain_name 强制关闭虚拟机,这种方式是从virsh list列表中将虚拟机删
除,仍然可以start起来
virsh net-start default 启动默认的网络
virsh net-autostart default 自启动默认网络
彻底删除虚拟机步骤
1)关闭虚拟机:virsh destroy domain_name
2)删除定义:virsh undefine domain_name
3)删除虚拟机文件(在/var/lib/libvirtd/下的相关文件)

创建虚拟机步骤:
需要提前准备好xml配置文件(本地没有就去网上抄一个,修改对应参数)
virsh dumpxml domain_name > /home/ 转储虚拟机的设置项
virsh define *.xml 从xml定义一个虚拟机
virsh start domain_name

附上libvirt 官方xml链接
https://libvirt.org/formatdomain.html

你可能感兴趣的:(虚拟化,云计算)