標籤:kvm 虛擬化
一、KVM簡介
KVM(Kernel-basedVirtual Machine)即基於核心的虛擬機器,是一種用於Linux核心中的虛擬化基礎設施,可以將Linux核心轉化為一個hypervisor。KVM在2007年2月被匯入Linux 2.6.20核心中,以可載入核心模組的方式被移植到FreeBSD及illumos上。
KVM在具備Intel VT或AMD-V功能的x86平台上運行。它也被移植到S/390,PowerPC與IA-64平台上。在Linux核心3.9版中,加入ARM架構的支援。
關於KVM:
KVM是開源軟體,全稱是kernel-based virtual machine(基於核心的虛擬機器)。
是x86架構且硬體支援虛擬化技術(如 intel VT 或 AMD-V)的Linux全虛擬化解決方案。
它包含一個為處理器提供底層虛擬化 可載入的核心模組kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM還需要一個經過修改的QEMU軟體(qemu-kvm),作為虛擬機器上層控制和介面。
KVM能在不改變linux或windows鏡像的情況下同時運行多個虛擬機器,(它的意思是多個虛擬機器使用同一鏡像)並為每一個虛擬機器設定個人化硬體環境(網卡、磁碟、圖形卡……)。
在主流的Linux核心,如2.6.20以上的核心均已包含了KVM核心。
KVM 記憶體管理
KVM 繼承了 Linux 系統管理記憶體的諸多特性,比如,分配給虛擬使用的記憶體可以被交換至交換空間、能夠使用大記憶體頁以實現更好的效能,以及對 NUMA 的支援能夠讓虛擬機器高效訪問更大的記憶體空間等。
KVM 基於 Intel 的 EPT ( ExtendedPage Table )或 AMD 的 RVI ( Rapid Virtualization Indexing )技術可以支援更新的記憶體虛擬功能,這可以降低 CPU 的佔用率,並提供較好的輸送量。
此外, KVM 還藉助於 KSM ( Kernel Same-pageMerging )這個核心特性實現了記憶體頁面共用 。 KSM 通過掃描每個虛擬機器的記憶體尋找各虛擬機器間相同的記憶體頁,並將這些記憶體頁合并為一個被各相關虛擬機器共用的單獨頁面。在某虛擬機器試圖修改此頁面中的資料時, KSM 會重新為其提供一個新的頁面副本。實踐中,運行於同一台物理主機上的具有相同 GuestOS 的虛擬機器之間出現相同記憶體頁面的機率是很的,比如共用庫、核心或其它記憶體對象等都有可能表現為相同的記憶體頁,因此, KSM 技術可以降低記憶體佔用進而提高整體效能。
KVM組件
KVM主要兩類組件組成:
◇/dev/kvm:管理虛擬機器的裝置節點,使用者空間的程式可通過其ioctl()系統調用集來完成虛擬機器的建立啟動等管理工作;它是一個字元裝置;其主要完成的操作包括:
建立虛擬機器;
為虛擬機器分配記憶體;
讀、寫VCPU的寄存器;
向VCPU注入中斷;
運行VCPU;
◇qemu進程:工作於使用者空間的組件,用於模擬PC機的I/O類硬體裝置;
qemu全稱Quick Emulator。是獨立虛擬軟體,能獨立運行虛擬機器(根本不需要kvm)。kqemu是該軟體的加速軟體。kvm並不需要qemu進行虛擬處理,只是需要它的上層管理介面進行虛擬機器控制。虛擬機器依舊是由kvm驅動。
半虛擬化virtio組件
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/79/1E/wKioL1aJ4m_gHtXgAAB2JYuZmrU358.jpg" title="圖片1.jpg" alt="wKioL1aJ4m_gHtXgAAB2JYuZmrU358.jpg" />
virtio半虛擬化驅動的方式,可以獲得很好的I/O效能,其效能幾乎可以達到和native(即:非虛擬化環境中的原生系統)差不多的I/O效能。所以,在使用KVM之時,如果宿主機核心和客戶機都支援virtio的情況下,一般推薦使用virtio達到更好的效能。當然,virtio的也是有缺點的,它必須要客戶機安裝特定的Virtio驅動使其知道是運行在虛擬化環境中,且按照Virtio的規定格式進行資料轉送,不過客戶機中可能有一些老的Linux系統不支援virtio和主流的Windows系統需要安裝特定的驅動才支援Virtio。不過,較新的一些Linux發行版(如RHEL 6.3、Fedora 17等)預設都將virtio相關驅動編譯為模組,可直接作為客戶機使用virtio,而且對於主流Windows系統都有對應的virtio驅動程式可供下載使用。
virtio是對半虛擬化hypervisor中的一組通用類比裝置的抽象.該設定還允許hypervisor匯出一組通用的類比裝置,並通過一個通用的應用程式介面(API)讓它們變得可用.有了半虛擬化hypervisor之後,客體作業系統能夠實現一組通用的介面,在一組後端驅動程式之後採用特定的裝置類比.後端驅動程式不需要是通用的,因為它們只實現前端所需的行為。
KVM工具棧
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/79/20/wKiom1aJ4mXiC26oAAEjoQk443c231.jpg" title="圖片2.jpg" alt="wKiom1aJ4mXiC26oAAEjoQk443c231.jpg" />
二、KVM虛擬化平台構建
1、安裝準備
查看你的硬體是否支援虛擬化。命令:
egrep ‘(vmx|svm)‘ /proc/cpuinfo
注意:
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/79/1F/wKioL1aJ5SrhvuNpAADHq9wY-1s547.jpg" title="QQ20160104111616.jpg" alt="wKioL1aJ5SrhvuNpAADHq9wY-1s547.jpg" />
2、安裝KVM
由於Linux核心已經將KVM收錄了,在安裝系統時已經加入了KVM,我們只需要在命令列模式下啟用 KVM 即可:
[[email protected] ~]# modprobe kvm_intel[[email protected] ~]# lsmod |grep kvmkvm_intel 54285 0 kvm 333172 1 kvm_intel
3、KVM虛擬機器建立和管理所依賴的組件介紹
KVM 虛擬機器的建立依賴qemu-kvm :
雖然 kvm 的技術已經相當成熟而且可以對很多東西進行隔離,但是在某些方面還是無法虛擬出真實的機器。比如對網卡的虛擬,那這個時候就需要另外的技術來做補充,而 qemu-kvm 則是這樣一種技術。它補充了 kvm 技術的不足,而且在效能上對 kvm 進行了最佳化。
我們還可以使用 virt-manager , virt-viewer 來管理虛擬機器;
我們在建立和管理 KVM 虛擬機器時還需要 libvirt 這個重要的組件:
它是一系列提供出來的庫函數,用以其他技術調用,來管理機器上的虛擬機器。包括各種虛擬機器技術, kvm 、 xen 與 lxc 等,都可以調用 libvirt 提供的 api 對虛擬機器進行管理。有這麼多的虛擬機器技術,它為何能提供這麼多的管理功能那。是因為它的設計理念,它是面向驅動的架構設計。對任何一種虛擬機器技術都開發設計相對於該技術的驅動。這樣不同虛擬機器技術就可以使用不同驅動,而且相互直接不會影響,方便擴充。而且 libvirt 提供了多種語言的編程介面,可以直接通過編程,調用 libvirt 提供的對外介面實現對虛擬機器的操作。如今流行的雲端運算中的 IaaS 是與該庫聯絡相當密切的。通過可以看出它的架構設計思想。
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/79/21/wKiom1aJ53uxzIvkAACEOQphDxo665.jpg" title="圖片1.jpg" alt="wKiom1aJ53uxzIvkAACEOQphDxo665.jpg" />
從該圖可以看出,在 libvirtapi 之上會有很多個 driver ,對於每一種虛擬機器技術都會有一種 driver ,用來充當該虛擬機器技術與 libvirt 之間的封裝介面。如此設計就可以避免 libvirt 需要設計各種針對不同虛擬機器技術的介面,它主要關注底層的實現,提供對外介面調用,而不同的虛擬機器技術通過調用 libvirt 提供的介面來完成自己所需要的功能。
4、安裝KVM所需組件
yum install -y qemu-kvm libvirt virt-manager
安裝完成後啟動 libvirtd 服務:
service libvirtd start
會自動啟動一個橋裝置,這相當於VMware Workstation中的host-only僅主機的網路裝置;
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/79/21/wKiom1aJ6onwQ5YqAAGL0E-dHvQ836.jpg" title="QQ20160104114355.jpg" alt="wKiom1aJ6onwQ5YqAAGL0E-dHvQ836.jpg" />
使用橋接器管理命令查看:
# brctl showbridge namebridge idSTP enabledinterfacesvirbr08000.5254006d26bbyesvirbr0-nic
像 VMware Workstation 中我們需要建立物理橋接裝置,可以使用 virsh 建立橋裝置關連網卡到橋接裝置上:
需要將 NetworkManager 服務關閉,開機啟動也關閉,然後在建立橋接裝置及關連網卡到橋接裝置上:
virsh iface-bridge eth0 br0
查看橋接裝置及其他網路裝置運行情況:
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/79/22/wKiom1aJ62KwA8V2AAILlQPUpiE282.jpg" title="QQ20160104114732.jpg" alt="wKiom1aJ62KwA8V2AAILlQPUpiE282.jpg" />
至此,我們的虛擬化平台就構建完畢,下面就開始在 KVM 虛擬化平台上建立和管理虛擬機器,我們先使用 qemu-kvm 來建立和管理虛擬機器。
三、使用qemu-kvm管理KVM虛擬機器
1、Qemu-kvm介紹
Qemu 是一個廣泛使用的開源電腦模擬器和虛擬機器。當作為模擬器時,可以在一種架構(如 PC 機)下運行另一種架構(如 ARM)下的作業系統和程式。而通過動態轉化,其可以獲得很高的運行效率。當作為一個虛擬機器時,qemu可以通過直接使用真機的系統資源,讓虛擬系統能夠獲得接近於物理機的效能表現。qemu支援xen或者kvm模式下的虛擬化。當用kvm時, qemu可以虛擬x86、伺服器和嵌入式 powerpc ,以及s390的系統。
QEMU當運行與主機架構相同的目標架構時可以使用KVM。例如,當在一個 x86 相容處理器上運行 qemu-system-x86時,可以利用KVM加速――為宿主機和客戶機提供更好的效能。
Qemu 有如下幾個部分組成:
基於libvirt的工具如virt-manager和virt-install提供了非常便捷的虛擬機器管理介面,但它們事實上上經二次開發後又封裝了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能夠完成此前的任務。
2、Qemu-kvm的使用協助
在RHEL6/CentOS6 上,qemu-kvm位於/usr/libexec目錄中。由於此目錄不屬於PATH環境變數,故無法直接使用,這樣也阻止了可以直接使用qemu作為建立並管理虛擬機器。如若想使用qemu虛擬機器,可以通過將/usr/libexec/qemu-kvm連結為/usr/bin/qemu-kvm實現。
ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
qemu-kvm命令使用格式為“qemu-kvm [options] [disk_image]”,其選項非常多,不過,大致可分為如下幾類。
標準選項;
USB選項;
顯示選項;
i386平台專用選項;
網路選項;
字元裝置選項;
藍芽相關選項;
Linux系統引導專用選項;
調試/專家模式選項;
PowerPC專用選項;
Sparc32專用選項;
qemu-kvm的標準選項
qemu-kvm的標準選項主要涉及指定主控件類型、CPU模式、NUMA、軟碟機裝置、光碟機裝置及硬體裝置等。
-name name:設定虛擬機器名稱;-M machine:指定要類比的主控件類型,如Standard PC、ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”擷取所支援的所有類型;-m megs:設定虛擬機器的RAM大小;-cpu model:設定CPU模型,如coreduo、qemu64等,可以使用“qemu-kvm -cpu ?”擷取所支援的所有模型;-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:設定類比的SMP架構中CPU的個數等、每個CPU的核心數及CPU的socket數目等;PC機上最多可以類比255顆CPU;maxcpus用於指定熱插拔的CPU個數上限;-numa opts:指定類比多節點的numa裝置;-fda file-fdb file:使用指定檔案(file)作為磁碟片鏡像,file為/dev/fd0表示使用物理軟碟機;-hda file-hdb file-hdc file-hdd file:使用指定file作為硬碟鏡像;-cdrom file:使用指定file作為CD-ROM鏡像,需要注意的是-cdrom和-hdc不能同時使用;將file指定為/dev/cdrom可以直接使用物理光碟機;-drive option[,option[,option[,...]]]:定義一個硬碟裝置;可用子選項有很多。 file=/path/to/somefile:硬體映像檔案路徑; if=interface:指定硬碟裝置所串連的介面類型,即控制器類型,如ide、scsi、sd、mtd、floppy、pflash及virtio等; index=index:設定同一種控制器類型中不同裝置的索引號,即標識號; media=media:定義介質類型為硬碟(disk)還是光碟片(cdrom); snapshot=snapshot:指定當前硬碟裝置是否支援快照功能:on或off; cache=cache:定義如何使用物理機緩衝來訪問塊資料,其可用值有none、writeback、unsafe和writethrough四個; format=format:指定映像檔案的格式,具體格式可參見qemu-img命令;-boot [order=drives][,once=drives][,menu=on|off]:定義啟動裝置的引導次序,每種裝置使用一個字元表示;不同的架構所支援的裝置及其表示字元不盡相同,在x86 PC架構上,a、b表示軟碟機、c表示第一塊硬碟,d表示第一個光碟機裝置,n-p表示網路介面卡;預設為硬碟裝置;-boot order=dc,once=d
本文出自 “小小水滴” 部落格,請務必保留此出處http://wangzan18.blog.51cto.com/8021085/1731324
CentOS 6.5安裝KVM虛擬化