libvirtsAPI
mongodb远程服务器连接
mongo -uroot -p321 master.puppet.org:27017/admin
aaarticlea/png;base64,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" alt="" />
基于libvcirt的虚拟化guest domain overview:
A guest domain may be transient, or persistent. A transient guest domain can only be managed while
it is running on the host and, when powered off, all trace of it will disappear. A persistent guest domain
has its configuration maintained in a data store on the host by the hypervisor, in an implementation
defined format. Thus when a persistent guest is powered off, it is still possible to manage its inactive
config. A transient guest can be turned into a persistent guest on the fly by defining a configuration for
it.
virDomainLookupByID,virDomainLookupByName,virDomainLokkupByUUID
Example:Fetching a domain object from ID
int domainID = 6;
virDomainPtr dom;
dom = virDomainLookupByID(conn,domainID);
example:fetching a domain object from Name
int domainName = "byRuiy";
virDomainPtr dom;
dom = virDomainLookupByName(conn,domainName);
example:fetching a domain object from an UUID
char *domainUUID = "byrui-1990-04-03-15055198367-5160-59158"
virDomainPtr dom
dom = virDomainLookupByUUIDString(conn,domainUUID);
virConnectListDomains
virConnectNumOfDomains
int i;
int numDomains;
int *activeDomains;
numDomains = virConnectNumOfDomains(conn);
activeDomains = virConnectListDomains(conn,activeDomains,numDomains);
printf("Active domain IDs:\n");
for(i = 0;i < numDomains;i++)
{
printf("%d \n",activeDomains[i]);
}
free(activeDomains);
Exampe:Listing active domais
there may be some persistent inactive domain configurations stored on the host.
virConnectListDefinedDomains
virConnectNumOfDefinedDomains
int i;
int numDomains;
char **inactiveDomains;
numDomains = virConnectNumOfDefinedDomains(conn);
inactiveDomains = malloc(sizeof(char *) * numDomains);
numDomains = virConnectListDomains(conn,inactiveDomains,numDomains);
printf("Inactive domain names:\n");
for (i = 0;i < numDomains;i++)
{
printf("%s \n",inactiveDomains[i]);
free(inactiveDomains[i]);
}
free(inactiveDomains);
the APIs for listing domains do not directly return the full virDomainPtr objects,since this may incur
virDomainPtr *allDomains;
int numDomains;
int numActiveDomains,numInactiveDomains;
char *inactiveDomains;
int *activeDomains;
numActiveDomains = virConnectNumOfDomains(conn);
numInactiveDomains = virConnectNumOfDefinedDomains(conn);
allDomains = malloc(sizeof(virDomainPtr) * numActiveDomains + numInactiveDomains);
inactiveDomains = malloc(sizeof(char *) * numDomains);
activeDomains = malloc(sizeof(int) * numDomains);
numActiveDomains = virConnectListDomains(conn,activeDomains,numActiveDomains);
numInactiveDomains = virConnectListDomains(conn,activeDomains,numActiveDomains);
numInactiveDomains = virConnectListDomains(conn,inactiveDomains,NumInactiveDomains);
for (i = 0;i < numActiveDomains;i++)
{
allDomains[numDomains] = virDomainLoopupByID(aciveDomains[i]);
numDomains++
}
基于libvirt虚拟化 Guest domains lifecycle c ontrol API overview;
libvirt can control the entire lifecycle of guest domains,guest domains can transition through several states throughout their
virDomainCreateXML create and immediately boot a new transient guest domain,when this guest domain shuts down,all trace of it will disappear
virDomainDefineXML store the configuration for a persisent guest domain
virDomainCreate boot a previously defined guest domain from its persistent configuration,
virDomainDefineXML command can be used to turn a previously booted transient guest domain into a persistent domain
booting a transient guest domain
to boot a transient guest domain,simply requires a connection to libvirt and a string containing the XML document describing the required
configuration,the following example assumes that conn is
virDomainPtr dom;
const char *xmlconfig = "<domain>...</domain>";
dom = virConnectCreateXML(conn,xmlconfig,0);
if (!dom) {
fprintf(stderr,"Domain creation failed");
return;
}
fprintf(stderr,"Guest %s has booted",virDomainName(dom));
virDomainFree(dom);
Defining and booting a persistent guest domain
virDomainPtr dom;
const char *xmlconfig = "<domain>..</domain>";
dom = virConnectDefineXML(conn,xmlconfig,0);
if (!dom)
{
fprintf(stderr,"Domain definition failed");
return;
}
if (virDomainCreate(dom) < 0)
{
virDomainFree(dom);
fprintf(stderr,"Cannot boot guest");
New guest provisioning techniques
<domain type='kvm'>
<name>demo</name>
<graphics type='vnc' port='-1' listen='localhost'>
}
CMROM/ISO image provisioning
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
<disk type='file' device='cdrom'>
<source file='/var/lib/libvirt/images/rhel5-x86_64-dvd.iso'/>
<target dev='hdc' bus='ide'>
</disk>
const char *xml = "<domain>...</domain>";
virDomainPtr dom;
dom = virDomainDefineXML(conn,xml);
if (!dom)
{
fprintf(stderr,"Unable to define persistent guest configuration");
return;
}
if (virDomainCreate(dom) < 0)
{
fprintf(stderr,"Unable to boot guest configuration");
}
Paravirtualized (full virtualization)准虚拟化 technologies
Paravirtualization ()半虚拟化
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<kernel>/var/lib/libvirt/boot/f11-x86_64-vmlinuz</kernel>
<initrd>/var/lib/libvirt/boot/f11-x86_64-initrd.img</initrd>
<cmdline>method=http://download.fedoraproject.org/pub/fedora/linux/releases/11/x86_64/osconsole=ttySo console=tty<cmdline>
</os>
host side bootloader xen paravirtualized
<bootloader>/usr/bin/pygrub</bootloader>
<os>
<type arch='x86_64' machine='pc'>xen</type>
</os>
BIOS boot setup fully virtualized guest
const char *xml = "<domain>...</domain>"
virDomainPtr dom;
dom = virDomainCreateXML(conn,xml);
if (!dom)
{
fprintf(stderr,"Unable to define persistent guest configuration \n");
return;
}
if (virDomainCreate(dom) < ) {
fprintf("stderr,"Unable to boot persistent guest \n"");
return;
}
fprintf(stderr,"Guest provisoning complete,OS is running \n");
stopping
a guest can be stopped by two methods
shutdown and destroy
virDomainPtr dom;
virDomainInfoPtr info;
const char *filename = "/var/lib/libvirt/save/demo-guest.img";
dom = virDomainLookupByName(conn,"demo-guest");
//id,uuid,name/第二个参数;
//virDomainPtr,virDomainLokkupByID,virDomainByName,virDomainByUUID
if (!dom)
{
fprintf(stderr,"Cannot find guest to be saved");
return;
}
if (virDomainGetInfo(dom,&info) < )
{
fprintf(stderr,"Cannot check guest state");
return;
}
if (info.state == VIR_DOMAIN_SHUTOFF)
{
fprintf(stderr,"Not saving guest that isn't running");
}
if (virDomainSave(dom,filename) < )
{
fprintf(stderr,"Unable to save guest to %s ",filename);
}
fprintf(stderr,"Guest state saved to %s",filename);
virDomainPtr dom;
int id;
const char *filename = "/var/lib/libvirt/save/demo-guest.img";
if ((id = virDomainRestore(conn,filename)) < 0)
{
fprintf(stderr,"Unable to restore guest from %s",filename);
}
dom = virDomainLookupByID(conn,id);
if (!dom) {
fprintf(stderr,"Cannot find guest that was restored");
return;
}
virDomainMigrate established hypervisor connection
domains are defined in libvirt using XML Everything related only to the domain
monitoring performance
statistical metrics are available for monitoring the utilization rates of domains,
vCPUS,Vmemory,block devices ,netWork interfaces;
virNodeDevicePtr de= get virNodeDevicePtr for the PCI device
if (virNodeDeviceDettach(dev) < )
{
fprintf(stderr,"Device cannot be dettached from the host OS drivers \n");
return;
}
if (virNodeDeviceReset(dev) < )
{
fprintf(stderr,"Device cannot be safely reset without affecting other devices \n");
}
virInterfaceDefineXML virInterfaceGetXMLDesc
xml definition of an ethernet interface using DHCP
<interface type='ethernet' name='eth0'>
<start mode='onboot'/>
<mac address=''/>
<protocol family='ipv4'>
xml definition of an ethernet interface with static ip
<interface type='ethernet' name='eth0'>
<start mode='onboot'/>
<mac address=''>
<protocol family=''>
<ip address="" prefix="24"/>
<route gateway="">
</protocol>
</interface>
xml definition of a bridge device with eth0 and eth1 attached
<interface type="bridge" name="br0">
<start mode="onboot"/>
<mtu size="1500"/>
<protocol family="ipv4">
<dhcp/>
</protocol>
<bridge stp="off" delay="0.01">
<interface type="ethernet" name="eth0">
<mac address=""/>
</interface>
<interface type="ethernet" name="eth1"/>
</bridge>
</interface>
xml definition of a vlan interface associated with eth0
<interface type="value" name="eth0.042">
<start mode="onboot"/>
<protocol family="ipv4">
<dhcp peerdns="no"/>
</protocol>
<vlan tag="42">
<interface name="eth0"/>
</vlan>
</interface>
retrieving information about interfaces
enumerating interfaces
have a connection to a host,respresented by a virConnectPtr,determine the number of interface on the host with virConnectNumOfInterfaces
and virConnectNumOfDefinedInterfaces
a list of those interfaces names can be obtained with virConnectListInterfaces and virConnectListDefinedInterfaces
("defined" interfaces are those that have been defined,but are currently inactive)
getting a list of active("up" interfaces on a host)
int numIfaces,i
char *ifaceNames;
numIfaces = virConnectNumOfInterfaces(conn);
ifaceNames = malloc(numIfaces * sizeof(char *));
numIfaces = virConnectListInterfaces(conn,names,ct);
printf("Active host interfaces:\n");
for(i = ;i < numIfaces;i++)
{
printf("%s \n",ifaceNames[i]);
free(ifaceNames[i]);
}
free(ifaceNames);
getting a list of inactive ("down") interfaces on a host
int numIfaces,i;
char *ifaceNames;
numIfaces = virConnectNumOfDefinedInterfaces(conn);
ifaceNames = malloc(numIfaces * sizeof(char *));//分配内存空间
numIfaces = virConnectListDefinedInterfaces(conn,names,ct);
printf("Inactive host interfaces:\n");
for (i = ;i < numIfaces;i++)
{
prientf("%s \n",ifaceNames[i]);
free(ifaceNames[i]);
}
free(faceNames);
altrnative method of enumerating interfaces
virNodeDevice
virNodeListDevices virNodeDeviceLookupByName virNodeDeviceGetXMLDesc
obtaining a virInterfacePtr for an interface
many operations require that you have a virInterfacePtr,but you may only have the name or MAC address of the interface
use virInterfaceLookupByName and virInterfaceLookupByMACString to get the virInterfacePtr
virInterfacePtr iface;
const char *name = "eth0";
iface = virInterfaceLookupByName(name);
if (iface)
{
/* use the virInterfacePtr*/
virInterfaceFree(iface);
}
else
{
printf("Interface '%s' not found. \n",name);
}
virInterfacePtr iface;
const char *mac ="";
iface = virInterfaceLookupByMACString(mac);
if (iface) {
//use the virInterfacePtr;
virInterfaceFree(iface);
}
else
{
printf("No interface found with MAC address '%s'.\n",mac);
}
virInterfaceGetName virInterfaceMACString virInterfaxceGetXMLDesc
const char *name;
const char *mac;
name = virInterfaceGetName(iface);
mac = virInterfaceGetMACString(iface);
printf("Interface %s has MAC address %s",name,mac);
virInterfaceGetXMLDesc
const char *xml;
name = virInterfaceGetXMLDesc(iface,0);
printf("Interface configuration:\n%s \n",xml);
free(xml);
//xml is a char * containing the description
virInterfacePtr iface;
iface = virInterfaceDefineXML(xml,0);
if (!iface)
{
fprintf(stderr,"Failed to define interface. \n");
//other error handling
goto cleanup;
virInterfaceFree(iface);
cleanup;
}
virInterfacePtr iface;
char *xml = NULL;
iface = virInterfaceLookupByName("br0");
if (!iface)
{
printf("Interface br0 not found. \n");
}
else
{
xml = virInterfaceGetXMLDesc(iface,0);
virInterfaceUndefine(iface);
virInterfaceFree(iface);
}
//you must also free the buffer at xml when you're finished with it
activating/deactivating an interface
temporarily bring down eth2,then bring it back up
virInterfaqcePtr iface;
iface = virInterfaceLookupByName("eth2");
if (!iface){
printf("Interface eth2 not found. \n");
}
else{
if (virInterfaceDestroy(iface) != )
{
fprintf(stderr,"failed to destroy (deactive) interface eth2. \n");
}
else{
//
if (virInterfaceCreate(iface) != ){
fprintf(stderr,"failed to create (active) interface eth2. \n");
}
}
free(iface);
}
libvirtsAPI的更多相关文章
随机推荐
- Java基础知识强化26:Object类之hashCode()方法、getClass()方法
1. Object类的hashCode()方法,如下: public int hashCode():返回该对象的哈希码值,这个值和地址值有关,但是不是实际地址值(哈希码值是根据实际地址值转化过来的 ...
- 【网络流#2】hdu 1533 - 最小费用最大流模板题
最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...
- cogs 1008 贪婪大陆
/* 不要思维定视 盯着线段树维护l r 的ans不放 显然没法区间合并 换一种思路 如果打暴力的话 O(nm) 每次询问 扫一遍之前所有的修改 有交点则说明种数++ 接下来考虑如何优化 我们把每个区 ...
- UWP APP 开发日记
最近需要使用C#开发UWP应用,以前学习过C,这回就是快速看了一下C#的一些特别之处,然后就进入到了实战练习当中. 1.按照MSDN的教程自己搭建了一个简单的“Hello, world”应用.是使用C ...
- hdu 1022
// hdu1022 这题算是我做的第一道栈的题目,之前看过栈的一些内容,做这道题的时候,可以模拟出过程,但是具体的代码不会写...所以决定练习一些栈和队列的问题,大概思路就是有三个数组和一个栈,先把 ...
- GridView and DropDownList
<form id="form1" runat="server"> <div> <asp:GridView runat=" ...
- 分析器错误消息: 未能加载类型“WebApplication._Default”
1.新建一个空白解决方案2.新闻一个Web Application项目 默认就有Default.aspx 直接调试的时候出现-------------------------------------- ...
- C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)
1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...
- Spring.net--很棒的事务处理
1--Case 比如t_Order订单表1,t_OrderDetail订单明细表2 下一张订单会往表1插入一条数据,表2会插入多行数据 使用Spring.net事务管理 例如 ---Order---订 ...
- CactiEZ 中文版V10.1安装使用以及139邮箱短信报警设置
说明:CactiEZ中文版V10.1是基于CentOS 6.0系统,整合Cacti等相关软件,重新编译而成的一个操作系统! 说明:CactiEZ中文版V10.1是基于CentOS 6.0系统,整合 ...