KVM虛擬化

1、 虛擬化的優點

  • 1.下降運營成本:
      服務器虛擬化下降了IT基礎設施的運營成本,令系統管理員擺脫了繁重的物理服務器、OS、中間件及兼容性的管理工做,減小人工干預頻率,使管理更增強大、便捷。
  • 2.提升應用兼容性:
      服務器虛擬化提供的封裝性和隔離性使大量應用獨立運行於各類環境中,管理人員不需頻繁根據底層環境調整應用,只需構建一個應用版本並將其發佈到虛擬化後的不一樣類型平臺上便可。
  • 3.加速應用部署:
      採用服務器虛擬化技術只需輸入激活配置參數、拷貝虛擬機、啓動虛擬機、激活虛擬機便可完成部署,大大縮短了部署時間,免除人工干預,下降了部署成本。
  • 4.提升服務可用性:
      用戶能夠方便地備份虛擬機,在進行虛擬機動態遷移後,能夠方便的恢復備份,或者在其餘物理機上運行備份,大大提升了服務的可用性。
  • 5.提高資源利用率:
      經過服務器虛擬化的整合,提升了CPU、內存、存儲、網絡等設備的利用率,同時保證原有服務的可用性,使其安全性及性能不受影響。
  • 6.動態調度資源:
      在服務器虛擬化技術中,數據中心從傳統的單一服務器變成了統一的資源池,用戶能夠即時地調整虛擬機資源,同時數據中心管理程序和數據中心管理員能夠靈活根據虛擬機內部資源使用狀況靈活分配調整給虛擬機的資源。
  • 7.下降能源消耗:
      經過減小運行的物理服務器數量,減小CPU之外各單元的耗電量,達到節能減排的目的。

    2、KVM虛擬化介紹

KVM(kernel-based virtual machine,基於內核的虛擬主機),最初是一家叫Qumranet的以色列公司研發。做爲他們的VDI產品的虛擬機。爲了簡化開發,KVM的開發人員並無選擇從底層開始新寫一個Hypervisor,而是選擇了基於Linux kernel,經過加載新的模塊從而使Linux Kernel自己變成一個Hypervisor。2006年10月,在前後完成了基本功能、動態遷移以及主要的性能優化以後,Qumranet正式對外宣佈了KVM的誕生。html

KVM虛擬化技術之因此叫基於內核的虛擬化技術,其KVM自身就是一個Linux內核模塊,當一個安裝有Linux系統的物理機裝載了KVM這個內核模塊以後,搖身一變,此Linux系統就變成了一個hypervisor。可是這個Hypervisor上面運行的進程仍是會繼續運行,同時也能夠建立虛擬機,但每一個虛擬機就是運行在Linux內核之上的一個系統進程,能夠隨時使用kill命令殺死。
在2006年10月左右, Linux內核的維護者將KVM收錄進了內核,KVM是寄宿在Linux內核之上。python

KVM這家公司在2008年9月被RedHat收購,出價1億7百萬美金。RedHat收購KVM後也算有了本身的虛擬化技術,此後就開始大力支持KVM,從REHL5.4開始KVM就已經被收錄進內核。因爲KVM這種虛擬化技術出現的比較晚,因此充分利用了現代操做系統特性,特別是KVM要求只能運行在支持HVM(硬件輔助虛擬化)的平臺上而且只能是64位平臺,如Intel的VT。linux

3、KVM 架構

KVM虛擬化

KVM是一個很是精巧的設計方式,它只是Linux的一個內核模塊,可是這個內核模塊一旦裝載當即能夠成爲一個hypervisor,若是不裝載就仍是一個正常的Linux系統。有了KVM模塊之後Linux就有了三種運行模式:web

  • Guest Mode:來賓模式:

此模式只負責非I/O類操做或者說是非特權指令操做,如算術運行,因爲是虛擬而非模擬,底層架構同樣,因此此時Guest OS能夠直接經過KVM Driver直接運行到物理CPU的ring 3上執行。若是是模擬那麼此時就須要通過User Mode轉到CPU執行。但一旦須要跟I/O打交道或須要運行特權指令,就須要Guest OS中的進程進行內部系統調用到達Geust OS的內核空間,而後通過User Mode到Kernel Mode這麼一個過程。express

  • User Mode:用戶模式:

