虛擬化使得在一臺物理的服務器上能夠跑多臺虛擬機,虛擬機共享物理機的 CPU、內存、IO 硬件資源,但邏輯上虛擬機之間是相互隔離的。
服務器
物理機咱們通常稱爲宿主機(Host),宿主機上面的虛擬機稱爲客戶機(Guest)。Hypervisor是統載虛擬機的全稱,像kvm、xen、vmware、hyper-v都屬於Hypervisor。網絡
Host經過Hypervisor將本身的硬件資源虛擬化,並提供給 Guest 使用。ide
虛擬化分爲兩種:工具
一、全虛擬化性能
Hypervisor直接安裝在物理機上,而後Hypervisor上運行多個虛擬機。xen、vmware、ESXI都屬於全虛擬化!優化
二、半虛擬化ui
物理機器上先安裝操做系統,而後再物理機上的操做系統上再運行虛擬機。
加密
KVM、VirtualBox 和 VMWare Workstation 都屬於半虛擬化。spa
三、兩種虛擬化的對比操作系統
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。
一、libvirtd是服務程序,接收和處理API 請求;
二、API 庫使得其餘人能夠開發基於Libvirt 的高級工具,好比 virt-manager,這是個圖形化的 KVM 管理工具。
三、virsh 是常常要用的 KVM 命令行工具。
CPU虛擬化
查看系統是否開啓虛擬化:egrep -o '(vmx|svm)' /proc/cpuinfo
一個 KVM 虛機在宿主機中實際上是一個 qemu-kvm 進程,與其餘 Linux 進程同樣被調度。
虛機中的每個虛擬 vCPU 則對應 qemu-kvm 進程中的一個線程。看下圖
在這個例子中,宿主機有兩個物理 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)。
存儲虛擬化
KVM 的存儲虛擬化是經過存儲池(Storage Pool)和卷(Volume)來管理的。
Storage Pool 是宿主機上能夠看到的一片存儲空間。
Volume 是在 Storage Pool 中劃分出的一塊空間,宿主機將 Volume 分配給虛擬機,Volume 在虛擬機中看到的就是一塊硬盤。
Storage Pool種類:
一、本地目錄或遠程掛載點目錄(好比nfs、Glusterfs)
二、宿主機上 VG 中的 LV,無MBR引導記錄,只能作數據盤。這種狀況下宿主機上的 VG 就是一個 Storage Pool,VG 中的LV 就是 Volume,LV 的優勢是有較好的性能;
不足的地方是管理和移動性方面不如鏡像文件,並且不能經過網絡遠程使用。
三、iSCSI,Ceph 等多種類型。
以lvm爲例查看及添加Storage Pool:
建立了一個 Storage Pool 的定義文件/etc/libvirt/storage/HostVG.xml,內容爲
virsh pool-list –all
virsh pool-define /etc/libvirt/storage/HostVG.xml
virsh pool-start HostVG
Volume 文件格式:
一、raw,默認格式,即原始磁盤鏡像格式,移植性好,性能好,但大小固定,不能節省磁盤空間,不支持快照。
二、qcow2,cow 表示 copy on write,可以節省磁盤空間,支持 AES 加密,支持 zlib 壓縮,支持多快照,功能不少。
三、vmdk 是 VMWare 的虛擬磁盤格式,VMWare 虛機能夠直接在 KVM上 運行。
網絡虛擬化
Linux Bridge:
Linux Bridge 是 Linux 上用來作 TCP/IP 二層協議交換的設備,其功能能夠簡單的理解爲是一個二層交換機或者 Hub。
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
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口了。
VLAN一、二、3 的數據包在經過 Trunk 口到達對方交換機的過程當中始終帶着本身的 VLAN 標籤。
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 的網絡虛擬化總結:
一、物理交換機存在多個 VLAN,每一個 VLAN擁有多個端口。
同一 VLAN 端口之間能夠交換轉發,不一樣 VLAN 端口之間隔離。
因此交換機其包含兩層功能:交換與隔離。
二、Linux 的 VLAN 設備實現的是隔離功能,但沒有交換功能。
一個 VLAN 母設備(好比 eth0)不能擁有兩個相同 ID 的VLAN 子設備,所以也就不可能出現數據交換狀況。
三、Linux Bridge 專門實現交換功能。
將同一 VLAN 的子設備都掛載到一個 Bridge 上,設備之間就能夠交換數據了。
內容源於網絡,整理!