虛擬化四、KVM虛擬化技術

kflj88發表於2019-03-30

一、KVM概述

1、KVM

     Kernel-based Virtual Machine 基於核心的虛擬機器

     以色列Qumranet公司研發,是核心的一個模組

     2006年研發,2008被RedHat收購了

     依賴於HVM技術:Intel VT-X,AMD AMD-V

2、KVM模組載入後的系統執行模式

核心模式:GuestOS執行I/O類操作,或其它的特殊指令的操作  

使用者模式:代表GuestOS代為請求I/O類操作,

來賓(guest)模式:GuestOS的非I/O類操作,事實上,它被稱作虛擬機器的使用者模式

3、KVM的元件

兩類元件:

      /dev/kvm:工作於hypervisor,在使用者空間可透過ioctl()系統呼叫來完成VM建立,啟動等管理功能,它是一個字元裝置,

                     功能:建立VM,為VM分配記憶體,讀寫VCPU的暫存器,向CPU注入中斷,執行VCPU等

    qemu程式:工作於使用者空間,主要用於實現模擬PC機的I/O裝置

4、KVM特性

1)記憶體管理

          將分配給VM的記憶體交換至SWAP

          支援使用Huge Page(大記憶體頁);

          支援使用Intel EPT或AMD RVI技術完成記憶體地址對映:GVA-->GPA-->HPA簡化為GVA-->HPA

          支援KSM (Kernel Same-page Merging)

                   這個核心特性實現了記憶體頁面共享。KSM透過掃描每個虛擬機器的記憶體查詢各虛擬機器間相同的記憶體頁,並將這些記憶體頁合併為一個被各相關虛擬機器共享的單獨頁面。在某虛擬機器試圖修改此頁面中的資料時,KSM會重新為其提供一個新的頁面副本。實踐中,執行於同一臺物理主機上的具有相同GuestOS的虛擬機器之間出現相同記憶體頁面的機率是很的,比如共享庫、核心或其它記憶體物件等都有可能表現為相同的記憶體頁,因此,KSM技術可以降低記憶體佔用進而提高整體效能。

2)硬體支援

   取決於Linux核心;

3)儲存:

本地儲存:

網路附加儲存:

儲存區域網路:

分散式儲存:例如GlustFS

4)實時遷移:

支援的GuestOS:

       Linux, Windows, OpenBSD, FreeBSD, OpenSolaris; 

5)裝置驅動:

IO裝置的完全虛擬化:模擬硬體

IO裝置的半虛擬化:在GuestOS中安裝驅動;virtio

               virtio-blk, virtio-net, virtio-pci, virtio-console, virtio-ballon


5、KVM侷限性

一般侷限性:

CPU overcommit

時間記錄難以精確,依賴於時間同步機制

MAC地址:

VM量特別大時,存在衝突的可能性;

實時遷移:

效能侷限性:


6、KVM的工具棧介紹

分為2大類:

qemu:

       qemu-kvm

       qemu-img

libvirt

       GUI: virt-manager, virt-viewer

       CLI: virt-install, virsh


QEMU主要提供了以下幾個部分:

        處理器模擬器

        模擬IO裝置

       關聯模擬的裝置至真實裝置;

       偵錯程式

      與模擬器互動的使用者介面


補充資料:

VMM:對IO的驅動有三種模式:

自主VMM:VMM自行提供驅動和控制檯;

混合VMM:藉助於OS提供驅動;

                   依賴於外部OS實現特權域

                    自我提供特權域

寄宿式VMM:


二、KVM安裝

1、安裝kvm

1) 確保CPU支援HVM

# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo

2) 裝載模組

[root@BAIYU_180 ~]# lsmodModule                  Size  Used by
ppdev                   8537  0 
vmware_balloon          7199  0 
parport_pc             22690  0 
parport                36209  2 ppdev,parport_pc
microcode             112685  0 
snd_ens1371            21587  0 
snd_rawmidi            23017  1 snd_ens1371

# modprobe kvm

# modprobe kvm-intel

