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内部类实现伪方法级多线程
最近碰到一个问题,就是用户在填写相关信息提交后,后台需要将一些文件同步到另外一台服务器,而这个时候,由于用的是spring的框架,导致前端页面需要等待文件同步完成,才能弹出提示信息.相信大家在很多时候 ...
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- [转] PostgreSQL学习手册(函数和操作符)
一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < ...
- Visual Studio 2012 Ultimate 上安装 Python 开发插件 PTVS
1.我的环境 操作系统:32位 Win7 旗舰版 Service Pack 1 VS版本:Microsoft Visual Studio Ultimate 2012 版本 11.0.50727.1 R ...
- 配置HP LaserJet M1536dnf MFP打印机通过TCPIP共享多台计算机
HP LaserJet M1536dnf MFP打印机通过TCPIP共享多台计算机配置配置过程:1.确保网线插入到打印机后,点设置按钮,到网络配置中查看IP地址,确保与主机或者路由器的IP地址一致,设 ...
- 06-自定义Attribute标记案例
自定义Attribute: 1)Attribute都从System. Attribute类继承,类名一般以Attribute结尾 2) 标记类的用途—AttributeUsage标记(标记的标记):A ...
- redis入门指南学习笔记
redis的常见命令 set key hello get key incr num get num set foo lorem incr foo hset car price 500 hset car ...
- CentOs上搭建git服务器
CentOs上搭建git服务器 首先安装setuptools wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0 ...
- 【转】Windows按键消息—虚拟键码
来源:http://c.biancheng.net/cpp/html/1253.html 虚拟键码保存在WM_KEYDOWN.WM_KEYUP.WM_SYSKEYDOWN和WM_SYSKEYUP消息的 ...
- 使用poi3.9的jar输出excel
// 取得模板文件存放的路径 ReadFilePath = ServletActionContext.getServletContext().getRealPath(ExcelTemplateFile ...