使用java连接Libvirtd

news2024/12/23 21:03:05

基于springboot web

一、依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.libvirt</groupId>
            <artifactId>libvirt</artifactId>
            <version>0.5.2</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.13.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.37</version>
        </dependency>

二、代码

package com.libvirtddemo.controller;

import com.alibaba.fastjson2.JSON;  // 引入fastjson库,用于将对象转换为JSON字符串
import lombok.extern.slf4j.Slf4j;  // 引入Slf4j注解,方便日志记录
import org.libvirt.Connect;  // 引入libvirt库的Connect类
import org.libvirt.Library;  // 引入libvirt库的Library类
import org.libvirt.LibvirtException;  // 引入libvirt库的LibvirtException类
import org.springframework.web.bind.annotation.GetMapping;  // 引入Spring的GetMapping注解
import org.springframework.web.bind.annotation.RestController;  // 引入Spring的RestController注解

import java.util.HashMap;  // 引入HashMap类
import java.util.Map;  // 引入Map类
import java.util.Objects;  // 引入Objects类

@RestController  // 声明该类是一个RESTful API控制器
@Slf4j  // 添加Slf4j注解,方便日志记录
public class LibvirtdController {
    static private Map<String, Connect> s_connections = new HashMap<String, Connect>();  // 定义一个静态Map对象,用于存储连接对象

    @GetMapping("/connection")  // 处理GET请求的映射,路径为"/connection"
    public String connectLibvirt(String hypervisorURI) throws LibvirtException {

        log.info("hypervisorURI: " + hypervisorURI);  // 记录日志,输出hypervisorURI的值
        if (hypervisorURI == null || Objects.equals(hypervisorURI, "")) {  // 判断hypervisorURI是否为空或者为空字符串
            hypervisorURI = "qemu:///system";  // 如果为空,设置默认值为"qemu:///system"
        }
        log.info("Looking for libvirtd connection at: " + hypervisorURI);  // 记录日志,输出连接的libvirtd的URI
        Connect conn = s_connections.get(hypervisorURI);  // 从连接Map中获取指定URI的连接对象

        if (conn == null) {  // 如果连接对象为空
            log.info("No existing libvirtd connection found. Opening a new one");  // 记录日志,表示没有已经存在的连接对象
            conn = new Connect(hypervisorURI, false);  // 创建新的连接对象
            Library.initEventLoop();  // 初始化事件循环
            log.info("Successfully connected to libvirt at: " + hypervisorURI);  // 记录日志,表示成功连接到libvirtd
            s_connections.put(hypervisorURI, conn);  // 将连接对象加入到连接Map中
        } else {  // 如果连接对象不为空
            try {
                long version = conn.getVersion();  // 获取libvirtd的版本号
                log.info("version:{}", version);  // 记录日志,输出版本号
            } catch (LibvirtException e) {
                log.error("Connection with libvirtd is broken: " + e.getMessage());  // 记录错误日志,表示与libvirtd的连接中断
                log.info("Opening a new libvirtd connection to: " + hypervisorURI);  // 记录日志,表示打开一个新的libvirtd连接
                conn = new Connect(hypervisorURI, false);  // 创建新的连接对象
                s_connections.put(hypervisorURI, conn);  // 将连接对象加入到连接Map中
            }
        }
        log.info("conn:{}", JSON.toJSONString(conn));  // 记录日志,输出连接对象的JSON字符串形式
        return JSON.toJSONString(conn);  // 将连接对象转换为JSON字符串并返回
    }
}

URL说明

qemu:///... QEMU and KVM URIs¶
To use QEMU support in libvirt you must be running the libvirtd daemon (named libvirt_qemud in releases prior to 0.3.0). The purpose of this daemon is to manage qemu instances.

The libvirtd daemon should be started by the init scripts when the machine boots. It should appear as a process libvirtd --daemon running as root in the background and will handle qemu instances on behalf of all users of the machine (among other things).