此模式就表明來賓模式執行I/O類操做請求(站在虛擬機角度),由於QEMU就在用戶模式運行(QEMU負責模擬I/O設備提供給Guest OS使用)。編程

  • Kernel Mode:內核模式:

此模式是真正能夠操做硬件的,當Guest OS執行I/O類操做或特權指令操做時須要向用戶模式提交請求,而後由用戶模式再次發起硬件操做請求給內核模式從而真正操做硬件。windows

KVM組件 緩存

在一個裝載了KVM模塊的Linux系統上,其運行的KVM虛擬機表現爲一個個線程,Linux系統能夠正常管理。KVM核心就兩個組件:/dev/kvm和QEMU。
KVM模塊是KVM虛擬機的核心部分,其主要功能是初始化CPU硬件,打開虛擬化模式,而後將虛擬客戶機運行在虛擬機模式下,並對虛擬客戶機的運行提供必定的支持。
爲了軟件的簡潔和性能,KVM僅支持硬件虛擬化。天然而然,打開並初始化系統硬件以支持虛擬機的運行,是KVM模塊的職責所在。以KVM在Intel公司的CPU上運行爲例,在被內核加載的時候,KVM模塊會先初始化內部的數據結構;作好準備以後,KVM模塊檢測系統當前的CPU,而後打開CPU控制寄存器CR4中的虛擬化模式開關,並經過執行VMXON 指令將宿主操做系統(包括KVM模塊自己)置於虛擬化模式中的根模式;最後,KVM模塊建立特殊設備文件/dev/kvm並等待來自用戶空間的命令。接下來虛擬機的建立和運行將是一個用戶空間的應用程序(QEMU)和KVM模塊相互配合的過程。安全

1) /dev/kvm性能優化

/dev/kvm是一個字符設備,工做於Hypervisor。在用戶空間,可經過這個接口(調用ioctl系統調用)管理虛擬機或經過這個接口編程序用來管理虛擬機,實現VM建立、刪除、分配內存、讀寫VCPU的寄存器、想VCPU注入中斷、運行VCPU等功能。如virsh或qemu-kvm這些工具都是均可以用來管理KVM虛擬機。

2) QEMU

QEMU自己並非KVM的一部分,其自身就是一個著名的開源虛擬機軟件。與KVM不一樣,QEMU虛擬機是一個純軟件的實現,因此性能低下。可是,其優勢是在支持QEMU自己編譯運行的平臺上就能夠實現虛擬機的功能,甚至虛擬機能夠與宿主機並非同一個架構。做爲一個存在已久的虛擬機,QEMU的代碼中有整套的虛擬機實現,包括處理器虛擬化、內存虛擬化,以及KVM使用到的虛擬設備模擬(好比網卡、顯卡、存儲控制器和硬盤等)。
爲了簡化開發和代碼重用,KVM在QEMU的基礎上進行了修改。虛擬機運行期間,QEMU 會經過KVM模塊提供的系統調用進入內核,由KVM模塊負責將虛擬機置於處理器的特殊模式運行。遇到虛擬機進行輸入輸出操做,KVM模塊會從上次的系統調用出口處返回 QEMU,由QEMU來負責解析和模擬這些設備。
從QEMU角度來看,也能夠說QEMU使用了KVM模塊的虛擬化功能,爲本身的虛擬機提供硬件虛擬化的加速,從而極大地提升了虛擬機的性能。除此以外,虛擬機的配置和建立,虛擬機運行依賴的虛擬設備,虛擬機運行時的用戶操做環境和交互,以及一些針對虛擬機的特殊技術(諸如動態遷移),都是由QEMU本身實現的。

4、部署KVM虛擬化平臺:

  1. 經過BIOS上面設置支持虛擬化操做
    若是是使用vmware來模擬開啓支持虛擬化標誌:
    KVM虛擬化
  2. 查看系統是否支持虛擬化:

    # grep -E 'vmx|svm' /proc/cpuinfo

    KVM虛擬化
    3.安裝KVM管理工具

    # yum install qemu-kvm libvirt libvirt-client python-virtinst virt-manager

    加載KVM模塊,並驗證KVM模塊是否安裝好:

    # modprobe kvm 
        # lsmod |grep kvm(物理機:若是沒有輸出表明CPU不支持,須要開啓CPU的支持KVM虛擬化的模塊,具體就是進入BIOS中設置。)

    KVM虛擬化

  3. 設置KVM網絡橋接模式:

備註:在libvirt中運行kvm網絡有兩種方法:NAT和BRIDGE,默認是NAT模式,用戶模式能夠訪問外網,可是沒法從外部訪問虛擬機網絡,因此用的不是不少,咱們通常作的服務器都須要外網的訪問,全部咱們多數狀況採用橋接模式(bridge),這種模式容許虛擬機像一臺獨立的主機同樣擁有網絡,外部的機器能夠直接訪問到虛擬機。因此通常都是使用橋接模式。
說明:在安裝kvm後發現網絡接口中多了一個叫作virbr0的虛擬網絡接口:
KVM虛擬化
這是由於安裝啓動了libvirt服務後生產的,libvirt在服務器上生成了一個virbr0,host上全部的虛擬主機經過這個virbr0鏈接起來。默認使用的是NAT模式,這時guest能夠訪問外部,可是沒法從外部訪問虛擬機網絡,因此,大部分時候咱們虛擬機是經過網橋鏈接到局域網裏。
因此這個virbr0不是必須的。如何關掉這個virbr0呢:

# virsh net-list  列出網絡
# virsh net-destroy default  銷燬網絡
# virsh net-undefine default  不定義一個持久網絡
# service libvirtd restart

設置橋接:

  • 第一種方法(在Centos7上會斷開鏈接,推薦第二種方法):

    # virsh iface-bridge ens33 br0 --no-stp
    # service libvirtd restart
    # # service network restart
  • 第二種方法:

編輯物理機的網卡文件(以下):

# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
# cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=dhcp
STP=off

KVM虛擬化

# service libvirtd restart  重啓libvirtd守護進程
  1. KVM虛擬機安裝:

1)安裝虛擬機(圖形化界面)

# virt-manager

KVM虛擬化
備註:error qustion:
a. virt-manager沒法打開圖形界面:
windows安裝xmanager
linux下安裝支持xmanager的驅動:yum -y install xorg-x11-xauth
b. 圖形界面亂碼問題:
yum install dejavu-lgc-sans-fonts -y
yum groupinstall Fonts
2)查看安裝界面(雙擊localhost)
KVM虛擬化
能夠看到此時的默認存儲地址是/var/lib/libvirt/images下的。
3)右擊localhost界面,點擊新建。
KVM虛擬化
能夠看到其支持ISO,HTTP,FTP,NFS,PXE和本地image等方式來安裝虛擬機系統。
KVM虛擬化
點擊前進,選擇使用iso鏡像,
KVM虛擬化
選擇瀏覽-本地瀏覽—>找到存放你ISO鏡像的地方。

KVM虛擬化
設置你要給虛擬機的內存和CPU。
KVM虛擬化

KVM虛擬化
KVM虛擬化

而後點擊完成。這裏必定要設置鍵盤模式爲en-us。
KVM虛擬化
點擊應用,而後開始安裝。接下來就是安裝操做系統的常規界面了,這裏就不做介紹了。
KVM虛擬化

2)命令行方式安裝虛擬機(virt-install):
virt-install介紹:
virt-install 建立虛擬機並安裝GuestOS,virt-isntall是一個命令行工具,爲KVM,XEN或者其餘支持libvirt API的hypervisor建立虛擬機並完成Guest OS安裝,此外能夠基於串行控制檯/VNV/SDL支持文本或者圖形安裝界面,安裝過程可使用本地的安裝介質cdrom,也能夠經過網絡NFS/HTTP/FTP服務實現。對於經過網絡安裝的方式,virt-install能夠經過自動加載必要的文件以啓動安裝過程而無須額外提供引導工具。固然,virt-install也支持PXE方式的安裝過程,也可以直接使用現有的磁盤鏡像直接啓動安裝過程。
virt-install:命令選項大致分類
通常選項:指定虛擬機的名稱/內存大小/VCPU個數及特性等
-n NAME,--name=NAME:虛擬機名稱,全局惟一
-r Memory,--ram=memory:虛擬機內存大小,單位MB
--vcpus=VCPUS ...:VCPU個數及相關配置
--cpu=CPU:CPU模式及其特性,如coreduo等,可使用qemu-kvm -cpu ?來獲取支持的CPU模式

