KVM及KVM-Virtio

KVMhtml

  Kernel-based Virtual Machine,基於內核的虛擬機linux

  KVM是做爲內核模塊嵌入進Linux內核的它不會像Xen那樣剝奪KernelCPU以及內存的管理權因此Kernel尤爲鍾愛KVM編程

  KVM被做爲模塊加載進內核之後內核儼然就搖身一變成爲了Hypervisor,其管理方式是將運來的用戶空間做爲控制檯用其對KVM進行管理。包括建立、銷燬、保存、遷移、配置虛擬機;每一個新建立的額虛擬機做爲一個進程運行在用戶空間,其所擁有的虛擬CPU或虛擬內存則被抽象成爲線程,若是咱們想關閉一個虛擬機,則直接kill其對應的進行便可;當建立的虛擬機要執行某些特定(能夠理解成普通的主機中,在陷入內核模式時所執行的命令,好比執行寫操做的時候)的操做時,要經過內核中的KVM模塊才能被調度執行(虛擬機會調用本身的內核空間,而後這個虛擬機內核空間在向宿主機內核中的KVM模塊發起調用)。若是執行的另一些命令(好比作一個簡單的加法操做)不須要上面的特權指令的話,其所在的用戶空間就能夠將其直接交給CPU運行,不須要通過內核中的KVM模塊調度;centos

  KVM極其依賴HVM(硬件輔助的虛擬化),也便是說:若是你電腦的CPU不支持VTIntel-VT-xAMD-V)技術的話,是沒法使用建立KVM虛擬機的,固然,如今的絕大多數CPU都已經支持VT功能了;緩存

  KVM使用一個設備文件/dev/kvm做爲整個KVM的調用接口/dev/kvm是一個字符設備,工做於Hypervisor(內核空間),在用戶空間可經過ioctl()系統調用來完成虛擬機的建立啓動等管理功能(好比建立VM、爲VM分配內存、讀寫VCPU的寄存器、向VCPU注入中斷、運行VCPU等);也就是說若是你編程能力好的話徹底能夠經過調用這個文件來自行管理KVM,直接與內核中KVM交互網絡

  KVM虛擬化是創建在操做系統之上的Xen是直接將Hypervisor創建在硬件上;當咱們建立一個KVM虛擬機以後,會在原來的操做系統之上又創建一個操做系統,這樣就會致使在運來的用戶空間有創建一個內核空間和用戶空間。爲了區分它們,咱們將給他們事先定義一下:架構

    宿主機直接運行在物理機器上的操做系統也就是加載KVM模塊的操做系統框架

    Guest主機經過KVM建立出來的虛擬機;其包含本身的Guest用戶空間和Guest內核空間;dom

    內核模式宿主機的內核空間; ssh

    用戶模式宿主機的用戶空間;通常用於表明Guest OS請求IO類操做

  KVM虛擬化的IO使用方式

    由於KVM只是一個模塊因此它根本就沒有提供有關IO調用的方法所以KVM藉助了QEMU經過它來使用IO設備

    當KVM虛擬機的用戶空間要進行IO操做時首先會將請求發送給本身的內核而後Guest內核再向宿主機的用戶空間QEMU程序發送請求,讓其爲本身進行進一步的操做,最後宿主機用戶空間的QEMU再對真正的內核進行請求進而執行IO操做

  KVM的兩類組件

    /dev/kvm:上面已經提到了

    qemu:工做於用戶空間主要用於實現模擬PC機的IO設備;

  KVM的特性

    內存管理

      支持將分配給VM的內存交換至SWAP

      支持使用Huge Page(大內存頁)機制;

      支持使用Intel EPTAMD RVI技術完成內存地址映射;

      支持KSMKernel Same-Page Merging);

        將多個MV加載的相同的內存頁(好比相同的庫文件)合併成一個,從而減小內存的佔用;相似於共享內存功能;當某虛擬機要修改本身的內存頁時,會經過寫時複製爲其建立一個副本,供其修改;

    硬件管理

      取決於該Linux內核

    存儲

      支持本地存儲

      支持網絡附加存儲

      支持存儲區域網絡

      支持分佈式存儲GlustFS

    遷移

      跨物理主機遷移可分爲熱遷移和冷遷移

      冷遷移:線下遷移,關機遷移服務中斷

      熱遷移線上遷移服務不中斷在虛擬機運行過程當中將其內存中的數據複製(複製時虛擬機會暫停)一份到另外一臺物理主機上且掛載其位於共享存儲中的磁盤映像文件從而實現實時遷移,而後原先的虛擬機就能夠關掉了

    設備驅動

      支持IO設備的徹底虛擬化模擬硬件

      支持IO設備的半虛擬化Guest OS中安裝驅動,相似於front-endGuest OS提供|backed-endKernel提供)機制;

        經常使用組件爲virtio,其支持塊設備(virtio-blk)的半虛擬化、網絡設備(virtio-net)的半虛擬化、PCI設備(virtio-pci)的半虛擬化、控制檯設備(virtio-console)的半虛擬化、內存空間動態擴展機制(virtio-ballon)的半虛擬化;

  KVM的侷限性

    過載使用CPU時會致使性能降低因此通常不建議虛擬CPU的數量(物理機上的全部VCPU數量)大於物理CPU的數量(此處的數量指的是核心數);

    時鐘不精確這幾乎時全部虛擬機的弊病其依賴於時間同步機制(好比NTP);

    MAC地址可能衝突(虛擬機數量特別多的時候才能遇到的問題);

  KVM的工具棧

    QEMU組件

 

      主要提供了一下功能

        處理器模擬器,用於完成異構;

        仿真IO設備

        管理模擬的設備至真實設備

        調試器

        與模擬器交互的用戶接口

      工具

        qemu-io

        qemu-img

        qemu-kvm:專門用於管理KVM的工具

       libvirt工具棧:支持遠程管理,須要在被管理主機上運行libvirtd服務;

        virsh、virt-install:字符命令行管理工具

        virt-manager、virt-viewer:圖形化的管理工具

    建立第一個KVM虛擬機

      開啓VMware的虛擬化引擎VMware中的虛擬機支持HVM

 

        ~]# grep -E "(vmx|svm)" /proc/cpuinfo   查看主機是否支持虛擬化

 

      裝載KVM模塊

        ~]# modprobe kvm

        ~]# modprobe kvm-intel    這兩個模塊通常都是自動裝載完畢的只要加載了這兩個模塊此時的Kernel儼然就成爲一個Hypervisor;能夠查看一下在/dev目錄下是否有kvm文件

      安裝qemu-kvm工具

        ~]# yum install qemu-kvm    默認安裝之後qemu-kvm命令是不在PATH路徑中的

        ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/    qemu-kvm建立一個連接

      格式:qemu-kvm [options] [disk_image]

        Standard options:

          -name:設置虛擬機的名稱

          -machine:指定要模擬的主機的類型

          -m:指定虛擬機的RAM大小

          -cpu:指定CPU類型

            能夠經過 ~]# qemu-kvm -cpu ? 查看支持的CPU類型

          -smp:設定虛擬的SMP架構中的CPU個數

          -numa:指定模擬多節點的numa設備

            這種模型會給每一個CPU分配器一段其專用的內存而且它們還具備一塊共有內存這樣能夠防止多CPU之間的內存佔用問題而且能夠經過將某個進程綁定到某一CPU提升緩存命中率

          -boot options:用於定義設備的引導次序

            options:

              order=指定引導設備的介質類型可用取值爲:floppy (a), hard disk (c), CD-ROM (d), network (n);默認爲c

              once=:指定某引導設備只是用一次,通常是安裝系統時只須要指定一次的介質;

