参考资料:
http://blog.youkuaiyun.com/quqibing001/article/details/51201768
http://www.coderli.com/windows-libvirt-one/(重点)
http://www.coderli.com/windows-libvirt-api-two/(重点)
https://wenku.baidu.com/view/1ca54b57ad02de80d4d840f3.html
http://www.10tiao.com/html/625/201601/403509325/2.html
windows上Java通过libvirt来获取KVM下host数据:
1、windows上必须要用32位的JDK才行,不能使用64位JDK,eclipse当然也要使用32位的了;
2、安装Libvirt-0.8.8-0.exe,配置环境变量;
3、将C:\Program Files\Libvirt\bin目录下的libvirt-0.dll改为virt.dll ;
可能会出现的错误:
1、出现Unable to load libvirt ‘virt’:Native library(win32-x86/virt.dll) not found in ……。
解决办法:重新执行并检查上述3个步骤;
如果Libvirt-0.8.8-0.exe安装配了系统环境变量,可以不使用代码
System.setProperty("jna.library.path","C:\\Program Files\\Libvirt");
2、代码能够顺利跑起来之后,运行过程中如果出现Java(TM) Platform SE binary已停止工作,是由于代码中有部分值无法获取导致,将该值得获取代码注释掉即可,如下代码中被注释掉的代码就是无法获取到值的;
结果截图:
package com.mdl;
import java.io.FileNotFoundException;
import org.dom4j.DocumentException;
import org.libvirt.Connect;
import org.libvirt.Domain;
import org.libvirt.DomainBlockInfo;
import org.libvirt.DomainBlockStats;
import org.libvirt.LibvirtException;
import org.libvirt.NodeInfo;
import org.libvirt.VcpuInfo;
import com.google.gson.Gson;
public class LibvirtTest1 {
// 新建连接
public static Connect kvmConn;
public static void main(String arg[]) throws FileNotFoundException, DocumentException {
String arch = System.getProperty("sun.arch.data.model");
System.out.println(arch);
init();
}
/**
* 初始化连接
*/
public static void init() {
try {
// System.setProperty("jna.library.path","C:\\Program Files\\Libvirt");//如果配置了环境变量,这行代码可以不需要
kvmConn = new Connect("qemu+tcp://172.*.*.80/system");
// System.out.println("Connectionversion is "+ Connect.connectionVersion(kvmConn));
doDetectHost(kvmConn);
doDetectDomains(kvmConn);
} catch (LibvirtException e) {
e.printStackTrace();
}
}
/**
* 主机信息探测接口验证,验证可以获取的主机属性和监控指标,分别考虑Xen环境和KVM环境
*/
// public void testDetectHost() {
// // KVM
// doDetectHost(kvmConn);
// // XEN
// // doDetectHost(xenConn);
// }
// 物理主机探测
private static void doDetectHost(Connect conn) {
try {
// System.out.println("Host name: " + conn.getHostName());
System.out.println("Type: " + conn.getType());
System.out.println(conn.getVersion());
NodeInfo nodeInfo = conn.nodeInfo();
System.out.println("每一个socket的核的数量: " + nodeInfo.cores);
System.out.println("活动的cpu数量: " + nodeInfo.cpus);
System.out.println("内存的大小(以千字节为单位): " + nodeInfo.memory);
System.out.println("预期的CPU频率: " + nodeInfo.mhz);
System.out.println("cpu型号: " + nodeInfo.model);
System.out.println("the number of NUMA cell, 1 for uniform: " + nodeInfo.nodes);
System.out.println("每个节点的cpu socket数量: " + nodeInfo.sockets);
System.out.println("每个核心的线程数: " + nodeInfo.threads);
System.out.println("支持的CPU总数: " + nodeInfo.maxCpus());
// for (String networkName : conn.listNetworks()) {
// System.out.println("网络名称: " + networkName);
// Network network = conn.networkLookupByName(networkName);
// System.out.println("网络UUID: " + network.getUUIDString());
// System.out.println("Network free: " + network.free());
// }
//
// for (String networkFilterName : conn.listNetworkFilters()) {
// System.out.println("Network filter name: " + networkFilterName);
// }
// System.out.println(conn.getCapabilities());
} catch (LibvirtException e) {
e.printStackTrace();
}
}
/**
* 执行探测虚拟机测试函数
*
* @param conn
*/
private static void doDetectDomains(Connect conn) {
try {
for (int activeDomId : conn.listDomains()) {
System.out.println("活动的虚拟机id: " + activeDomId);
Domain domain = conn.domainLookupByID(activeDomId);
Gson gs = new Gson();
String domainStr = gs.toJson(domain.getID());
System.out.println(domainStr);
String domainStr2 = gs.toJson(domain.getInfo());
System.out.println(domainStr2);
String domainStr3 = gs.toJson(domain.getJobInfo());
System.out.println("getJobInfo---" + domainStr3);
String domainStr4 = gs.toJson(domain.getVcpusInfo());
System.out.println(domainStr4);
System.out.println("虚拟机Cpu时间: " + domain.getInfo().cpuTime);
System.out.println("虚拟机允许最大内存: " + domain.getInfo().maxMem);
System.out.println("虚拟机内存: " + domain.getInfo().memory);
System.out.println("虚拟机Cpu数量: " + domain.getInfo().nrVirtCpu);
System.out.println("虚拟机状态: " + domain.getInfo().state);
System.out.println("虚拟机id: " + domain.getID());
System.out.println("虚拟机名称: " + domain.getName());
// System.out.println("虚拟机操作系统类型: " + domain.getOSType());
System.out.println("虚拟机uuid: " + domain.getUUIDString());
System.out.println("虚拟机最大内存: " + domain.getMaxMemory());
System.out.println("虚拟机最大vcpu: " + domain.getMaxVcpus());
// System.out.println("Domain xml description: " + domain.getXMLDesc(0));
System.out.println("虚拟机网络是否自动启动: " + domain.getAutostart());
// 虚拟机cpu扩展信息
for (VcpuInfo vcpuInfo : domain.getVcpusInfo()) {
System.out.println("cpu: " + vcpuInfo.cpu);
System.out.println("cpu运行时间: " + vcpuInfo.cpuTime);
System.out.println("cpu数量: " + vcpuInfo.number);
System.out.println("cpu状态: " + vcpuInfo.state);
}
// System.out.println("xxxxxxxxxxxxxxxxxxxxx" + conn.getURI());
// 如果是KVM环境
// if (conn.getURI().startsWith("QEMU")) {
if (conn.getType().equals("QEMU")) {
DomainBlockInfo blockInfo;
String mName = domain.getName();
if (!mName.equals(null) && mName.startsWith("instance")) {
blockInfo = domain.blockInfo("/var/lib/nova/instances/" + domain.getName() + "/disk");
System.out.println("磁盘容量: " + blockInfo.getCapacity());
System.out.println("分配磁盘: " + blockInfo.getAllocation());
System.out.println("物理磁盘: " + blockInfo.getPhysical());
DomainBlockStats blockStats = domain.blockStats("vda");
// 磁盘读取请求总数
System.out.println("磁盘读取请求总数:" + blockStats.rd_req);
// 磁盘读取总bytes数
System.out.println("磁盘读取总bytes数 : " + blockStats.rd_bytes);
// 磁盘写入请求总数
System.out.println("磁盘写入请求总数:" + blockStats.wr_req);
// 磁盘写入总bytes数
System.out.println("磁盘写入总bytes数: " + blockStats.wr_bytes);
} else {
System.out.println("********************not instance*********************");
}
}else {
System.out.println("*******************not QEMU**********************");
continue;
}
}
// 列出所有停止态的虚拟机
// for (String name : conn.listDefinedDomains()) {
// if (name != null) {
// Domain domain = conn.domainLookupByName(name);
// System.out.println("未运行虚拟机名称 " + name);
//
// System.out.println("未运行虚拟机最大内存: " + domain.getMaxMemory());
// System.out.println("未运行虚拟机UUID: " + domain.getUUIDString());
// System.out.println("未运行虚拟机运行Time: " + domain.getInfo().cpuTime);
// System.out.println("未运行虚拟机状态: " + domain.getInfo().state);
// System.out.println("未运行虚拟机内存: " + domain.getInfo().memory);
// System.out.println("未运行虚拟机Cpu数量: " + domain.getInfo().nrVirtCpu);
// }
// }
} catch (LibvirtException e) {
e.printStackTrace();
}
}
}