安裝方法:指定安裝方法/Guest OS類型等
        -c cdrom,--cdrom=cdrom:光盤安裝介質
        -l localtion,--location=locationo:安裝源URL,支持ftp,http及nfs等,如http://192.168.1.1/cobber/ks...
        --pxe:基於pxe安裝
        --live cd:把光盤看成live CD
        --os-type=DISTRO_VARIANT:某類型操做系統的變體,如rhe13
        -x extra,--extra-args=extra:根據--location指定的方式安裝時,用於傳遞給內核的額外選項,例如指定kickstartd文件的位置,--extra-args 'ks=http://172.16.0.1/class.cfg'
        --boot=bootopts:指定安裝過程完成後的配置選項,如指定引導設備的次序,使用指定的而非安裝的kernel/initrd來引導系統啓動等。如:
            --boot cdromo,hd,nd,network:指定引導次序
            --boot keernel=KERNEL,initrd=INITRD,kernel_args='console=/dev/ttys0':指定啓動系統內核及 initrd文件
    存儲配置:指定存儲類型/位置及其屬性等
        --disk=DISKOPTS:指定存儲設備及其屬性;格式爲--disk /some/storage/path,opt1=val1,opt2=val2.經常使用的選項有:
            device:設備類型,如cdromo,disk或者floppy等,默認disk
            bus:磁盤總線類型,
            perms:訪問權限,如rw,ro或sh(共享的可讀寫),默認爲rw
            size:新建磁盤鏡像文件的大小。單位GB
            cache:緩存模型,值爲none,writethrouth(緩存讀),writeback(緩存讀寫)
            format:磁盤鏡像格式,raw,qcow2.vmdk等
            sparse:磁盤鏡像使用稀疏格式,也就是不當即分配只當大小的空間
            --nodisks:不是使用本地磁盤,在LIVECD模式中經常使用
網絡配置:指定網絡接口的網絡類型及其接口屬性,如mac地址/驅動模式等
        -w NETWORK,--network=NETWORK,opt1=val1,opt2=val2 將虛擬機鏈接到宿主機的網絡中。其NETWORK能夠爲:bridge=Bridge:鏈接至名爲‘BRIDEG’的橋設備
            network=NAME 鏈接至名爲‘NAME’的網絡
圖形配置:
設備選項:
虛擬化平臺:
其餘:
        --autostart:指定虛擬機是否在物理啓動後自動啓動
        --print-xml:
        --force:禁止命令進入交互模式,若是有須要回答yes或者no,則自動回答yes

安裝示例:
使用光盤安裝:
virt-install --hvm --name demo1 --memory 500 –disk size=5--livecd --graphics vnc --cdrom /var/lib/libvirt/images/CentOS-7-x86_64-Minimal-1708.iso

Install a Fedora 9 plain QEMU guest, using LVM partition, virtual networking, booting from PXE, using VNC server/viewer, with virtio-scsi disk

# virt-install \
          --connect qemu:///system \
          --name demo \
          --memory 500 \
          --disk path=/dev/HostVG/DemoVM,bus=scsi \
          --controller virtio-scsi \
          --network network=default \
          --virt-type qemu \
          --graphics vnc \
          --os-variant fedora9

Run a Live CD image under Xen fullyvirt, in diskless environment

# virt-install \
          --hvm \
          --name demo \
          --memory 500 \
          --disk none \
          --livecd \
          --graphics vnc \
          --cdrom /root/fedora7live.iso

Run /usr/bin/httpd in a linux container guest (LXC). Resource usage is capped at 512 MiB of ram and 2 host cpus:

# virt-install \
           --connect lxc:/// \
           --name httpd_guest \
           --memory 512 \
           --vcpus 2 \
           --init /usr/bin/httpd

Start a linux container guest(LXC) with a private root filesystem, using /bin/sh as init. Container's root will be under host dir /home/LXC. The host dir "/home/test" will be mounted at "/mnt" dir inside container:

# virt-install \
           --connect lxc:/// \
           --name container \
           --memory 128 \
           --filesystem /home/LXC,/ \
           --filesystem /home/test,/mnt \
           --init /bin/sh

Install a paravirtualized Xen guest, 500 MiB of RAM, a 5 GiB of disk, and Fedora Core 6 from a web server, in text-only mode, with old style –file options:

# virt-install \
          --paravirt \
          --name demo \
          --memory 500 \
          --disk /var/lib/xen/images/demo.img,size=6 \
          --graphics none \
          --location

Create a guest from an existing disk image 'mydisk.img' using defaults for the rest of the options.

# virt-install \
          --name demo \
          --memory 512 \
          --disk /home/user/VMs/mydisk.img \
          --import

Start serial QEMU ARM VM, which requires specifying a manual kernel.

# virt-install \
          --name armtest \
          --memory 1024 \
          --arch armv7l --machine vexpress-a9 \
          --disk /home/user/VMs/myarmdisk.img \
          --boot kernel=/tmp/my-arm-kernel,initrd=/tmp/my-arm-initrd,dtb=/tmp/my-arm-dtb,kernel_args="console=ttyAMA0 rw root=/dev/mmcblk0p3" \
          --graphics none

5、常規操做虛擬機

  • 列出域

    # virsh list   列出開啓和掛起的域
        # virsh list –all 列出所有域

    KVM虛擬化

  • 掛起和恢復虛擬機

    # virsh suspend kvm2  掛起虛擬機
        # virsh resume kvm1   恢復虛擬機

    KVM虛擬化
    KVM虛擬化

  • 伴隨着開機自啓動

    # virsh autostart kvm1  隨着物理機開機自動啓動KVM1

    KVM虛擬化

  • 關閉開啓一個域

    # virsh start kvm1
        # virsh shutdown kvm1
  • 編輯虛擬機的配置文件

    # virsh edit kvm3
  • 克隆虛擬機:

    # virt-clone -o kvm1 -n kvm4 -f /var/lib/libvirt/images/kvm4.img

    KVM虛擬化
    KVM虛擬化

  • 轉換磁盤的格式:

虛擬磁盤有raw和qcow2兩種格式,默認使用的是raw,raw性能好,速度快,缺點是不支持一些功能,例如:製做快照,壓縮,加密等。下面給你們介紹qcow2格式的使用,這種格式用的比較多,功能多。

# qemu-img info /var/lib/libvirt/images/kvm3.img  查看KVM3鏡像的磁盤格式爲raw

KVM虛擬化

# virsh shutdown kvm3
    #  qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/kvm3.img  /var/lib/libvirt/images/kvm3.qcow2  將raw轉換成qcow2格式

進行格式的轉換

# virsh edit kvm3  編輯配置文件將raw修改爲爲qcow2,把配置文件的路徑也修改一下

修改前:
KVM虛擬化

修改後:
KVM虛擬化

  • 虛擬機快照(raw格式不支持)

    Snapshot (help keyword 'snapshot')
        snapshot-create                Create a snapshot from XML
        snapshot-create-as             Create a snapshot from a set of args
        snapshot-current               Get or set the current snapshot
        snapshot-delete                Delete a domain snapshot
        snapshot-dumpxml               Dump XML for a domain snapshot
        snapshot-edit                  edit XML for a snapshot
        snapshot-info                  snapshot information
        snapshot-list                  List snapshots for a domain
        snapshot-parent                Get the name of the parent of a snapshot
        snapshot-revert                Revert a domain to a snapshot
    
        # virsh snapshot-create kvm3  建立快照
        # virsh snapshot-list kvm3      查看快照

    KVM虛擬化

    # virsh snapshot-revert  kvm3 1525428646 恢復快照
        # virsh snapshot-delete kvm3 1525428646  刪除快照

    KVM虛擬化

  • 使用libguestfs-tools工具:

安裝:# yum -y install libguestfs-tools

virt-df     顯示虛擬機磁盤的空間,相似於物理機的df命令
    virt-cat    讀取虛擬機的文件,同cat
    virt-ls 列出文件或者目錄
    virt-copy-out   複製文件從虛擬機複製到本地物理機
    virt-copy-in    複製文件從本地物理機複製到虛擬機

6、虛擬機的優化:

  • 綁定虛擬機的CPU

