云平台管理


云平台管理

详细实现

 

创建如下目录结构

img

在maven的pom.xml添加依赖

运行之前。打开virsh 使用命令“virsh list --all”或virt-manger查看虚拟机状态

img

此时web浏览器端没有虚拟机信息

img

我们在virt-manager下手动创建一个demo虚拟机

img

img

img

img

img

现在切换到浏览器段查看

img

首先我们对创建的虚拟机进行管理,可以看出,我们的操作有删除,挂起,重启,启动,关机

首先进行挂起

img

在进行启动

img

然后进行重启

img

最后进行关机,但是关机之后在web端就不显示此虚拟机了,只有打开后可以看到管理操作。

img

img

最后的最后演示删除操作

img

接下来演示在web段创建虚拟机实例

img

img

我们只需要更改以创建成功的虚拟机.xml文件

以下面为例

img

img

我们只需要更改name,和uuid属性。

img

img

img

演示存储池管理

img

新增存储池有缺陷,目前还未解决

img

img

演示网络部分

img

img

img

需求分析

用户通过web方式管理虚拟机,可以对虚拟机进行添加,挂起,恢复,删除,启动,关机。可以实时的看到虚拟机的信息。查看宿主机的的信息。以及操作对存储池的管理还有网络的管理。

系统实现

云平台管理系统是对虚拟机进行管理和操作,该系统采用Libvirt Java API 进行分析和设计,使用编程语言java作为开发语言,使用IDEA作为开发平台,通过springboot框架+thmleaf模板引擎展示给用户,能够实现很好的交互页面。使用的前端的请求交给后端controller层来处理。在通过controller调用service层处理。对虚拟机的启动,重启,正常关机,强制关机,挂起,唤醒挂起的虚拟机,保存当前虚拟机状态,读取已保存的虚拟机,也可以实现对当前运行的虚拟机状态的打印输出,还可以实现对网络的启动和关闭。

  • 连接

public class Libvirt {
   private Connect connect;
?
   public Connect getConnect() {
       return connect;
  }
?
   public Libvirt() throws LibvirtException {
       connect = new Connect("qemu:///system",false);
  }
}
  • 宿主机信息列表

/*
   宿主机信息列表
*/
?
@RequestMapping("/")
public String index(Model model) throws LibvirtException {
   Map hostinfo = lIbvirtService.Hostinf();
   model.addAttribute("hostinfo",hostinfo);
   return "suzhuji";
}
/*
   宿主机信息列表
*/
public Map Hostinf() throws LibvirtException{
   Map information= Maps.newLinkedHashMap();
   int idsOfDomain = libvirt.getConnect().listDomains().length;
   information.put("主机名称",libvirt.getConnect().getHostName());
   information.put("管理IP",libvirt.getConnect().getURI());
   information.put("CPU型号",host.getCpumodel());
   information.put("CPU主频(mhz)",String.valueOf(host.getCpumhz()));
   information.put("最大CPU数",String.valueOf(host.getCpunum()));
   information.put("内存容量(MB)",String.valueOf(host.getMemory()));
   information.put("内存使用率",String.valueOf(host.getMemory()/host.getMemoryused()));
   information.put("实例个数",String.valueOf(idsOfDomain));
   information.put("状态","alive");
   information.put("虚拟化类型",libvirt.getConnect().getType());
   information.put("虚拟化版本",String.valueOf(libvirt.getConnect().getLibVirVersion()));
   return information;
}
  • 存储池信息列表

3/*
   存储池信息列表
*/
@RequestMapping("/poollist")
public String poolList(Model model) throws LibvirtException {
   List<Storagepool> poollist = new ArrayList<>();
   poollist = lIbvirtService.Storagepoolist();
   model.addAttribute("poollist",poollist);
   return "cunchu";
}
?
public List<Storagepool> Storagepoolist() throws LibvirtException {
   List<Storagepool> poollist = new ArrayList<>();
   String[] pools = libvirt.getConnect().listStoragePools();
   System.out.println("pool have : " + pools.length);
   for (String pool : pools) {
       Storagepool storagepool = new Storagepool(pool);
       poollist.add(storagepool);
  }
   return poollist;
}
  • 网络信息列表

