使用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()

 界面展示:

 

posted @ 2018-06-08 22:44  润青  阅读(8400)  评论(0编辑  收藏  举报