zoukankan      html  css  js  c++  java
  • 使用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="--------主机信息--------
    "
                              "模型:{}
    "
                              "内存大小:{}MB
    "
                              "CPU数量:{}个
    "
                              "虚拟类型:{}
    "
                              "连接URI:{}
    "
                              "内存空间:{}bytes
    "
                         .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	Name
    ----------------""")
        if vms_dict:
            for id_part,name_part in vms_dict.items():
                print("{}	{}".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="开启状态:{}
    "
                                  "关机状态:{}
    ".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()

     界面展示:

  • 相关阅读:
    毛笔算法 毛笔签名效果
    手写输入控件
    全栈工程师成长路线
    配置msdtc
    流行的广告轮播(图片轮播)JS代码!!
    水晶报表放上去网站会爆:bobj错误的
    查询所有存储过程
    VB.NET and C# Comparison
    SQL查询案例:多行转换为一行
    SQL Server行列转换[转]
  • 原文地址:https://www.cnblogs.com/nyist0/p/9157867.html
Copyright © 2011-2022 走看看