前言
KVM 全稱是 Kernel-Based Virtual Machine,基于linux內(nèi)核的虛擬化技術(shù),現(xiàn)大數(shù)據(jù)業(yè)務(wù)需要支持適配云公司國產(chǎn)化ctyunos,這里使用KVM本地模擬虛機交付,記錄下使用過程。
KVM架構(gòu)

一些說明
0,虛擬化是云計算的基礎(chǔ)。一種資源管理技術(shù),是將計算機的各種實體資源(CPU、內(nèi)存、磁盤空間、網(wǎng)絡(luò)適配器等)做虛擬化、將虛擬化后的整體做為一個可供分割且組合的操作系統(tǒng)。
1,KVM全稱是Kernel-Based Virtual Machine。KVM基于Linux內(nèi)核實現(xiàn),屬于半虛擬化的Hypervisor。KVM有一個內(nèi)核模塊叫 kvm.ko,只用于管理虛擬 CPU 和內(nèi)存,而Qemu則協(xié)助提供IO設(shè)備半虛擬化,用于虛擬磁盤IO和網(wǎng)絡(luò)IO等。不過IO設(shè)備的虛擬化方向都是往直接透傳到宿主機的方向走,比如vhost-net,直接在硬件或內(nèi)核級別支持。
2,一個 KVM虛機在宿主機中其實是一個qemu-kvm進程。而每個虛機中的vCPU則為宿主機中的一個線程。
3,大名鼎鼎的OpenStack底層也使用Libvirt,Libvirt是KVM的管理工具,還可以管理Xen,VirtualBox等Hypervisor。Libvirt包含3個東西:后臺daemon服務(wù)libvirtd、API 庫和命令行工具 virsh。
4,虛機的vCPU總數(shù)可以超過物理CPU數(shù)量,這個叫CPU overcommit(超配)。
虛擬化原理
CPU虛擬化

一些說明
1,一個 KVM虛機在宿主機中其實是一個qemu-kvm進程。而每個虛機中的vCPU則為宿主機中的一個線程。
2, KVM 允許CPU overcommit(超配:虛機的vCPU總數(shù)可以超過物理CPU數(shù)量),適當(dāng)overcommit虛機能夠充分利用宿主機的CPU,過大的負(fù)載反而會影響整體性能。
內(nèi)存虛擬化
影子頁面SPT

一些說明
1,影子頁表SPT由KVM維護,實際上就是一個 Guest頁表到Host頁表的映射。直接將GVA轉(zhuǎn)換為HPA。
2,影子頁表SPT優(yōu)點在于當(dāng)需要訪問物理內(nèi)存的時候,只會經(jīng)過一層影子頁表的轉(zhuǎn)換。而缺點在于需要為Guest的每個進程都維護一個影子頁表,這將帶來很大的內(nèi)存開銷。同時影子頁表的建立是很耗時的,如果 Guest 的進程過多,將導(dǎo)致影子頁表頻繁切換。
EPT和NPT

一些說明
1,Intel的EPT(Extent Page Table)技術(shù)和AMD的 NPT(Nest Page Table)技術(shù)都是在硬件層面上實現(xiàn)GVA到HPA之間的轉(zhuǎn)換。采用了在兩級頁表結(jié)構(gòu),Guest OS頁表維護GVA->GPA,EPT頁表來維護GPA->HPA映射。
2,原來是HVA->HPA由HostOS完成的映射由EPT直接完成GPA->HPA,EPTP負(fù)責(zé)指向EPT。
3,EPT/NPT地址轉(zhuǎn)化直接由硬件(MMU)查頁表完成,大大提升了效率,且只需為Guest維護一份EPT頁表,減少內(nèi)存的開銷。
VirtIO
QEMU主要負(fù)責(zé)虛擬設(shè)備IO,而QEMU和核心則為VirtIO,VirtIO設(shè)計目標(biāo)是在虛擬化環(huán)境下提供與物理設(shè)備相近的 I/O 功能和性能,并且避免在虛擬機中安裝額外的驅(qū)動程序。VirtIO是用半虛擬化,相較于最先QEMU版本的全虛擬化,性能有很大的提升。
模塊組成

