KVM詳解

虛擬化與KVM

    下載排好版的word文檔,點這裏php


一、虛擬化簡介

1)     系統虛擬化是將底層物理設備與上層操做系統、軟件分離的一 種去耦合技術,在一臺物理機器上邏輯的劃分出多臺機器。 html

2)     虛擬化的目標是實現IT資源利用效率和靈活性的最大化。在一臺物理主機上虛擬出多個虛擬計算機(虛擬機,Virtual Machine,VM),其上能同時運行多個獨立的操做系統,這些客戶操做系統(Guest OS)經過虛擬機管理器(Virtual Machine Monitor,VMM,也稱做Hypervisor)訪問實際的物理資源python

3)     KVM 全稱是 基於內核的虛擬機(Kernel-based Virtual Machine),它是Linux 的一個內核模塊,該內核模塊使得 Linux 變成了一個Hypervisorlinux

二、使用虛擬化的緣由

當公司的服務器愈來愈多,咱們須要充分利用資源,也須要統一運維管理,這時虛擬化能幫助咱們作不少事。總結以下:windows

1)       打破「一臺服務器對應一套應用」的模 式,將物理服務器進行整合,提高利用 率後端

2)       服務器和相關IT硬件更少,節省了機房空間,也減小了散熱和電力需求centos

3)       具有靈活數據備份和應用遷移機制,保障服務永不中斷api

4)       資源動態調配和模板化部署,應用系統快速上線,及時響應業務變化。緩存

image.png

三、虛擬化的分類

1)       全虛擬化(使用二進制翻譯的虛擬化,hypervisor將操做系統的指令翻譯並將結果緩存,供以後使用。而用戶級指令無需修改就運行,具備和物理機同樣的執行速度。客戶系統不知道本身在虛擬環境中服務器

2)       半虛擬化(半虛擬化指的是虛擬機系統和hypervisor經過交互來改善性能和效率,但須要修改客戶機操做系統。客戶系統知道本身在虛擬環境中。如Xen)

3)       硬件輔助的虛擬化(Intel虛擬化技術(VT-x)和AMD的AMD-V,經過硬件的輔助實現全虛擬化)

四、三種虛擬化的區別

4.1、cpu的ring

在介紹三種虛擬化的區別前,首先要明白cpu的ring級別。

Intel的CPU將特權級別分爲4個級別:RING0,RING1,RING2,RING3。

RING0級別最高,級別依次往降低。

操做系統(內核)的代碼運行在最高運行級別ring0上,可使用特權指令,控制中斷、修改頁表、訪問設備等等。

應用程序的代碼運行在最低運行級別上ring3上,不能作受控操做。若是要作,好比要訪問磁盤,寫文件,那就要經過執行系統調用(函數)。

執行系統調用的時候,CPU的運行級別會發生從ring3到ring0的切換,並跳轉到系統調用對應的內核代碼位置執行,這樣內核就爲你完成了設備訪問,完成以後再從ring0返回ring3。這個過程也稱做用戶態和內核態的切換。

那麼,虛擬化在這裏就遇到了一個難題,由於宿主操做系統是工做在ring0的,客戶操做系統就不能也在ring0了,可是它不知道這一點,之前執行什麼指令,如今仍是執行什麼指令,那確定不行啊,沒權限啊,玩不轉啊。因此這時候虛擬機管理程序(VMM)就要避免這件事情發生。

(VMM在ring0上,通常以驅動程序的形式體現,驅動程序都是工做在ring0上,不然驅動不了設備)

image.png

4.2、全虛擬化

1)       客戶操做系統執行特權指令時,會觸發異常(CPU機制,沒權限的指令,觸發異常)

2)       而後VMM捕獲這個異常,在異常裏面作翻譯,模擬。而且會緩存翻譯結果

3)       最後返回到客戶操做系統內,客戶操做系統認爲本身的特權指令工做正常,繼續運行。

全虛擬化中,雖然用戶級指令具備和物理機同樣的執行速度。但系統級指令整個過程下來,性能損耗很是的大。由於一條簡單的指令在宿主機上直接執行就好了,如今在gues os上卻要經過複雜的異常處理過程。