So to connect to the daemon, one of two different URIs is used:

qemu:///system connects to a system mode daemon.

qemu:///session connects to a session mode daemon.

(If you do libvirtd --help, the daemon will print out the paths of the Unix domain socket(s) that it listens on in the various different modes).

KVM URIs are identical. You select between qemu, qemu accelerated and KVM guests in the guest XML as described here.

三、测试

curl http://localhost:8080/connection?hypervisorURI=qemu%3A%2F%2F%2Fsystem
curl http://localhost:8080/connection

四、官网案例

https://java.libvirt.org/
import org.libvirt.*;
public class minitest {
    public static void main(String[] args) {
        Connect conn=null;
        try{
            conn = new Connect("test:///default", true);
        } catch (LibvirtException e) {
            System.out.println("exception caught:"+e);
            System.out.println(e.getError());
        }
        try{
            Domain testDomain=conn.domainLookupByName("test");
            System.out.println("Domain:" + testDomain.getName() + " id " +
                               testDomain.getID() + " running " +
                               testDomain.getOSType());
        } catch (LibvirtException e) {
            System.out.println("exception caught:"+e);
            System.out.println(e.getError());
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站优化如何更新文章才有效果,有技巧的更新SEO优化文章

很多新手SEO人员都不太清楚网站为什么要每天更新文章&#xff1f;每天更新文章的主要目的是让新站更快地通过审核期&#xff0c;让老网站避免被降权。同时拥有更多的关键词排名&#xff0c;整体提升网站的流量。 提供新鲜和有用的内容&#xff1a;搜索引擎非常重视新鲜和有用的…

长胜证券:美科技股大跌,甲骨文一夜蒸发超3000亿

当地时间9月12日&#xff0c;美股三大股指跌落&#xff0c;其中&#xff0c;道指跌0.05%&#xff0c;标普指数跌0.57%&#xff0c;纳斯达克指数跌1.04%。本周商场重视通胀与顾客开支等经济数据。当天发布的数据显现&#xff0c;美国8月份线上商品价格创40个月最大降幅。美国房租…

四川Certum便宜多域名SSL证书

多域名SSL证书是一种安全协议&#xff0c;通过SSL/TLS协议对多个域名进行加密传输&#xff0c;实现网站的安全访问和数据传输。它不仅可以保护网站的信息安全&#xff0c;还可以提高网站的信任度和排名 。 而Certum是正规的SSL证书颁发机构&#xff0c;旗下SSL证书产品众多&…

docker 镜像内执行命令显示:You requested GPUs: [0] But your machine only has: []

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在docker 镜像环境中&#xff0c;执行“docker exec -it container_name /bin/bash “进入容器之后&#xff0c;执行对应的python命令&#xff0c;显示You requested GPUs: [0] But your machine only…

基于Java+SpringBoot+Vue+uniapp校园点餐小程序(包含协同过滤算法和会员系统,强烈推荐!)

校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…

【【萌新编写risc-v之软件的学习使用】】

萌新编写risc-v软件的学习使用 对于vscode我其实没什么好说的 就是先配置好环境 其实vscde作为一个编译器的软件 其实并不需要指望能往里面加载多少功能 我们需要做的就是赋予编辑器更好用的功能和体验 有些人会在vscode里面甚至加入波形 仿真 我觉得不如交给 vivado来用 在vs…

车载摄像头进入「多元」增长周期,哪些图像传感器厂商领跑竞争力

随着单车搭载摄像头数量的增加&#xff0c;以及对于摄像头性能要求的提高&#xff0c;汽车级图像传感器&#xff08;CIS&#xff09;市场在2022年成为仅次于手机行业的第二大应用领域。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-6月中国市场&#xff08;不含进出口…

Java基础面试整理

Java基础面试 摘要1. 数据类型和变量2. 控制流语句3. 面向对象编程4. 异常处理5. 集合框架6. 多线程7. 输入输出流8. 设计模式9. 字符串操作10. 数组11. 枚举&#xff08;Enum&#xff09;12. 包&#xff08;Package&#xff09;和导入&#xff08;Import&#xff09;13. 接口&…

飞行动力学 - 第22节-动稳定性与运动方程 之 基础点摘要

飞行动力学 - 第22节-动稳定性与运动方程 之 基础点摘要 1. 稳定性定义2. 动稳定性示意图3. 数值仿真结构框图4. 运动响应类型5. 参考资料 1. 稳定性定义 飞机在平衡状态&#xff08;静止或匀速运动&#xff09;受到扰动&#xff1a; 有回到初始状态的趋势&#xff1b;静稳定…

网页录屏方法推荐,满足你的各种录制需求

“网页可以录屏吗&#xff1f;在浏览器观看了一篇教程&#xff0c;但是不能保存&#xff0c;就想用录屏的方法录制下来&#xff0c;可是不知道网页怎么录屏&#xff0c;家人们帮帮忙&#xff0c;非常感谢&#xff01;” 网页录制是将浏览器中的内容录制成视频的过程&#xff0…

算法分析与设计23.9.12晚第一节

23.9.12晚第一节&#xff1a; 解决问题 问题结构 解决问题思路1&#xff1a;(常规思路) Q0: The simplest case. 先找到最简单的情况。 Q1: Decomposed.(INPUT DS, OUTPUT DS) 观察输入输出的数据结构&#xff0c;尝试分解问题。 Q2: Solution neighborhood. 尝试邻域解的变…

机器学习技术(八)——朴素贝叶斯算法实操

机器学习技术&#xff08;八&#xff09;——朴素贝叶斯算法实操 文章目录 机器学习技术&#xff08;八&#xff09;——朴素贝叶斯算法实操一、引言二、导入相关依赖库三、读取并查看数据四、数据预处理五、构建两种模型进行比较1、只考虑Dayofweek以及District2、加入犯罪时间…

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式&#xff0c;如下&#xff1a; select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …

【LeetCode-简单题】383. 赎金信

文章目录 题目方法一&#xff1a;数组方法二&#xff1a;哈希表 题目 方法一&#xff1a;数组 先将magazine中的字符转换为26大小的数组中字符的数量然后再遍历ransomNote中的字符&#xff0c;每遍历一个就让字符数量- 1&#xff0c;若字符数量<0 了 &#xff0c;说明magaz…

9.12号

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…

java.lang.NoClassDefFoundError: com/sun/jna/Callback

添加依赖 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.13.0</version></dependency> 其他版本查看 https://mvnrepository.com/artifact/net.java.dev.jna/jna

leetcode 第454题.四数相加II

给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 454. 四数相加 II - 力扣&#xff08;LeetCode&#xf…

荣23转债上市价格预测

荣23转债113676 基本信息 转债名称&#xff1a;荣23转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;5.76亿元。 正股名称&#xff1a;荣晟环保&#xff0c;今日收盘价&#xff1a;15.64元&#xff0c;转股价格&#xff1a;15.74元。 当前转股价值 转债面…

Redis 缓存过期淘汰策略

面试题&#xff1a; 生产上你们的redis内存设置多少&#xff1f;如何配置、修改redis的内存大小如果内存满了你怎么办redis清理内存的方式&#xff1f;定期出测除和惰性曲除了解过吗redis缓存淘太策略有哪些&#xff1f;分别是什么&#xff1f;你用那个&#xff1f;redis的LRU…

阿里云CDN架构接入WAF应用防火墙案例实践

文章目录 1.网站架构变化2.配置WAF应用防火墙2.1.配置网站接入WAF防火墙2.2.WAF防火墙生成CNAME地址2.3.配置WAF防火墙HTTPS证书2.4.WAF防火墙开启HTTP回源SLB 3.配置CDN加速器回源WAF防火墙4.将域名DNS解析指向CDN的域名5.测试网站是否能正常访问6.模拟攻击观察WAF的作用7.解除…