① 測試開發之系統篇-按需創建測試虛擬機
首先,我們來了解一下KVM虛擬機有關的幾個概念和工具。
新建KVM虛擬機時,可以指定另一磁碟文件作為 BackingFile 。BackingFile是一個 只讀 的虛擬磁碟基礎映像,可以在多個虛擬機間進行共享。基於BackingFile創建和運行虛擬機時,只會在自己的磁碟文件中增量地寫入文件,從而提高效率、節省磁碟和維護成本。
虛擬機快照 保存了虛擬機在某個指定時間點的狀態,當我們在自動化測試過程中遭遇問題或錯誤時,可以利用快照保存、並恢復到執行中的某個時間點。藉助BackingFile機制,虛擬機支持形如以下的多層依賴的快照鏈。
可使用以下命令,將處於快照鏈中的某個虛機,導出形成一個獨立的磁碟映像文件,其不再依賴其它映像。
假設我們在用戶的工作目錄中,建立了以下目錄。
下面用一個例子,給大家介紹下快速創建測試虛擬機的方法。
(1)按照上一篇文章中的步驟,創建一個Win10虛擬機;
(2)在虛擬機中,安裝好工作中用到的測試軟體;
(3)使用以下命令,新建一個共享工具磁碟;
(4)掛載共享磁碟到虛擬機,復制工具和文件到該盤中;
(5)移除該虛擬機,確認對話框中,請選擇不刪除相關磁碟文件;
(6)移動原虛機主磁碟文件到基礎鏡像目錄,如
kvm/base/windows/win10/x64-pro-zh_cn.qcow2。
(7)執行以下命令,以上述基礎鏡像作為BackingFile,創建新的虛擬機磁碟;
(8)圖形界面中,新建測試虛擬機,掛在新建的虛擬機和共享磁碟。
除了使用圖形界面的qemu-manager軟體,這里也提供一種命令行的方法,大家可用於測試平台的代碼中。
(9)導出虛擬機XML配置文件
(10)修改XML配置文件中的以下欄位:nameuuidvcpumemory和currentMemorymac address第1塊disk的source file
(11)在第1塊disk的Elemnt中,加入以下BackingFile有關的內容:
(12)如需要用頁面VNC訪問虛擬機桌面,找到XML的graphics元素,修改成以下內容。
(13)使用以下命令定義虛擬機。
(14)使用以下命令啟動虛擬機。
(15)使用以下命令獲取虛擬機的VNC埠編號,在VNC軟體中使用」5900+該數字「的埠,訪問虛擬機遠程桌面。
另外,本人使用GO語言實現了基於libvirt介面的虛擬機管理有關功能,此開源項目旨在為大家提供一個基於KVM虛擬機和Docker容器的、按需測試環境管理平台,詳情請參照GitHub上的easysoft/zagent項目。
常用命令:
② KVM虛擬機的常用操作命令整理
1,創建虛擬機
代碼如下:
[root@localhost ~]# virt-install --name=centos1 \ #生成一個虛擬機
--ram 1024 --vcpus=1 \
--disk path=/root/centos1.img,size=10 \
--accelerate --cdrom /root/CentOS-6.5-x86_64-bin-DVD1.iso \
--graphics vnc,port=5921 --network bridge=br0
2,virsh的其他操作
代碼如下:
[root@localhost /]# virsh start centos1 #啟動虛擬機
[root@localhost /]# virt-viewer centos1 #如果有圖形界面的話,可以進入虛擬機的界面
[root@localhost ~]# virsh shutdown centos1 #關閉虛擬機
[root@localhost /]# virsh reboot centos1 #重啟虛擬機
[root@localhost /]# virsh suspend centos1 #暫停虛擬機
[root@localhost /]# virsh resume centos1 #恢復虛擬機
[root@localhost /]# virsh autostart centos1 #自動載入虛擬機
virsh參數如下:
autostart #自動載入指定的一個虛擬機
connect #重新連接到hypervisor
console #連接到客戶會話
create #從一個SML文件創建一個虛擬機
start #開始一個非活躍的虛擬機
destroy #刪除一個虛擬機
define #從一個XML文件定義一個虛擬機
domid #把一個虛擬機名或UUID轉換為ID
domuuid #把一個郁悶或ID轉換為UUID
dominfo #查看虛擬機信息
domstate #查看虛擬機狀態
domblkstat #獲取虛擬機設備快狀態
domifstat #獲取虛擬機網路介面狀態
mpxml #XML中的虛擬機信息
edit #編輯某個虛擬機的XML文件
list #列出虛擬機
migrate #將虛擬機遷移到另一台主機
quit #退出非互動式終端
reboot #重新啟動一個虛擬機
resume #重新恢復一個虛擬機
save #把一個虛擬機的狀態保存到一個文件
mp #把一個虛擬機的內核mp到一個文件中以方便分析
shutdown #關閉一個虛擬機
setmem #改變內存的分配
setmaxmem #改變最大內存限制值
suspend #掛起一個虛擬機
vcpuinfo #虛擬機的cpu信息
version #顯示virsh版本
3,virt-clone,如果我們要建幾個一樣的虛擬機,這個命令,非常有用
代碼如下:
# virt-clone --connect=qemu:///system -o centos1 -n centos3 -f /root/centos3.img #克隆centos1
正在克隆 centos1.img | 10.0 GB 00:07
Clone 'centos3' created successfully.
libguestfs-tools是虛擬機一個管理包,很有用的工具
[root@localhost ~]# yum -y install libguestfs-tools #安裝工具包
4,未登錄的情況下,查看鏡像目錄
代碼如下:
[root@localhost ~]# virt-ls centos.img /home #查看centos.img鏡像文件中/home目錄
tank
5,未登錄的情況下,將鏡像文件中的文件出來
代碼如下:
[root@localhost ~]# virsh list --all #查看所有的虛擬機名稱
Id 名稱 狀態
----------------------------------------------------
1 centos1running
2 centos6.5 running
- arch 關閉
- arch1 關閉
- arch2 關閉
- arch3 關閉
- arch5 關閉
- centos3關閉
- ubuntu 關閉
- ubuntu1關閉
[root@localhost ~]# virt--out -d centos1 /etc/passwd /tmp #將centos1中的文件到tmp下面
6,查看虛擬機的分區情況
代碼如下:
[root@localhost ~]# virt-filesystems -d centos1
/dev/sda1
/dev/VolGroup/lv_root
[root@localhost ~]# virt-list-partitions /root/centos.img
/dev/sda1
/dev/sda2
[root@localhost ~]# virt-df centos.img
Filesystem 1K-blocks Used Available Use%
centos.img:/dev/sda1 495844 34510 435734 7%
centos.img:/dev/VolGroup/lv_root 8780808 2842056 5492700 33%
7,mount虛擬機
代碼如下:
[root@localhost ~]# guestmount -a /root/centos.img -m /dev/VolGroup/lv_root --rw /mnt/usb
[root@localhost ~]# cd /mnt/usb/
[root@localhost usb]# ls
bin dev home lib64 media mnt opt root selinux sys usr
boot etc lib lost+found misc net proc sbin srv tmp var
8,修改kvm中虛擬機的內存大小
代碼如下:
[root@nfs ~]# virsh edit vm01 ##注意vi直接編輯不生效
vm01
df8604c1-dcf3-fa98-420f-6eea7b39c395
1048576 ###本來開始設置為1G,現在這個單位是k
1048576
修改為1.5G
代碼如下:
[root@nfs ~]# expr 1536 \* 1024
1572864/p
p[root@nfs ~]# virsh list
Id Name State
----------------------------------
1 win2003 running
3 vm01 running/p
p[root@nfs ~]# virsh shutdown vm01 ###修改配置文件後需要重新啟動下虛擬機,先關閉它
Domain vm01 is being shutdown/p
p[root@nfs ~]# virsh list ###確認已經被關閉
Id Name State
----------------------------------
1 win2003 running/p
p[root@nfs ~]# virsh start vm01 ###啟動它
Domain vm01 started/p
p[root@nfs ~]# virsh list
Id Name State
----------------------------------
1 win2003 running
3 vm01 running
到機器上查看內存大小:
代碼如下:
[root@vm01 liuxiaojie]# free -m
total used free shared buffers cached
Mem: 1505 618 886 0 29 361
-/+ buffers/cache: 227 1277
Swap: 2000 0 2000
9,刪除一個虛擬機(vm01)
代碼如下:
[root@nfs qemu]# virsh undefine vm01
[root@nfs qemu]# rm -f /home/data/vm01.img
10,刪除一個域
代碼如下:
[root@nfs web01]# virsh list --all
Id Name State
----------------------------------
1 web01 running ##處於工作狀態
- myweb01 shut off
- myweb03 shut off
- mywin2003 shut off
- myxp shut off
- xp shut off
代碼如下:
[root@nfs web01]# virsh undefine web01 ##處於工作狀態也能刪除!
Domain web01 has been undefined
代碼如下:
[root@nfs web01]# virsh list
Id Name State
----------------------------------
1 web01 running
代碼如下:
[root@nfs web01]# virsh destroy web01
Domain web01 destroyed
代碼如下:
[root@nfs web01]# virsh list --all ##web01已經沒有了!
Id Name State
----------------------------------
- myweb01 shut off
- myweb03 shut off
- mywin2003 shut off
- myxp shut off
- xp shut off
代碼如下:
[root@nfs web01]# virsh define web01
error: Failed to open file 'web01': No such file or directory
③ kvm和qemu的關系 kvm為什麼沒有做io虛擬化 半虛擬化和全虛擬化的區別 kvm是否在內
不同的基於KVM的虛擬化平台,可能會採用不同的虛擬化組件,目前主流的採用QEMU-KVM組件,但在不同的產品里版本有所不同,功能也有差異,下面就幾個概念進行梳理下
KVM:Kernel-Based Virtual Machine 基於內核的虛擬機,是Linux內核的一個可載入模塊,通過調用Linux本身內核功能,實現對CPU的底層虛擬化和內存的虛擬化,使Linux內核成為虛擬化層,需要x86架構的,支持虛擬化功能的硬體支持(比如Intel VT,AMD-V),是一種全虛擬化架構。KVM在2007年年2月被導入Linux 2.6.20內核中。從存在形式來看,它包括兩個內核模塊:kvm.ko 和 kvm_intel.ko(或kvm_amd.ko),本質上,KVM是管理虛擬硬體設備的驅動,該驅動使用字元設備/dev/kvm(由KVM本身創建)作為管理介面,主要負責vCPU的創建,虛擬內存的分配,vCPU寄存器的讀寫以及vCPU的運行。
QEMU:是一套由Fabrice Bellard編寫的模擬處理器的自由軟體,它是一個完整的可以單獨運行的軟體,可以獨立模擬出整台計算機,包括CPU,內存,IO設備,通過一個特殊的「重編譯器」對特定的處理器的二進制代碼進行翻譯,從而具有了跨平台的通用性。QEMU有兩種工作模式:系統模式,可以模擬出整個電腦系統,另一種是用戶模式,可以運行不同與當前硬體平台的其他平台上的程序(比如在x86平台上運行跑在ARM平台上的程序);其代碼地址 http://git.qemu.org/qemu.git ,有興趣的同學可以自己去看看,目前最新的版本是2.7.0,在0.9.1及之前版本還可以使用kqemu加速器(可以理解為QEMU的一個插件,用來提高QEMU的翻譯性能,支持Windows平台),但1.0以後版本就只能使用qemu-kvm(只支持Linux)進行加速了,1.3版本後QEMU和QEMU-KVM合二為一了。
QEMU-KVM:從前面對KVM內核模塊的介紹知道,它只負責CPU和內存的虛擬化,載入了它以後,用戶就可以進一步通過工具創建虛擬機(KVM提供介面),但僅有KVM還是不夠的,用戶無法直接控制內核去做事情(KVM只提供介面,怎麼創建虛擬機,分配vCPU等並不在它上面進行),還必須有個運行在用戶空間的工具才行,KVM的開發者選擇了比較成熟的開源虛擬化軟體QEMU來作為這個工具,並對其進行了修改,最後形成了QEMU-KVM。
在QEMU-KVM中,KVM運行在內核空間,QEMU運行在用戶空間,實際模擬創建,管理各種虛擬硬體,QEMU將KVM整合了進來,通過/ioctl 調用 /dev/kvm,從而將CPU指令的部分交給內核模塊來做,KVM實現了CPU和內存的虛擬化,但kvm不能虛擬其他硬體設備,因此qemu還有模擬IO設備(磁碟,網卡,顯卡等)的作用,KVM加上QEMU後就是完整意義上的伺服器虛擬化
當然,由於qemu模擬io設備效率不高的原因,現在常常採用半虛擬化的virtio方式來虛擬IO設備,另文再談
綜上所述,QEMU-KVM具有兩大作用:
1.提供對cpu,內存(KVM負責),IO設備(QEMU負責)的虛擬
2.對各種虛擬設備的創建,調用進行管理(QEMU負責)
libvirt
順帶提一提libvirt,這是RedHat開始支持KVM後,大概是覺得QEMU+KVM方案中的用戶空間虛擬機管理工具不太好用或者通用性不強,所以乾脆搞了個libvirt出來,一個針對各種虛擬化平台的虛擬機管理的API庫,一些常用的虛擬機管理工具如virsh(類似vim編輯器),virt-install,virt-manager等和雲計算框架平台(如OpenStack,OpenNebula,Eucalyptus等)都在底層使用libvirt提供的應用程序介面。
libvirt主要由三個部分組成:API庫,一個守護進程 libvirtd 和一個默認命令行管理工具 virsh。
總結:
目前來說,QEMU是一個獨立的虛擬化解決方案,並不依賴KVM(它本身自己可以做CPU和內存的模擬,只不過效率較低),而KVM是另一套虛擬化解決方案,對CPU進行虛擬效率較高(採用了硬體輔助虛擬化),但本身不提供其他設備的虛擬化,借用了QEMU的代碼進行了定製,所以KVM方案一定要依賴QEMU
即使後來RedHat後來開發了libvirt,也只能簡單的認為是個虛擬機管理工具,仍然需要通過用戶空間QEMU來與KVM進行交互