KVM虚拟机创建功能详细讲解.docx

上传人:b****8 文档编号:28044882 上传时间:2023-07-07 格式:DOCX 页数:24 大小:27.61KB
下载 相关 举报
KVM虚拟机创建功能详细讲解.docx_第1页
第1页 / 共24页
KVM虚拟机创建功能详细讲解.docx_第2页
第2页 / 共24页
KVM虚拟机创建功能详细讲解.docx_第3页
第3页 / 共24页
KVM虚拟机创建功能详细讲解.docx_第4页
第4页 / 共24页
KVM虚拟机创建功能详细讲解.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

KVM虚拟机创建功能详细讲解.docx

《KVM虚拟机创建功能详细讲解.docx》由会员分享,可在线阅读,更多相关《KVM虚拟机创建功能详细讲解.docx(24页珍藏版)》请在冰豆网上搜索。

KVM虚拟机创建功能详细讲解.docx

KVM虚拟机创建功能详细讲解

一.KVM虚拟机创建的用户操作

对于用户或者管理员来说,虚拟机的创建有着很多的方法,例如:

kvm自带命令行工

具、使用virsh命令来创建、使用具有图形界面的virt-manager等等。

但是它们底层实现的原理都是一样的,而且它们基本上都是通过开源的虚拟化库Libvirt来开发的。

下面就讲一讲三种用户可以创建虚拟机的方式。

1.1利用kvm自带命令行工具进行创建

kvm常用命令如下:

参数

示例

说明

-hda

-hda/data/windows.img

指定windows.img作为硬盘镜像

-cdrom

-cdrom/data/windows.iso

指定windows.iso作为光盘镜像

-boot

-bootc

从硬盘启动

 

-bootd

从光盘启动

-m

-m512

分配512M存给虚拟系统

-vnc

-vnc:

0

作为vnc服务器

-cpu

-cpu?

列出支持的CPU

 

-cpucore2duo

指定CPU为core2duo

-smp

-smp2

指定虚拟机有2个CPU

-net

-netnic

为虚拟机网卡(默认为tap0)

 

-nettap

系统分配tap设备(默认为tap0)1

 

-netnic-nettap

将虚拟机的网卡eth0连接真机里的tap0

具体创建一个虚拟机的步骤如下:

(1)生成硬盘镜像文件

roothost:

kvm-imgcreate-frawtest.img10G

其中“-fraw”指定镜像文件的格式为“raw”,“10G”指定镜像文件大小。

(2)从光盘启动虚拟机来安装操作系统

roothost:

kvm-bootd-hdatest.img-cdromtest.iso-m512

其中“-bootd”指定虚拟机从光盘启动,“-hdatest.img”指定硬盘镜像的位置,“-cdromtest.iso”指定光盘镜像的位置,“-m512”指定虚拟机的存为512M。

(3)安装操作系统后便可直接从硬盘启动虚拟机

roothost:

kvm-bootc-hdatest.img-m512

1.2利用virsh命令行工具进行创建

1.2.1virsh工具简介

Virsh是由一个名叫libvirt的软件提供的管理工具,提供管理虚拟机比较高级的能力。

Virsh可以管理KVM以及xen等虚拟机。

下面是virsh的一些常见的命令行选项:

命​令​

Description

help

打​印​基​本​帮​助​信​息​。

list

列​出​所​有​客​户​端​。

dumpxml

输​出​客​户​端​XML配​置​文​件​。

create

从​XML配​置​文​件​生​成​客​户​端​并​启​动​新​客​户​端​。

start

启​动​未​激​活​的​客​户​端​。

destroy

强​制​客​户​端​停​止​。

define

为​客​户​端​输​出​XML配​置​文​件​。

domid

显​示​客​户​端​ID。

domuuid

显​示​客​户​端​UUID。

dominfo

显​示​客​户​端​信​息​。

domname

显​示​客​户​端​名​称​。

domstate

显​示​客​户​端​状​态​。

quit

退​出​这​个​互​动​终​端​。

reboot

重​新​启​动​客​户​端​。

restore

恢​复​以​前​保​存​在​文​件​中​的​客​户​端​。

resume

恢​复​暂​停​的​客​户​端​。

save

将​客​户​端​当​前​状​态​保​存​到​某​个​文​件​中​。

shutdown

关​闭​某​个​域​。

suspend

暂​停​客​户​端​。

undefine

删​除​与​客​户​端​关​联​的​所​有​文​件​。

migrate

将​客​户​端​迁​移​到​另​一​台​主​机​中​。

命​令​

Description

setmem

为​客​户​端​设​定​分​配​的​​存​。

setmaxmem

为​管​理​程​序​设​定​​存​上​限​。

setvcpus

修​改​为​客​户​端​分​配​的​虚​拟​CPU数​目​。

vcpuinfo

显​示​客​户​端​的​虚​拟​CPU信​息​。

vcpupin

控​制​客​户​端​的​虚​拟​CPU亲​和​性​。

domblkstat

显​示​正​在​运​行​的​客​户​端​的​块​设​备​统​计​。

domifstat

显​示​正​在​运​行​的​客​户​端​的​网​络​接​口​统​计​。

attach-device

使​用​XML文​件​中​的​设​备​定​义​在​客​户​端​中​添​加​设​备​。

attach-disk

在​客​户​端​中​附​加​新​磁​盘​设​备​。

attach-interface

在​客​户​端​中​附​加​新​网​络​接​口​。

detach-device

从​客​户​端​中​分​离​设​备​,使​用​同​样​的​XML描​述​作​为​命​令​attach-device。

detach-disk

从​客​户​端​中​分​离​磁​盘​设​备​。

detach-interface

从​客​户​端​中​分​离​网​络​接​口​。

命​令​

Description

version

显​示​ virsh 版​本​

nodeinfo

有​关​管​理​程​序​的​输​出​信​息​

1.2.2virsh命令来创建虚拟机步骤

(1)生成硬盘镜像文件

roothost:

kvm-imgcreate-frawtest.img10G

(2)编写xml配置文件,这一步在1.2.3节具体介绍

(3)创建并运行虚拟机

roothost:

virshcreatetest.xml

其中“test.xml”指定步骤

(2)中创建的xml文件

      这样一个虚拟机便创建起来了。

1.2.3xml配置文件的编写

利用virsh工具创建虚拟机必须编写xml配置文件,该文件指定虚拟机的各项参数,比如虚拟机名称、磁盘镜像的位置、存大小、显示配置等等。

下面给出一个简单的配置文件的例子。

#test.xml

 

 windowsXP

 

 500000

 500000

 1

 

   hvm  

   

   

 

 

   /usr/bin/qemu-system-x86_64

   

     

     

     

   

   

 

     

     

   

      

 

下面介绍其中几个比较重要的元素及属性。

(1)元素的type属性指定运行域的虚拟机管理器,针对kvm应当选择“qemu”。

(2)元素的容指定域的名字。

(3)元素和元素的容非别指定启动时为域分配的最大存和实际分配的存。

(4)元素之间的容用来指定操作系统启动的一些信息。

其中重复的元素形成了一个启动顺序表,比如例子中先从磁盘启动,磁盘无法启动再从光盘启动。

(5)元素的device属性指明不同的设备,标签的file属性指明这些设备的位置。

1.3如何通过图形化界面virt-manager来创建虚拟机

  Virt-manger既虚拟机管理器,是创建和管理虚拟客户端的图形工具。

具体的操作步骤为:

① 从控制台窗口启动这个工具,从root身份输入virt-manager命令,点击file菜单

的”新建”选项。

② virt-manager显示两种虚拟化方法:

Qemu/KVM或者Xen,这里选择Qemu/KVM作

为hypervisor。

③ 选择虚拟机名称和指定一种安装方法,通过网络安装服务器或者本地CD/DVD驱动包括本地ISO文件,在此我用本地ISO的安装方法。

