kvm虚拟化技术实现原理
一、 虚拟化技术
- 虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。
物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)
1、虚拟化技术的分类:
(1) 模拟:Emulation
Qemu, PearPC, Bochs, ...
(2) 完全虚拟化:Full Virtualization,Native Virtualization
- 完全虚拟化提供底层物理系统的全部抽象化,且创建一个新的虚拟系统,客户机操作系统可以在里面运行。不需要对客户机操作系统或者应用程序进行修改(客户机操作系统或者应用程序像往常一样运行,意识不到虚拟环境的存在)。
- VMware是一款完全虚拟化软件。完全虚拟的弱点是效率不如半虚拟化的高
半虚拟化系统性能可以接近在裸机上的性能。
VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)
(3) 半虚拟化:Para-Virutalization
-
半虚拟化需要对运行在虚拟机上的客户机操作系统
进行修改(这些客户机操作系统会意识到它们运行在虚拟环境里)并提供相近的性能,但半虚拟化的性能要比完全虚拟化更优越。 -
特点:GuestOS明确知道自己运行虚拟机之上;
xen, UML(user-mode linux)
(4) 容器级虚拟化:
LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, ...
(5) 库级别虚拟化:
wine
(6) 程序级虚拟化
jvm, pvm, ...
2、主机虚拟化:Emulation, Full Virtualization, Para-Virutalization
Type-I:Hypervisor直接运行于硬件;
Type-II:Hypervisor运行主机OS之上;
3、云栈的类别:
- IaaS(Infrastructure-as-a-Service)基础设施服务
- PaaS(Platform-as-a-Service)系统平台服务
- SaaS(Software-as-a-Service)软件服务
- FWaaS(FireWall as a Service)防火墙服务
- DBaaS(DataBase-as-a-Service)数据库服务
- LBaas (load-balancer-as-a-service)负载均衡服务
二、主机虚拟化:
1、cpu的虚拟化:
- 模拟类型:emulation,虚拟机的arch与物理平台的arch可以不同;qemu
- 虚拟类型:virtualization
完全虚拟化(full-virt)
* BT:通过软件二进制转换
* HVM:硬件辅助的虚拟化
半虚拟化: (pare-virt)
* GuestOS明确知道自己运行于虚拟技术中
硬件级物理cup虚拟化技术
- 英特尔硬件虚拟化技术interl-VT
- AMD硬件虚拟化技术AMD-V
2、内存虚拟化管理
-
早期,虚拟机中的内存到物理内存地址机制,用软件实现, shadowmmu很低效
硬件内存中添加了,标识虚拟机标签机制tagged TLB。 -
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。
硬件级内存虚拟化:
硬件级物理内存映射到虚拟机
- 英特尔硬件虚拟化技术EPT,Extended Page Table
- AMD硬件虚拟化技术NTP,Nested Page Table
3、硬盘的虚拟化:
- 虚拟机如何使用硬盘的空间:虚拟机在物理硬盘上划分一个文件来使用,此文件也是靠宿主机通过文件系统将磁盘分区后,并创建文件系统后,分给虚拟机一个文件的大小的空间。在宿主机上表现的就是一个文件,而在虚拟机上表现的就是一块硬盘。所以还需要用软件的方式模拟一个适配器,将此文件,模拟成硬盘。
4、网络虚拟化
- 用软件的方式给每个虚拟机虚拟一块网卡和MAC地址,当通信时使用同一块物理网卡,网卡通讯有排队方式,在同一台物理网卡上,排队执行任务。(将物理网卡设为混杂模式;无论是不是发向本机物理网卡的内容都给与接收);此时将物理网卡也虚拟化一个MAC地址,把物理网卡当作交换机来使用。
5、IO虚拟化
I/O全虚拟化技术
- 通过VMM模拟I/O设备(磁盘和网卡等)实现虚拟化。
Guest OS所能看到就是一组统一的I/O设备。VMM截获Guest OS对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对Guest而言非常透明,无需考虑底层硬件的情况。
I/O半虚拟化技术
- 通过前端(Front-End)/后端(Back-End)模拟实现虚拟化。
Guest OS中的驱动程序为前端,VMM提供的与Guest通信的驱动程序为后端。前端驱动将Guest OS的请求通过与VMM间的特殊通信机制发送给VMM的后端驱动,后端驱动在处理完请求后再发送给物理驱动。
I/O透传技术
- 设备透传就是向一个特定客户操作系统提供一种设备隔离,对于性能而言,使用设备透传可以获得近乎本机的性能。对于某些网络应用程序(或那些拥有高磁盘 I/O 的应用程序)来说,这种技术简直是完美的。这些网络应用程序没有采用虚拟化,原因是穿过管理程序(达到管理程序中的驱动程序或从管理程序到用户空间模拟)会导致竞争和性能降低。但是,当这些设备不能被共享时,也可以将它们分配到特定的客户机中。例如,如果一个系统包含多个视频适配器,则那些适配器可以被传递到特定的客户域中。
6、一型虚拟化type-1
-
特点:于硬件级别直接运行hypervisor虚拟机管理控制
xen,vmware ESX/ESXI
xen虚拟过程
7、二型虚拟化type-2
- 特点:host主机上建立guest虚拟系统,有宿主机
在硬件级别运行一个os(host os),而此上运行一个vmm监视器,用于管理guest虚拟系统
vmwarworkstations, kvm,virtualbox
三、容器级级虚拟化
-
缺点:相较于主机级虚拟化隔离的不彻底
方案:lxc, libcontainer, runC, openvz -
Linux内核运行在物理设备上;在内核上运行多个操作系统如:centos,wubantu;susan;等,因为他们都是基于linux内核来开发的不同界面的操作系统而已,底层运行的内核是相同的。在每个操作系统上在运行每个应用。在内核上运行一个软件来创建和管理容器,是一个很小的软件,基本不消耗性能。
-
由于多个操作系统使用的是同一个内核,当在操作系统上执行关机命令,就会将内核关闭,所以需要将每个操作系统隔离开来,关掉的只是自身容器 本身而已。各个操作系统之间的操作互补干扰。(共享内核)
四、KVM虚拟技术
1、KVM概述
- 以色列qumranet公司研发,后被RedHad公司收购
(1)kvm只支持x86平台
(2)依赖于 HVM,inter VT AMD-v - KVM是(Kernel-based Virtual Machine)的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。
- KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
工作原理
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。
但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
virtio虚拟方案
2、KVM的核心组件:
(1)、 kvm.ko内核模块
- (kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能;
(2)、 qemu-kvm:用户空间的工具程序
- qemu-kvm进程:工作于用户空间,用于实现IO设备模拟;用于实现一个虚拟机实例;
(3)libvirt:工具箱用于与主流操作系统虚拟化进行交互工具
- libvirt是cs架构应用:
- 客户端:libvirt-client
virt-manager - daemon:图像化工具
libvirt-deaemon
- 客户端:libvirt-client
3、KVM运行模式
KVM模块load进内存之后,系统的运行模式:
- 内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式;
- 用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
- 来宾模式:GuestOS的用户模式;所有的非IO类请求;
4、KSM机制
扫描物理内存,发现多个虚拟机实例有相同的内存空间,合并成为一个共享内存空间,节省内存。
5、kvm工具集:
image.png-
qemu工具
-
qemu-kvm:用户空间的工具程序,创建管理虚拟机
-
qemu-img:是 QEMU 的磁盘管理工具
-
-
libvirt工具
- GUI:virt-manager, virt-viewer:图形化管理
- CLI: virsh, virt-install:创建管理虚拟机
-
集群工具:
libvirtd:管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。Libvirt是一个C工具包的虚拟化功能与最新版本的Linux(以及其他操作系统)。主包包含libvirtd服务器虚拟化支持出口。
5、KVM快速安装
(1)判断CPU是否支持硬件虚拟化:
grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
vmx:Intel VT-x
svm:AMD AMD-v
运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机;
(2)、装载内核模块
kvm:核心模块
kvm-intel|kvm-amd
(3)、使用virt-manager管理KVM
# yum install qemu-kvm libvirt-daemon-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virt-manager &
(4)、网络虚拟化:
CentOS 7创建物理桥,使用内核自带的桥接模块实现:
桥接口配置文件保留地址信息;
TYPE=Bridge
Device=BRIDGE_NAME
物理网卡配置文件:
删除地址、掩码和网关等相关的配置,添加
BRIDGE=BRIDGE_NAME
重启网络服务即可:
五、安装KVM示例
-
安装前首先开启虚拟机Inter VT
实验前开启
#检查主机cpu是否支持虚拟化
[root@node-64 ~]# grep -E -i "svm|vmx" /proc/cpuinfo
..........vmx ......... #出现这个字段即可支持虚拟化
#安装kvm模块
[root@node-64 ~]# modprobe kvm
[root@node-64 ~]# lsmod | grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
[root@node-64 ~]# ls /dev/kvm
/dev/kvm
[root@node-64 ~]# yum install libvirt libvirt-daemon virt-manager -y
[root@node-64 ~]# systemctl start libvirtd.service
[root@node-64 ~]# systemctl enable libvirtd.service
#安装物理桥
[root@node-64 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.64 netmask 255.255.255.0 broadcast 192.168.1.255
#创建网桥
[root@node-64 ~]# virsh iface-bridge ens33 br0
Created bridge br0 with attached device ens33
此时会断网,到虚拟机重启一下,发现已生成网桥,但还要配置网桥的dns,否则无法上网。
[root@node-64 ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="192.168.1.64"
NETMASK="255.255.255.0"
GATEWAY="192.168.1.1"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
DNS1=202.106.46.151 #添加
DNS2=8.8.8.8 #添加
#重启网络
[root@node-64 ~]#systemctl restart network.service
[root@node-64 ~]# ifconfig
br0: #生成虚拟网桥,并获得物理网卡的地址
flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.64 netmask 255.255.255.0 broadcast 192.168.1.255
ens33: #原物理网卡变成虚拟交换机
flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:79:2e:94 txqueuelen 1000 (Ethernet)
其他终端图形登录[root@node-60 ~]# ssh -X root@192.168.1.64
ssh -X root@192.168.1.64
[root@node-64 ~]# virt-manager
参考链接:
http://www.178linux.com/103971
https://www.cnblogs.com/sunhao96/p/7605865.html
https://bbs.csdn.net/topics/391040787
https://www.ibm.com/developerworks/cn/linux/l-pci-passthrough