Libvirt Java API操作QEMU虚拟机(重启,强制关机,挂起,恢复,详情,关机,注销,快照备份等 )(CentOS)

news2024/11/25 16:38:21

需求背景

有个产品需求,需要在一台linux上装多个虚拟机,然后每个虚拟机单独部署一个产品,然后需要虚拟机的一个产品去控制宿主机中安装虚拟机的状态

注意: 如果虚拟机中装的产品去连宿主机的Libvirt服务,那么虚拟机一定要装 libvirt 安装命令: yum install -y libvirt

Libvirt官网

1,虚拟机安装

博客
在这里插入图片描述
virsh 版本 4.5.0

2,宿主机Libvirt配置

2.1 libvirtd文件配置

开启 这两项配置
LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
LIBVIRTD_ARGS=“–listen”

vi /etc/sysconfig/libvirtd

在这里插入图片描述

2.2 配置 libvirtd.conf文件

vi  /etc/libvirt/libvirtd.conf

修改内容如下

listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
auth_tcp = "none"

2.3 重启libvirtd服务

systemctl restart libvirtd

3,Java代码

3.1 pom引入jar包

     <dependency>
            <groupId>org.libvirt</groupId>
            <artifactId>libvirt</artifactId>
            <version>0.5.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.12.1</version>
        </dependency>

3.2 代码

获取虚拟机列表,重启,强制关机,挂起,恢复,详情,关机,注销等虚拟机操作

 @GetMapping("/test")
    @ApiOperation("/test")
    public String test(@RequestParam String url) throws Exception {

        try {
            Connect connect = new Connect(url, true);
            System.out.println(connect.getHostName());
            System.out.println("dddd" + connect.getFreeMemory());
        } catch (LibvirtException e) {
            System.out.println("exception caught:" + e);
            System.out.println(e.getError());
            return e.getError().getMessage();
        }

        return "";
    }

    @GetMapping("/domains")
    @ApiOperation("/domains")
    private List<HostDo> listDomain(@RequestParam String url) throws LibvirtException {

        Map<String, Object> map = new HashMap<String, Object>();
        Connect connect = new Connect(url, true);

        int[] idsOfDomain = connect.listDomains();
        map.put("listDomains", idsOfDomain);
        List<HostDo> lists = new ArrayList<HostDo>();
        for (int id : idsOfDomain) {
            HostDo hostDo = new HostDo();
            Domain domain = connect.domainLookupByID(id);
            hostDo.setId(id);
            hostDo.setName(domain.getName());
            hostDo.setStatus(domain.getInfo().state);
            hostDo.setType(domain.getOSType());
            hostDo.setMemTotal(domain.getJobInfo().getMemTotal());
            lists.add(hostDo);
        }


        String[] namesOfDefinedDomain = connect.listDefinedDomains();

        for (String name : namesOfDefinedDomain) {
//            Domain domain = connect.domainLookupByName(name);
            HostDo hostDo = new HostDo();
//            hostDo.setId(id);
            hostDo.setName(name);
            hostDo.setStatus(DomainInfo.DomainState.VIR_DOMAIN_SHUTDOWN);
//            hostDo.setType(domain.getOSType());
//            hostDo.setMemTotal(domain.getJobInfo().getMemTotal());
            lists.add(hostDo);

        }

        return lists;
    }

    @GetMapping("/listDemo")
    @ApiOperation("/listDemo")
    private List<HostDo> listDemo(@RequestParam String url) throws LibvirtException {

        Connect connect = new Connect(url, true);
        List<HostDo> lists = new ArrayList<HostDo>();


        String[] namesOfDefinedDomain = connect.listDefinedDomains();

        for (String name : namesOfDefinedDomain) {
            Domain domain = connect.domainLookupByName(name);
            HostDo hostDo = new HostDo();
            hostDo.setId(domain.getID());
            hostDo.setName(name);
            hostDo.setStatus(DomainInfo.DomainState.VIR_DOMAIN_SHUTDOWN);
            hostDo.setType(domain.getOSType());
            hostDo.setMemTotal(domain.getJobInfo().getMemTotal());
            lists.add(hostDo);

        }

        return lists;
    }


    @GetMapping("/detail")
    @ApiOperation("详情")
    private Domain detail(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        return connect.domainLookupByName(name);
    }

    @GetMapping("/shutdown")
    @ApiOperation("正常关机")
    private Domain shutdown(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        domain.shutdown();
        domain = connect.domainLookupByName(name);
        return domain;
    }

    @GetMapping("/reboot")
    @ApiOperation("重启")
    private Domain reboot(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        domain.reboot(0);
        domain = connect.domainLookupByName(name);
        return domain;
    }


    @GetMapping("/delete")
    @ApiOperation("注销")
    private Domain delete(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        domain.destroy();
        domain.undefine();
        return domain;
    }

    @GetMapping("/forceShutDown")
    @ApiOperation("强制关机")
    private Domain forceShutDown(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        domain.destroy();
        System.out.println(domain.isActive());
        domain = connect.domainLookupByName(name);
        return domain;
    }

    @GetMapping("/start")
    @ApiOperation("启动")
    private Domain start(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        domain.create();
        System.out.println(domain.isActive());
        return domain;
    }

    @GetMapping("/resume")
    @ApiOperation("恢复")
    private Domain resume(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        domain.resume();
        System.out.println(domain.isActive());
        return domain;
    }

    @GetMapping("/suspend")
    @ApiOperation("挂起")
    private Domain suspend(@RequestParam String url, @RequestParam String name) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        domain.suspend();
        System.out.println(domain.isActive());
        return domain;
    }