4.3、半虛擬化

半虛擬化的思想是:讓客戶操做系統知道本身是在虛擬機上跑的,工做在非ring0狀態,那麼它原先在物理機上執行的一些特權指令,就會修改爲其餘方式,這種方式是能夠和VMM約定好的

這就至關於,我經過修改代碼把操做系統移植到一種新的架構上來,就是定製化。因此像XEN這種半虛擬化技術,客戶機操做系統都是有一個專門的定製內核版本,和x8六、mips、arm這些內核版本等價。這樣以來,就不會有捕獲異常、翻譯、模擬的過程了,性能損耗很是低。這就是XEN這種半虛擬化架構的優點。這也是爲何XEN只支持虛擬化Linux,沒法虛擬化windows緣由,由於微軟不改代碼。

4.4、硬件輔助的虛擬化

因爲CPU廠商開始支持虛擬化了,因此出現了硬件輔助的虛擬化。拿X86 CPU來講,引入了Intel-VT 技術,支持Intel-VT 的CPU,有VMX root operation 和 VMX non-root operation兩種模式,兩種模式都支持Ring 0 ~ Ring 3 這 4 個運行級別。這下好了,VMM能夠運行在VMX root operation模式下,客戶OS運行在VMX non-root operation模式下。便是宿主機和虛機是運行在一樣硬件上的不一樣模式,也就說,在硬件這層作了些區分,這樣全虛擬化下,有些靠「捕獲異常-翻譯-模擬」的實現就不須要了。

4.5、參考文檔

全虛擬化和半虛擬化的區別 cpuring0 ring1又是什麼概念?  (http://www.cnblogs.com/xusongwei/archive/2012/07/30/2615592.html)

cpuring0ring1ring2ring3 (https://blog.csdn.net/jeason29/article/details/47338441)

 

五、宿主機和虛機對虛擬化的理解

1)       開啓了硬件輔助虛擬化後,虛擬化是經過在Guest機器和Host機器中間加一層Hypervisor實現的。

2)       Host機器看虛機像跑在本身上面的程序

3)       因爲Hypervisor幫助Guest訪問物理資源,Guest機器感受本身運行在真機上

4)       若是Host機器和Guest機器都跑相同的Linux,它們的Kernel都想運行在Ring 0。

六、虛擬化技術

虛擬化技術很常見的有VMWareVirtualBoxCitrix Xenkvm

6.1、桌面虛擬化

將本來在本地電腦安裝的桌面系統,統一在後端數據中心進行部署和管理; 用戶能夠經過任何設備,在任何地點,任什麼時候間訪問屬於本身的桌面系統環境。

6.2、服務器虛擬化

1)         全虛擬化(Full-Virtulization)

無需修改操做系統,VM ESXiLinux KVM

2)         半虛擬化(Para-Virtulization)

集成半虛擬化代碼,直接運行特權指令,性能接近物理機,須要修改操做系統, MS Hyper-V Ctrix XenIBM PowerVM

3)         操做系統層虛擬化

開發、測試環境,VM WorkstationVM Server

七、kvmQemuLibvirt的關係

7.1Hypervisor的分類

首先,hypervisor 能夠劃分爲兩大類:

1)            類型 1,這種 hypervisor 是直接運行在物理硬件之上的。例子是基於內核的虛擬機(KVM —— 它自己是一個基於操做系統的 hypervisor)。

2)            類型 2,這種 hypervisor 運行在另外一個操做系統中。類型 2 hypervisor 包括 QEMU WINE

7.2kvm,Qemu,Libvirt

先總結:

咱們平時在linux上用到的kvm,實際是Qemu-Kvm組成的HypervisorHypervisor是虛擬機管理器。虛機跑在Hypervisor虛擬出來的環境上。

Libvirt是個工具包。它能夠管理Hypervisor。它的virsh命令,調用了它的libvirtd進程。它的libvirtd進程又回去調用Hypervisor。最後由Hypervisor實現對虛機的調控

QEMU