查看虛擬CPU和物理CPU的對應關係:

# virsh vcpuinfo 2

查看虛擬機可使用哪些物理邏輯CPU

Virsh # emulatorpin 2

在線綁定虛擬機的CPU和物理的CPU

Virsh emulatorpin 2 1-4 –live
Virsh emulatorpin 2   #查看綁定是否生效

也能夠經過vrish vcpuinfo n 查看綁定信息
也能夠經過virsh # dumpxml n 查看cpuset的綁定信息

  • 強制VCPU和物理CPU一對一綁定

    # virsh vcpupin 3 0 0
        # virsh vcpupin 3 0 1
        # virsh vcpupin 3 0 2
        virsh # dumpxml 0
  • 使用半虛擬化網卡(Virtio)技術提升虛擬機的網絡性能

    # grep -i virtio /boot/config-2.6.32-642.el6.x86_64 (查看是否支持virtio技術)

配置使用半虛擬化網卡:

# virsh edit kvm1
  • 磁盤虛擬化:

1) 使用Virtio半虛擬技術來代替IDE虛擬磁盤
2) 緩存模式技術:
a) 比較安全的模式:writethrought,none,directsync,可靠性要求很是高使用writethough或者directsync模式
b) wirteback模式:虛擬機必須依靠刷盤命令來保持數據的一致性。
c) Unsafe模式是最不安全的。

7、KVM的性能和侷限性:

1.性能特性支持

1)內存管理

KVM從Linux繼承了強大的內存管理功能,一個虛擬機的內存與任何其餘Linux進程的內存同樣進行存儲,能夠以大頁面的形式進行交換以實現更高的性能,
KVM支持最新的基於硬件的內存虛擬化功能,支持使用Intel EPT或AMD RVI技術來完成內存地址映射,GVAàHPA,以實現更低的CPU利用率和更高的吞吐量。
支持KSM(Kernel Same-page Merging,相同內存頁合併),好比在KVM上同時運行多個Linux相同版本的主機,它們都會載入一些相同的動態庫,因爲是隻讀的,因此能夠進行合併。KSM經過掃描每一個虛擬機的內存,查找個虛擬機間相同的內存頁,並將這些內存頁合併成一個各相關虛擬機可以共享的獨立內存頁面,從而實現了內存頁面共享。節約內存使用,使得咱們的KVM能夠過載使用內存,虛擬機內存分配能夠大於物理機內存。若是這些合併頁中有某個虛擬機須要修改,那麼此時KVM就會進行copy on write機制給它從新生成一個副本,它只能修改本身的而不能修改共享的。
2)硬件支持

因爲KVM出現的較晚,充分利用了先進技術,因此KVM運行的物理機必需要支持硬件輔助虛擬化且只能是X64架構。
因爲KVM是寄宿在Linux內核之上,因此支持的硬件取決於Linux內核支持的硬件。
3)存儲

KVM能夠支持任何Linux內核支持的存儲設備,如:
本地存儲:IDE、SCSI、SAN、SATA、SAS、PCI-E等。
網絡附加存儲:NAS、SAMBA等
存儲區域網絡:SAN,ISCSI。
分佈式存儲:GlustFS
KVM的原生磁盤格式爲QCOW2,它支持快照,容許多級快照、壓縮和加密。
4)實時遷移

各個Hypervisor利用共享存儲實現實時虛擬機遷移,而且虛擬機運行的服務無中斷。可是KVM實現實時遷移有一些前提條件,如:
a.鏡像文件必須放在共享存儲。
b.共享存儲還必須放在同一個位置,不然配置文件會找不到。
c.各個Hypervisor必需要兼容。
d.CPU必須擁有相同特性,最好同款CPU。
e.兩臺Hypervisor的時間必需要一致。
f.兩臺Hypervisor必須有同樣的網絡配置。
5)支持的Guest OS

像XEN那種半虛擬化,因爲要修改系統內核才能運行,因此不是每一個系統都支持,好比Windows系統。但KVM屬於全虛擬化技術,因此支持大多數系統,如:Linux、Windows、OpenBSD、FreeBSD、OpenSolaris等。另外,運行在KVM上的Windows還經過了微軟的虛擬化認證,也就是說,若是你在KVM上面運行正版Windows系統,若是出現異常,微軟官方是認可可提供技術支持的。固然這也是紅帽跟微軟的勾當而已。
6)設備驅動

