KVM虛擬化原理

CPU虛擬化

KVM虛擬化是須要硬件支持的。咱們能夠用 egrep -o '(vmx|svm)' /proc/cpuinfo 來查看是否支持CPU虛擬化。python

虛擬機中每個vCPU對應qemu-kvm中的一個線程,虛擬機的VCPU數量能夠超過物理CPU數量,這個叫作CPU的超配(overcommit)。這個特性使得虛擬機能夠充分利用宿主機的CPU資源,但前提是在同一時刻,不是全部虛擬機都滿負荷運行。vim

內存虛擬化

KVM經過內存虛擬化共享物理系統內存,動態分配給虛擬機。爲了在一臺機器上運行多個虛擬機,KVM須要實現VA(虛擬內存)→PA(物理內存)→MA(機器內存)之間的地址轉換。虛機OS控制虛擬地址到客戶內存物理地址的映射(VA→PA),可是虛機OS不能直接訪問實際機器內存,所以KVM須要負責映射客戶物理內存到實際機器內存(PA→MA)網絡

存儲虛擬化

KVM虛擬化是經過存儲池(storage pool)和卷(volume)來管理的app

storage pool 是宿主機上能夠看到的一片存儲空間,能夠是多種類型的。volume是在storage pool 中劃分出的一塊空間,宿主機將volume分配給虛擬機,volume在虛擬機中看到的就是一塊硬盤。負載均衡

目錄類型的Storage Poolui

KVM將宿主機目錄/var/lib/libvirt/images/ 做爲默認的Storage Pool。Volume就是該目錄下的文件,一個文件就是一個Volume。this

KVM全部可使用的Storage Pool都定義宿主機的/etc/libvirt/storage 目錄下,每一個Pool 一個 xml 文件,默認有一個default.xml,內容以下spa

 

[root@v5 storage]# cat default.xml 
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh pool-edit default
or other application using the libvirt API.
-->

<pool type='dir'>
  <name>default</name>
  <uuid>6fcbd70e-27ca-46c8-a34c-5651b9d57143</uuid>
  <capacity unit='bytes'>0</capacity>
  <allocation unit='bytes'>0</allocation>
  <available unit='bytes'>0</available>
  <source>
  </source>
  <target>
    <path>/var/lib/libvirt/images</path>
  </target>
</pool>

 

 

 Storage Pool 的類型是「dir」,目錄路徑就是/var/lin/libvirt/images/。線程

網絡虛擬化

1.Linux Bridge

是Linux上用來作TCP/IP 二層協議交換的設備,基本原理就是建立一個橋接接口 br0 ,在物理網卡和虛擬網絡接口之間傳遞數據。此種方式host卻能夠和vm聯通。3d

配置Linux Bridge br0

1)添加 br0 網卡的配置文件

 

cd /etc/sysconfig/network-scripts

cp ifcfg
-ens33 ifcfg-br0

 

2)編輯br0 配置文件

TYPE=Bridge

NAME=br0

DEVICE=br0

ONBOOT=yes

BOOTPROTO=none

IPADDR=192.168.254.20

PREFIX=24

GATEWAY=192.168.254.1

DNS=114.114.114.114

 

3)修改ens33網卡配置文件

TYPE=Ethernet

NAME=eth0

DEVICE=eth0

ONBOOT=yes

BRIDGE=br0

 

4)重啓服務

systemctl restart network

 

 

5)brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.000c29f7719c       no              ens33

virbr0          8000.52540041c6a8       yes             virbr0-nic

 

2.virbr0

是KVM默認建立的一個Bridge,其做用是爲鏈接其上的虛擬機網卡提供NAT訪問外網的功能。

virbr0 默認分配了一個192.168.122.1的地址,併爲鏈接其上的虛擬機提供DHCP服務

在virt-manager 打開VM1設置界面,網卡選擇default,將VM1的網卡掛在virbr0上

打開虛擬機,設置動態獲取IP,能夠看到已經得到了一個192.168.122.188的IP,而且能夠通外網。

