libvirt 是目前使用最为广泛的对 KVM虚拟机进行管理的工具和应用程序接口,而且一些常用的虚拟机管理工具(如 virsh/virt-install/virt-manager 等)和云计算框架平台(Openstack等)都在底层使用libvirt 的应用程序接口。libvirt 作为中间适配层,让底层 Hypervisor 对上层用户空间的管理工具可以完全透明的,因为libvirt 屏蔽了底层各种 Hyper-visor细节。
在 libvirt 中涉及几个重要的概念,解释如下:
libvirt 的管理功能主要包含如下五个部分:
(1) 域的管理。包括对节点上的域的各个生命周期的管理,如启动、停止、暂停、保存、恢复和动态迁移。也包括对多种设备类型的热插拔操作,包括磁盘、网卡、内存和CPU。
(2) 远程节点的管理。只要物理节点上运行了 libvirtd 这个守护进程,远程的管理程序就可以连接到该节点进行管理操作,经过认证和授权之后,所有的 libvirt 功能都可以被访问和使用。
virsh -c qemu+ssh://root@10.239.13.137/system
我们还可以设置别名:
vim /etc/libvirt/libvirt.conf
uri_aliases = [
"hhb=qemu+ssh://root@10.239.13.137/system",
]
我们就可以这样连接了 virsh -c hhb 在代码中调用 libvirt API 时也可以使用这个别名来建立连接,如下的 Python 代码行就实现了使用这个别名来建立连接: conn = libvirt.openReadonly(‘hhb’)
(3) 存储的管理。如何运行了 libvirtd 守护进程的主机,都可以通过 libvirt 来管理不同类型的存储,如创建不同格式的客户机镜像(qcow2、raw、qde、vmdk等)、挂载 NFS 共享存储系统、查看现有的 LVM卷组等。当然在 libvirt 中,对存储的管理也是支持远程管理的。
(4) 网络的管理,任何运行了 libvirtd 守护进程的主机,都可以通过 libvirt 来管理物理的和逻辑的网络接口。包括列出现有的网络接口卡、配置网络接口,创建虚拟网络接口,网络接口的桥接等。
(5) 提供一个稳定、可靠、高效的应用程序接口,以便可以完成前面的4个管理功能。libvirt 主要由三个部分组成,它们分别是:应用程序编程接口库(libvirt API)、一个守护进程(libvirtd)和一个默认命令行管理工具(virsh)。libvirtd守护进程可以分为两种,一种是root 权限的 libvirtd,其权限比较大,可以完成所有支持的管理工作;一种是普通用户权限的 libvirtd,只能完成比较受限的管理工作。另外应用程序接口是为其他虚拟管理工具(virsh, virt-manager等)提供虚拟机管理的程序库支持。
如果已经安装了,先把安装了东西删除 which libvirtd rpm -q libvirtd rpm -e libvirt libvirt –version
下载源码安装 http://libvirt.org/sources/libvirt-1.0.0.tar.gz
./configure
make -j 4
make install
ls /usr/local/lib/libvirt
ldconfig // 链接库
从 libvirt 的 git 代码仓库编译 libvirt
git clone git://libvirt.org/libvirt.git
http://libvirt.org/git/libvirt.git
cd libvirt.git
./autogen.sh
make
make install
// autogen.sh system 就会尽可能保证安装目录和原生系统的一致性。
用软件包安装 rpm -qa | grep libvirt yum 的方式安装
(1) libvirt 的配置文件
/etc/libvirt/libvirt.conf
(2) libvirtd 的配置文件
/etc/libvirt/libvirtd.conf
不同版本的API具体参见:http://libvirt.org/hvsupport.html,主要为不同的虚拟化技术方案对外提供统一的接口,其设计思想为: (1)isolation from HV API changes - 隔离底层硬件虚拟化接口对上层的影响 (2)portable across HV - 支持多种os,如linux,windows,solairs等 (3)rapid application development - 提供封装的API,加快软件开发的过程 (4)TLS, SASL, SSH, PolicyKit - 提供各种加密协议,保证了上层应用对下层资源的安全访问 通过封装最原始的C库,实现了多种编程语言的接口:Perl, Python, OCaml, Java, Ruby,C#, Php,并对目前在应用层编程中常用的协议进行封装,形成不同的协议库,方便在应用层编程中调用,目前主要支持: (1)Mapping to CIM/DMTF: libvirt-cim 公共信息模型CIM,是一个与具体实现无关的、用于描述管理信息的概念性模型。 (2)Mapping to AMQP/QMF: libvirt-qmf AMQP是一个提供统一消息服务的应用层标准协议,是一种二进制协议,提供客户端应用与消息中间件之间异步、安全、高效地交互。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。 (3)Mapping to SNMP: libvirt-snmp 该库使得libvirt具备SNMP的功能,开发人员能够通过SNMP来监控和设置每个node上不同domain的信息 (4)Mapping to GObject: libvirt-glib
该后台进程主要实现以下功能:
(1)远程代理
所有remote client发送来的命令,由该进程监测执行
(2)本地环境初始化
libvirt服务的启停,用户connection的响应等
(3)根据环境注册各种Driver(qemu, xen, storage…)的实现
不同虚拟化技术以Driver的形式实现,由于libvirt对外提供的是统一的接口,所以各个Driver就是实现这些接口, 即将Driver注册到libvirt中
即将libvirt API封装,以Command Line Interface提供的对外接口。
为了便于理解,将libvirt分为三个层次结构,具体参见下图。
参照上图,来理一下通过virsh命令或接口创建虚拟机实例的代码执行路径:
(1)virsh命令或API接口c创建虚拟机 – 接口层
virsh create vm.xml 或者 virDomainPtr virDomainCreateXML (virConnectPtr conn, const char * xmlDesc, unsigned int flags)
(2)调用libvirt提供的统一接口 – 抽象驱动层
conn->driver->domainCreateXML(conn, xmlDesc, flags);
//此处的domainCreateXML即抽象的统一接口,这里并不需要关心底层的driver是kvm,还是xen
(3)调用底层的相应虚拟化技术的接口 – 具体驱动层
domainCreateXML = qemuDomainCreateXML; //如果driver=qemu,那么此处即调用的qemu注册到抽象驱动层上的函数qemuDomainCreateXML
(4)拼装shell命令,并执行
以qemu为例,qemuDomainCreateXML首先会拼装一条创建虚拟机的命令,比如qemu -hda disk.img,然后创建一个新的线程来执行
回过头来思考,libvirt通过4步,将最底层的直接在shell中输入命令来完成的操作进行了抽象封装,给应用程序开发人员提供了统一的,易用的接口.
目前,libvirt以下几种类型的抽象驱动,每一种类型的驱动代表某以功能模块的抽象封装:
(1)虚拟化驱动(virDriverPtr) (2)虚拟网络驱动(virNetworkDriverPtr) (3)物理网卡驱(virInterfaceDriverPtr) (4)存储驱动(virStorageDriverPtr) (5)监控驱动(virDeviceMonitorPtr) (6)安全驱动(virSecretDriverPtr) (7)过滤驱动(virNWFilterDriverPtr) (8)状态驱动(virStateDriverPtr)
在下篇文章中,将会从如何搭建libvirt调试环境入手,深入分析libvirt每一个模块的代码。
1. Define new virtual machine using XML file (example file in Appendix B):
virsh define vmm.xml
2. Start the newly created virtual domain using its name (defined in XML file):
virsh start vmm
3. Launch graphical window for the virtual domain using its name:
virt-viewer vmm
4. Shutdown (graceful shutdown) or destroy (stop) the domain in order to close it:
virsh shutdown vmm
virsh destroy vmm
how to fix “network ‘default’ is not active” error in libvirt
When you check the state of existing networks, you will see “inactive” state for the ‘default’ network.
$ sudo virsh net-list –all
Identify the name of the bridge associated with the ‘default’ network. You can find out the bridge name in the default network template (/etc/libvirt/qemu/networks/default.xml). In most cases, the bridge name is virbr0.
Remove that bridge as follows.
$ sudo ifconfig virbr0 down $ sudo brctl delbr virbr0
Now start the ‘default’ network using virsh command.
$ sudo virsh net-start default
This will automatically re-create the virbr0 bridge
Verify the state of the default network.
$ sudo virsh net-list –all