4/*
网络信息列表
*/
@RequestMapping("/netlist")
public String netList(Model model) throws SigarException {
   List<Net> netlist = new ArrayList<>();
   netlist = lIbvirtService.Netlist();
   model.addAttribute("netlist",netlist);
   return "wangluo";
}
/*
网络信息列表
*/
public List<Net> Netlist() throws SigarException {
   List<Net> netlist = new ArrayList<>();
   Sigar sigar = new Sigar();
   String ifNames[] = sigar.getNetInterfaceList();
   for (int i = 0; i < ifNames.length; i++) {
       String name = ifNames[i];
       NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
       Net net = new Net(name,ifconfig.getAddress(),ifconfig.getType(),String.valueOf(ifconfig.getFlags()),"alive");
       if (ifconfig.getType().equals("Ethernet"))  netlist.add(net);
  }
   return netlist;
}
  • 虚拟机信息列表

/*
虚拟机信息列表
*/
@RequestMapping("/domainlist")
public String domainList(Model model) throws LibvirtException {
   List<Virtual> domainlist = new ArrayList<>();
   domainlist = lIbvirtService.Virtuallist();
   model.addAttribute("domainlist",domainlist);
   return "xuniji-shili";
}
/*
虚拟机信息列表
*/
?
public List<Virtual> Virtuallist() throws LibvirtException {
   List<Virtual> virtuals = new ArrayList<>();
   int[] idsOfDomain = libvirt.getConnect().listDomains();
   for (int i : idsOfDomain) {
       Virtual virtual = new Virtual(i);
       virtuals.add(virtual);
  }
   return virtuals;
}
  • 添加存储池

?
/*
添加存储池
*/
@RequestMapping("/addpool")
public String addPool(Model model, @RequestParam("type") String type,
                     @RequestParam("name") String name,
                     @RequestParam("capacity") String capacity,
                     @RequestParam("url") String url) {
   try {
       lIbvirtService.createStoragepool(type,name,capacity,url);
  } catch (LibvirtException e) {
       e.printStackTrace();
  }
   return "redirect:/poollist";
}
/*
添加存储池
*/
public void createStoragepool(String type,String name,String capacity,String url) throws LibvirtException {
   System.out.println(type + " " + name +" " + capacity +" " +url);
   String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
           "\n" +
           "+type+"\">\n" +
           "   "+name+" \n" +
           "   \n" +
           "   \n" +
           "   "+capacity+"\n" +
           "   0 \n" +
           "   \n" +
           "       "+url+" \n" +
           "       \n" +
           "           0711\n" +
           "           0\n" +
           "           0\n" +
           "      
\n" +
           "  
\n" +
           "
";
   StoragePool storagePool = libvirt.getConnect().storagePoolCreateXML(xml, 0);
}
  • 删除存储池

/*
删除存储池
*/
@RequestMapping("/delpool/{name}")
public String delPool(Model model,@PathVariable("name") String name) {
   System.out.println("name " + name);
   try {
       lIbvirtService.deleteStoragePool(name);
  } catch (LibvirtException e) {
       e.printStackTrace();
  }
   return "redirect:/poollist";
}
/*
通过name删除存储池
*/
public void deleteStoragePool(String name) throws LibvirtException {
   StoragePool storagePool = libvirt.getConnect().storagePoolLookupByName(name);
   storagePool.destroy();
   storagePool.undefine();
}
  • 通过xml添加虚拟机