快照备份

  @GetMapping("/snapshotCurrent")
    @ApiOperation("生成当前快照")
    private Domain snapshotCurrent(@RequestParam String url, @RequestParam String name,@RequestParam String snap) throws LibvirtException {

        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        String snapshotXML = snap;
        domain.snapshotCreateXML(snapshotXML);
        System.out.println(domain.isActive());
        return domain;
    }

    @GetMapping("/snapshot-list")
    @ApiOperation("快照列表")
    private String[] snapshotListNames(@RequestParam String url, @RequestParam String name) throws LibvirtException {
        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        String[] snapArray = domain.snapshotListNames();
        return snapArray;
    }

    @GetMapping("/snapshotLookupByName")
    @ApiOperation("快照详情")
    private DomainSnapshot snapshotLookupByName(@RequestParam String url, @RequestParam String name, @RequestParam String snapName) throws LibvirtException {
        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        DomainSnapshot domainSnapshot = domain.snapshotLookupByName(snapName);
        return domainSnapshot;
    }

    @GetMapping("/snapshotNum")
    @ApiOperation("快照数量")
    private int snapshotNum(@RequestParam String url, @RequestParam String name, @RequestParam String snapName) throws LibvirtException {
        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        int i = domain.hasCurrentSnapshot();
        return i;
    }

    @GetMapping("/revertToSnapshot")
    @ApiOperation("恢复快照")
    private int revertToSnapshot(@RequestParam String url, @RequestParam String name, @RequestParam String snapName) throws LibvirtException {
        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        DomainSnapshot domainSnapshot = domain.snapshotLookupByName(snapName);
        int i = domain.revertToSnapshot(domainSnapshot);
        return i;
    }

    @GetMapping("/snapshot-delete")
    @ApiOperation("删除快照")
    private int snapDelete(@RequestParam String url, @RequestParam String name, @RequestParam String snapName) throws LibvirtException {
        Connect connect = new Connect(url, false);
        Domain domain = connect.domainLookupByName(name);
        DomainSnapshot domainSnapshot = domain.snapshotLookupByName(snapName);
        int delete = domainSnapshot.delete(0);
        return delete;
    }

3,调试

qemu+tcp://10.50.1.60:16511/system

在这里插入图片描述
未完待续。。。后面会补充克隆等虚拟机操作

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

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

相关文章

LeetCode530.二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先

文章目录530二叉搜索树的最小绝对差c代码实现python 代码实现501二叉搜索树中的众数c 代码实现python 代码实现236二叉树的最近公共祖先c代码实现python代码实现530二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差…

运维行业数字化维修数据屏来袭

说起维修数字化&#xff0c;售后维保管理&#xff0c;大家必然想到青鸟云报修&#xff0c;今天我给大家呈现一下青鸟云报修数据大屏是怎么一回事。 这是青鸟云报修第三代数据大屏&#xff0c;在2代基础上增加了更多板块&#xff0c;更加专业和智能化&#xff0c;他主要应用于单…

Unity ab包加载文本 puerts 自定义loader

