文章目录
- 【KVM虚拟化实践与编程】云平台管理系统
- 一、KVM/QEMU虚拟化环境的搭建
- 1. 安装QEMU
- 2.构建KVM环境
- 3.安装虚拟化管理工具
- 4.配置JDK环境
- 二、需求分析
- 三、系统设计
- 四、系统实现
【KVM虚拟化实践与编程】云平台管理系统
一、KVM/QEMU虚拟化环境的搭建
1. 安装QEMU
使用命令“apt-get install qemu
”安装QEMU。
2.构建KVM环境
(1)打开VMware对CPU的虚拟化支持。
(2)使用命令“cat /etc/issue
”查看Ubuntu操作系统版本。
(3)使用命令“uname -r
”或“cat /proc/version
”查看Linux内核版本,如果内核版本低于2.6.20,则需要下载KVM进行编译和安装。
(4)使用命令“lsmod | grep kvm
”查看Linux内核是否已安装KVM内核模块。
(5)确认KVM 相关的模块加载成功后,使用命令“ls -l /dev/kvm
”检查/dev/kvm文件。
3.安装虚拟化管理工具
(1)安装libvirt,使用命令“apt-get install libvirt-bin
”和“apt-get install libvirt-dev
”安装libvirt-bin和libvirt-dev两个包。
(2)安装virt-manager,使用命令“apt-get install virt-manager
”安装virt-manager。
4.配置JDK环境
(1)由于使用java程序设计语言做开发,因此需要配置JDK环境。IDE工具可以使用eclipse。可以使用“apt-get install eclipse
”命令安装eclipse,会自动配置JDK环境。
(2)由于libvirt是使用C语言开发的,因此使用java进行系统开发需要使用libvirt对java的绑定,需要下载libvirt-0.5.0.jar
和jna-4.4.0.jar
。
二、需求分析
云平台管理系统的功能包括:
- 通过镜像管理虚拟机,包括虚拟机创建、启动、暂停、恢复、删除等
- 镜像的添加与删除功能
- 虚拟机网络模式设置,网络的断开和连接
- 对虚拟机做快照功能(选做)
- 虚拟机挂载存储磁盘(选做)
三、系统设计
云平台管理系统是对虚拟机进行管理和操作,该系统采用Libvirt Java API 进行分析和设计,使用编程语言java作为开发语言,使用ecplise作为开发平台,通过jfinal框架展示给用户,能够很好的实现系统的开发及测试。使用java的GUI实现了按钮对虚拟机的启动,重启,正常关机,强制关机,挂起,唤醒挂起的虚拟机,保存当前虚拟机状态,读取已保存的虚拟机,也可以实现对当前运行的虚拟机状态的打印输出,还可以实现对网络的启动和关闭。
- 连接
public static Domain init() throws LibvirtException, DocumentException {conn = new Connect("qemu:///system", false);SAXReader reader = new SAXReader();Document docu = reader.read(new File("/etc/libvirt/qemu/demo.xml"));String xmlDesc = docu.asXML();Domain domain = conn.domainDefineXML(xmlDesc);return domain;}
- 启动
if (e.getActionCommand().equals("启动")) {try {domain = JavaLibvirt.init();domain.create();System.out.println(domain.getName() + "虚拟机已启动!");} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 挂起
if (e.getActionCommand().equals("挂起")) {try {domain = JavaLibvirt.init();domain.suspend();System.out.println(domain.getName() + "虚拟机已挂起!");} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 唤醒
if (e.getActionCommand().equals("唤醒")) {try {domain = JavaLibvirt.init();domain.resume();System.out.println(domain.getName() + "虚拟机已唤醒!");} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 保存
if (e.getActionCommand().equals("保存")) {try {domain = JavaLibvirt.init();JFileChooser jf = new JFileChooser();jf.setFileSelectionMode(JFileChooser.SAVE_DIALOG | JFileChooser.DIRECTORIES_ONLY);jf.showDialog(null, null);File fi = jf.getSelectedFile();String f = fi.getAbsolutePath() + "/save.img";System.out.println("save: " + f);domain.save(f);System.out.println(domain.getName() + "虚拟机状态已保存!");System.out.println();} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 恢复
if (e.getActionCommand().equals("恢复")) {try {domain = JavaLibvirt.init();JFileChooser chooser = new JFileChooser();chooser.showOpenDialog(null);File f = chooser.getSelectedFile();if (f != null) {String path = chooser.getSelectedFile().getPath();System.out.println(path);domain.getConnect().restore(path); System.out.println(domain.getName() + "虚拟机状态已恢复!");System.out.println();}} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 重启
if (e.getActionCommand().equals("重启")) {try {domain = JavaLibvirt.init();domain.reboot(0);System.out.println(domain.getName() + "虚拟机已重启!");} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 正常关机
if (e.getActionCommand().equals("正常关机")) {try {domain = JavaLibvirt.init();domain.shutdown();System.out.println(domain.getName() + "虚拟机已正常关机!");} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 强制关机
if (e.getActionCommand().equals("强制关机")) {try {domain = JavaLibvirt.init();domain.destroy();System.out.println(domain.getName() + "虚拟机已强制关机!");} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 打印运行信息
if (e.getActionCommand().equals("打印运行信息")) {try {domain = JavaLibvirt.init();for (int id : JavaLibvirt.conn.listDomains()) {domain = JavaLibvirt.conn.domainLookupByID(id);System.out.println("id is " + domain.getID()+ " name is " + domain.getName() + " state is "+ domain.getInfo().state);System.out.println();}} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 启动网络
if (e.getActionCommand().equals("启动网络")) {try {domain = JavaLibvirt.init();domain.getConnect().networkLookupByName("default").create();String netname = domain.getConnect().networkLookupByName("default").getName();if (domain.getConnect().networkLookupByName("default").isActive() == 0) {System.out.println("网络" + netname + "已经被关闭!");} else {System.out.println("网络" + netname + "正在使用中!");}} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
- 关闭网络
if (e.getActionCommand().equals("关闭网络")) {try {domain = JavaLibvirt.init();domain.getConnect().networkLookupByName("default").destroy();String netname = domain.getConnect().networkLookupByName("default").getName();if (domain.getConnect().networkLookupByName("default").isActive() == 0) {System.out.println("网络" + netname + "已经被关闭!");} else {System.out.println("网络" + netname + "正在使用中!");}} catch (LibvirtException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
四、系统实现
-
在eclipse中配置工作目录
-
创建java项目
-
创建类
-
在eclipse中配置需要的jar包
-
编写java代码
-
运行之前,打开virsh使用命令“
virsh list --all
”或virt-manager查看虚拟机状态。
-
运行代码,打开virsh使用命令“
virsh list --all
”或virt-manager查看虚拟机状态。
图22 云平台管理系统主界面
图23 启动后查看虚拟机状态
图24 挂起后查看虚拟机状态
图25 唤醒后查看虚拟机状态
图26 保存操作
图27 保存后查看虚拟机状态
图28 恢复操作
图29 恢复后查看虚拟机状态
图30 重启后查看虚拟机状态
图31 正常关机后查看虚拟机状态
图32 强制关机后查看虚拟机状态
图33 关闭网络和启动网络