④输入本地ISO文件路径和文件名(假设本地ISO的路径就在根目录下,名称为Mini-BT3.6.1.iso)

⑤设置虚拟机使用的存容量和处理器数量。

 ⑥ 配置虚拟机的存储方法。

对于存储后端有两种选择:

物理存储设备或者使用之前建立的磁盘文件。

如果处于简单测试,创建文件作为存储后端。

当创建虚拟磁盘时,默认为10GB。

 ⑦网络配置,在这里选择NAT方式。

这样一个虚拟机就开始启动起来了,将会出现启动界面,最后出现虚拟机中操作系统的界面。

 

二.libvirt函数库如何实现虚拟机创建

2.1virsh工具”create”命令源码  

在libvirt软件包安装完成之后,就可以看到libvirt的源码,这个源码实现了很多的开发虚拟化软件的用户接口,也就是开发的API。

里面也实现了工具virsh,这个工具也实现了很多的功能。

在/tools下面有一个virsh.c,这个文件里面实现virsh的功能,这里就具体把创建这部分代码选取出来。

     /*

 *"create"command

 */

staticconstvshCmdInfoinfo_create[]={

   {"help",N_("createadomainfromanXMLfile")},

   {"desc",N_("Createadomain.")},

   {NULL,NULL}

};

staticconstvshCmdOptDefopts_create[]={

   {"file",VSH_OT_DATA,VSH_OFLAG_REQ,N_("filecontaininganXMLdomaindescription")},

#ifndefWIN32

   {"console",VSH_OT_BOOL,0,N_("attachtoconsoleaftercreation")},

#endif

   {"paused",VSH_OT_BOOL,0,N_("leavetheguestpausedaftercreation")},

  {"autodestroy",VSH_OT_BOOL,0,N_("automaticallydestroytheguestwhenvirshdisconnects")},

   {NULL,0,0,NULL}

};

staticbool

cmdCreate(vshControl*ctl,constvshCmd*cmd)

{

   virDomainPtrdom;

   constchar*from=NULL;

   boolret=true;

   char*buffer;

#ifndefWIN32

   intconsole=vshCommandOptBool(cmd,"console");

#endif

   unsignedintflags=VIR_DOMAIN_NONE;

   if(!

vshConnectionUsability(ctl,ctl->conn))

       returnfalse;

   if(vshCommandOptString(cmd,"file",&from)<=0)

       returnfalse;

   if(virFileReadAll(from,VIRSH_MAX_XML_FILE,&buffer)<0)

       returnfalse;

   if(vshCommandOptBool(cmd,"paused"))

       flags|=VIR_DOMAIN_START_PAUSED;

   if(vshCommandOptBool(cmd,"autodestroy"))

 

       flags|=VIR_DOMAIN_START_AUTODESTROY;

   dom=virDomainCreateXML(ctl->conn,buffer,flags);

   VIR_FREE(buffer);

   if(dom!

=NULL){

       vshPrint(ctl,_("Domain%screatedfrom%s\n"),

                virDomainGetName(dom),from);

#ifndefWIN32

       if(console)

           cmdRunConsole(ctl,dom,NULL);

#endif

       virDomainFree(dom);

   }else{

       vshError(ctl,_("Failedtocreatedomainfrom%s"),from);

       ret=false;

   }

   returnret;

}

代码的讲解:

  ⑴typedefstruct{

       constchar*name;

       constchar*data;

     }vshCmdInfo;

  上面这个结构体是关于命令的键值对信息,命令一般包含两个名称:

命令的名字和命令的描述信息。

  ⑵typedefstruct{

        constchar*name;

        vshCmdOptTypetype;

        unsignedintflags;

        constchar*help;

     }vshCmdOptDef;

  上面这个结构体是关于命令选项的定义,该结构体一般包括四个字段:

选项的名称,选项类型,标志,帮助信息。

其中选项类型包括:

bool类型,字符串类型,整型,字符数据,剩余的参数。

  ⑶在cmdCreate主程序中有一个特别重要的函数:

virDomainCreateXML(),这个函数的最初原型是:

virDomainPtrvirDomainCreateXML(virConnectPtrconn,constchar*xmlDesc,unsignedintflags),这个函数是基于一个指定的XML文件来创建一个虚拟机,其中conn表示一个指向hypervisor的连接,xmlDesc表示一个XML文件,flags表示命令选项的标志。

2.2通过libvirt创建虚拟机的关键API

通过分析2.1中的virsh源码我们可以看出,使用libvirt进行虚拟机创建要调用两个关键的API--virFileReadAll和virDomainCreateXML,下面分别进行说明。

2.2.1virFileReadAll

   该函数原型为intvirFileReadAll(constchar*path,intmaxlen,char**buf),功能是将参数“path”指定路径的文件容读到一个缓冲区中,并将缓冲区地址记录在参数“*buf”中,而参数“maxlen”指定文件的最大长度。

利用该API,我们可以将xml配置文件都到一个缓冲区中,以方便接下来的使用。

2.2.2virDomainCreateXML

该函数原型为virDomainPtr   virDomainCreateXML     (virConnectPtrconn, constchar*xmlDesc, unsignedintflags),功能是根据参数“xmlDesc”定义的配置方式创建一个域并返回该域的指针。

参数“conn”是指向虚拟机管理器的指针,而通过设置不同的“flags”标志,可以使创建的域具有不同的属性。

三.利用libvirt库编写自己的虚拟机创建程序

  Virsh命令用来创建虚拟机的命令是:

virshcreate,这个命令主要是从给定的XML文件生成客户端并启动客户端。

  下面用一个测试例子来说明如何通过virsh命令来创建虚拟机的。

  具体的操作实践步骤是:

首先需要创建虚拟硬盘,为了放置操作系统的地方,命令是:

kvm-imgcreate

701.img10G,也就是创建一个大小为10G的虚拟硬盘。

  2. 编写一个xml文件,这个文件里面包含启动操作系统的一些特征,比如:

存容量,操作系统位置,虚拟硬盘位置等等,其实有很多的字段,可以简写一个xml文件,如果有些字段没有定义,那么系统就会默认,下面给出一个xml文件,命名为701.xml,程序为:

     

     linux10.0421

     

     512000

     512000

     1

     

        hvm

         

        

     

        

           /usr/bin/qemu-system-x86_64

 

           

           

        

        

      

        

        

        

      

         

       

     

   3. 接着编写一个c文件,名称为701.c这个文件主要实现的功能就是调用这个xml文件来创建并启动虚拟机。

这个c程序代码为:

    #include

    #include

    #include

    #include

    constchar*from=NULL;

    staticvirConnectPtrconn=NULL;

    #defineVIRSH_MAX_XML_FILE10*1024*1024

    voidcloseConn()

    {

        if(conn!

=NULL)

        virConnectClose(conn);

    }

    intcmdCreate()

    {

       virDomainPtrdom;

       char*buffer;

       unsignedintflags=VIR_DOMAIN_NONE;

       conn=virConnectOpen("qemu:

///system");

       if(conn==NULL)

       {

          fprintf(stderr,"failedtoconnecttohypervisor/n");

          closeConn();

          return0;

       }

       if(virFileReadAll(from,VIRSH_MAX_XML_FILE,&buffer)<0)

        return0;

       dom=virDomainCreateXML(conn,buffer,flags);

       memset(buffer,0,sizeof(buffer));

       if(dom!

=NULL){

 

          fprintf(stdout,"Domain%screatedfrom%s\n",virDomainGetName(dom),from);

          virDomainFree(dom);

      }

     else{

         fprintf(stdout,"Failedtocreatedomainfrom%s",from);

       }

     }

      intmain(intargc,char*argv[])

      {

        if(argc<2){

        fprintf(stdout,"therearetoofewparameters,shouldhastwomoreparameters!

");

      }

     from=*++argv;

     cmdCreate();

  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1