一些說明
1,VirtIO-Block(塊設(shè)備):提供虛擬磁盤設(shè)備的接口。
2,VirtIO-Net(網(wǎng)絡(luò)設(shè)備):提供虛擬網(wǎng)絡(luò)設(shè)備的接口。
3,VirtIO-Serial(串口設(shè)備):提供虛擬串口設(shè)備的接口。
4,VirtIO-Memory(內(nèi)存設(shè)備):提供虛擬內(nèi)存設(shè)備的接口。
5,VirtIO-Input(輸入設(shè)備):提供虛擬輸入設(shè)備的接口。
6,VirtIO-SCSI、VirtIO-NVMe、VirtIO-GPU、VirtIO-FS、VirtIO-VSock 等等虛擬設(shè)備類型和協(xié)議。
技術(shù)原理

一些說明
1,VirtIO使用前后端架構(gòu),包括前端驅(qū)動(Guest OS Kernel內(nèi)部 VirtIO Driver),后端設(shè)備(QEMU設(shè)備 VirtIO Device),傳輸協(xié)議(vring)。
2,VirtIO 相當(dāng)于QEMU實現(xiàn)的全虛擬化,因為直接和Hypervisor中的虛擬化設(shè)備交互,避免了CPU在VM Exit和VM Entry之間頻繁陷入陷出,性能有較大的提升。且提供了一套統(tǒng)一的虛擬設(shè)備接口標(biāo)準(zhǔn)。
3,不過當(dāng)前IO設(shè)備虛擬化的方向當(dāng)前主要往IO透傳的方向發(fā)展了,繞開QEMU直接對接硬件的虛擬化能力,比如Intel VT-d和SR-IOV,基本能達(dá)到宿主機的吞吐能力。
塊IO虛擬化
virtio-block塊IO虛擬化同樣是virtio-x虛擬化的子模塊。

一些說明
1,virtio-block的流程需要經(jīng)過兩次IO協(xié)議棧,在Guest和Host主機中都要走完整的VFS IO協(xié)議棧。
2,官方提供了vhost-blk方案,不過沒有合并到主分支,當(dāng)前方案和vhost-user網(wǎng)絡(luò)一樣,直接走了內(nèi)核,性能能大大提高,需要的可以了解下,當(dāng)前業(yè)內(nèi)比較成熟的。
3,業(yè)內(nèi)成熟的虛擬存儲IO棧的軟件為SPDK(Storage Performance Development Kit),提供了一整套工具和庫,以實現(xiàn)高性能、擴展性強、全用戶態(tài)的存儲應(yīng)用程序,需要的可以了解下。
網(wǎng)絡(luò)虛擬化
網(wǎng)絡(luò)虛擬化是虛擬化技術(shù)中最復(fù)雜的部分。存在virtio-net,vhost-net,vhost-user+DPDK,vDPA等方案。這里只簡單說下virtio-net(半虛擬化),vhost-net(透傳)。


一些說明
1,virtio-net為半虛擬化方案,相對于qemu的全虛擬化,virtio-net通過在Guest OS的VirtIO Net Driver層引入了vring與qemu-kvm層VirtIO Net Device進行通信,降低了VM exit和VM entry的開銷,一定程度上改善了網(wǎng)絡(luò)IO的性能。vhost-net則為透傳方案,相對于virtio-net半虛擬化繞過了QEMU直接在Guest OS和host宿主機之間通信,減少了數(shù)據(jù)的拷貝,特別是減少了用戶態(tài)到內(nèi)核態(tài)的拷貝。性能得到大大加強,就吞吐量來說,vhost-net基本能夠跑滿一臺物理機的帶寬。
2,生產(chǎn)環(huán)境中一般使用DPDK和vDPA結(jié)合OVS(Open vSwitch)使用。
管理工具Libvirt
libvirt軟件包提供了一個獨立于虛擬機監(jiān)控程序的虛擬化API,可與各種操作系統(tǒng)的虛擬化功能進行交互。