输出ab包 他会把你创建的ab包都打包 也就是在这里的创建的 string assetBundleDirectory Path.Combine(Application.streamingAssetsPath, "OutAssetBundles"); if (!Directory.Exists(assetBundleDirectory)) {Directory.CreateDirectory(assetBundleDirectory);…

2022/11/28-29总结

刷题 统计2021年10月每个退货率不大于0.5的商品各项指标_牛客题霸_牛客网 思路 主要就是sum函数、round函数、date_format函数 代码实现 select product_id, round(sum(if_click)/count(*),3) ctr, round(sum(if_cart)/sum(if_click),3) cart_rate, round(sum(if_payment)…

大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【JavaScript预解析】

JavaScript预解析1 本节目标2 预解析3 变量预解析和函数预解析4 预解析案例1 本节目标 知道解析器运行JS分为哪两步说出变量提升的步骤和运行过程说出函数提升的步骤和运行过程 2 预解析 JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行Java…

技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

深度学习技术在图像识别、搜索推荐等领域得到了广泛应用。近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向&#xff0c;通过《Arm 芯片 Python-AI 算力优化》我们将看到龙蜥社区 Arm 架构 SIG&#xff08;Special Interest Group&#xff09; 利用最新的 Arm 指令集优化…

分析实时云渲染在小程序中可行性应用

点量云小芹和大家分享过很多实时云渲染的优势&#xff0c;比如在网页直接打开&#xff0c;本地无需任何算力支持&#xff0c;所有指令的执行均是在云端服务器上完成的。但在实际中小芹发现很多业主也想在小程序给用户更好的体验&#xff0c;尤其是一些To C的场景下&#xff0c;…

【新知实验室 认识TRTC+四步跑通音视频demo】

1【产品功能介绍】 1.1 什么是TRTC&#xff1f; 实时音视频&#xff08;Tencent RTC &#xff09;是腾讯基于21年来在网络与音频技术上的深度积累&#xff0c;以多人音视频通话和低延时互动直播两大场景化方案&#xff0c;通过腾讯云服务向开发者开放&#xff0c;致力于帮助开…

LabVIEW创建类 2

LabVIEW创建类 2 定义私有数据控件 创建LabVIEW类时&#xff0c;LabVIEW将自动创建类的私有数据控件。请注意在下列项目浏览器窗口中&#xff0c;LabVIEW类的图标是一个有色立方体。该立方体用于代表一个LabVIEW类。私有数据控件的图标是一个带有绿色圆柱体的有色立方体。圆柱…

SpringCloud 从入门到入土

springcloud包含的模块&#xff1a; 1、服务注册与发现 2、服务调用 3、服务熔断 4、负载均衡 5、服务降级 6、服务消息队列 7、配置中心管理 8、服务网关 9、服务监控 10、全链路追踪 11、自动化构建部署 12、服务定时任务调度操作 版本控制留样 重点技术选型&am…

ConstraintLayout布局扩展

相信大家对ConstraintLayout&#xff08;约束布局&#xff09;不陌生,这是google推出的一个强大控件&#xff0c;之所以强大其实主要归纳有两点&#xff1a;减少布局层次&#xff0c;能够轻松实现复杂布局。当然在我们实际使用过程中&#xff0c;是否真的减少了布局层次&#x…

一种亮红色染料AF 594 NHS Ester|295348-87-7|AF 594 Succinimidyl Ester

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; CAS号&#xff1a;295348-87-7 中文名&#xff1a;AF 594活性酯 英文名&#xff1a;AF 594 Succinimidyl Ester&#xff0c;Alexa Fluor 594 NHS Ester&#xff0c;AF 594 NHS Ester 光谱图&#xff08;Sp…

低代码助力生产管理:ERP生产管理系统

随着国内生产技术的迅速发展&#xff0c;企业信息化实现了生产经营活动的运营自动化、管理网络化和决策智能化。其中运营自动化是基础&#xff0c;决策智能化是顶峰。将信息化应用于生产管理有助于提高产品的质量和生产效率&#xff0c;加强对原材料、生产工序、员工、设备和产…

第三十九篇 自定义指令 - directive

前面讲了关于在Vue中如何来进行封装swiper组件的内容&#xff0c;本篇内容讲到使自定义组件&#xff0c;讲这块内容也是同样为了后续再次回顾封装swiper组件变化做铺垫内容&#xff0c;那么什么是自定义指令&#xff0c;在前面的内容讲过了好些常用的指令&#xff0c;如 v-modl…

记录--两行CSS让页面提升了近7倍渲染性能!

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 对于前端人员来讲&#xff0c;最令人头疼的应该就是页面性能了&#xff0c;当用户在访问一个页面时&#xff0c;总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢&#xff0c;你…

衡师11月月赛web题目wp

目录 1.丢三落四的学姐 2.wep&#xff1f;Pwn&#xff01;&#xff01;&#xff01; 这题web部分是buuctf中的DASCTF X GFCTF 2022十月挑战赛&#xff01;的原题 1.丢三落四的学姐 访问题目位置&#xff0c;很明显的phpstudy搭建的痕迹 访问一下经常信息泄露的几个文件&…

Redis与数据库的爱恨纠葛

Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 早期数据库只要有数据库的操作---增--删--改--查 当用户量特别多的情况下&#xff0c;数据库的数量一定是跟不上用户的数量&#xff0c;对数据库来说是特别繁忙的 看着每天都累趴下…

String_JavaScript

String_JavaScript 学习路线&#xff1a;JavaScript基础语法&#xff08;输出语句&#xff09;->JavaScript基础语法&#xff08;变量&#xff09;->JavaScript基础语法&#xff08;数据类型&#xff09;->JavaScript基础语法&#xff08;运算符&#xff09;->Jav…

海外推广运营的技巧汇总

海外电商运营推广&#xff1f;做海外电商&#xff0c;重点在于运营推广。如果运营推广能做好&#xff0c;那么在行业内分一杯羹并不难。但问题是&#xff0c;在运营推广上&#xff0c;很难做海外电商。 这年头&#xff0c;相信大家都知道海外电商出问题了。很多人的账号都被亚…