[root@BAIYU_173 kvm]# lsmodModule                  Size  Used by
nls_utf8                1455  1 
ipv6                  335589  142 
vhost_net              29185  0 
macvtap                10551  1 vhost_net
macvlan                10324  1 macvtap
tun                    16934  1 vhost_net
kvm_intel              55624  0 
kvm                   341551  1 kvm_intel
ppdev                   8217  0 
parport_pc             22658  0 
parport                36209  2 ppdev,parport_pc

3) 驗正:

/dev/kvm


三、kvm管理工具棧使用

# yum grouplist | grep -i "virtualization"    #檢視和虛擬化相關的所有包組
   Virtualization:
                 qemu-kvm
   Virtualization Client:
                  python-virtinst, virt-manager, virt-viewer
   Virtualization Platform:
                  libvirt, libvirt-client
   Virtualization Tools   #可以不用
                   libguestfs

1、使用qemu-kvm管理工具

      基於libvirt的工具如virt-manager和virt-install提供了非常便捷的虛擬機器管理介面,但它們事實上上經二次開發後又封裝了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能夠完成此前的任務。

    在RHEL6上,qemu-kvm位於/usr/libexec目錄中。由於此目錄不屬於PATH環境變數,故無法直接使用,這樣也阻止了可以直接使用qemu作為建立並管理虛擬機器。如若想使用qemu虛擬機器,可以透過將/usr/libexec/qemu-kvm連結為/usr/bin/qemu實現。

1) 安裝 qemu-kvm

#yum install qemu-kvm

# ln  -sv  /usr/libexec/qemu-kvm  /usr/bin/qemu-kvm

[root@BAIYU_173 ~]# yum install qemu-kvmDependencies Resolved========================================================================================================
 Package                          Arch           Version                          Repository       Size========================================================================================================Installing:
 qemu-kvm                         x86_64         2:0.12.1.2-2.491.el6_8.1         updates         1.6 M
Installing for dependencies:
 celt051                          x86_64         0.5.1.3-0.el6                    base             50 k
 glusterfs                        x86_64         3.7.5-19.el6                     base            392 k
 glusterfs-api                    x86_64         3.7.5-19.el6                     base             56 k
 glusterfs-client-xlators         x86_64         3.7.5-19.el6                     base            942 k
 glusterfs-libs                   x86_64         3.7.5-19.el6                     base            303 k
 gpxe-roms-qemu                   noarch         0.9.7-6.15.el6                   base            220 k
 qemu-img                         x86_64         2:0.12.1.2-2.491.el6_8.1         updates         837 k
 seabios                          x86_64         0.6.1.2-30.el6                   base             93 k
 sgabios-bin                      noarch         0-0.3.20110621svn.el6            base            6.6 k
 spice-server                     x86_64         0.12.4-13.el6.1                  updates         346 k
 usbredir                         x86_64         0.5.1-3.el6                      base             41 k
 vgabios                          noarch         0.6b-3.7.el6                     base             42 k
Transaction Summary========================================================================================================Install      13 Package(s)[root@BAIYU_173 ~]# rpm -ql qemu-kvm/etc/ksmtuned.conf
/etc/modprobe.d/blacklist-kvm.conf
/etc/rc.d/init.d/ksm
/etc/rc.d/init.d/ksmtuned
/etc/sasl2/qemu-kvm.conf
/etc/sysconfig/ksm
/etc/sysconfig/modules/kvm.modules
/etc/udev/rules.d/80-kvm.rules
/usr/libexec/qemu-kvm
/usr/sbin/ksmtuned
/usr/share/doc/qemu-kvm-0.12.1.2/COPYING

2)qemu-kvm的使用

qemu-kvm命令使用格式為:

    “qemu-kvm  [options]  [disk_p_w_picpath]”

其選項非常多,不過,大致可分為如下幾類。

命令選項:

       標準選項:

       顯示選項:

       i386平臺專用選項

       字元裝置選項

       藍芽裝置選項

       Linux啟動專用選項

       除錯/專家模式選項


cirros project:為cloud環境測試vm提供的微縮版Linux的磁碟映像檔案

                        官網下載地址:

建立並啟動虛擬機器:

qemu-kvm -m 128 -smp 2 -name test -hda /p_w_picpaths/kvm/cirros-0.3.4-i386.disk.img


