标签(空格分隔): KVM网络
本文不介绍kvm和qemu的基本安装操做,但愿读者具备必定的KVM实践经验。同时但愿借此系列博客,可以对KVM底层有一些清晰直观的认识,固然我没有通读KVM的源码,文中的内容一部分来自于书籍和资料,一部分来自于实践,还有一些来自于本身的理解,确定会有一些理解的误差,欢迎讨论并指正。本系列文章敬表明我我的观点和实践,不表明公司层面。架构
KVM 全称 kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。
KVM实现主要基于Intel-V或者AMD-V提供的虚拟化平台,利用普通的Linux进程运行于虚拟态的指令集,模拟虚拟机监视器和CPU。KVM不提供硬件虚拟化操做,其IO操做等都借助QEMU来完成。优化
KVM有以下特色:线程
每个虚拟机(guest)在Host上都被模拟为一个QEMU进程,即emulation进程。
咱们建立一个虚拟机后,用普通的ps 命令就能够查看到。3d
➜ ~ virsh list --all Id Name State ---------------------------------------------------- 1 kvm-01 running ➜ ~ ps aux | grep qemu libvirt+ 20308 15.1 7.5 5023928 595884 ? Sl 17:29 0:10 /usr/bin/qemu-system-x86_64 -name kvm-01 -S -machine pc-i440fx-wily,accel=kvm,usb=off -m 2048 -realtime mlock=off -smp 2 qemu ....
能够看到,此虚拟机就是一个普通的Linux进程,他有本身的pid。而且有四个线程,线程数量不是固定的,可是至少会有三个(vCPU,IO,Signal)。其中有两个是vCPU线程,有一个IO线程还有一个信号处理线程。code
➜ ~ pstree -p 20308 qemu-system-x86(20308)-+-{qemu-system-x86}(20353) |-{qemu-system-x86}(20408) |-{qemu-system-x86}(20409) |-{qemu-system-x86}(20412)
guest的全部用户级别(user)的指令集,都会直接由宿主机线程执行,此线程会调用KVM的ioctl方式提供的接口加载guest的指令并在特殊的CPU模式下运行,不须要通过CPU指令集的软件模拟转换,大大的减小了虚拟化成本,这也是KVM优于其余虚拟化方式的点之一。blog
KVM向外提供了一个虚拟设备/dev/kvm,经过ioctl(IO设备带外管理接口)来对KVM进行操做,包括虚拟机的初始化,分配内存,指令加载等等。继承
guest做为一个进程存在,固然他的内核的全部驱动等都存在,只是硬件被QEMU所模拟(后面介绍virtio的时候特殊)。guest的全部硬件操做都会有QEMU来接管,QEMU负责与真实的宿主机硬件打交道。接口
guest的内存在host上由emulator提供,对emulator来讲,guest访问的内存就是他的虚拟地址空间,guest上须要通过一次虚拟地址到物理地址的转换,转换到guest的物理地址其实也就是emulator的虚拟地址,emulator再次通过一次转换,转换为host的物理地址。后面会有介绍各类虚拟化的优化手段,这里只是作一个overview。进程