例子-boot order=dc,once=d   表示使用光驅和硬盤引導系統第一次優先使用光驅引導

          Block device options:

            -hda/-hdb file:use 'file' as IDE hard disk 0/1 image

            -hdc/-hdd file:use 'file' as IDE hard disk 2/3 image

            -cdrom file:use 'file' as IDE cdrom image

              Note-cdrom-hdc不可同時使用

            -drive options:use 'file' as a drive image,用於取代上面的-hd#

              options:選項之間使用逗號隔開;

                file=指定磁盤映像文件的路徑

                if=指定磁盤設備所鏈接的接口類型即控制器類型好比IDESCSISDMTDvirtio

                index=:設定同一種控制器類型中不一樣設備的索引號,即標識號;好比sda一、sda2;

                media=定義介質類型爲硬盤(disk)仍是光盤(cdrom);

                snapshot=指定當前硬盤設備是夠支持快照功能

                cache=:指定如何使用物理機硬盤緩存來訪問數據;可用取值:writethrough(通寫)|writeback(回寫)|none(不啓用)|directsync|unsafe

                format=指定映像文件的格式具體可參見qemu-img命令

                  Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

          Network options:

            用於定義網絡設備接口類型以及其相關的各類屬性等信息

            -net nic[,options]:爲虛擬機配置網卡信息

              options:

                vlan=指定網卡屬於哪一個vlan

                macaddr=:指定網卡的MAC地址;

                model=指定網卡類型能夠經過~]# qemu-kvm -net nic,model=?來查看支持的類型

                name=:指定網卡名稱,通常用於monitor中;

                addr=:指定網卡的IP地址,通常經過DHCP分配:

               -net tap[options]:在宿主機內核上配置與虛擬機相對應的網卡(二層設備)信息

                 options:

                   vlan=:指定網卡屬於哪一個vlan中;

                   ifname=:指定網卡名稱;

                   script=:使用指定的腳原本配置當前的網絡接口,默認爲:/etc/qemu-ifup,可是這個腳本默認是沒有的須要本身寫若是是測試的話能夠指定script=no;

 

                   downscript=:使用指定的腳本撤銷當前的網絡接口,默認爲:/etc/qemu-ifdown;

 

                 -net user[,options]:用於配置用戶空間的網絡功能的

                   例子:~]# qemu-kvm -m 128 -cpu host -smp 2 -name "test" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic, macaddr=52:54:00:11:22:33 -net tap,ifname=vif0.0

                Display options:

                  -sdl:跨平臺且開源的多媒體程序庫文件;

                  -spice:啓用spice遠程桌面協議

                  -vnc display options:啓用vnc功能,指定qemu監聽在VNC的某一接口上

                    display格式

                      1.host:Num

                        這裏的Num是以5900爲基礎一次遞增的

                        例子192.168.80.134:0192.168.80.137:1,其中冒號後面的0|1表示桌面號

                      2.unix/path/to/socket_file   僅用於本機

                      3.none  

                    options:

                      password:鏈接是須要驗證的密碼monitor接口上使用change設定密碼

 

                      reverse:反向鏈接至某處於監聽狀態的vncview

                  -vga [std|cirrus|vmware|qxl|xenfb|none]:指定要仿真的VGA接口類型

                Debug/Expert options:

                  -monitor dev:表示在標準輸入輸出上顯示monitor界面

                    例子:~]#  qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-no_cloud-0.3.0-x86_64-disk.img  -vnc 192.168.80.134:0 -monitor stdio

                  -nographic:直接在控制檯上啓動命令接口

                    使用Ctrl + a --> c能夠在consolemonitor之間切換

              下載共有映像文件

                這個映像文件就是一個裝好的操做系統直接加載使用便可;我使用的是cirros-no_cloud-0.3.0-x86_64-disk.img;

 

              安裝VNC組件:須要安裝桌面環境(yum groups install "GNOME Desktop"-->reboot)

                ~]# yum install tigervnc.x86_64

              啓動虛擬機

                ~]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-no_cloud-0.3.0-x86_64-disk.img

                ~]# vncviewer :5900    使用VNC連接虛擬機此處的5900接口是虛擬機test所監聽的接口若是有第二個虛擬機則端口號會一次遞增爲5901;

 

                  Note:使用Ctrl + Alt + num能夠切換到其餘窗口

 

                Note:上圖中-drive的順序尤其重要,若是有-boot選項的話,關於isodrive要放在其後

 