3.VLAN

 1)基本概念

 LAN 表示 Local Area Network,本地局域網,一般使用 Hub 和 Switch 來鏈接 LAN 中的計算機。通常來講,兩臺計算機連入同一個 Hub 或者 Switch 時,它們就在同一個 LAN 中。

一個 LAN 表示一個廣播域。 其含義是:LAN 中的全部成員都會收到任意一個成員發出的廣播包。

VLAN 表示 Virtual LAN。一個帶有 VLAN 功能的switch 可以將本身的端口劃分出多個 LAN。計算機發出的廣播包能夠被同一個 LAN 中其餘計算機收到,但位於其餘 LAN 的計算機則沒法收到。 簡單地說,VLAN 將一個交換機分紅了多個交換機,限制了廣播的範圍,在二層將計算機隔離到不一樣的 VLAN 中。

比方說,有兩組機器,Group A 和 B,咱們想配置成 Group A 中的機器能夠相互訪問,Group B 中的機器也能夠相互訪問,可是 A 和 B 中的機器沒法互相訪問。 一種方法是使用兩個交換機,A 和 B 分別接到一個交換機。 另外一種方法是使用一個帶 VLAN 功能的交換機,將 A 和 B 的機器分別放到不一樣的 VLAN 中。

VLAN 的隔離是二層上的隔離,A 和 B 沒法相互訪問指的是二層廣播包(好比 arp)沒法跨越 VLAN 的邊界。但在三層上(好比IP)是能夠經過路由器讓 A 和 B 互通的。

如今的交換機幾乎都是支持 VLAN 的。 一般交換機的端口有兩種配置模式: Access 和 Trunk。以下圖

Access 口

這些端口被打上了 VLAN 的標籤,代表該端口屬於哪一個 VLAN。 不一樣 VLAN 用 VLAN ID 來區分,VLAN ID 的 範圍是 1-4096。 Access 口都是直接與計算機網卡相連的,這樣從該網卡出來的數據包流入 Access 口後就被打上了所在 VLAN 的標籤。 Access 口只能屬於一個 VLAN。

Trunk 口

假設有兩個交換機 A 和 B。 A 上有 VLAN1(紅)、VLAN2(黃)、VLAN3(藍);B 上也有 VLAN一、二、3,那如何讓 AB 上相同 VLAN 之間可以通訊呢?

辦法是將 A 和 B 連起來,並且鏈接 A 和 B 的端口要容許 VLAN一、二、3 三個 VLAN 的數據都可以經過。這樣的端口就是Trunk口了。 VLAN1, 2, 3 的數據包在經過 Trunk 口到達對方交換機的過程當中始終帶着本身的 VLAN 標籤。

 

2)KVM虛擬環境下VLAN的實現

 

eth0 是宿主機上的物理網卡,有一個命名爲 eth0.10 的子設備與之相連。 eth0.10 就是 VLAN 設備了,其 VLAN ID 就是 VLAN 10。 eth0.10 掛在命名爲 brvlan10 的 Linux Bridge 上,虛機 VM1 的虛擬網卡 vent0 也掛在 brvlan10 上。

這樣的配置其效果就是: 宿主機用軟件實現了一個交換機(固然是虛擬的),上面定義了一個 VLAN10。 eth0.10,brvlan10 和 vnet0 都分別接到 VLAN10 的 Access口上。而 eth0 就是一個 Trunk 口。VM1 經過 vnet0 發出來的數據包會被打上 VLAN10 的標籤。

eth0.10 的做用是:定義了 VLAN10
brvlan10 的做用是:Bridge 上的其餘網絡設備自動加入到 VLAN10 中

增長一個 VLAN20,以下圖

這樣虛擬交換機就有兩個 VLAN 了,VM1 和 VM2 分別屬於 VLAN10 和 VLAN20。

對於新建立的虛機,只須要將其虛擬網卡放入相應的 Bridge,就能控制其所屬的 VLAN。
VLAN 設備老是以母子關係出現,母子設備之間是一對多的關係。 一個母設備(eth0)能夠有多個子設備(eth0.10,eth0.20 ……),而一個子設備只有一個母設備。

 

3.配置VLAN

(1)查看核心是否提供VLAN 功能,執行

         dmesg | grep -i 802

或者檢查/proc/net/vlan目錄是否存在。

若是沒有提供VLAN 功能,/proc/net/vlan目錄是不存在的。

 

若是8021q模塊沒有載入系統,則能夠經過使用modprobe模組命令載入802.1q模組,並且利用lsmod命令確認模組是否已經載入到核心內。

         modprobe 8021q

         lsmod | grep 8021q

 

設置開機載入8021q模塊(可選)

在/etc/sysconfig/modules下增長一個8021q.modules文件,文件內容爲modprobe 8021q

         vim /etc/sysconfig/modules/8021q.modules

         modprobe 8021q

 

(2)建立vlan接口

建立vlan接口前,在設備上添加一塊網卡ens37,

注意:

將BOOTPROTO=static

基於網卡ens37創建vlan10,vlan20接口:ens37.10,ens37.20:

vconfig add ens37 10

vconfig add ens37 20

 

cd /etc/sysconfig/network-scripts/

cp ifcfg-ens37 ifcfg-ens37.10        -- 建立ens33.10接口配置文件

 

編輯ifcfg-ens37.10文件,增長/修改下面內容:

 

vim ifcfg-ens37.10

VLAN=yes

TYPE=vlan

PHYSDEV=ens37

VLAN_ID=10

NAME=ens37.10

ONBOOT=yes

ZONE=trusted

DEVICE=ens37.10

BRIDGE=brvlan-10

 

#cp ifcfg-ens37.10 ifcfg-ens37.20

編輯ifcfg-ens37.20文件,增長/修改下面內容:

       

#vim ifcfg-ens37.20

VLAN=yes

TYPE=vlan

PHYSDEV=ens37

VLAN_ID=20

NAME=ens37.20

ONBOOT=yes

ZONE=trusted

DEVICE=ens37.20

BRIDGE=brvlan-20

 

(3)分別創建網橋brvlan-10,brvlan-20

brctl addbr brvlan-10

brctl addbr brvlan-20

 

(4)編輯網橋brvlan-10配置文件:

#vim ifcfg-brvlan-10

TYPE=bridge

BOOTPROTO=static

NAME=brvlan-10

DEVICE=brvlan-10

ONBOOT=yes

 

編輯網橋brvlan-20配置文件:

vim ifcfg-brvlan-20

TYPE=bridge

BOOTPROTO=static

NAME=brvlan-20

DEVICE=brvlan-20

ONBOOT=yes

 

(5)將網橋brvlan-10接到網口ens34.10,brvlan-20接到網口ens34.20

brctl addif brvlan-10 ens34.10

brctl addif brvlan-20 ens34.20

 

(6)從新啓動網絡服務

systemctl restart network

 

4.網卡綁定(bond)

1)網卡bond(綁定),也稱做網卡捆綁。就是將兩個或者更多的物理網卡綁定成一個虛擬網卡。網卡是經過把多張網卡綁定爲一個邏輯網卡,實現本地網卡的冗餘,帶寬擴容和負載均衡,在應用部署中是一種經常使用的技術。

      多網卡綁定實際上須要提供一個額外的軟件的bond驅動程序實現。經過驅動程序能夠將多塊網卡屏蔽。對TCP/IP協議層只存在一個Bond網卡,在Bond程序中實現網絡流量的負載均衡,即將一個網絡請求重定位到不一樣的網卡上,來提升整體網絡的可用性。

 

2)網卡綁定的目的:

         (1)提升網卡的吞吐量。

         (2)加強網絡的高可用,同時也能實現負載均衡。

 

3)網卡配置bond(綁定)bond模式:

(1)Mode=0(balance-rr) 表示負載分擔round-robin,平衡輪詢策略,具備負載平衡和容錯功能。bond的網卡MAC爲當前活動的網卡的MAC地址,須要交換機設置聚合模式,將多個網卡綁定爲一條鏈路。

(2)Mode=1(active-backup) 表示主備模式,具備容錯功能,只有一塊網卡是active,另一塊是備的standby,這時若是交換機配的是捆綁,將不能正常工做,由於交換機往兩塊網卡發包,有一半包是丟棄的。

(3)Mode=2(balance-xor) 表示XOR Hash負載分擔(異或平衡策略),具備負載平衡和容錯功能。每一個slave接口傳輸每一個數據包和交換機的聚合強制不協商方式配合。(須要xmit_hash_policy)。

(4)Mode=3(broadcast)  表示全部包從全部interface發出,廣播策略,具備容錯能力,這個不均衡,只有冗餘機制...和交換機的聚合強制不協商方式配合。 

(5)Mode=4(802.3ad) 表示支持802.3ad協議(IEEE802.3ad 動態連接聚合) 和交換機的聚合LACP方式配合(須要xmit_hash_policy)。

(6)Mode=5(balance-tlb) 適配器傳輸負載均衡,並行發送,沒法並行接收,解決了數據發送的瓶頸。 是根據每一個slave的負載狀況選擇slave進行發送,接收時使用當前輪到的slave。 

(7)Mode=6(balance-alb) 在5的tlb基礎上增長了rlb。適配器負載均衡模式並行發送,並行接收數據包。

5和6不須要交換機端的設置,網卡能自動聚合。4須要支持802.3ad。0,2和3理論上須要靜態聚合方式,但實測中0能夠經過mac地址欺騙的方式在交換機不設置的狀況下不太均衡地進行接收。

經常使用的有三種:

mode=0:平衡負載模式,有自動備援,但須要」Switch」支援及設定。

mode=1:自動備援模式,其中一條線若斷線,其餘線路將會自動備援。

mode=6:平衡負載模式,有自動備援,沒必要」Switch」支援及設定。

 

4)配置Mode=6模式

(1)添加四塊網卡,都配置綁定爲bond0,例如:

cat ifcfg-ens37

TYPE=Ethernet

BOOTPROTO=none

DEVICE=eth1

ONBOOT=yes

MASTER=bond0

SLAVE=yes

 

         載入bond模塊:

modprobe bonding

 

(2)查看bond0,並橋接到br1

      

cat ifcfg-bond0

DEVICE=bond0

TYPE=Bond

NAME=bond0

BONDING_MASTER=yes

BOOTPROTO=static

USERCTL=no

ONBOOT=yes
     
BONDING_OPTS="mode=6 miimon=100"

BRIDGE=br1

 

(3)建立網橋br1並編輯配置文件

brctl addbr br1

 

cat ifcfg-br1

TYPE=Bridge

DEVICE=br1

ONBOOT=yes

NAME=br1

BOOTPROTO=static

 

(4)建立網口br1.10 br1.20 並編輯配置文件

      

vconfig add br1 10

vconfig add br1 20

 

vim ifcfg-br1.10

VLAN=yes

TYPE=vlan

PHYSDEV=br1

VLAN_ID=10

NAME=br1.10

ONBOOT=yes

ZONE=trusted

DEVICE=br1.10

BRIDGE=brvlan-10

 

(5)建立brvlan並編輯配置文件

brctl addbr brvlan-20

brctl addbr brvlan-20

 

vim ifcfg-brvlan-10

TYPE=bridge

BOOTPROTO=static

NAME=brvlan-10

DEVICE=brvlan-10

ONBOOT=yes

  

(6)將網橋接到網口

brctl addif brvlan-10 br1.10

brctl addif brvlan-10 br1.20

 

(7)brctlshow

bridge name       bridge id           STP enabled     interfaces

br0             8000.000c29a1940e        no             ens33

br1             8000.000c29a19418        no             bond0

brvlan-10       8000.000c29a19418        no             br1.10

brvlan-20       8000.000c29a19418        no             br1.20

virbr0          8000.525400de6b4d       yes           virbr0-nic

 

        

(8)重啓網絡服務

systemctl restart network

VLAN+Linux Bridge能夠實現虛擬交換機的功能

相關文章
相關標籤/搜索