用-drive指定磁碟映像檔案:

qemu-kvm -m 128 -name test -smp 2 -drive file=/p_w_picpaths/kvm/cirros-0.3.4-i386-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2


[root@BAIYU_173 ~]# cd /p_w_picpaths/kvm/[root@BAIYU_173 kvm]# lscirros-0.3.4-x86_64-disk.img[root@BAIYU_173 kvm]# qemu-kvm -m 128 -smp 2 -name test -hda /p_w_picpaths/kvm/cirros-0.3.4-x86_64-disk.img VNC server running on `::1:5900'    #這裡啟動了VNC server可以檢視到:[root@BAIYU_173 ~]# netstat -nlptu|grep 5900tcp        0      0 ::1:5900                    :::*                        LISTEN      3191/qemu-kvm       
[root@BAIYU_173 ~]# ps aux|grep qemu-kvmroot      3191 15.0  8.1 492796 82944 pts/3    Sl+  22:39   0:14 qemu-kvm -m 128 -smp 2 -name test -hda /p_w_picpaths/kvm/cirros-0.3.4-x86_64-disk.img
root      3242  0.0  0.0 103324   860 pts/0    S+   22:41   0:00 grep qemu-kvm[root@BAIYU_73 ~]# yum install tigervnc   #安裝vnc客戶端[root@BAIYU_173 ~]# rpm -ql tigervnc/usr/bin/vncviewer
/usr/share/applications/vncviewer.desktop
/usr/share/doc/tigervnc-1.1.0[root@BAIYU_173 ~]# vncviewer localhost  #連上看看

 

按ctrl+alt+2可以跳轉到控制頁面,可以檢視虛擬機器的資訊,再按ctrl+alt+1可以跳轉回來


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

我們用-drive選項來重新建立虛擬機器:                     

[root@BAIYU_173 kvm]# qemu-img info cirros-0.3.4-x86_64-disk.img  #檢視磁碟映像檔案的格式p_w_picpath: cirros-0.3.4-x86_64-disk.imgfile format: qcow2
virtual size: 39M (41126400 bytes)disk size: 14M
cluster_size: 65536


透過cdrom啟動win7的安裝

qemu-kvm -name winxp -smp 4,sockets=1,cores=2,threads=2 -m 512 -drive file=/p_w_picpaths/kvm/winxp.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom


(1)準備磁碟映像檔案

[root@BAIYU_173 ~]# qemu-img create -f qcow2 -o size=60G /p_w_picpaths/kvm/win7.imgFormatting '/p_w_picpaths/kvm/win7.img', fmt=qcow2 size=64424509440 encryption=off cluster_size=65536

(2)上傳win7的安裝檔案

(3)建立並啟動win7

[root@BAIYU_173 kvm]#  qemu-kvm -name win7 -smp 2 -m 1024 -drive file=/p_w_picpaths/kvm/win7.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso,media=cdrom -boot order=dc,once=d

  

qemu-kvm的顯示選項:

   顯示選項用於定義虛擬機器啟動後的顯示介面相關型別及屬性等。

-nographic:預設情況下,qemu使用SDL來顯示VGA輸出;而此選項用於禁止圖形介面,此時,

qemu類似一個簡單的命令列程式,其模擬串列埠裝置將被重定向到控制檯

此時可以使用的命令:

C-a h    print this helpC-a x    exit emulator
C-a s    save disk data back to file (if -snapshot)C-a t    toggle console timestamps
C-a b    send break (magic sysrq)C-a c    switch between console and monitor
C-a C-a  sends C-a


SDL: Simple DirectMedia Layer:簡單直接介質層   C語言開發,跨平臺且開源多媒體程式庫檔案;

在qemu中使用“-sdl”即可;  #centos預設不支援

VNC: Virtual Network Computing:虛擬網路計算   使用RFB(Remote FrameBuffer遠端幀緩衝)協議遠端控制另外的主機;

CentOS 6.6啟用vnc

    (1) yum install tigervnc-server

    (2) vncpasswd

    (3) vncserver :N   #啟動某一桌面


qemu-kvm

-vnc display(地址+某個桌面),option,option