/*
通过xml添加虚拟机
*/
@RequestMapping("/addomain")
public String addoMain(Model model,@RequestParam("xml")String xml) throws LibvirtException {
   lIbvirtService.createDomain(xml);
   return "forward:/domainlist";
}
/*
通过xml添加虚拟机
*/
?
public void createDomain(String xml) throws LibvirtException {
   String xmlDesc = xml;
   Domain domain = libvirt.getConnect().domainCreateXML(xmlDesc, 0);
?
}
  • 暂停/挂起虚拟机

/*
暂停/挂起虚拟机
*/
@RequestMapping("/supdomain/{name}")
public String supdoMain(Model model,@PathVariable("name") String name) throws LibvirtException {
   lIbvirtService.suspendedDomain(name);
   return "redirect:/domainlist";
}
/*
暂停/挂起虚拟机
*/
?
public void suspendedDomain(String name) throws LibvirtException {
   Domain domain = libvirt.getConnect().domainLookupByName(name);
   domain.suspend();
}
  • 还原暂停/挂起虚拟机

/*
还原暂停/挂起虚拟机
*/
@RequestMapping("/condomain/{name}")
public String condoMain(Model model,@PathVariable("name") String name) throws LibvirtException {
   lIbvirtService.continueDomain(name);
   return "redirect:/domainlist";
}
/*
   还原暂停/挂起虚拟机
*/
?
public void continueDomain(String name) throws LibvirtException {
   Domain domain = libvirt.getConnect().domainLookupByName(name);
   domain.resume();
}

 

  • 关闭虚拟机

 */
?
public void shutdownDomain(String name) throws LibvirtException {
   Domain domain = libvirt.getConnect().domainLookupByName(name);
   domain.shutdown();
}
  • 删除虚拟机

/*
删除虚拟机
*/
@RequestMapping("/deldomain/{name}")
public String deldoMain(Model model,@PathVariable("name") String name) throws LibvirtException {
   lIbvirtService.deleteDomain(name);
   return "redirect:/domainlist";
}
/*
删除虚拟机
*/
?
public void deleteDomain(String name) throws LibvirtException {
   Domain domain = libvirt.getConnect().domainLookupByName(name);
   domain.destroy(); // 强制关机
   domain.undefine();
}
  • 重启虚拟机

/*
重启虚拟机
*/
@RequestMapping("/rebdomain/{name}")
public String rebdoMain(Model model,@PathVariable("name") String name) throws LibvirtException {
   lIbvirtService.rebootDomain(name);
   return "redirect:/domainlist";
}
/*
   重启虚拟机
*/
public void rebootDomain(String name) throws LibvirtException {
   Domain domain = libvirt.getConnect().domainLookupByName(name);
   domain.reboot(0);
}

 

  • 为虚拟机添加网络

/*
为虚拟机添加网络
*/
@RequestMapping("/addnet/{domain}/{bridge}")
public String addNet(Model model,
                    @PathVariable("domain") String domain,
                    @PathVariable("bridge") String bridge) throws LibvirtException {
   lIbvirtService.addNet(domain,bridge);
   return "wangluo";
}
/*
为虚拟机添加网络
*/
?
public void addNet(String domin,String bridge) throws LibvirtException {
   Domain domain = libvirt.getConnect().domainLookupByName(domin);
?
   String interFace = "\n" +
           "     \n" +
           "
\n";
   domain.attachDevice(interFace);
}

 

环境搭建

jdk环境及idea的安装及maven的安装与配置

image-20220622091022635

环境信息: OS:Ubuntu18.04 JDK:8

JDK的http://www.oracle.com/technetwork/articles/javase/index-jsp-138363.html   说明: 选择相应的 .gz包下载,需要跟你的操作系统环境相匹配

  1. 解压缩,放到指定目录(以jdk-8u333-linux-x64.tar.gz为例)

 目标不存在需要先创建目录,我这里是放在/opt目录下: sudo mkdir /opt/java8

 目录创建成功后解压缩到该目录:

              ```shell
            sudo tar -zxvf jdk-8u333-linux-x64.tar.gz -C /opt/java8
            ```

