Qemu-kvm淺析

 

一.虛擬化介紹node

X86平臺的虛擬化技術中,新引入的虛擬化層一般稱爲虛擬化監控器(Virtual Machine Monitor,VMM),也叫Hypervisor。在虛擬化中,VMM必須能截獲計算元件到物理資源的直接訪問,並將其重定向到虛擬資源池中。根據VMM是用純軟件的方法仍是利用物理資源提供的機制來「截獲重定向」,可分爲軟件虛擬化和硬件虛擬化。linux

 

 

 

 

 

二:軟件虛擬化和硬件虛擬化git

軟件虛擬化:QEMU,VMWare安全

QEMU採用動態二進制翻譯技術,客戶機的指令不能再物理機上直接執行,須要經過VMM翻譯,再轉換成能夠在物理機上執行的指令,這一般會產生顯著的性能開銷,因此QEMU虛擬機用起來是至關慢的,可是QEMU的優勢是平臺無關性,能夠在同一平臺模擬不一樣架構平臺的的虛擬機。這麼好的優勢真的是不該該被這麼慢的性能拖住而不被普遍使用,因此後面就搭配KVM一塊兒用,QEMU提供I/OKVM提供對硬件的訪問。網絡

VMWare採用二進制翻譯和直接執行相結合的方案。客戶機用戶空間的代碼採用直接執行的方式,客戶機的內核代碼則採用二進制翻譯的方式,咱們知道一個程序的大部分時間都是在用戶空間來完成的,大大的減小了翻譯所佔的開銷,與QEMU相比,這樣作性能會大幅提高,可是失去了跨平臺的能力。數據結構

 

硬件虛擬化:架構

說白了就是硬件提供了對特殊指令的截獲和重定向的支持,從而提高客戶機的性能。socket

 

 

三.半虛擬化和全虛擬化工具

在半虛擬化的方案中,經過改動客戶機的操做系統,使客戶機知道本身運行在虛擬化環境下,可以與VMM進行協同工做。本質上,半虛擬化弱化了對虛擬機特殊指令的被動截獲要求,將其轉化爲客戶機的操做系統主動通知。這個主動通知前提是須要修改客戶機的操做系統源代碼的。性能

 

全虛擬化:

全虛擬化爲客戶機提供了完整的虛x86平臺,包括處理器、內存和外設,客戶機認爲本身運行在硬件之上,性能相對於半虛擬化低。

隨着廠商的cpu對虛擬化的支持愈來愈好,intel引入Intel-VTAMD引入ADM-V技術,靠硬件輔助的全虛擬化性能愈來愈好,全虛擬化將成爲虛擬化技術的核心

 

 

四.KVM

KVMkernel-based Virtual Machine)是基於kernel的虛擬機,從Linux 2.6.20開始,KVM就被集成進內核,成爲內核的可加載的模塊。關於KMV,總結以下:

 

1.KVM的模塊:

kvm-intel.ko #for Intel CPU

kvm-amd.ko #for AMD CPU

kvm.ko #主要的模塊

當三個模塊都加載後,會出現/dev/kvm字符設備,負責qemukvm的通信

 

2. kvm架構中,每一個虛擬的CPU顯示爲一個常規的進程,有Linux調度程序進行調度,享受Linux內核全部的功能

 

3. KVM自己不提供模擬,運行在內核,提供CPU和內存的虛擬化,以及客戶機的I/O攔截,客戶機的I/OKVM攔截後交給QEMU處理,爲KVM修改過的QEMU運行在用戶空間,提供硬件的I/O虛擬化,經過IOCTL /dev/kvm字符設備和KVM進行交互。

KVM模塊被加載的時候:

1首先初始化內部的數據結構;

2作好準備後,KVM 模塊檢測當前的 CPU,而後打開 CPU 控制及存取 CR4 的虛擬化模式開關,並經過執行 VMXON 指令將宿主操做系統置於虛擬化模式的根模式;

3最後,KVM 模塊建立特殊設備文件 /dev/kvm 並等待來自用戶空間的指令

 

4. KVM的功能列表:

1)支持CPUMemory超分(overcommit

2)支持virtio

3)支持熱插拔(cpu,塊設備,網絡設備等)

4)支持SMPSymmetric Multi-Processing對稱多處理器系統)

5)支持實時遷移(Live Migration

6)支持PCI設備直接分配和單根I/O虛擬化(SR-IOV)

7)支持內核同頁合併(KSM

8)支持非一致性內存訪問(NUMA

 

 

5. KVM工具集合

1) libvirt: 操做管理kvm虛擬機虛擬化API

2) Virsh: 基於libvirt命令行工具

3) Virt-Manager: 基於libvirtGUI工具

4) Virt-v2v:虛擬機遷移

5) Virt-*

