目录
本文是梳理之前的KVM学习笔记,如果有说的不合适的地方,欢迎评论区提出~
KVM是什么呢
KVM是内核级别虚拟化,支持广泛的操作系统。
在KVM架构中,每个虚拟机都是一个linux进程,每个虚拟的CPU都显示为一个常规的linux进程。但是KVM本身不执行任何模拟,需要用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向他提供模拟的IO,并将它的视频显示映射到宿主的显示屏上,这一部分由qemu负责。
kernal based virtual machine 基于内核的虚拟机,是linux内核的一个模块,当kvm被装载至内核时,整个内核升级为hypervisior,因此linux内核的功能kvm几乎都可以使用。为了给每个虚拟机虚拟出多个CPU,KVM会虚拟出多个进程(2个CPU有两个进程)来实现虚拟的CPU,这一过程是受KVM的辅在内核中完成的
kvm的组件:
两类:
/dev/kvm:工作于hypervisior,在用户(guest)空间可通过ioctl()请求来实现系统调用,来完成vm的创建,启动等功能,他是一个字符设备;/dev/kvm的功能:创建vm,为vm分配内存,读写vcpu的寄存器,向vcpu注入中断,运行vcpu等;vcpu是由host的线程模拟实现的
qemu进程:工作于用户空间,主要用于实现模拟PC机的IO设备。
kvm功能特性:
内存管理:
- 支持使用huge page
大页表作用:
每个进程拿到的内存空间,进程的线性地址空间由内核离散映射到物理内存上,某个进程需要在CPU运行时,进程告诉CPU的是线性地址,(CPU将内核分配给进程的taskstruct装载映射表,然后找到线性地址对应的物理内存,)MMU来计算并完成线性地址到物理地址的转换。MMU中存放的是页表,对应关系
如果频繁访问某一个数据,需要在MMU之前加一个缓存,在MMU转换之前先看缓存是否可以命中,当数据量很大的时候,缓存可能失效,因此系统调优有这样一个策略,调大页框大小,一个页框1M,这样相比之前的4K来说,这样存放的条目就变少了,MMU转换时,找的比较容易。
- 支持使用因特尔扩展页表inter ept或amd rvi(快速虚拟化索引)技术来完成内存地址映射,直接从虚拟机的线性地址空间映射为物理机内核中地址空间,无需中间经过虚拟的内存地址空间转换,CPU利用率低,吞吐量高。
- 支持KSM(kernal same-page merge),来降低内存占用
- KSM:内核同页合并;KSM会扫描每个虚机的内存,如果虚机拥有相同的内存页面,KSM会将这些页面合并到一个共享的内面,所有虚机都可以访问,仅仅存储一个副本,如果要更改这个共享页面,你会得到自己的专用副本。
硬件支持:
取决于linux内核,因为kvm是基于内核的虚拟化
存储:
支持本地存储、网络附加存储(比如映像文件放在NAS上)、存储区域网络、分布式存储、
实时迁移:
当A机的硬件设备遭入侵或其他影响时,运行在hypervisior A 上的虚拟机能够实时迁移到hypervisior B上面。此过程依赖于共享存储
支持的GuestOS:
linux,windows,openssd,freebsd等很多操作系统;
kvm局限性:
- 过载使用:一般不建议所有虚拟机核心数加起来超过物理机核心数,假如物理机核心32个,一个虚拟机2核,那么不要超过16个虚拟机
- 时间记录难以同步:因此装好虚拟机后最好手动同步一下时间
linux有两套时钟,一个是硬件时钟,一个是根据CPU使用频率来做精确计时,比如1s内震荡2G次,就认为这是1S过去了。由于做了虚拟化,一个CPU可能给多个虚拟机使用,因此1S内走过的时间可能并不是CPU真正走过的时间,所以虚拟机的时钟可能于宿主机不同
比如安装vmware时有vmware tools来同步虚拟机时间和硬件时间
- 实时迁移:有一定要求,目标KVM要兼容源KVM;两台主机共享存储必须挂在同一个位置,否则配置文件无法共享;CPU有相同类型的特性,比如同intel,同amd;两台物理主机时间同步,且有一致的网络配置。
- 性能局限性:
性能占原来的多少 | 完全虚拟化(模拟) | 半虚拟化 | 透传 |
CPU | 93% | 97% | 不支持透传 |
磁盘IO | 40% | 85% | 95% |
网络IO | 60% | 75% | 95% |
显卡 | 50% | 不支持,centos7可以了 | 不支持透传 |
时间计时 | 5%偏差 | 精确(有一个特殊模块支持时间同步) | 不支持透传 |
kvm属于完全虚拟化
kvm管理工具:
qemu:
qemu-kvm qemu-img
libvirt:支持远程管理操作
libvirt | 安装工具 | 管理工具 |
GUI | virt-manager | virt-viewer |
CLI | virt-install | virsh |