Linux內核支持的驅動,KVM都支持。另外,KVM是一個混合類型的VMM,由於KVM可以以模擬(QEMU)的方式支持徹底虛擬機,又可以支持在Guest OS中安裝驅動實現IO的半虛擬化,也就是兩階段IO,前半部分IO在Guest OS上,後半部分在宿主機上。
如今在KVM中經常使用的IO半虛擬化組件叫virtio,由IBM和RedHat聯合研發,是一個比較通用的半虛擬化IO組件。目前,基於virtio有virtio-blk支持塊存儲半虛擬化、virtio-net支持網絡半虛擬化、virtio-pci支持pci設備虛擬化、virtio-console支持控制檯的虛擬化、virtio-ballon支持動態內存的擴展和收縮。而virtio在Linux 2.6.25內核已經收錄,只要編譯內核時選擇了virtio模塊就能夠,可是若是是微軟的系統那麼還須要去RedHat官方下載對應的virtio程序才能夠支持。
7)性能和可伸縮性

KVM也繼承了Linux的性能和可伸縮性。KVM虛擬化性能在不少方面(如計算能力、網絡帶寬等)已經能夠達到非虛擬化原生環境的95%以上的性能。KVM的擴展性也很是良好,客戶機和宿主機均可以支持很是多的CPU數量和很是大量的內存。例如,Redhat官方文檔就介紹過,RHEL 6.x系統中的一個KVM客戶機能夠支持160個虛擬CPU和多達2TB的內存,KVM宿主機支持4096個CPU核心和多達64TB的內存。

2. KVM的侷限性:

1). CPU過載使用

KVM容許過載使用CPU,可是過載能力有限,過載使用不但不會提高性能反而會下降性能。通常全部虛擬CPU數量加在一塊兒不要大於物理CPU核心數,一旦超過物理CPU數量依然須要調度。
2). 虛擬化時間須要依賴外部時鐘才能實現精確計時

Linux系統有個特性,它有兩套時鐘,一套是硬件時鐘、另外一套是系統啓動時從硬件讀取的時間稱爲系統時間。當系統一旦啓動後,系統時間就開始本身記時了,根據CPU震盪頻率來計時,好比是一個2G赫茲的CPU,那麼系統就認爲1s中震盪2G個時鐘週期,它就認爲時間過1s,計時很是精確。可是很遺憾的是,一旦咱們作了虛擬化,就意味着這顆CPU未必就是供這一個虛擬機所使用的,好比2G赫茲的CPU,這個虛擬機只獲得了1G赫茲,那麼此虛擬化仍是以2G赫茲爲1s計時,就會比正常時間整整慢一半。因此任何虛擬機的時鐘都不會精確,包括vmware workstations(vmware提供的vmware tools工具就是實現把虛擬機時間一直跟系統時間同步),通常全部虛擬化都須要提供一個時鐘服務器,一直同步這個比較精確的時間。
3). MAC地址

KVM的MAC地址分配機制跟vmare同樣,前24位固定,後24後隨機。當虛擬機量特別大時,可能會出現MAC地址衝突。
4). 性能影響

對於CPU MMU來說,在徹底虛擬化模式下,性能大概有10%的損耗;若是支持EPT技術以及硬件輔助虛擬化技術,性能損耗大概在5%左右。
對於網絡IO在徹底虛擬化模式下,只至關於物理硬件性能的60%左右;半虛擬化模式下75%;透傳模式下95%。
對於磁盤IO若是使用模擬的方式,只至關於物理硬件性能的40%左右;若是使用半虛擬化性能在85%左右,因此磁盤IO是最須要半虛擬化的;若是是透傳大概在95%左右。
對於顯卡設備模擬,至關於物理硬件設備的50%左右;而後半虛擬化是不支持的。
對於時間計時在徹底虛擬化模式下,是不可能精確;在半虛擬化模式下,能夠作到精確,由於它有一個特殊模塊來完成計時輔助。

參考文獻:
http://www.ywnds.com/?p=5842
http://www.javashuo.com/article/p-phrxvkge-cw.html

相關文章
相關標籤/搜索