关于libvirt的API编程介绍
来源:互联网 发布:sqlserver卸载不干净 编辑:程序博客网 时间:2024/06/04 18:21
本文先简要介绍了libvirt以及其API编程要点,然后具体介绍了如何通过调用libvirt的Python API,来实现memory balloon(即virtio balloon)的功能。
关于libvirt,可以将它看成由四个部分组成:
1. libvirtd,它是一个系统服务,运行 man libvirtd 可以看到更多关于libvirtd的介绍。 它主要是作为libvirt虚拟化管理系统的服务端守护进程。它的任务主要包括启动、停止虚机,在主机间迁移虚机,配置和操作网络,为虚机的使用而管理存储等。重启libvirtd不会影响正在运行的虚机。
2. libvirt虚拟化所依赖的动态链接库
对于CentOS来说,位于 /usr/lib64/libvirt
3. virsh,一个用户态程序,用于管理虚机。用“man virsh”可以看到非常详尽的信息。
4. libvirt API,有各种语言的实现,但最基本最主要的是C语言的实现。
通过使用这些API,可以实现virsh的功能。
关于libvirt API的列表,可以参见:http://libvirt.org/html/index.html
一个坑:
关于libvirt API的各语言实现与C语言的对应关系,是一个比较坑的事情。libvirt官方网站给出了一个简单的例子来说明C语言API和Python版本的API的对应关系,参见这里:http://libvirt.org/python.html
int virDomainSetMemory(virDomainPtr domain, unsigned long memory);
这是一个C语言的全局函数,它对应于Python中的类virDomain的成员函数setMemory()
2. C语言里面的一些宏,比如 XXX,到了Python中体现为 libvirt.XXX.
3. C语言里面一些指向结构体的指针,尤其是该指针被用作函数的入参同时也是出参的时候,到了Python中就体现为该函数的返回值是一个dict. 比如,int virDomainMemoryStats(virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags) 这个函数,到了Python中就体现为 virDomain::memoryStats(),该函数没有入参,返回值是一个dict,包含了'actual', 'available'等keys,分别表示实际总内存量、可得内存量等等。
最后回归实践,让我们来写一段代码,用于设置和获取某个指定虚机的‘total memory’,即实现内存气球技术(关于内存气球的细节,请参见http://blog.csdn.net/nirendao/article/details/54919471)
关于libvirt,可以将它看成由四个部分组成:
1. libvirtd,它是一个系统服务,运行 man libvirtd 可以看到更多关于libvirtd的介绍。 它主要是作为libvirt虚拟化管理系统的服务端守护进程。它的任务主要包括启动、停止虚机,在主机间迁移虚机,配置和操作网络,为虚机的使用而管理存储等。重启libvirtd不会影响正在运行的虚机。
2. libvirt虚拟化所依赖的动态链接库
对于CentOS来说,位于 /usr/lib64/libvirt
3. virsh,一个用户态程序,用于管理虚机。用“man virsh”可以看到非常详尽的信息。
4. libvirt API,有各种语言的实现,但最基本最主要的是C语言的实现。
通过使用这些API,可以实现virsh的功能。
关于libvirt API的列表,可以参见:http://libvirt.org/html/index.html
一个坑:
关于libvirt API的各语言实现与C语言的对应关系,是一个比较坑的事情。libvirt官方网站给出了一个简单的例子来说明C语言API和Python版本的API的对应关系,参见这里:http://libvirt.org/python.html
说它坑,是因为:一、即使进入Python运行环境,import之后,运行help()来查看,看到的也仍是C API的描述;二、官方网站上只有C版本API的文档;三、上述的那个对应关系文章并不很详尽,很多由C到Python的对应规则还需自行领悟。这三点会对初学者使用非C版本的libvirt API造成一定的障碍。
笔者大致总结了一下从C到Python的API的对应规则,可能并不全面,但应该会有一点帮助:
1. C语言API里的一些全局函数,对应于Python版本里的特定类的成员函数,比如:int virDomainSetMemory(virDomainPtr domain, unsigned long memory);
这是一个C语言的全局函数,它对应于Python中的类virDomain的成员函数setMemory()
2. C语言里面的一些宏,比如 XXX,到了Python中体现为 libvirt.XXX.
3. C语言里面一些指向结构体的指针,尤其是该指针被用作函数的入参同时也是出参的时候,到了Python中就体现为该函数的返回值是一个dict. 比如,int virDomainMemoryStats(virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags) 这个函数,到了Python中就体现为 virDomain::memoryStats(),该函数没有入参,返回值是一个dict,包含了'actual', 'available'等keys,分别表示实际总内存量、可得内存量等等。
最后回归实践,让我们来写一段代码,用于设置和获取某个指定虚机的‘total memory’,即实现内存气球技术(关于内存气球的细节,请参见http://blog.csdn.net/nirendao/article/details/54919471)
#!/usr/bin/pythonimport libvirtimport sysfrom pprint import pprint def set_memory(instance_id, size_in_kb): conn = libvirt.open(None) if conn == None: print 'Failed to open connection to the hypervisor' sys.exit(1) else: print 'Get the connection' try: # dom = conn.lookupByUUIDString('790208f9-6379-4172-bc8e-d2b325496a14') dom = conn.lookupByID(instance_id) result = dom.setMemory(1024*size_in_kb) if result == 0: print 'Succeeded to set Memory!' else: print 'Failed to set Memory!' except Exception as ex: print 'Failed to execution: %s' % ex sys.exit(1) def get_memory(instance_id): conn = libvirt.open(None) if conn == None: print 'Failed to open connection to the hypervisor' sys.exit(1) else: print 'Get the connection' try: # dom = conn.lookupByUUIDString('790208f9-6379-4172-bc8e-d2b325496a14') dom = conn.lookupByID(instance_id) result = dom.memoryStats() pprint(result) except Exception as ex: print 'Failed to execution: %s' % ex sys.exit(1) def main(): set(5, 1200) get(5) if __name__ == "__main__": main()
以上这个程序中,set_memory(instance_id, size_in_kb)函数就是用来设定指定虚机(dom)的实际最大内存,而get_memory(instance_id)函数,就是用来获取指定虚机的实际最大内存。
(完)
1 0
- 关于libvirt的API编程介绍
- libvirt 部分API 介绍
- libvirt 部分API 介绍
- libvirt Java API用法连载之libvirt C/Java API介绍与jna/libvirt Java SDK引入(三)
- 用C++编程调用libvirt的API来创建KVM虚拟机
- centos下C编程调用libvirt的API访问KVM虚拟机
- Libvirt介绍
- Libvirt介绍
- libvirt 介绍
- libvirt 介绍
- Libvirt介绍
- libvirt库的API参考文档总结
- KVM 介绍:libvirt 介绍
- KVM 介绍:libvirt 介绍
- WIN API编程的详细介绍
- API编程的详细介绍(转)
- 【Libvirt】 Libvirt 虚拟化库剖析 (针对简单的 Linux 虚拟化的 API)
- Windows关于操作注册表的API介绍
- [01]Tomcat和HTTP协议
- centos 7 firewall配置
- C语言 sprintf实现
- gulp的node-glob
- Git 学习笔记、相关命令、问答
- 关于libvirt的API编程介绍
- qscoj 28 喵哈哈村的嘟嘟熊魔法(4)(思维+前缀和)@
- U盘安装Ubuntu failed to load ldlinux.c32' UltraISO
- PAT L2-014. 列车调度 二分查找优化,递减序列
- Android中使用SVG
- java数据类型和字符串讲解
- UVALive 4614 Moving to Nuremberg(树形DP)
- EffectiveJava(27)优先考虑使用泛型方法
- 内部centos + vpn + 中间windows + 日本ntp服务器