windows下Libvirt Java环境部署

本文介绍如何在Windows环境下使用32位JDK及libvirt库,通过Java程序获取KVM虚拟化平台上的主机信息和虚拟机状态。文章详细说明了配置步骤、可能出现的问题及其解决方案,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:
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();
        }
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值