设为首页 收藏本站
查看: 917|回复: 0

[经验分享] 使用libvirt管理kvm(API篇)

[复制链接]
发表于 2015-10-10 09:44:34 | 显示全部楼层 |阅读模式
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://speakingbaicai.blog.iyunv.com/5667326/1162005

一、简介

libvirtLinux上的虚拟化库,是长期稳定的C语言API,支持KVM/QEMUXenLXC等主流虚拟化方案。链接:http://libvirt.org/

API开发手册:http://libvirt.org/html/libvirt-libvirt.html

virshlibvirt对应的shell命令。

之前写了一篇使用virsh管理kvm虚拟机的博客《使用libvirt管理kvmvirsh篇)》(传送门:http://speakingbaicai.blog.iyunv.com/5667326/1161964),这里再从编程接口API的角度介绍如何使用libvirt管理kvm虚拟机。

二、环境介绍

OSUbuntu
12.04.1 LTS


内核:Linux 3.2.0-33-generic-pae #52-Ubuntu SMP Thu Oct 18 16:39:21 UTC 2012 i686 i686 i386 GNU/Linux

libvirt0.9.8

三、准备工作

ubuntu安装,直接apt-get
install


1、安装kvm/qemu

sudo apt-get install kvm qemu

2、安装libvirt

sudo apt-get install libvirt-bin libvirt-dev

3、网桥管理工具

sudo apt-get install bridge-utils

4、统一建模语言

sudo apt-get install uml-utilities

5vnc 虚拟机查看工具

sudo apt-get install vncviewer vnc4server

四、创建镜像

在指定目录下

执行 qemu-img create
-f raw template.img 3G


这样就创建了一个大小为3G的镜像(img

有人可能问镜像是什么东西。简单的说,我们在镜像上启动一个虚拟机,这个3G的镜像就相当于这个虚拟机对应的磁盘空间。

也有人执行 qemu-img create
-f qcow2 template.img 3G
,(备注:qcow2支持动态扩张)来获得一个动态扩张的镜像。我个人还需要对磁盘资源进行简单的统计、管理,因此没有用这个。不同情景下可能这种模式更好,有兴趣的朋友自己试一下。

五、libvirt xml配置文件

libvirt(包括virsh)使用xml文件对虚拟机进行配置,其中包括虚拟机名称、分配内存、vcpu等多种信息。定义、创建虚拟机等操作都需要xml配置文件的参与,因此这里先介绍xml配置文件。我编辑了一个名为template.xmlxml文件,其中定义了一个名为demokvm 虚拟机。


  • <domain type = 'kvm'>          //虚拟机类型,kvm
  •     <name>demo</name>          //虚拟机名称
  •     <memory>1048576</memory>   //分配内存,单位kb
  •     <vcpu>1</vcpu>             //分配vcpu,单位个数
  •     <os>
  •         <type arch = 'x86_64' machine = 'pc'>hvm</type>
  •         <boot dev = 'cdrom'/>  //cd 启动
  •         <boot dev = 'hd'/>     //硬盘启动
  •     </os>
  •     <features>
  •         <acpi/>
  •         <apic/>
  •         <pae/>
  •     </features>
  •     <clock offset = 'localtime'/>
  •     <on_poweroff>destroy</on_poweroff>
  •     <on_reboot>restart</on_reboot>
  •     <on_crash>destroy</on_crash>
  •     <devices>
  •         <emulator>/usr/bin/kvm</emulator>
  •         <disk type = 'file' device = 'disk'>  //对应的镜像,就是之前使用qemu-img命令新建的img文件,注意路径要正确
  •             <driver name = 'qemu' type = 'raw'/>
  •             <source file = '/var/lib/lynn/img/template.img'/>
  •             <target dev = 'hda' bus = 'ide'/>
  •         </disk>
  •         <disk type = 'file' device = 'cdrom'> //可选项,iso通常是操作系统的安装光盘
  •             <source file = '/var/lib/lynn/img/template.iso'/>
  •             <target dev = 'hdb' bus = 'ide'/>
  •         </disk>
  •         <interface type = 'bridge'>           //libvirt默认虚拟机的网络配置是NAT模式,就是虚拟机与宿主机的网络拓扑是NAT形式。实际中,许多开发者更希望使用网桥模式。
  •             <source bridge = 'br0'/>
  •         </interface>
  •         <input type ='tablet' bus='usb'/>
  •         <input type = 'mouse' bus = 'ps2'/>
  •         <graphics type = 'vnc' port = '-1' listen = '0.0.0.0' autoport = 'yes' keymap = 'en-us'/>  //vnc端口系统自动配置
  •     </devices>
  • </domain>


六、libvirt的使用——头文件与编译

#include &quot;libvirt/libvirt.h&quot; //libvirt主要API

#include <libvirt/virterror.h> //libvirt 错误提示

编译时加入连接库 -lvirt,例如我要编译名为createvm.cpp的源文件,可以运行如下命令g&#43;&#43;
createvm.cpp -o createvm -lvirt


七、主要使用的API

这里只列举一些常用的API,具体可参见libvirt
API
开发手册



主要功能


函数原型



创建连接

virConnectPtr virConnectOpen(const char * name)                 


根据xml文档创建虚拟机


virDomainPtr virDomainCreateXML(virConnectPtr conn, const char * xmlDesc, unsigned int flags)



根据虚拟机名字获得虚拟域


virDomainPtr virDomainLookupByName(virConnectPtr conn, const char * name)



获取虚拟域相关信息


int virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)



关闭虚拟域


int virDomainShutdown (virDomainPtr domain)



销毁虚拟域


int virDomainDestroy (virDomainPtr domain)



八、新建虚拟机

备注:这里只是写一个简单的例子,除print.cpp以外的代码没有写成带参数、可配置的,请见谅。


  • /*  createvm.cpp  */
  • /* compile with: g&#43;&#43; createvm.cpp -o createvm -lvirt */

  • /* Wang Min @ iie           */
  • /* autumn_sky_is@163.com    */
  • /* date: 2013-02-27         */

  • #include <iostream>
  • #include <cstdio>
  • #include <string>
  • #include <fstream>
  • #include <sstream>  // for stringstream
  • #include &quot;libvirt/libvirt.h&quot;
  • #include <libvirt/virterror.h>

  • using namespace std;
  • string vm_xml_location = &quot;../xml/template.xml&quot;;

  • int main()
  • {
  •     ifstream file(vm_xml_location.c_str());
  •     if(!file) {
  •         cout<<&quot;Cannot open file &quot;<<vm_xml_location<<endl;
  •         return -1;
  •     }
  •     // read xml file
  •     stringstream buffer;
  •     buffer << file.rdbuf();
  •     string vm_xml_template = buffer.str();
  •     file.close();
  •      
  •     virConnectPtr conn = virConnectOpen(&quot;qemu:///system&quot;);
  •     if(NULL==conn) {
  •         fprintf(stderr, &quot;Failed to build connection to qemu:///system.\n&quot;);
  •         return -1;
  •     }

  •     virDomainPtr vm_ptr = virDomainCreateXML(conn, vm_xml_template.c_str(), 0);
  •     if(!vm_ptr) {
  •         virErrorPtr error = virGetLastError();
  •         cout<<error->message<<endl;
  •         return -1;
  •     }
  •     return 0;
  • }


编译后,直接运行./createvm,就创建了一个名为demo的kvm 虚拟机。需要预先在相应目录下新建好一个名为“template.xml”的配置文件

九、读取虚拟机信息


  • /* print.cpp  */
  • /* compile with: g&#43;&#43; print.cpp -o print -lvirt */

  • /* Wang Min @ iie           */
  • /* autumn_sky_is@163.com    */
  • /* date: 2013-02-27         */

  • #include <iostream>
  • #include <cstdio>
  • #include <string>
  • #include <fstream>
  • #include <sstream>  // for stringstream
  • #include &quot;libvirt/libvirt.h&quot;
  • #include <libvirt/virterror.h>

  • using namespace std;
  • //using namespace rapidxml;

  • int main(int argc, char * argv[])
  • {
  •     if(2!=argc){
  •     cout<<&quot;Error: print need 1 parametre&quot;<<endl;
  •     cout<<&quot;usage: ./print vm_name&quot;<<endl;
  •     return -1;   
  •     }
  •     virConnectPtr conn = virConnectOpen(&quot;lxc:///&quot;);
  •     if(NULL==conn) {
  •         fprintf(stderr, &quot;Failed to build connection to lxc:///.\n&quot;);
  •         return -1;
  •     }

  •     virDomainPtr domain = virDomainLookupByName(conn, argv[1]);
  •     if(domain == NULL){
  •         cout<<&quot;can not find &quot;<<argv[1]<<&quot;, regard it as success.&quot;<<endl;
  •         return -1;
  •     }   
  •      
  •     // get lxc Info
  •     virDomainInfo info;
  •     if(-1==virDomainGetInfo(domain, &info)){
  •        cout<<&quot;can not get domain info&quot;<<endl;
  •        return -1;
  •     }
  •    
  •     printf(&quot;state:%d|maxmem:%d|memused:%d|cpunum:%d|cputime:%ld\n&quot;,info.state,info.maxMem,info.memory,info.nrVirtCpu,info.cpuTime);
  •     cout<<&quot;Helloworld&quot;<<endl;
  •     return 0;
  • }


编译后运行./print virt_name,例如./print demo

十、关闭虚拟机


  • /* shutdownvm.cpp  */
  • /* compile with: g&#43;&#43; shutdownvm.cpp -o shutdownvm -lvirt */

  • /* Wang Min @ iie           */
  • /* autumn_sky_is@163.com    */
  • /* date: 2013-02-27         */

  • #include <iostream>
  • #include <cstdio>
  • #include <string>
  • #include <fstream>
  • #include <sstream>  // for stringstream
  • #include &quot;libvirt/libvirt.h&quot;
  • #include <libvirt/virterror.h>

  • using namespace std;
  • string domname = &quot;demo&quot;;
  • int main()
  • {
  •     virConnectPtr conn = virConnectOpen(&quot;qemu:///system&quot;);
  •     if(NULL==conn) {
  •         fprintf(stderr, &quot;Failed to build connection to qemu:///system.\n&quot;);
  •         return -1;
  •     }

  •     virDomainPtr domain = virDomainLookupByName(conn, domname.c_str());
  •     if(domain == NULL){
  •         cout<<&quot;can not find &quot;<<domname <<&quot;, regard it as success.&quot;<<endl;
  •         return 0;
  •     }
  •     if(virDomainShutdown(domain)!=0){
  •         virErrorPtr error = virGetLastError();
  •         cout<<error->message<<endl;
  •         return -1;
  •     }
  •     return 0;
  • }


编译后运行./shutdownvm

十一、销毁虚拟机


  • /* destroyvm.cpp  */
  • /* compile with: g&#43;&#43; destroyvm.cpp -o destroyvm -lvirt */

  • /* Wang Min @ iie           */
  • /* autumn_sky_is@163.com    */
  • /* date: 2013-02-27         */

  • #include <iostream>
  • #include <cstdio>
  • #include <string>
  • #include <fstream>
  • #include <sstream>  // for stringstream

  • #include &quot;libvirt/libvirt.h&quot;
  • #include <libvirt/virterror.h>

  • using namespace std;
  • string domname = &quot;demo&quot;;
  • int main()
  • {
  •     virConnectPtr conn = virConnectOpen(&quot;qemu:///system&quot;);
  •     if(NULL==conn) {
  •         fprintf(stderr, &quot;Failed to build connection to qemu:///system.\n&quot;);
  •         return -1;
  •     }

  •     virDomainPtr domain = virDomainLookupByName(conn, domname.c_str());
  •     if(domain == NULL){
  •         cout<<&quot;can not find &quot;<<domname <<&quot;, regard it as success.&quot;<<endl;
  •         return 0;
  •     }
  •     if(virDomainDestroy(domain)!=0){
  •         virErrorPtr error = virGetLastError();
  •         cout<<error->message<<endl;
  •         return -1;
  •     }
  •     return 0;
  • }


编译后运行./destroyvm

本文出自 “说话的白菜” 博客,请务必保留此出处http://speakingbaicai.blog.iyunv.com/5667326/1162005

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-124959-1-1.html 上篇帖子: Xen vs. KVM 下篇帖子: KVM API的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表