前言
KVM 全称是 Kernel-Based Virtual Machine,基于linux内核的虚拟化技术,现大数据业务需要支持适配云公司国产化ctyunos,这里使用KVM本地模拟虚机交付,记录下使用过程。
KVM架构
一些说明
0,虚拟化是云计算的基础。一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等)做虚拟化、将虚拟化后的整体做为一个可供分割且组合的操作系统。
1,KVM全称是Kernel-Based Virtual Machine。KVM基于Linux内核实现,属于半虚拟化的Hypervisor。KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存,而Qemu则协助提供IO设备半虚拟化,用于虚拟磁盘IO和网络IO等。不过IO设备的虚拟化方向都是往直接透传到宿主机的方向走,比如vhost-net,直接在硬件或内核级别支持。
2,一个 KVM虚机在宿主机中其实是一个qemu-kvm进程。而每个虚机中的vCPU则为宿主机中的一个线程。
3,大名鼎鼎的OpenStack底层也使用Libvirt,Libvirt是KVM的管理工具,还可以管理Xen,VirtualBox等Hypervisor。Libvirt包含3个东西:后台daemon服务libvirtd、API 库和命令行工具 virsh。
4,虚机的vCPU总数可以超过物理CPU数量,这个叫CPU overcommit(超配)。
虚拟化原理
CPU虚拟化
一些说明
1,一个 KVM虚机在宿主机中其实是一个qemu-kvm进程。而每个虚机中的vCPU则为宿主机中的一个线程。
2, KVM 允许CPU overcommit(超配:虚机的vCPU总数可以超过物理CPU数量),适当overcommit虚机能够充分利用宿主机的CPU,过大的负载反而会影响整体性能。
内存虚拟化
影子页面SPT
一些说明
1,影子页表SPT由KVM维护,实际上就是一个 Guest页表到Host页表的映射。直接将GVA转换为HPA。
2,影子页表SPT优点在于当需要访问物理内存的时候,只会经过一层影子页表的转换。而缺点在于需要为Guest的每个进程都维护一个影子页表,这将带来很大的内存开销。同时影子页表的建立是很耗时的,如果 Guest 的进程过多,将导致影子页表频繁切换。
EPT和NPT
一些说明
1,Intel的EPT(Extent Page Table)技术和AMD的 NPT(Nest Page Table)技术都是在硬件层面上实现GVA到HPA之间的转换。采用了在两级页表结构,Guest OS页表维护GVA->GPA,EPT页表来维护GPA->HPA映射。
2,原来是HVA->HPA由HostOS完成的映射由EPT直接完成GPA->HPA,EPTP负责指向EPT。
3,EPT/NPT地址转化直接由硬件(MMU)查页表完成,大大提升了效率,且只需为Guest维护一份EPT页表,减少内存的开销。
VirtIO
QEMU主要负责虚拟设备IO,而QEMU和核心则为VirtIO,VirtIO设计目标是在虚拟化环境下提供与物理设备相近的 I/O 功能和性能,并且避免在虚拟机中安装额外的驱动程序。VirtIO是用半虚拟化,相较于最先QEMU版本的全虚拟化,性能有很大的提升。
模块组成
一些说明
1,VirtIO-Block(块设备):提供虚拟磁盘设备的接口。
2,VirtIO-Net(网络设备):提供虚拟网络设备的接口。
3,VirtIO-Serial(串口设备):提供虚拟串口设备的接口。
4,VirtIO-Memory(内存设备):提供虚拟内存设备的接口。
5,VirtIO-Input(输入设备):提供虚拟输入设备的接口。
6,VirtIO-SCSI、VirtIO-NVMe、VirtIO-GPU、VirtIO-FS、VirtIO-VSock 等等虚拟设备类型和协议。
技术原理
一些说明
1,VirtIO使用前后端架构,包括前端驱动(Guest OS Kernel内部 VirtIO Driver),后端设备(QEMU设备 VirtIO Device),传输协议(vring)。
2,VirtIO 相当于QEMU实现的全虚拟化,因为直接和Hypervisor中的虚拟化设备交互,避免了CPU在VM Exit和VM Entry之间频繁陷入陷出,性能有较大的提升。且提供了一套统一的虚拟设备接口标准。
3,不过当前IO设备虚拟化的方向当前主要往IO透传的方向发展了,绕开QEMU直接对接硬件的虚拟化能力,比如Intel VT-d和SR-IOV,基本能达到宿主机的吞吐能力。
块IO虚拟化
virtio-block块IO虚拟化同样是virtio-x虚拟化的子模块。
一些说明
1,virtio-block的流程需要经过两次IO协议栈,在Guest和Host主机中都要走完整的VFS IO协议栈。
2,官方提供了vhost-blk方案,不过没有合并到主分支,当前方案和vhost-user网络一样,直接走了内核,性能能大大提高,需要的可以了解下,当前业内比较成熟的。
3,业内成熟的虚拟存储IO栈的软件为SPDK(Storage Performance Development Kit),提供了一整套工具和库,以实现高性能、扩展性强、全用户态的存储应用程序,需要的可以了解下。
网络虚拟化
网络虚拟化是虚拟化技术中最复杂的部分。存在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的开销,一定程度上改善了网络IO的性能。vhost-net则为透传方案,相对于virtio-net半虚拟化绕过了QEMU直接在Guest OS和host宿主机之间通信,减少了数据的拷贝,特别是减少了用户态到内核态的拷贝。性能得到大大加强,就吞吐量来说,vhost-net基本能够跑满一台物理机的带宽。
2,生产环境中一般使用DPDK和vDPA结合OVS(Open vSwitch)使用。
管理工具Libvirt
libvirt软件包提供了一个独立于虚拟机监控程序的虚拟化API,可与各种操作系统的虚拟化功能进行交互。
一些说明
1,libvirt主要包括3个部分:应用程序编程接口(API)库、一个守护进程(libvirtd)和一个默认命令行管理工具(virsh)。应用程序编程接口(API)库:为了其他虚拟机管理工具(如virsh、virt-manager等)提供虚拟机管理的程序库支持。libvirtd守护进程:负责执行对节点上的域的管理工作,在用各种工具对虚拟机进行管理之时,这个守护进程一定要处于运行状态中。virsh : libvirt项目中默认的对虚拟机管理的一个命令行工具。
2,一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如 OpenStack、OpenNebula、Eucalyptus 等)都在底层使用 libvirt 的应用程序接口。
创建CtyunOS虚机
这里使用virt-manager创建一个CtyunOS的虚机,用于加深学习印象。
创建CtyunOS虚机
这里使用virt-manager创建一个CtyunOS的虚机,用于加深学习印象。
1,安装KVM
# qemu-kvm -为KVM管理程序提供硬件仿真的软件。
# libvirt-daemon-system -用于将libvirt守护程序作为系统服务运行的配置文件。
# libvirt-clients -用于管理虚拟化平台的软件。
# bridge-utils -一组用于配置以太网桥的命令行工具。
# virtinst -一组用于创建虚拟机的命令行工具。
# virt-manager -易于使用的GUI界面和支持命令行工具,用于通过libvirt管理虚拟机。
# 安装
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
# qemu-kvm创建软链
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
# 查看网络信息,建议用默认的net网络即可
brctl show
2,开通CtyunOS实例
a)打开virt-manager
b)选择对应的安装介质,配置安装的资源
c)设置安装的系统信息
d)安装系统
e)系统安装完成
f)配置网络
# 配置网络
vi /etc/sysconf iq/network-scripts/ifcfg-ens3
# 修改ONBOOT=yes后重启网络
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
# 创建一个虚拟机
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
# 开启和关闭虚拟机 ,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
# 给虚拟机添加硬盘,创建一块 100G 的硬盘
qemu-img create -f qcow2 ctyunsos-100-d1.qcow2 20G
# 创建快照, 不写 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
# 查看虚拟机内存和cpu信息
virsh dommemstat ctyunsos-100
virsh vcpuinfo ctyunsos-100
虚拟机技术发展
虚拟机技术的思想源头来源于1974年7月的论文《Formal Requirements for Virtualizable Third-Generation Architectures》。经过这么多年的发展,从最先开始的全虚拟化,半虚拟化(XEN),硬件辅助虚拟化(Intel VT-X/AMD-V),KVM/VirtualBox/Hyper-V,容器化技术LXC&Docker(cgroup&namespace),到当前的microVM和functions技术(firecracker)。已经有了很大的发展。
一些说明
1,全虚拟化技术,比如QEMU,主要由HyperVisor将虚拟机的命令翻译成宿主机上能执行的命令,性能很差。
2,半虚拟化技术,比如Xen,在内核加一些接口,接受虚拟机传入内核接口命令,功能和风险较大,需要修改内核。
3,硬件辅助虚拟化技术,最有效的有KVM/Hyper-V,使用Intel VT-X/AMD-V技术CPU直接接收虚拟机的命令,避免的解释和翻译命令的过程,性能大大提高。
4,容器化技术,比如Docker,在微服务的发展下,不需要像KVM一样虚拟化出一个有操作系统,有IO等设备的完整机器,基于Cgroups和namespace,隔离出一个独立的操作系统和网络环境,给应用提供简约的运行环境,虚拟化成本大大减少,提供更轻量级的虚拟化方案。
5,超轻虚拟化技术,比如firecracker,在基于KVM和VirtIO,构建MicroVM Zone。提供毫秒级的VM创建速度,是一个更精简、更安全、更现代化的虚拟化技术方向。
总结
1,虚拟化技术的发展,大大推动了云技术的进步。
2,虚拟化技术从论文《Formal Requirements for Virtualizable Third-Generation Architectures》到现在的serverless以及firecracker代表的microVMs技术,越来越往功能化,小型简单化,高安全,低成本的方向发展了。
3,从云计算的角度来看,kvm虚拟技术属于IaaS层的产品,给客户提供完整一套基础设施,客户可以用这个kvm虚机做任何事情,而代表LXC的Docker容器技术则属于PaaS层的产品,为特定的软件服务提供特定的服务,比如MySQL images,而这个MySQL images容器只能用于MySQL服务,而不能再这个容器里面在用于跑其他的服务,比如Redis。