或者先移动到该目录,进入到源目录下执行以下命令:

              ```shell
            sudo mv jdk-8u333-linux-x64.tar.gz /opt/java8
            ```

然后进入到目标目录下进行解压缩sudo tar -zxvf jdk-8u333-linux-x64.tar.gz

注意:这里一定要加sudo,否则你的用户角色不一定有权限 3.使用vim修改环境变量:  

使用vim打开环境变了文件 sudo vim ~/.bashrc

image-20220622092041424

vim安装成功后接下来继续打开文件进行编辑,在末尾先输入一个I,进入写入模式,追加下面内容:

#set oracle jdk environment ## 这里JAVA_HOME要注意目录要换成自己解压的jdk 目录
export JAVA_HOME=/opt/java8/jdk1.8.0_333
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH

编辑结束用:wq进行保存退出,如果是在编辑过程中放弃编辑可以按Esc键,接下来使环境变量马上生效

命令: source ~/.bashrc

4.设置系统默认jdk 版本(如果系统中只有一个JDK,也可以不做此操作)

sudo update-alternatives --install /usr/bin/java java /opt/java8/jdk1.8.0_151/bin/java 300  
sudo update-alternatives --install /usr/bin/javac javac /opt/java8/jdk1.8.0_151/bin/javac 300  
sudo update-alternatives --install /usr/bin/jar jar /opt/java8/jdk1.8.0_151/bin/jar 300  
sudo update-alternatives --install /usr/bin/javah javah /opt/java8/jdk1.8.0_151/bin/javah 300  
sudo update-alternatives --install /usr/bin/javap javap /opt/java8/jdk1.8.0_151/bin/javap 300

 

 然后执行:

sudo update-alternatives --config java

 

说明: 若是初次安装jdk,会有下面的提示 There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/jdk1.8.0_151/bin/java  意思是链接组 java (提供 /usr/bin/java)中只有一个候选项:/opt/java8/jdk1.8.0_151/bin/java 无需配置。 如果不是提示这个,请选择合适的jdk,或者是一些别的问题

5.测试jdk,输入命令 java -version 显示结果如下说明JDK安装配置成功 java version "1.8.0_333" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) image-20220622092317622

安装IDEA

maven官网:https://maven.apache.org/

安装maven前首先确保你安装了JDK

jdk安装位置及设置: 前往oracle官网下载jdk,我将下载后的jdk放在了/root/ENVIRMENT目录下

image-20220622093503765

进入到

/root/ENVIRMENT/apache-maven-3.8.5/conf

编辑setting.xml

<?xml version="1.0" encoding="UTF-8"?>
?

?

xmlns="http://maven.apache.org/SETTINGS/1.2.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">

?

?

?


 

?


 

?


 
?
 

?


 
 
    maven-default-http-blocker
    external:http:*
    Pseudo repository to mirror external repositories initially using HTTP.
    http://0.0.0.0/
    true
 

 
  alimaven  
  aliyun maven  
  http://maven.aliyun.com/nexus/content/groups/public/  
  central          
 

?

?


 
?
 

?

设置MAVEN_HOME

$sudo gedit ~/.bashrc
#set maven environment
MAVEN_HOME=/root/ENVIRMENT/apache-maven-3.8.5
PATH=$PATH:$MAVEN_HOME/bin

image-20220622093848186

由于此次编辑的为~/.bashrc,不用重启电脑,使用ctrl+alt+t在重新打开一个交互式shell上述配置即可生效。 注意在原有shell中该配置不会生效。 最后运行mvn -v检查你的安装配置是否成功

image-20220622093929185

maven阿里云镜像在setting.xml上面已配置

?
 
  alimaven  
  aliyun maven  
  http://maven.aliyun.com/nexus/content/groups/public/  
  central