一些說明
1,libvirt主要包括3個部分:應(yīng)用程序編程接口(API)庫、一個守護進程(libvirtd)和一個默認(rèn)命令行管理工具(virsh)。應(yīng)用程序編程接口(API)庫:為了其他虛擬機管理工具(如virsh、virt-manager等)提供虛擬機管理的程序庫支持。libvirtd守護進程:負(fù)責(zé)執(zhí)行對節(jié)點上的域的管理工作,在用各種工具對虛擬機進行管理之時,這個守護進程一定要處于運行狀態(tài)中。virsh : libvirt項目中默認(rèn)的對虛擬機管理的一個命令行工具。
2,一些常用的虛擬機管理工具(如virsh、virt-install、virt-manager等)和云計算框架平臺(如 OpenStack、OpenNebula、Eucalyptus 等)都在底層使用 libvirt 的應(yīng)用程序接口。
創(chuàng)建CtyunOS虛機
這里使用virt-manager創(chuàng)建一個CtyunOS的虛機,用于加深學(xué)習(xí)印象。
創(chuàng)建CtyunOS虛機
這里使用virt-manager創(chuàng)建一個CtyunOS的虛機,用于加深學(xué)習(xí)印象。
1,安裝KVM
# qemu-kvm -為KVM管理程序提供硬件仿真的軟件。
# libvirt-daemon-system -用于將libvirt守護程序作為系統(tǒng)服務(wù)運行的配置文件。
# libvirt-clients -用于管理虛擬化平臺的軟件。
# bridge-utils -一組用于配置以太網(wǎng)橋的命令行工具。
# virtinst -一組用于創(chuàng)建虛擬機的命令行工具。
# virt-manager -易于使用的GUI界面和支持命令行工具,用于通過libvirt管理虛擬機。
# 安裝
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
# qemu-kvm創(chuàng)建軟鏈
sudo ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu-kvm
# libvirtd是否啟動
sudo systemctl is-active libvirtd active
# 啟動libvirtd
sudo systemctl start libvirtd.service
# 查看網(wǎng)絡(luò)信息,建議用默認(rèn)的net網(wǎng)絡(luò)即可
brctl show
2,開通CtyunOS實例
a)打開virt-manager

b)選擇對應(yīng)的安裝介質(zhì),配置安裝的資源


c)設(shè)置安裝的系統(tǒng)信息

d)安裝系統(tǒng)

e)系統(tǒng)安裝完成

f)配置網(wǎng)絡(luò)

# 配置網(wǎng)絡(luò)
vi /etc/sysconf iq/network-scripts/ifcfg-ens3
# 修改ONBOOT=yes后重啟網(wǎng)絡(luò)
systemctl restart network
# 安裝sshd
yum install -y initscripts openssh-server openssl openssl-devel
service sshd restart
ss -tan
# 查看虛機ip,當(dāng)然也可以到wirt-manager的虛機詳情nic頁面查看
virsh domiffadr ctyunos-test
安裝配置配置好sshd服務(wù)后,即可愉快玩耍ctyunos虛擬機了。
常用命令
# virsh 查看幫助命令
virsh help | grep dom*
# 查看當(dāng)前運行的虛擬機
virsh list
virsh list --all
# 創(chuàng)建一個虛擬機
sudo virt-install --virt-type kvm --name ctyunsos-100 --ram 2048 \
--disk /var/lib/libvirt/images/ctyunsos-100.qcow2,format=qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux --os-variant=ctyunsos2.0.1 \
--location=/data/kvm/images/ctyunos-2.0.1-220311-x86_64-dvd.iso
# 開啟和關(guān)閉虛擬機 ,ctyunsos-100 是虛擬機名字
virsh start ctyunsos-100
virsh shutdown ctyunsos-100
# 進入查看虛擬機
virt-viewer ctyunsos-100
# libvirtd 啟動時自動啟動虛擬機
virsh autostart ctyunsos-100
# 禁止虛擬機開機啟動
virsh autostart --disable ctyunsos-100
# 查看虛擬機IP
virsh domifaddr ctyunsos-100
# 掛起/恢復(fù)虛擬機
virsh suspend ctyunsos-100
virsh resume ctyunsos-100
# 查看虛擬機信息
virsh dominfo ctyunsos-100
# 軟重啟虛擬機
virsh reboot ctyunsos-100
# 硬重啟虛擬機
virsh reset ctyunsos-100
# 銷毀擬機,會刪除虛擬機配置文件,但不會刪除虛擬磁盤
virsh undefine ctyunsos-100
# 編輯虛擬機配置文件
virsh edit ctyunsos-100
# 給虛擬機添加硬盤,創(chuàng)建一塊 100G 的硬盤
qemu-img create -f qcow2 ctyunsos-100-d1.qcow2 20G
# 創(chuàng)建快照, 不寫 name 自動按時間生成
virsh snapshot-create-as --domain ctyunsos-100 --name snapshot01-ctyunsos-100 --description "ctyunsos-100 snapshot"
# 查看快照
virsh snapshot-list ctyunsos-100
# 回滾快照
## 回滾名稱位 snap-vm-ubuntu 的快照
virsh snapshot-revert --domain vm-ubuntu snapshot01-ctyunsos-100
## 回滾最新版快照
virsh snapshot-revert --domain ctyunsos-100 --current
# clone一個虛擬機
virt-clone --original=ctyunsos-100 --name=ctyunsos-100-new --file=/var/lib/libvirt/images/ctyunsos-100-new.qcow2
# 查看虛擬機內(nèi)存和cpu信息
virsh dommemstat ctyunsos-100
virsh vcpuinfo ctyunsos-100
虛擬機技術(shù)發(fā)展
虛擬機技術(shù)的思想源頭來源于1974年7月的論文《Formal Requirements for Virtualizable Third-Generation Architectures》。經(jīng)過這么多年的發(fā)展,從最先開始的全虛擬化,半虛擬化(XEN),硬件輔助虛擬化(Intel VT-X/AMD-V),KVM/VirtualBox/Hyper-V,容器化技術(shù)LXC&Docker(cgroup&namespace),到當(dāng)前的microVM和functions技術(shù)(firecracker)。已經(jīng)有了很大的發(fā)展。

