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


    需求背景

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

    注意:1, 如果虚拟机中装的产品去连宿主机的Libvirt服务,那么虚拟机一定要装 libvirt 安装命令: yum install -y libvirt
    2,写的Java Demo一定要在linux服务器运行,我在windows上运行提示 virt-0.dll缺失,这个问题比较难以解决,linux运行命令如下:
    nohup java -jar libvirt-demo-1.0-SNAPSHOT.jar >temp.txt 2>&1 &

    Libvirt官网

    1,虚拟机安装

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

    2,宿主机Libvirt配置

    2.1 libvirtd文件配置

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

    vi /etc/sysconfig/libvirtd
    
    • 1

    在这里插入图片描述

    2.2 配置 libvirtd.conf文件

    vi  /etc/libvirt/libvirtd.conf
    
    
    • 1
    • 2

    修改内容如下

    listen_tls = 0
    listen_tcp = 1
    tcp_port = "16509"
    listen_addr = "0.0.0.0"
    auth_tcp = "none"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.3 重启libvirtd服务

    systemctl restart libvirtd
    
    • 1

    3,Java代码

    3.1 pom引入jar包

         
                org.libvirt
                libvirt
                0.5.1
            
            
            
                net.java.dev.jna
                jna
                5.12.1
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.2 代码

    虚拟机对象

    import lombok.Data;
    import org.libvirt.DomainInfo;
    
    @Data
    public class HostDo {
    
        private int id;
    
        private String name;
    
        private DomainInfo.DomainState status;
    
        private String type;
    
    
    
        private long memTotal;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

     @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 listDomain(@RequestParam String url) throws LibvirtException {
    
            Map map = new HashMap();
            Connect connect = new Connect(url, true);
    
            int[] idsOfDomain = connect.listDomains();
            map.put("listDomains", idsOfDomain);
            List lists = new ArrayList();
            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 listDemo(@RequestParam String url) throws LibvirtException {
    
            Connect connect = new Connect(url, true);
            List lists = new ArrayList();
    
    
            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;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169

    快照备份

      @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;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    3.3,调试

    qemu+tcp://10.50.1.60:16511/system
    
    • 1

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

  • 相关阅读:
    免费搜索vs付费搜索:百度谷歌的有力竞争者刚刚出现!
    pod 镜像拉取策略
    linux中怎么用shell逐行读取文件
    可以为一个servlet定义多个servlet-mapping、或url-pattern
    LabVIEW分配多少线程?
    【接口加密】接口加密的未来发展与应用场景
    LeetCode 2296.设计一个文本编辑器
    JavaScript实现网页截屏的5种方法(详解+代码)
    Java类和对象
    torch.cat函数用法
  • 原文地址:https://blog.csdn.net/qq_42511550/article/details/128092110