天天看點

kvm虛拟化簡述

 虛拟化使得在一台實體的伺服器上可以跑多台虛拟機,虛拟機共享實體機的 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(虛拟記憶體) -&gt; PA(實體記憶體) -&gt; MA(機器記憶體)直接的位址轉換。

虛機 OS 控制虛拟位址到客戶記憶體實體位址的映射(VA -&gt; PA),但是虛機 OS 不能直接通路實際機器記憶體,是以 KVM 需要負責映射客戶實體記憶體到實際機器記憶體 (PA -&gt; 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,如需轉載請自行聯系原作者

繼續閱讀