一些說明
1,全虛擬化技術(shù),比如QEMU,主要由HyperVisor將虛擬機的命令翻譯成宿主機上能執(zhí)行的命令,性能很差。
2,半虛擬化技術(shù),比如Xen,在內(nèi)核加一些接口,接受虛擬機傳入內(nèi)核接口命令,功能和風(fēng)險較大,需要修改內(nèi)核。
3,硬件輔助虛擬化技術(shù),最有效的有KVM/Hyper-V,使用Intel VT-X/AMD-V技術(shù)CPU直接接收虛擬機的命令,避免的解釋和翻譯命令的過程,性能大大提高。
4,容器化技術(shù),比如Docker,在微服務(wù)的發(fā)展下,不需要像KVM一樣虛擬化出一個有操作系統(tǒng),有IO等設(shè)備的完整機器,基于Cgroups和namespace,隔離出一個獨立的操作系統(tǒng)和網(wǎng)絡(luò)環(huán)境,給應(yīng)用提供簡約的運行環(huán)境,虛擬化成本大大減少,提供更輕量級的虛擬化方案。
5,超輕虛擬化技術(shù),比如firecracker,在基于KVM和VirtIO,構(gòu)建MicroVM Zone。提供毫秒級的VM創(chuàng)建速度,是一個更精簡、更安全、更現(xiàn)代化的虛擬化技術(shù)方向。
總結(jié)
1,虛擬化技術(shù)的發(fā)展,大大推動了云技術(shù)的進步。
2,虛擬化技術(shù)從論文《Formal Requirements for Virtualizable Third-Generation Architectures》到現(xiàn)在的serverless以及firecracker代表的microVMs技術(shù),越來越往功能化,小型簡單化,高安全,低成本的方向發(fā)展了。
3,從云計算的角度來看,kvm虛擬技術(shù)屬于IaaS層的產(chǎn)品,給客戶提供完整一套基礎(chǔ)設(shè)施,客戶可以用這個kvm虛機做任何事情,而代表LXC的Docker容器技術(shù)則屬于PaaS層的產(chǎn)品,為特定的軟件服務(wù)提供特定的服務(wù),比如MySQL images,而這個MySQL images容器只能用于MySQL服務(wù),而不能再這個容器里面在用于跑其他的服務(wù),比如Redis。