一、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()
界面展示: