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/。線程
是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
是KVM默認建立的一個Bridge,其做用是爲鏈接其上的虛擬機網卡提供NAT訪問外網的功能。
virbr0 默認分配了一個192.168.122.1的地址,併爲鏈接其上的虛擬機提供DHCP服務
在virt-manager 打開VM1設置界面,網卡選擇default,將VM1的網卡掛在virbr0上
打開虛擬機,設置動態獲取IP,能夠看到已經得到了一個192.168.122.188的IP,而且能夠通外網。
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
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能夠實現虛擬交換機的功能