6) Svirt: 安全工具

 

 

五.Qemu-KVM的簡單安裝和使用

1)查看CPU是否支持虛擬化

cat /proc/cpuinfo|egrep 「vmx|svm」

2)如今的linux都帶有kvm 模塊,確保kvm模塊正確安裝

ls /dev/kvm

3) 安裝qemu

yum install qemu*

或者git clone https://git.qemu.org/git/qemu.git 下載最新的qemu

或者https://download.qemu.org/來下載想要的版本

 

4)建立img 文件,有通常有兩種方式

[a]. dd if=/dev/zero of=rhel7u4.img bs=1M count=8192

[b]. qemu-img create -f qcow2 rhel7u4.img 8G ; 推薦使用這種方式,這種方式建立出 來的img文件是稀疏文件,也就是剛建立出來並無8G,會隨着數據的增多而增長。

 

-f : 磁盤文件格式,通常有rawqcow2, 一般用的較多的是qcow2,相比較raw格式來講,性能雖然差點,可是優勢是稀疏文件,而且具備加密、壓縮、快照等功能

 

格式轉換:qemu-img convert -f raw input.img -O qcow2 output.qcow2

 

5)將客戶機os安裝到img中,img能夠當作是qemu 客戶機啓動的硬盤。

taskset -c 0-4 qemu-system-x86_64 -name vm2 -enable-kvm -cpu host -smp cores=16,sockets=1, -m 77G -drive file=redhat.img -vnc :12  -netdev tap,id=ipvm1,ifname=tap3,script=/etc/qemu-ifup -device e1000,netdev=ipvm1,id=net0,mac=00:00:02:98:AC:62

 

taskset -c 1-4:綁定hostcore,意思是用host1-4 core來起這個guest

  -name vm2 :客戶機的名字

-enable-kvm 開啓kvm加速

-cpu host:客戶機cpu 模型

-smp:客戶機cpu

-m 77G:客戶機的內存

-drive file=/home/redhat.img : 配置驅動器,也能夠這樣寫 -boot order=cd  -hda=redhat.img  -cdrom=redhat.iso

-vnc :12 開啓vnc 5912端口,能夠經過該端口鏈接到客戶機,也能夠指定ip,例如-vnc  10.10.10.10:12,默認是127.0.0.1

-netdev tap,id=ipvm1,ifname=tap3,script=/etc/qemu-ifup 這是新版的net配置方式,這句話的意思是建立一個tap型的網絡設備,id=ipvm1 這個標識符能夠隨便取,ifname=tap3 tap設備網卡的名字,script=/etc/qemu-ifup表示在建立的虛擬機的時候會先執行qemu-ifup這個腳本,事實上還有個downscript=/etc/qemu-ifdown,這個是自動調用的,不須要特地去指定,是在結束的時候調用。

-device e1000,netdev=ipvm1,id=net0,mac=00:00:02:98:AC:62 這個-netdev是在host端建立了一個tap網卡,網卡idipvm1, -device e1000是建立一個千兆的網卡,netdev=ipmi1,是與host端的tap設備網卡相對應的另一端,id=net0guest端網卡的標識符,mac是指定guest端網卡的mac

 

 

另外有種結合numa node來指定客戶端的smp,例如 -smp cores=4,threads=2,socket=2 -numa  node, mem=1Gcpus=0-8,nodeid=0  -numa  node,mem=1G,cpus=9-15,nodeid=1

更簡單的方式也能夠寫成-smp 16,即指定guestcpu 16 core

 

6)啓動guest後,按ctrl+alt+2 進入到(qemu)命令行,輸入info cpus 能夠看到guest cpu對應在host中的線程ID

另外能夠在起qemu的時候加入參數-monitor unix:/tmp/vm0.monitor,server,nowait

而後在host中輸入nc -U /tmp/vm0.monitor也能夠進到monitor裏

 

或者在hostps -efL |grep qemu也能夠看到

 

22288qemu啓動客戶機的進程號,22290-22297是它產生的線程,做爲客戶機的vCPU在運行。

 

7)進程處理器的親和性和vCPU的綁定

a. 查看vcpu在哪一個core上運行

[root@xid]# taskset  -p  3963

pid 3963s current affinity mask: 4

這個416進制,即0100,即運行在core 3

或者

[root@xid]# taskset  -pc  3963

pid 3963s current affinity core: 3

-c的參數,就直接表示哪一個core,是10進制的

b. 修改客戶機的qemu進程,使其運行在core 4

[root@xid]# taskset -p 0x8 3963

pid 3963s current affinity mask: 4

pid 3963s new affinity mask: 8

或者

[root@xid]# taskset -pc  4  3963

pid 3963s current core : 3

pid 3963s new affinity core: 4

相關文章
相關標籤/搜索