KVM詳解

虛擬化與KVM

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


1、虛擬化簡介

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

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

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

2、使用虛擬化的原因

當公司的服務器越來越多,我們需要充分利用資源,也需要統一運維管理,這時虛擬化能幫助我們做很多事。總結如下:

1)       打破“一臺服務器對應一套應用”的模 式,將物理服務器進行整合,提升利用 率

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

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

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

image.png

3、虛擬化的分類

1)       全虛擬化(使用二進制翻譯的虛擬化,hypervisor將操作系統的指令翻譯並將結果緩存,供之後使用。而用戶級指令無需修改就運行,具有和物理機一樣的執行速度。客戶系統不知道自己在虛擬環境中

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

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

4、三種虛擬化的區別

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這種半虛擬化技術,客戶機操作系統都是有一個專門的定製內核版本,和x86、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)

 

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

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

2)       Host機器看虛機像跑在自己上面的程序

3)       由於Hypervisor幫助Guest訪問物理資源,Guest機器感覺自己運行在真機上

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

6、虛擬化技術

虛擬化技術很常見的有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

7、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)

 

8、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、qcow2、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:某類型操作系統的變體,如rhel5、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

(http://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管理而已

9、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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章