目录
本文是梳理之前的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的辅在内核中完成的
两类:
/dev/kvm:工作于hypervisior,在用户(guest)空间可通过ioctl()请求来实现系统调用,来完成vm的创建,启动等功能,他是一个字符设备;/dev/kvm的功能:创建vm,为vm分配内存,读写vcpu的寄存器,向vcpu注入中断,运行vcpu等;vcpu是由host的线程模拟实现的
qemu进程:工作于用户空间,主要用于实现模拟PC机的IO设备。
大页表作用:
每个进程拿到的内存空间,进程的线性地址空间由内核离散映射到物理内存上,某个进程需要在CPU运行时,进程告诉CPU的是线性地址,(CPU将内核分配给进程的taskstruct装载映射表,然后找到线性地址对应的物理内存,)MMU来计算并完成线性地址到物理地址的转换。MMU中存放的是页表,对应关系
如果频繁访问某一个数据,需要在MMU之前加一个缓存,在MMU转换之前先看缓存是否可以命中,当数据量很大的时候,缓存可能失效,因此系统调优有这样一个策略,调大页框大小,一个页框1M,这样相比之前的4K来说,这样存放的条目就变少了,MMU转换时,找的比较容易。
取决于linux内核,因为kvm是基于内核的虚拟化
支持本地存储、网络附加存储(比如映像文件放在NAS上)、存储区域网络、分布式存储、
当A机的硬件设备遭入侵或其他影响时,运行在hypervisior A 上的虚拟机能够实时迁移到hypervisior B上面。此过程依赖于共享存储
linux,windows,openssd,freebsd等很多操作系统;
linux有两套时钟,一个是硬件时钟,一个是根据CPU使用频率来做精确计时,比如1s内震荡2G次,就认为这是1S过去了。由于做了虚拟化,一个CPU可能给多个虚拟机使用,因此1S内走过的时间可能并不是CPU真正走过的时间,所以虚拟机的时钟可能于宿主机不同
比如安装vmware时有vmware tools来同步虚拟机时间和硬件时间
| 性能占原来的多少 | 完全虚拟化(模拟) | 半虚拟化 | 透传 |
| CPU | 93% | 97% | 不支持透传 |
| 磁盘IO | 40% | 85% | 95% |
| 网络IO | 60% | 75% | 95% |
| 显卡 | 50% | 不支持,centos7可以了 | 不支持透传 |
| 时间计时 | 5%偏差 | 精确(有一个特殊模块支持时间同步) | 不支持透传 |
kvm属于完全虚拟化
qemu:
qemu-kvm qemu-img
libvirt:支持远程管理操作
| libvirt | 安装工具 | 管理工具 |
| GUI | virt-manager | virt-viewer |
| CLI | virt-install | virsh |