Qemu 是純軟件實現的虛擬化模擬器,幾乎能夠模擬任何硬件設備,咱們最熟悉的就是可以模擬一臺可以獨立運行操做系統的虛擬機,虛擬機認爲本身和硬件打交道,但實際上是和 Qemu 模擬出來的硬件打交道,Qemu 將這些指令轉譯給真正的硬件。

正由於 Qemu 是純軟件實現的,全部的指令都要經 Qemu 過一手,性能很是低。

 

KVM

KVMlinux內核的模塊。它採用硬件輔助虛擬化技術Intel-VTAMD-V以得到CPU的支持。採用如IntelEPTAMDRVI技術以得到內存的支持。Guest OSCPU指令不用再通過Qemu轉譯,直接運行,大大提升了速度,KVM經過/dev/kvm暴露接口,用戶態程序能夠經過ioctl函數來訪問這個接口。見以下僞代碼:

 


open("/dev/kvm")

ioctl(KVM_CREATE_VM)

ioctl(KVM_CREATE_VCPU)

for (;;) {

    ioctl(KVM_RUN)

        switch (exit_reason) {

        case KVM_EXIT_IO: 

        case KVM_EXIT_HLT:

    }

}

KVM內核模塊自己只能提供CPU和內存的虛擬化,因此它必須結合QEMU才能構成一個完成的虛擬化技術,這就是下面要說的qemu-kvm

 

Qemu-kvm

QemuKVM整合進來,經過ioctl調用/dev/kvm接口,將有關CPU指令的部分交由內核模塊來作。kvm負責cpu虛擬化+內存虛擬化,實現了cpu和內存的虛擬化,但kvm不能模擬其餘設備。qemu模擬IO設備(網卡,磁盤等),kvm加上qemu以後就能實現真正意義上服務器虛擬化。由於用到了上面兩個東西,因此稱之爲qemu-kvm

Qemu模擬其餘的硬件,如Network, Disk,一樣會影響這些設備的性能,因而又產生了pass through半虛擬化設備virtio_blk, virtio_net,提升設備性能。

 

image.png

 

Libvirt

Libvirt是用於管理虛擬化平臺的開源的API,後臺程序和管理工具。它能夠用於管理KVMXenVMware ESXQEMU和其餘虛擬化技術。

libvirt包括一個API庫,一個守護進程(Libvirtd),和一個命令行實用程序(virsh)。

Libvirtd是一個daemon進程,能夠被本地的virsh調用,也能夠被遠程的virsh調用,Libvirtd調用qemu-kvm操做虛擬機

image.png

 

7.3、參考文檔

qemu支持的硬盤格式