示例:-vnc :N[,password]

                      啟動qemu-kvm時,額外使用-monitor stdio選項,並使用

                       QEMU模式下使用change vnc password命令設定密碼;


qemu-kvm的 網路屬性相關選項

    網路屬性相關選項用於定義網路裝置介面型別及其相關的各屬性等資訊。

這裡只介紹nic、tap和user三種型別網路介面的屬性,其它型別請參照qemu-kvm手冊。

-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:

建立一個新的網路卡裝置並連線至vlan n中 ;PC架構上預設的NIC為e1000,macaddr用於為其指定MAC地址, name用於指定一個在監控時顯示的網上裝置名稱 ;emu可以模擬多個型別的網路卡裝置,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不過,不同平臺架構上,其支援的型別可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”來獲取當前平臺支援的型別;

-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:

透過物理機的TAP網路介面連線至vlan n中 ,使用script=file指定的指令碼(預設為/etc/qemu-ifup)來配置當前網路介面,ifname用於指定網路卡名稱,並使用downscript=file指定的指令碼(預設為/etc/qemu-ifdown)來撤消介面配置;使用script=no和downscript=no可分別用來禁止執行指令碼;

如果建立虛擬機器時沒有指定-net選項也會預設建立一個-net user型別的網路卡

-net user[,option][,option][,...]:在使用者模式配置網路棧,其不依賴於管理許可權;

有效選項有:

vlan=n:連線至vlan n,預設n=0;

name=name:指定介面的顯示名稱,常用於監控模式中;

net=addr[/mask]:設定GuestOS可見的IP網路,掩碼可選,預設為10.0.2.0/8;

host=addr:指定GuestOS中看到的物理機的IP地址,預設為指定網路中的第二個,即x.x.x.2;

dhcpstart=addr:指定DHCP服務地址池中16個地址的起始IP,預設為第16個至第31個,即x.x.x.16-x.x.x.31;

dns=addr:指定GuestOS可見的dns伺服器地址;預設為GuestOS網路中的第三個地址,即x.x.x.3;

tftp=dir:啟用內建的tftp伺服器,並使用指定的dir作為tftp伺服器的預設根目錄;

bootfile=file:BOOTP檔名稱,用於實現網路引導GuestOS;如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0


qemu-ifup和qemu-ifdown指令碼:

# cat /etc/qemu-ifup #!/bin/bash#bridge=br0       #bro要事先建立好if [ -n "$1" ]; thenip link set $1 upsleep 1
brctl addif $bridge $1[ $? -eq 0 ] && exit 0 || exit 1elseecho "Error: no interface specified."  #執行時後面接網路卡介面exit 1fi

# cat /etc/qemu-ifdown #!/bin/bash#bridge=br0if [ -n "$1" ];thenbrctl delif $bridge $1ip link set $1 downexit 0else
	echo "Error: no interface specified."   #執行時後面接網路卡介面exit 1fi


指定使用橋接網路介面:

     qemu-kvm -m 128 -name test -smp 2 -drive file=/p_w_picpaths/kvm/cirros-0.3.4-i386-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic -net tap,script=/etc/if-up,downscript=no -nographic


四、總結一下這篇博文的內容

1、kvm組成部分:

/dev/kvm

qemu


2、安裝KVM需要裝載的模組:

modprobe kvm

modprobe kvm-intel|kvm-amd


3、KVM工具棧:

qemu-kvm, /usr/libexec

libvirt:

GUI: virt-manager

CLI: virt-install, virsh


qemu-kvm

-name 'NAME'

-m megs

-cpu ?

-smp n[,sockets=N][,cores=N][,threads=N][,maxcpus=N]

-hda|-hdb|-hdc|-hdd

-cdrom

-drive 

file=, media=, if=, cache=, format=, index=, readonly  #只讀方式開啟,後面不用接引數

-boot [order=drives][,once=drives][,menu=on|off]

-sdl

-vnc :0,password

-nographic

-monitor stdio       # 不開啟視窗, 在本地顯示監視器的畫面,

-usbdevice tablet    #解決虛擬機器中滑鼠不同步問題


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31516067/viewspace-2639825/,如需轉載,請註明出處,否則將追究法律責任。

相關文章