虛拟化使得在一台實體的伺服器上可以跑多台虛拟機,虛拟機共享實體機的 CPU、記憶體、IO 硬體資源,但邏輯上虛拟機之間是互相隔離的。
實體機我們一般稱為主控端(Host),主控端上面的虛拟機稱為客戶機(Guest)。Hypervisor是統載虛拟機的全稱,像kvm、xen、vmware、hyper-v都屬于Hypervisor。
Host通過Hypervisor将自己的硬體資源虛拟化,并提供給 Guest 使用。
虛拟化分為兩種:
1、全虛拟化
Hypervisor直接安裝在實體機上,然後Hypervisor上運作多個虛拟機。xen、vmware、ESXI都屬于全虛拟化!
2、半虛拟化
實體機器上先安裝作業系統,然後再實體機上的作業系統上再運作虛拟機。
KVM、VirtualBox 和 VMWare Workstation 都屬于半虛拟化。
3、兩種虛拟化的對比
a、全虛拟化一般對硬體虛拟化功能進行了特别優化,性能比半虛拟化好。
b、半虛拟化比較靈活,支援虛拟機嵌套。
本篇主要介紹比較主流的半虛拟化的Hypervisor--KVM
KVM
KVM 全稱是 Kernel-Based Virtual Machine。也就是說 KVM 是基于 Linux 核心實作的。
KVM有一個核心子產品叫 kvm.ko,隻用于管理虛拟 CPU 和記憶體。
那 IO 的虛拟化,比如存儲和網絡裝置由誰實作呢?
這個就交給 Linux 核心和Qemu來實作。
作為一個 Hypervisor,KVM 本身隻關注虛拟機排程和記憶體管理這兩個方面。IO 外裝置的任務交給 Linux 核心和 Qemu。
Libvirt
Libvirt就是 KVM的管理工具,除了能管理 KVM 這種 Hypervisor,還能管理 Xen,VirtualBox 等。
Libvirt 包含 3 個東西:背景 daemon 程式 libvirtd、API 庫和指令行工具 virsh。
1、libvirtd是服務程式,接收和處理API 請求;
2、API 庫使得其他人可以開發基于Libvirt 的進階工具,比如 virt-manager,這是個圖形化的 KVM 管理工具。
3、virsh 是經常要用的 KVM 指令行工具。
CPU虛拟化
檢視系統是否開啟虛拟化:egrep -o '(vmx|svm)' /proc/cpuinfo
一個 KVM 虛機在主控端中其實是一個 qemu-kvm 程序,與其他 Linux 程序一樣被排程。
虛機中的每一個虛拟 vCPU 則對應 qemu-kvm 程序中的一個線程。看下圖
<a href="http://s1.51cto.com/wyfs02/M01/8B/69/wKiom1hNQpTAZnjyAAM52-W3j3w360.png" target="_blank"></a>
在這個例子中,主控端有兩個實體 CPU,上面起了兩個虛機 VM1 和 VM2。
VM1 有兩個 vCPU,VM2 有 4 個 vCPU。可以看到 VM1 和VM2 分别有兩個和 4 個線程在兩個實體 CPU 上排程。
這裡也示範了另一個知識點,即虛機的 vCPU 總數可以超過實體 CPU 數量,這個叫 CPU overcommit(超配)。
但前提是在同一時刻,不是所有的虛機都滿負荷運作。當然,如果每個虛機都很忙,反而會影響整體性能。
記憶體虛拟化
KVM 通過記憶體虛拟化共享實體系統記憶體,動态配置設定給虛拟機。
為了在一台機器上運作多個虛拟機,KVM 需要實作 VA(虛拟記憶體) -> PA(實體記憶體) -> MA(機器記憶體)直接的位址轉換。
虛機 OS 控制虛拟位址到客戶記憶體實體位址的映射(VA -> PA),但是虛機 OS 不能直接通路實際機器記憶體,是以 KVM 需要負責映射客戶實體記憶體到實際機器記憶體 (PA -> MA)。
<a href="http://s4.51cto.com/wyfs02/M02/8B/65/wKioL1hNQpWgl07xAAFxvIkSn0U097.png" target="_blank"></a>
存儲虛拟化
KVM 的存儲虛拟化是通過存儲池(Storage Pool)和卷(Volume)來管理的。
Storage Pool 是主控端上可以看到的一片存儲空間。
Volume 是在 Storage Pool 中劃分出的一塊空間,主控端将 Volume 配置設定給虛拟機,Volume 在虛拟機中看到的就是一塊硬碟。
Storage Pool種類:
1、本地目錄或遠端挂載點目錄(比如nfs、Glusterfs)
2、主控端上 VG 中的 LV,無MBR引導記錄,隻能做資料盤。這種情況下主控端上的 VG 就是一個 Storage Pool,VG 中的LV 就是 Volume,LV 的優點是有較好的性能;
不足的地方是管理和移動性方面不如鏡像檔案,而且不能通過網絡遠端使用。
3、iSCSI,Ceph 等多種類型。
以lvm為例檢視及添加Storage Pool:
建立了一個 Storage Pool 的定義檔案/etc/libvirt/storage/HostVG.xml,内容為
<a href="http://s2.51cto.com/wyfs02/M01/8B/65/wKioL1hNQpaCkb5DAAAS_QP2e3g433.png" target="_blank"></a>
virsh pool-list –all
virsh pool-define /etc/libvirt/storage/HostVG.xml
virsh pool-start HostVG
Volume 檔案格式:
1、raw,預設格式,即原始磁盤鏡像格式,移植性好,性能好,但大小固定,不能節省磁盤空間,不支援快照。
2、qcow2,cow 表示 copy on write,能夠節省磁盤空間,支援 AES 加密,支援 zlib 壓縮,支援多快照,功能很多。
3、vmdk 是 VMWare 的虛拟磁盤格式,VMWare 虛機可以直接在 KVM上 運作。
網絡虛拟化
Linux Bridge:
Linux Bridge 是 Linux 上用來做 TCP/IP 二層協定交換的裝置,其功能可以簡單的了解為是一個二層交換機或者 Hub。
<a href="http://s2.51cto.com/wyfs02/M02/8B/65/wKioL1hNQpfgxfd-AAB5HNO9Zpg586.png" target="_blank"></a>
virbr0 是 KVM 預設建立的一個 Bridge,其作用是為連接配接其上的虛機網卡提供 NAT 通路外網的功能。virbr0 預設配置設定了一個IP 192.168.122.1。
brctl show可以檢視的到,配置檔案位于/etc/libvirt/qemu/networks/default.xml
初始模闆位于/usr/share/libvirt/networks/default.xml
virbr0 使用 dnsmasq 提供 DHCP 服務,可以在主控端中檢視該程序資訊。
ps -elf|grep dnsmasq
VLAN
VLAN 表示Virtual Local Area Network,一個帶有 VLAN 功能的switch 能夠将自己的端口劃分出多個 LAN。一個 LAN 表示一個廣播域。VLAN 将一個交換機分成了多個交換機,限制了廣播的範圍。VLAN 的隔離是二層上的隔離,A 和 B 無法互相通路指的是二層廣播包(比如 arp)無法跨越 VLAN 的邊界。但在三層上(比如IP)是可以通過路由器讓 A 和 B 互通的。
通常交換機的端口有兩種配置模式: Access 和 Trunk
<a href="http://s4.51cto.com/wyfs02/M00/8B/69/wKiom1hNQpnRT5MyAAGcHTFNeZE111.png" target="_blank"></a>
Access 口
這些端口被打上了 VLAN 的标簽,表明該端口屬于哪個 VLAN。
不同 VLAN 用 VLAN ID 來區分,VLAN ID 的 範圍是 1-4096。
Access 口都是直接與計算機網卡相連的,這樣從該網卡出來的資料包流入 Access 口後就被打上了所在 VLAN 的标簽。
Access 口隻能屬于一個 VLAN。
Trunk 口
假設有兩個交換機 A 和 B。
A 上有 VLAN1(紅)、VLAN2(黃)、VLAN3(藍);B 上也有 VLAN1、2、3
那如何讓 AB 上相同 VLAN 之間能夠通信呢?
辦法是将 A 和 B 連起來,而且連接配接 A 和 B 的端口要允許 VLAN1、2、3 三個 VLAN 的資料都能夠通過。這樣的端口就是Trunk口了。
VLAN1、2、3 的資料包在通過 Trunk 口到達對方交換機的過程中始終帶着自己的 VLAN 标簽。
<a href="http://s5.51cto.com/wyfs02/M00/8B/69/wKiom1hNQpriJT1uAABsiF5NDzM809.png" target="_blank"></a>
eth0 是主控端上的實體網卡,有一個命名為 eth0.10 的子裝置與之相連。
eth0.10 就是 VLAN 裝置了,其 VLAN ID 就是 VLAN 10
eth0.10 挂在命名為 brvlan10 的 LinuxBridge 上,虛機 VM1 的虛拟網卡 vent0 也挂在 brvlan10 上。
這樣的配置其效果就是:
主控端用軟體實作了一個交換機(當然是虛拟的),上面定義了一個 VLAN10。
eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。而eth0 就是一個 Trunk 口。
VM1 通過 vnet0 發出來的資料包會被打上 VLAN10的标簽。
eth0.10 的作用是:定義了 VLAN10
brvlan10 的作用是:Bridge 上的其他網絡裝置自動加入到 VLAN10 中。
KVM 的網絡虛拟化總結:
1、實體交換機存在多個 VLAN,每個 VLAN擁有多個端口。
同一 VLAN 端口之間可以交換轉發,不同 VLAN 端口之間隔離。
是以交換機其包含兩層功能:交換與隔離。
2、Linux 的 VLAN 裝置實作的是隔離功能,但沒有交換功能。
一個 VLAN 母裝置(比如 eth0)不能擁有兩個相同 ID 的VLAN 子裝置,是以也就不可能出現資料交換情況。
3、Linux Bridge 專門實作交換功能。
将同一 VLAN 的子裝置都挂載到一個 Bridge 上,裝置之間就可以交換資料了。
内容源于網絡,整理!
本文轉自Jacken_yang 51CTO部落格,原文連結:http://blog.51cto.com/linuxnote/1881721,如需轉載請自行聯系原作者