(https://www.hongweipeng.com/index.php/archives/1368/)

 

深刻淺出 kvm qemu libvirt

(https://www.cnblogs.com/qiaoyanlin/p/6888408.html)

 

八、kvm配置

8.1、安裝軟件包

複雜版:yum install qemu-kvm qemu-img virt-manager libvirt libvirt-Python ibvirt-client virt-install virt-viewer bridge-utils

簡介版:yum install qemu-kvm qemu-kvm-tools libvirt

qemu-kvm:qemu模擬器

qemu-img:qemu的磁盤管理器

virt-install:用來建立虛擬機的命令行工具

virt-manager:GUI虛擬機管理工具

libvirt:提供libvirtd daemon來管理虛擬機和控制hypervisor

libvirt-Python:基於libvirt API的python語言綁定工具包,經過該包能夠實現對KVM平常管理和監控數據的獲取

libvirt-client:提供客戶端API用來訪問server和提供管理虛擬機命令行工具的virsh實體

virt-install:是一個命令行工具,它可以爲KVM、Xen或其它支持libvrit API的hypervisor建立虛擬機並完成GuestOS安裝

virt-viewer:圖形控制檯

bridge-utils:建立和管理橋接設備的工具

8.2、檢查內核模塊嵌入

# 檢查嵌入

lsmod | grep kvm

kvm_intel 55496 0 

kvm 337900 1 kvm_intel 

# 嵌入命令

modprobe kvm

modprobe kvm-intel

 

8.3、建立安裝盤

qemu支持的硬盤格式

qemu-img create –f qcow2 /xx/xx/name 10G

8.4、建立虛擬機

virt-install --virt-type kvm \

--name CentOS-7 \

--ram 1024 \

--vcpus 1 \

--cdrom=/data/kvmtest/CentOS-7-x86_64-Minimal-1804.iso \

--disk path=/data/kvmtest/CentOS-7.qcow2 \

--network network=default \

--graphics vnc,listen=0.0.0.0 --noautoconsole \

--os-type=linux \

--os-variant=rhel7

virt-install參數詳解

--virt-type:使用的hypervisor,如kvm、qemu、xen等

-n NAME, --name=NAME:虛擬機名稱,需全局唯一;

-r MEMORY, --ram=MEMORY:虛擬機內在大小,單位爲MB;

--vcpus=VCPUS[,maxvcpus=MAX][,sockets=#][,cores=#][,threads=#]:VCPU個數及相關配置;

-c CDROM, --cdrom=CDROM:光盤安裝介質;

--disk=DISKOPTS:指定存儲設備及其屬性;格式爲--disk /some/storage/path,opt1=val1,opt2=val2等;

經常使用的選項有:

l  device:設備類型,如cdrom、disk或floppy等,默認爲disk;

l  bus:磁盤總結類型,其值能夠爲ide、scsi、usb、virtio或xen;

l  perms:訪問權限,如rw、ro或sh(共享的可讀寫),默認爲rw;

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

l  cache:緩存模型,其值有none、writethrouth(緩存讀)及writeback(緩存讀寫);

l  format:磁盤映像格式,如raw、qcow二、vmdk等;

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

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

 

--network=NETWORK:將虛擬機連入宿主機的網絡中,其中NETWORK能夠爲:

l  bridge=BRIDGE:鏈接至名爲「BRIDEG」的橋設備;

l  network=NAME:鏈接至名爲「NAME」的網絡;

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

TYPE:指定顯示類型,能夠爲vnc、sdl、spice或none等,默認爲vnc; 若是選擇spice,則須要linux圖形界面的支持

port: TYPE爲vnc或spice時其監聽的端口;

listen:TYPE爲vnc或spice時所監聽的IP地址,默認爲127.0.0.1,能夠經過修改/etc/libvirt/qemu.conf定義新的默認值;

password:TYPE爲vnc或spice時,爲遠程訪問監聽的服務進指定認證密碼;

--noautoconsole:禁止自動鏈接至虛擬機的控制檯;

--os-type=DISTRO_TYPE:操做系統類型,如Linux、unix或windows等;

--os-variant=DISTRO_VARIANT:某類型操做系統的變體,如rhel五、fedora8等

# 不經常使用的,瞭解

--cpu=CPU:CPU模式及特性,如coreduo等;可使用qemu-kvm -cpu ?來獲取支持的CPU模式;

-l LOCATION, --location=LOCATION:安裝源URL,支持FTP、HTTP及NFS等,如ftp://172.16.0.1/pub;

--pxe:基於PXE完成安裝; --livecd: 把光盤看成LiveCD;

-x EXTRA, --extra-args=EXTRA:根據--location指定的方式安裝GuestOS時,用於傳遞給內核的額外選項,例如指定kickstart文件的位置,

--extra-args "ks=http://172.16.0.1/class.cfg"

--boot=BOOTOPTS:指定安裝過程完成後的配置選項,如指定引導設備次序、使用指定的而非安裝的kernel/initrd來引導系統啓動等 ;例如: --boot cdrom,hd,network:指定引導次序;

--boot kernel=KERNEL,initrd=INITRD,kernel_args=」console=/dev/ttyS0」:指定啓動系統的內核及initrd文件;

 

8.5VNC安裝

由於上面指定的是用VNC顯示圖形界面。因此下載一個VNC viewer,連上IP:5900,進行圖形化安裝。安裝完成後就能夠正常操做了

8.6、安裝電源模塊

yum install acpid

ACPIAdvanced Configuration and PowerInterface縮寫,高級配置和電源管理接口。

acpid中的d則表明daemonAcpid是一個用戶空間的服務進程,它充當linux內核與應用程序之間通訊的接口,負責將kernel中的電源管理事件轉發給應用程序。

若是沒有這個服務,是不能virsh shutdown 掉虛機的

8.7KVMxml文件

xml文件是虛機的配置文件。裏面有虛機名,磁盤大小,vcpuramnetwor等等的信息。咱們經過xml文件能夠了解到虛機的整個基礎配置。還能夠經過複製xml文件,用define命令生成新的虛機

<domain type = 'kvm'>        //虛擬機類型,kvm

  <name>demo</name>        //虛擬機名稱

  <memory>1048576</memory> //分配內存,單位kb

  <vcpu>1</vcpu>           //分配vcpu,單位個數

  <os>

    <type arch = 'x86_64'machine = 'pc'>hvm</type>

    <bootdev = 'cdrom'/> //cd 啓動

    <bootdev = 'hd'/>    //硬盤啓動

  </os>

  <features>

    <acpi/>

    <apic/>

    <pae/>

  </features>

  <clock offset = 'localtime'/>

  <on_poweroff>destroy</on_poweroff>

  <on_reboot>restart</on_reboot>

  <on_crash>destroy</on_crash>

  <devices>

    <emulator>/usr/bin/kvm</emulator>

    <disk type = 'file'device = 'disk'>  //對應的鏡像,就是以前使用qemu-img命令新建的img文件,注意路徑要正確

      <driver name = 'qemu'type = 'raw'/>

      <sourcefile = '/var/lib/lynn/img/template.img'/>

      <target dev = 'hda'bus = 'ide'/>

    </disk>

    <disk type = 'file'device = 'cdrom'> //可選項,iso一般是操做系統的安裝光盤

      <source file = '/var/lib/lynn/img/template.iso'/>

      <target dev = 'hdb'bus = 'ide'/>

    </disk>

    <interface type = 'bridge'>           //libvirt默認虛擬機的網絡配置是NAT模式,就是虛擬機與宿主機的網絡拓撲是NAT形式。實際中,許多開發者更但願使用網橋模式。

      <source bridge = 'br0'/>

    </interface>

    <input type ='tablet'bus='usb'/>

    <input type = 'mouse'bus = 'ps2'/>

    <graphics type = 'vnc'port = '-1'listen = '0.0.0.0'keymap = 'en-us'/> //vnc端口系統自動配置

  </devices>

</domain>

 

8.8、網絡配置

1、將網絡由vibr0橋接,變爲br0橋接

在最初建立虛機時,設置虛機的網絡是「network=default」。讓虛機連入名爲default的網絡。當時咱們也可設置「network=bridge_name,讓虛機連入橋設備。但咱們沒有這樣作,因此如今虛機是連在virbr0橋設備上的。

1)vibr0是什麼

vibr0KVM默認建立的一個Bridge,它爲鏈接其上的虛機網卡提供NAT訪問外網的功能。virbr0默認會被分配一個IP地址,併爲鏈接其上的其餘KVM虛擬網卡提供DHCP服務(dnsmasq服務)。此時,虛機網絡爲NAT模式,訪問外部網絡簡單,但外部網絡不能訪問進來

2)br0橋接

這裏的br0橋接,就是將虛機的網絡模式變爲橋接模式。這樣虛機與宿主機處於同一網絡環境,相似於一臺真實的宿主機。操做以下:

(1)      宿主機操做

brctl show  #查看橋接鏈接

brctl addbr br0  #新建橋接鏈接

brctl addif br0 eth0  #將eth0網卡,綁到br0橋設備上

ip addr del dev eth0 192.168.56.11/24 #刪除eth0網卡的IP地址

ifconfig br0 192.168.56.11/24  up #將eth0網卡的IP,配到br0上

route add default gw 192.168.56.2  #配置默認網關

修改KVM的xml文件(把端口類型改成bridge,源端口改成br0)

image.png

(2)      進入KVM虛機,爲其配置網卡IP

BOOTPROTO=staic

 IPADDR=192.168.56.111 (與宿主機同網段)

 NETMASK=255.255.255.0

 GATEWAY=192.168.56.2

 

2、建立VLAN

vconfig add eth0 10  # 建立VLAN  (/proc/net/vlan/config)10,並將eth0加入VLAN

brctl addbr br10     # 建立網橋

brctl addif br10 eth0.10 # 將eth0綁到網橋

brctl addif br10 vnet0   # 將KVM虛機的網卡 加入網橋br10

3、參考文檔

Linux系統配置kvm+vlan

(https://blog.51cto.com/fklinux/2045498)

 

KVM虛擬機網絡配置 Bridge方式,NAT方式

(https://blog.csdn.net/hzhsan/article/details/44098537/)

 

KVM 虛擬機的網絡模式學習及配置

(https://www.baidu.com/link?url=Cs-jCTF5gY6F3T73jhTWpR129jJwRnG2JqdsLZQSs2amaVgk8lf2LVjV9jevyzMdA1NpVzHja6-0riqJJZ7ZgK7AUj92XFzATOo48O441wy&wd=&eqid=b8fdc22300032726000000055b053d6f)

 

8.7KVM與宿主機的關係

KVMLinux中是一個進程的表現形式,它受的到CPU的調度

Libvirt是管理kvm的工具,關掉Libvird服務,不影響KVM虛機的正常運行,只是沒法用libvirt管理而已

九、virsh命令

virsh命令,調用libvidLibvirtd調用qemu-kvm操做虛擬機。經過virsh命令,咱們能夠實如今CLI對虛擬機的管理

 

virsh有命令模式和交互模式。

u  命令模式:直接在virsh後面接參數

u  交互模式:直接寫virsh

u  事實上交互模式和命令的參數都是同樣的

9.1、經常使用命令

命令(前綴 virsh)

含義

list

顯示顯示本地活動虛擬機

-all:顯示本地全部的虛擬機

creat KVM_name.xml

建立虛機(建立後,虛機當即執行。虛機關機後自動消失)

define KVM_name.xml

經過配置文件定義一個虛機。(定之後虛機不是活動的)

start KVM_name

啓動虛機

console KVM_name

鏈接虛機 【KVM 經過virsh console連入虛擬機

suspend KVM_name

暫停虛機,虛擬機處於paused暫停狀態

可是仍然消耗資源,只不過不被超級管理程序調度而已。

resume KVM_name

喚醒虛機

shutdown KVM_name

正常關閉虛機

destroy KVM_name

強制關閉虛機,並刪除

libvirt直接銷燬demo,取消demo的定義

undefine KVM_name

移除虛擬機

在虛擬機處於Running狀態時,調用該指令,該指令暫時不生效

可是當虛擬機被關閉後,該指令生效移除該虛擬機,也能夠在該指令生效以前調用define+TestKVM.xml取消該指令

 

9.2、顯示虛機信息命令

命令(前綴爲 virsh)

含義

dominfo KVM_name

顯示虛機的基本信息

dumpxml KVM_name

顯示虛機的當前配置文件

dump KVM_name file

將虛機的配置文件重定向到file

domiflist KVM_name

列出虛機網卡接口

domifstat KVM_name vnet0

顯示網卡信息

domuuid KVM_name

顯示虛機UUID

domid KVM_name/UUID

顯示虛機ID

cpu-stats KVM_name

顯示虛機CPU狀態

vncdisplay

顯示虛機的IP

 

9.3、更改虛機

命令(前綴爲 virsh)

含義

exit KVM_name

編輯虛機的配置文件

setmen KVM_name size

設置虛機內存。要求虛機不活動

setvcpus KVM_name num

設置虛機的虛擬CPU個數。要求虛機不活動

autostart KVM_name

虛機將隨宿主機一塊兒啓動

--disable   KVM_name:取消自動啓動

9.4、參考文檔

virsh的詳細命令解析 (https://blog.csdn.net/xxoo00xx00/article/details/49802367)

相關文章
相關標籤/搜索