使用Python-Libvirt GUI 实现KVM 虚拟机 界面化管理
一、KVM环境的搭建
1.安装VMware(略)
2.在VMware中安装Linux系统(略,Ubuntu16.04)
打开支持虚拟化
网络选择桥接模式
3.安装qemu
apt-get install qemu
4.下载内层虚拟机需要用到的镜像(Ubuntu14.04)
镜像下载地址:https://www.ubuntu.com/download/alternative-downloads
5.安装ssh
apt-get install ssh
6.修改/etc/ssh/sshd_config文件
PermitRootLogin yes
--------------------------(将以下部分添加至文件末尾)
Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc
MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
-------------------------------------------
7.新建kvmtest文件夹
mkdir kvmtest
8.将镜像使用ssh传输工具传送到kvmtest
9.安装libvirt
apt-get update
apt-get install libvirt-dev libvirt-bin
10.安装virt-manager
apt-get install virt-manager
二、创建一台虚拟机
1.创建安装盘
①切换到kvmtest文件夹下创建安装盘
②执行命令:qemu-img create -f qcow2 ubuntu14.qcow2 10G
2.创建虚拟机
virt-install --virt-type kvm --name ubuntu01 --ram 1024 \
--vcpus 1 \
--cdrom=你的虚拟机镜像所在的位置 \
--disk 创建的磁盘所在的位置,format=qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux --os-variant=rhel6
(此方法安装过后需要使用VNC或virt-manager工具进入图形界面进行安装)
3.查看虚拟机
①执行命令 virsh list –all
(由于之前我创建过,所以存在四台虚拟机)
4.virt-manager的使用
执行命令:virt-manager
5.第一台虚拟机创建成功
三、根据xml文件来创建虚拟机
1.找到xml文件
进入到/etc/libvirt/qemu目录下。我们可以看到有xml文件。
在这个xml文件可以看到里面有虚拟机名字配置,磁盘大小配置等。
2.拷贝修改xml文件
①通过复制一份xml文件我们就可以创建另外一台虚拟机
②执行命令:cp ubuntu.xml ubuntu01.xml
③修改内容:使用超级用户对xml文件进行修改(name部分和uuid)
④定义一台虚拟机:使用virsh define + xml文件的绝对路径
如此我们便定义了另外一台虚拟机,可以使用 list –all命令查看
⑤开启虚拟机:virsh start +虚拟机名称
⑥关闭虚拟机:virsh shutdown +虚拟机名称
⑦移除虚拟机:移除虚拟机通过virsh undefined +虚拟机名称(删除了xml文件)
四、通过python控制kvm
1.配置python环境
①linux系统中带有python2,而我所使用的是python3,所以要另外安装python3,
可以去官网下载压缩包,解压,编译执行的方式进行安装。
2.安装IDE(可选)
我安装了pycharm(社区版,免费),方便编程使用
3.安装libvirt-python
需要安装在python3上安装python3-libvirt实现python语言与libvirt的连接
①安装
②测试:输入python3,输入import libvirt 不报错则说明安装成功
4.下载python-libvirt API文档
参照文档编写程序
①libirt API:https://libvirt.org/
5.编写程序
......
五、导入tkinter库进行图形化界面的设计
tkinter的使用不再描述......
代码:(由于第一版采用控制台输出没有界面,改进时没有对代码进行彻底的改进,所以此代码中有很多多余部分,且功能不太完善,仅供参考)
#encoding=utf-8 import libvirt
import tkinter as tk def close_connection():#关闭连接
try:
conn.close()
except:
print("--关闭连接失败--")
return 1
print('--成功关闭连接--') def list_connection():#主机信息
print("---------主机信息---------")
nodeinfo = conn.getInfo() # 获取虚拟化主机信息
print('模型: ' + str(nodeinfo[0])) # cpu模型
print('内存大小: ' + str(nodeinfo[1]) + 'MB') # 内存
print('CPU数量: ' + str(nodeinfo[2])) # cpu数量
print('虚拟类型: ' + conn.getType()) # 虚拟化类型
uri = conn.getURI() # 目前链接的uri
print('连接URI: : ' + uri)
mem = conn.getFreeMemory()
print("空闲内存: " + str(mem) + " bytes.")
print("-------------------------") lableInit.config(text="--------主机信息--------\n"
"模型:{}\n"
"内存大小:{}MB\n"
"CPU数量:{}个\n"
"虚拟类型:{}\n"
"连接URI:{}\n"
"内存空间:{}bytes\n"
.format(str(nodeinfo[0]),str(nodeinfo[1]),str(nodeinfo[2]),conn.getType(),uri,str(mem))) def show_machine():#显示虚拟机状态
#开启的域
vms_dict={}
domain_list=conn.listDomainsID()
for vm in domain_list:
vms_dict[str(vm)]=conn.lookupByID(vm).name()
print("""
处于开启状态的虚拟机
----------------
ID\tName
----------------""")
if vms_dict:
for id_part,name_part in vms_dict.items():
print("{}\t{}".format(id_part,name_part))
#lableInit.config(text="开启状态:".format(vms_dict))
else:
print("None")
print("----------------") #关闭的域
global vmd_list
vmd_list=[]
for i in conn.listDefinedDomains():
vmd_list.append(i)
print("""
处于关闭状态的虚拟机
----------------
Name
----------------""")
if vmd_list:
for name_part in vmd_list:
print("{}".format(name_part))
lableInit.config(text="开启状态:{}\n"
"关机状态:{}\n".format(vms_dict,vmd_list))
else:
print("None")
print("----------------")
#lableInit.config(text="虚拟机信息已在终端显示") #--------对虚拟机域进行操作--------- def temp():
name = entryName.get()
f = open('/etc/libvirt/qemu/{}.xml'.format(name)) # xml文件需要事先准备好
xml = f.read()
conn.createXML(xml)
f.close()
lableInit.config(text="临时虚拟机 {} 创建完成".format(name))
def define():
name=entryName.get()
f=open('/etc/libvirt/qemu/{}.xml'.format(name))#xml文件需要事先准备好
xml=f.read()
dom = conn.defineXML(xml)
f.close()
lableInit.config(text="虚拟机 {} 创建成功".format(name)) def undefine():
dom = conn.lookupByName(entryName.get())
dom.undefine()
print("虚拟机 {} 已取消定义".format(entryName.get()))
lableInit.config(text="虚拟机 {} 已取消定义".format(entryName.get())) def suspand():
dom = conn.lookupByName(entryName.get())
dom.suspend()
print("虚拟机 {} 暂停成功".format(entryName.get())) lableInit.config(text="虚拟机 {} 已暂停".format(entryName.get())) def resume():
dom = conn.lookupByName(entryName.get())
dom.resume()
print("虚拟机 {} 运行成功".format(entryName.get())) lableInit.config(text="虚拟机 {} 继续运行".format(entryName.get())) def destroy():
dom = conn.lookupByName(entryName.get())
dom.destroy()
print("虚拟机 {} 销毁成功".format(entryName.get())) lableInit.config(text="虚拟机 {} 已销毁".format(entryName.get())) def start():
dom = conn.lookupByName(entryName.get())
dom.create()
print("虚拟机 {} 启动成功".format(entryName.get())) lableInit.config(text="虚拟机 {} 已启动".format(entryName.get())) def shutdown(): dom = conn.lookupByName(entryName.get())
dom.shutdown()
print("虚拟机 {} 关闭成功".format(entryName.get())) lableInit.config(text="虚拟机 {} 已关闭".format(entryName.get())) #------------菜单控制-------------
def test():
name=str(entryName.get())
print(name) #--------------------------------
conn = libvirt.open("qemu:///system")#链接 top=tk.Tk()
top.title("虚拟机管理平台") #top.geometry('602x')#窗体大小
lableTitle = tk.Label(top,bg='#00BFFF',fg="#EEE8AA",font = 'Helvetica -24 bold',text="虚 拟 机 管 理 平 台",width=46)
lableTitle.grid(row=0,column=0,columnspan=2,ipady=10) #------------------------------- labelHello = tk.Label(top,fg='#c71585',font = 'Helvetica -18 bold', text = "请输入虚拟机的名称:")
labelHello.grid(row=1,column=0,padx=2,pady=6,sticky='E') entryName=tk.Entry(top,width=24)
entryName.grid(row=1,column=1,padx=2,sticky='W') #-------操作------ showHost =tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold', text="显示主机信息",command=list_connection)
showHost.grid(row=2,column=0,padx=4,pady=4,sticky='E') showVM =tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold', text="显示虚拟机状态",command=show_machine)
showVM.grid(row=2,column=1,padx=4,pady=4,sticky='W') tempVM =tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold',text="创建虚拟机",command=temp)
tempVM.grid(row=3,column=0,padx=4,pady=4,sticky='E') destroyVM = tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold', text="销毁虚拟机", command=destroy)
destroyVM.grid(row=3,column=1,padx=4,pady=4,sticky='W') suspandVM =tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold',text="暂停虚拟机",command=suspand)
suspandVM.grid(row=4,column=0,padx=4,pady=4,sticky='E') resumeVM = tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold', text="运行虚拟机", command=resume)
resumeVM.grid(row=4,column=1,padx=4,pady=4,sticky='W') startVM = tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold', text="开启虚拟机", command=start)
startVM.grid(row=5,column=0,padx=4,pady=4,sticky='E') shutdownVM = tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold', text="关闭虚拟机", command=shutdown)
shutdownVM.grid(row=5,column=1,padx=4,pady=4,sticky='W') defineVM =tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold',text="创建虚拟机"
"(永久创建)",command=define)
defineVM.grid(row=6,column=0,padx=4,pady=4,sticky='E') undefineVM =tk.Button(top,bg='#00BFFF',fg='white',width=18,height=2,font = 'Helvetica -15 bold',text="删除虚拟机"
"(取消定义)",command=undefine)
undefineVM.grid(row=6,column=1,padx=4,pady=4,sticky='W') lableInitTitle = tk.Label(top,bg='black',font = 'Helvetica -13 bold',text="* * * 系 统 反 馈 信 息 * * *",width=85,fg="blue")
lableInitTitle.grid(row=7,column=0,columnspan=2,ipady=10) lableInit = tk.Label(top,bg='black',font = 'Helvetica -13 bold',text="NULL",width=85,fg="white")
lableInit.grid(row=8,column=0,columnspan=2,ipady=10) photo=tk.PhotoImage(file="/home/ldw/kvmtest/copyright.png")
labelphoto=tk.Label(image=photo)
labelphoto.image=photo
labelphoto.grid(row=9,column=0,columnspan=2)
#quitVM = tk.Button(top,text="退出管理系统",command=close_connection())
#quitVM.pack() top.mainloop()
界面展示:
使用Python-Libvirt GUI 实现KVM 虚拟机 界面化管理的更多相关文章
- 【转载】使用宝塔对Linux系统进行界面化管理操作
腾讯云服务器和阿里云服务器的Centos系统都是没有Linux系统的一个版本,Centos系统的操作都是在没有类似Windows图形化操作界面的黑框框命令窗口进行操作的,需要使用到很多Linux操作命 ...
- 通过libVirt抓取kvm虚拟机监控指标数据
通常在我们的云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如cpu的使用率.内存的使用率.磁盘io.网络io等基本信息.可以利用这些信息及时调整云平台 ...
- OpenStack入门篇(四)之KVM虚拟机介绍和管理
1.查看虚拟机,启动虚拟机 [root@linux-node1 ~]# virsh list --all Id Name State --------------------------------- ...
- KVM虚拟机的日常管理与配置
1. 查看KVM虚拟机配置文件及运行状态(1) KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/ autostart目录是配置kvm虚拟机开机自启动目录. (2) virsh命令帮 ...
- Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)
课程大纲及内容简介: 每节课约35分钟,共不下40讲 第一章(11讲) ·分布式和传统单机模式 ·Hadoop背景和工作原理 ·Mapreduce工作原理剖析 ·第二代MR--YARN原理剖析 ·Cl ...
- 记录KVM虚拟机常用操作管理命令
环境说明 centos7中的KVM NAT方式是kvm安装后的默认方式.它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机. 检查当前的网络设置 # virsh net-li ...
- Docker私有仓库搭建与界面化管理
一.关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去. 但是有时候我们的使用场景需要我们拥有一个私有的镜 ...
- IDEA整合Jenkins界面化管理项目构建
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/WALK_MAN_wubiao/articl ...
- linux kvm虚拟机使用
安装配置kvm 1.安装kvm软件包 [root@kvm ~]# yum install kvm python-virtinst libvirt tunctl bridge-utils virt-ma ...
随机推荐
- Python3学习之路~5.11 configparser模块
用于生成和修改常见配置文档,当前模块的名称在 python 2.x 版本中为 ConfigParser, python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式 ...
- java框架之SpringCloud(7)-Config分布式配置中心
前言 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中标会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...
- linear-gradient常用实现效果
之前也研究过css3的这个属性,感觉没什么大用,一般的开发不会用到,毕竟调出来的渐变不专业,不如找一个好看的图片,其实很多时候还是有用的,偷来三个例子. 一.控制虚线 一般写虚线都用dashed,但有 ...
- CSS实现经典的三栏布局
实现效果: 左右栏定宽,中间栏自适应 (有时候是固定高度) 1 . 绝对定位布局:position + margin <div class="container"> & ...
- Go 初体验 - 令人惊叹的语法 - defer.3 - defer 函数参数计算时机
defer 函数的参数计算时机 定义一个 defer 函数,接收参数 n: 调用: 输出: 有点惊讶,为什么不是 100 200 200? go 语言里,defer 函数的参数是在定义位置被计算的,也 ...
- Linux基础命令---accept/reject 允许拒绝发送打印请求
accept accept指令用来设置允许向目标打印机发送打印任务. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 cupsaccept ...
- FAT32文件系统学习(上)
2011-06-02 22:30:48 目的:需要编写SD读图片的底层驱动程序.所以要了解一个SD卡常用文件系统基本概念.累计学习用时2.5小时. 一,FAT32的保留区 1,引导扇区 :引导扇区是F ...
- MySQL删除命令_DELETE
单表删除语句: DELETE [LOW_PRIORITY][IGNORE] FROM tbl_name [WHERE where_definition] [ORDER BY ...] ...
- MySQL5.7 Dockerfile
#Dockerfile for mysql5.7 FROM centos COPY ["src","/src"] RUN groupadd -g 1003 my ...
- detours express版本的使用
原文最早发表于百度空间2012-03-21 一.编译lib 1)拷贝它的src文件夹和system.mak文件到VS的VCVARS32.BAT所在的目录下 2)在命令提示符中运行VCVARS32.BA ...