KVM-Virtio及管理工具

  基礎框架

 

    Note:使用Virtio之後虛擬機中的驅動會顯示爲相應的Virtio設備(好比virtio_netvirtio_pci等);

  virsh、virt-manager、virt-install、libvirtd、libvirt

    其中libvirt是一個庫文件,能夠爲虛擬化管理提供各類接口;libvirtd是一個運行在各個支持虛擬化主機上的服務支持遠程管理虛擬機,相似客戶端代理,能夠執行管理端發來的命令;virsh是基於libvirt的虛擬機命令行管理工具,virt-manager是基於libvirt的虛擬機圖形管理工具,virt-install是用於建立虛擬機的工具;通常virt-install會與virsh配合使用;

    安裝及啓動服務

      ~]# yum install libvirt-client virt-manager libvirt-daemon virt-install qemu-kvm

 

      ~]# systemctl start libvirtd.service

      ~]# virt-manager

        圖形化界面相似Vmware!

        默認建立的虛擬機鏡像文件存儲位置:/var/lib/libvirt/images/

      相關命令

        virsh:選項特別多;

          ~]# virsh help

          ~]# virsh help interface

          ~]# virsh help iface-bridge

        根據XML文件建立

          create:建立並啓動虛擬機

          define:建立但不啓動虛擬機

        關閉domain:

          destory:強制關閉虛擬機

          shutdown:將虛擬機關機

          reboot:重啓虛擬機

        刪除虛擬機

          undefine:刪除虛擬機

        鏈接至console:

          console:鏈接虛擬機控制檯

        附加或拆除磁盤

          attach-disk:爲虛擬機附加一個磁盤

          detach-disk:拆除虛擬機上的磁盤

        附加或查出網卡接口

          attach-interface:爲虛擬機添加一個網卡接口

          detach-interface:拆除虛擬機上的網卡接口

        保存及恢復虛擬機狀態至磁盤文件

          save:保存虛擬機狀態至磁盤文件

          restore:恢復虛擬機狀態至磁盤文件

        virt-install:

          格式:virt-install [options]

            options:

              General Options:

                -n NAME:指定虛擬機名稱全局惟一

                -r MEMORY:指定虛擬機的內存大小默認單位爲MB;

                --vcpus [maxcpus=n][,cpuset=][,sockets=n][,cores=n][,threads=n]:指定虛擬機中vcpu的數量;

                  經過~]#  virt-install --vcpus help獲取更多參數信息

                --cpu CPU Module:指定CPU的模式及特性

              Installation Method Options:

                -c CDROM--cdrom=CDROM:使用光盤安裝

                -l LOCATION--location=LOCATION:指定安裝源的URL,支持FTPHTTP等;

                --pxe:基於PXE安裝

                --livecd:把光盤當作LiveCD;

                --os-type=DISTRO_TYPE:指定安裝的系統類型;好比linuxWindows等;

                --os-variant=DISTRO_VARIANT:指定要安裝的操做系統的distribution;好比centos六、redhat7

                  -x EXTRA--extra-args=EXTRA:根據--location指定的方式安裝Guest OS用於傳遞給內核額外選項;例如指定kickstart文件的位置,--extra-args "ks=http://192.168.80.128/Centos6_install.cfg"

                --boot =BOOTOPTS:指定安裝過程完成後的配置選項好比指定引導設備次序使用指定的而非安裝的kernel/initrd來引導系統啓動;

                  例子--boot cdrom,hd,network

                --boot kernel=KERNEL,initrd=INITRD,kernel_args="console=/dev/ttyS0"

              Device Options:

                --disk=DISKOPTS:指定存儲設備及其屬性

                  格式爲--disk /some/storage/path,opt1=val1,opt2=val2;

                  經常使用選項

                    device:設備類型cdromdisk默認爲disk;

                    bus:磁盤總線類型其值能夠爲ide、scsi、busvirtio

                    perms:訪問權限rw、rosh(共享的可讀寫)默認爲rw;

                    size:新建磁盤映像的大小,單位爲GB

                    cache:緩存模型其值有none、writeback、writethrough;

                    format:磁盤映像格式raw、qcow二、vmdk

                    sparse:指定磁盤映像使用稀疏格式即不當即分配指定大小的空間

                    --nodisks:不使用本地磁盤LiveCD模式中經常使用

                    -w NETWORK--network=NETWORK:將虛擬機連入宿主機的網絡中;

                      格式--network=NETWORK,opt1=val1,opt2=val2

                      options:

                           bridge=BRIDGE:鏈接至名爲"BRIDGE"的橋設備

                           network=NAME:鏈接至名爲"NAME"的網絡

                           model:指定Guest OS中看到的網絡設備型號e1000、virtio

                           mac:指定固定的MAC地址;不指定則使用隨機地址,可是對KVM來講前三段固定爲52:54:00;

                         --nonetworks:虛擬機不使用網絡模型

                         --graphics TYPE,opt1=val1,opt2=val2:指定圖形顯示相關的配置此選項不會配置任何顯示硬件而是指虛擬機啓動後對其進行訪問的接口

                          TYPE:指定顯示類型,好比VNCsdlspicenooe等,默認爲VNC

                          port:TYPEVNCspice爲其指定的監聽端口

                          listen:TYPEVNCspice爲其指定的監聽地址;默認爲127.0.0.1,能夠通/etc/libvirt/qemu.conf進行修改

                        --serial=CHAROPTS:附加一個串行設備到當前虛擬機

                        --serial pty:建立僞終端

                        --serial dev,path=HOSTPATH:附加主機設備至此虛擬機

                      Virtualization Platform Options:

                        -v--hvm:當虛擬機同時支持使用半虛擬化和徹底虛擬化時指定使用徹底虛擬化

                          -p--paravirt:指定使用半虛擬化

                          --virt-type:指定使用的Hypervisor類型好比kvm、xen、qemu

                      Miscellaneous Options:

                          --print-xml:不建立虛擬機僅打印XML配置文件的內容

                          --force:禁止進入交互模式須要回答yesno的默認回答爲yes

                          --dry-run:dry-run模式

                        例子:~]# virt-install --name centos6.1 --virt-type kvm --ram 512 --graphics vnc --cdrom /root/CentOS-6.10-x86_64-bin-DVD1.iso --disk path=/images/kvm/centos6.img,size=20

 

關於Virtio的不錯的文章:http://www.javashuo.com/article/p-rybncnll-eb.html

 

根據馬哥視頻作的學習筆記,若有錯誤歡迎指正;侵刪

相關文章
相關標籤/搜索