前言
KVM 全稱是 Kernel-Based Virtual Machine钻蔑,基于linux內(nèi)核的虛擬化技術(shù)晴弃,現(xiàn)大數(shù)據(jù)業(yè)務需要支持適配云公司國產(chǎn)化ctyunos苛茂,這里使用KVM本地模擬虛機交付筛谚,記錄下使用過程捻脖。
KVM架構(gòu)
一些說明
0锐峭,虛擬化是云計算的基礎(chǔ)中鼠。一種資源管理技術(shù),是將計算機的各種實體資源(CPU只祠、內(nèi)存兜蠕、磁盤空間、網(wǎng)絡適配器等)做虛擬化抛寝、將虛擬化后的整體做為一個可供分割且組合的操作系統(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設備半虛擬化,用于虛擬磁盤IO和網(wǎng)絡IO等蛮位。不過IO設備的虛擬化方向都是往直接透傳到宿主機的方向走较沪,比如vhost-net,直接在硬件或內(nèi)核級別支持失仁。
2尸曼,一個 KVM虛機在宿主機中其實是一個qemu-kvm進程。而每個虛機中的vCPU則為宿主機中的一個線程萄焦。
3控轿,大名鼎鼎的OpenStack底層也使用Libvirt,Libvirt是KVM的管理工具拂封,還可以管理Xen茬射,VirtualBox等Hypervisor。Libvirt包含3個東西:后臺daemon服務libvirtd冒签、API 庫和命令行工具 virsh在抛。
4,虛機的vCPU總數(shù)可以超過物理CPU數(shù)量萧恕,這個叫CPU overcommit(超配)霜定。
虛擬化原理
CPU虛擬化
一些說明
1,一個 KVM虛機在宿主機中其實是一個qemu-kvm進程廊鸥。而每個虛機中的vCPU則為宿主機中的一個線程。
2辖所, KVM 允許CPU overcommit(超配:虛機的vCPU總數(shù)可以超過物理CPU數(shù)量)惰说,適當overcommit虛機能夠充分利用宿主機的CPU,過大的負載反而會影響整體性能缘回。
內(nèi)存虛擬化
影子頁面SPT
一些說明
1吆视,影子頁表SPT由KVM維護典挑,實際上就是一個 Guest頁表到Host頁表的映射。直接將GVA轉(zhuǎn)換為HPA啦吧。
2您觉,影子頁表SPT優(yōu)點在于當需要訪問物理內(nèi)存的時候,只會經(jīng)過一層影子頁表的轉(zhuǎn)換授滓。而缺點在于需要為Guest的每個進程都維護一個影子頁表琳水,這將帶來很大的內(nèi)存開銷。同時影子頁表的建立是很耗時的般堆,如果 Guest 的進程過多在孝,將導致影子頁表頻繁切換。
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負責指向EPT晰搀。
3,EPT/NPT地址轉(zhuǎn)化直接由硬件(MMU)查頁表完成仆百,大大提升了效率厕隧,且只需為Guest維護一份EPT頁表,減少內(nèi)存的開銷俄周。
VirtIO
QEMU主要負責虛擬設備IO吁讨,而QEMU和核心則為VirtIO,VirtIO設計目標是在虛擬化環(huán)境下提供與物理設備相近的 I/O 功能和性能峦朗,并且避免在虛擬機中安裝額外的驅(qū)動程序建丧。VirtIO是用半虛擬化,相較于最先QEMU版本的全虛擬化波势,性能有很大的提升翎朱。
模塊組成
一些說明
1,VirtIO-Block(塊設備):提供虛擬磁盤設備的接口尺铣。
2拴曲,VirtIO-Net(網(wǎng)絡設備):提供虛擬網(wǎng)絡設備的接口。
3凛忿,VirtIO-Serial(串口設備):提供虛擬串口設備的接口澈灼。
4,VirtIO-Memory(內(nèi)存設備):提供虛擬內(nèi)存設備的接口。
5叁熔,VirtIO-Input(輸入設備):提供虛擬輸入設備的接口委乌。
6,VirtIO-SCSI荣回、VirtIO-NVMe遭贸、VirtIO-GPU、VirtIO-FS心软、VirtIO-VSock 等等虛擬設備類型和協(xié)議壕吹。
技術(shù)原理
一些說明
1,VirtIO使用前后端架構(gòu)糯累,包括前端驅(qū)動(Guest OS Kernel內(nèi)部 VirtIO Driver)入问,后端設備(QEMU設備 VirtIO Device)逢慌,傳輸協(xié)議(vring)桥氏。
2匆篓,VirtIO 相當于QEMU實現(xiàn)的全虛擬化,因為直接和Hypervisor中的虛擬化設備交互胖秒,避免了CPU在VM Exit和VM Entry之間頻繁陷入陷出缎患,性能有較大的提升。且提供了一套統(tǒng)一的虛擬設備接口標準阎肝。
3挤渔,不過當前IO設備虛擬化的方向當前主要往IO透傳的方向發(fā)展了,繞開QEMU直接對接硬件的虛擬化能力风题,比如Intel VT-d和SR-IOV判导,基本能達到宿主機的吞吐能力。
塊IO虛擬化
virtio-block塊IO虛擬化同樣是virtio-x虛擬化的子模塊沛硅。
一些說明
1眼刃,virtio-block的流程需要經(jīng)過兩次IO協(xié)議棧,在Guest和Host主機中都要走完整的VFS IO協(xié)議棧摇肌。
2擂红,官方提供了vhost-blk方案,不過沒有合并到主分支围小,當前方案和vhost-user網(wǎng)絡一樣昵骤,直接走了內(nèi)核,性能能大大提高肯适,需要的可以了解下变秦,當前業(yè)內(nèi)比較成熟的。
3框舔,業(yè)內(nèi)成熟的虛擬存儲IO棧的軟件為SPDK(Storage Performance Development Kit)伴栓,提供了一整套工具和庫,以實現(xiàn)高性能、擴展性強钳垮、全用戶態(tài)的存儲應用程序,需要的可以了解下额港。
網(wǎng)絡虛擬化
網(wǎng)絡虛擬化是虛擬化技術(shù)中最復雜的部分饺窿。存在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)絡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個部分:應用程序編程接口(API)庫、一個守護進程(libvirtd)和一個默認命令行管理工具(virsh)背镇。應用程序編程接口(API)庫:為了其他虛擬機管理工具(如virsh咬展、virt-manager等)提供虛擬機管理的程序庫支持。libvirtd守護進程:負責執(zhí)行對節(jié)點上的域的管理工作瞒斩,在用各種工具對虛擬機進行管理之時破婆,這個守護進程一定要處于運行狀態(tài)中。virsh : libvirt項目中默認的對虛擬機管理的一個命令行工具胸囱。
2祷舀,一些常用的虛擬機管理工具(如virsh、virt-install、virt-manager等)和云計算框架平臺(如 OpenStack裳扯、OpenNebula抛丽、Eucalyptus 等)都在底層使用 libvirt 的應用程序接口。
創(chuàng)建CtyunOS虛機
這里使用virt-manager創(chuàng)建一個CtyunOS的虛機饰豺,用于加深學習印象亿鲜。
創(chuàng)建CtyunOS虛機
這里使用virt-manager創(chuàng)建一個CtyunOS的虛機,用于加深學習印象冤吨。
1蒿柳,安裝KVM
# qemu-kvm -為KVM管理程序提供硬件仿真的軟件。
# libvirt-daemon-system -用于將libvirt守護程序作為系統(tǒng)服務運行的配置文件漩蟆。
# 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)絡信息扔仓,建議用默認的net網(wǎng)絡即可
brctl show
2褐奥,開通CtyunOS實例
a)打開virt-manager
b)選擇對應的安裝介質(zhì),配置安裝的資源
c)設置安裝的系統(tǒng)信息
d)安裝系統(tǒng)
e)系統(tǒng)安裝完成
f)配置網(wǎng)絡
# 配置網(wǎng)絡
vi /etc/sysconf iq/network-scripts/ifcfg-ens3
# 修改ONBOOT=yes后重啟網(wǎng)絡
systemctl restart network
# 安裝sshd
yum install -y initscripts openssh-server openssl openssl-devel
service sshd restart
ss -tan
# 查看虛機ip,當然也可以到wirt-manager的虛機詳情nic頁面查看
virsh domiffadr ctyunos-test
安裝配置配置好sshd服務后翘簇,即可愉快玩耍ctyunos虛擬機了撬码。
常用命令
# virsh 查看幫助命令
virsh help | grep dom*
# 查看當前運行的虛擬機
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
# 掛起/恢復虛擬機
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)森篷,到當前的microVM和functions技術(shù)(firecracker)输钩。已經(jīng)有了很大的發(fā)展。
一些說明
1仲智,全虛擬化技術(shù)买乃,比如QEMU,主要由HyperVisor將虛擬機的命令翻譯成宿主機上能執(zhí)行的命令钓辆,性能很差剪验。
2肴焊,半虛擬化技術(shù),比如Xen功戚,在內(nèi)核加一些接口娶眷,接受虛擬機傳入內(nèi)核接口命令,功能和風險較大疫铜,需要修改內(nèi)核茂浮。
3,硬件輔助虛擬化技術(shù)壳咕,最有效的有KVM/Hyper-V,使用Intel VT-X/AMD-V技術(shù)CPU直接接收虛擬機的命令顽馋,避免的解釋和翻譯命令的過程谓厘,性能大大提高。
4寸谜,容器化技術(shù)竟稳,比如Docker,在微服務的發(fā)展下熊痴,不需要像KVM一樣虛擬化出一個有操作系統(tǒng)他爸,有IO等設備的完整機器,基于Cgroups和namespace果善,隔離出一個獨立的操作系統(tǒng)和網(wǎng)絡環(huán)境诊笤,給應用提供簡約的運行環(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ǔ)設施冗栗,客戶可以用這個kvm虛機做任何事情,而代表LXC的Docker容器技術(shù)則屬于PaaS層的產(chǎn)品供搀,為特定的軟件服務提供特定的服務隅居,比如MySQL images,而這個MySQL images容器只能用于MySQL服務葛虐,而不能再這個容器里面在用于跑其他的服務胎源,比如Redis。