摘要
云计算现在已经非常成熟了,而虚拟化是构建云计算基础架构不可或缺的关键技术之一。 云计算的云端系统, 其实质上就是一个大型的分布式系统。 虚拟化通过在一个物理平台上虚拟出更多的虚拟平台, 而其中的每一个虚拟平台则可以作为独立的终端加入云端的分布式系统。 比起直接使用物理平台, 虚拟化在资源的有效利用、 动态调配和高可靠性方面有着巨大的优势。 利用虚拟化, 企业不必抛弃现有的基础架构即可构建全新的信息基础架构,从而更加充分地利用原有的IT投资。
虚拟化技术发展
美国环境保护EPA报告中曾经统计过一组统计数据:EPA研究服务器和数据中心得能源效率时发现,实际上服务器只有5%得时间时在工作的,其他时间一直处于休眠状态
雏形:
1961年,IBM709机器实现了分时系统,将CPU占用切分为多个极短的时间片(1/100sec)每一个时间片执行不同的工作,通过对这些时间片进行轮询
从而将一个CPU伪装成多个CPU
1972年, IBM正式将system370机的分时系统命名为虚拟机
1990年, IBM推出的system390机支持逻辑分区(将一个CPU分为多份,相互独立,也就是逻辑分割)
Xen 2003年问世,是一个外部的hypervisor程序(虚拟机管理程序),能够控制虚拟机和给多个客户机分配资源,Xen 支持的虚拟化技术:全虚拟化,半虚拟化
KVM:2007年问世,现已内置在kernel内核中,KVM:支持的虚拟化技术:全虚拟化
虚拟化技术介绍
什么是虚拟化:
- 虚拟化是资源的一种逻辑表示,并不会受限于物理资源。
- 运行的环境不在真实的硬件上,而是硬件之上的虚拟内存中的一段,或者说是虚拟的环境中。
- 虚拟化为数据,计算能力,存储资源等提供了一个逻辑视图,而不是物理视图。
- 虚拟化的发展,大幅降低了IT硬件成本,减少了资源的浪费,并且提升了系统的稳定性和安全性。
原理
通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率
虚拟化类型
一、全虚拟化(Full Virtulization)(vmware、kvm)
简介:主要是在客户操作系统和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使客户操作系统无需修改就能运行,速度会根据不同的实现而不同,但大致能满足用户的需求。这种方式是业界现今最成熟和最常见的,而且属于 Hosted 模式和 Hypervisor 模式的都有,知名的产品有IBM CP/CMS,VirtualBox,KVM,VMware Workstation和VMware ESX(它在其4.0版,被改名为VMware vSphere)。
优点:Guest OS无需修改,速度和功能都非常不错,更重要的是使用非常简单,不论是 VMware 的产品,还是Sun(Oracle?)的 VirtualBox。
缺点:基于Hosted模式的全虚拟产品性能方面不是特别优异,特别是I/O方面。
未来:因为使用这种模式,不仅Guest OS免于修改,而且将通过引入硬件辅助虚拟化技术来提高其性能,我个人判断,在未来全虚拟化还是主流。
CPU全虚拟化:采用二进制代码动态翻译技术,即在执行时动态地重写虚拟机的执行代码,需要在VMM监控和模拟的位置(即敏感指令前)插入陷入指令的技术。
优点:Guest OS无需修改即可运行。
缺点:动态翻译会带来一定的性能开销。
半虚拟化(Parairtulization)(xen)
简介:它与完全虚拟化有一些类似,它也利用Hypervisor来实现对底层硬件的共享访问,但是由于在Hypervisor 上面运行的Guest OS已经集成与半虚拟化有关的代码,使得Guest OS能够非常好地配合Hyperivosr来实现虚拟化。通过这种方法将无需重新编译或捕获特权指令,使其性能非常接近物理机,其最经典的产品就是Xen,而且因为微软的Hyper-V所采用技术和Xen类似,所以也可以把Hyper-V归属于半虚拟化。
优点:这种模式和全虚拟化相比,架构更精简,而且在整体速度上有一定的优势。
缺点:需要对Guest OS进行修改,所以在用户体验方面比较麻烦。
未来:觉得其将来应该和现在的情况比较类似,在公有云(比如Amazon EC2)平台上应该继续占有一席之地,但是很难在其他方面和类似VMware vSphere这样的全虚拟化产品竞争,同时它也将会利用硬件辅助虚拟化技术来提高速度,并简化架构。
CPU半虚拟化:通过修改Guest OS的内核源代码,将待监控的操作替换为对VMM的超级调用(Hypercall)
【优点】避免了“二进制代码动态翻译”这种开销较大的做法,性能方面得到了很大的提升。
【缺点】需要修改Guest OS的源代码,使虚拟机上的操作系统类型受到限制,不开源的操作系统(如windows系统和pv-driver)就很难移植到半虚拟化的vmm平台上。
三、硬件辅助虚拟化(Hardware Assisted Virtualization)(kvm、vmware、xen均可以用该技术)
简介:Intel/AMD等硬件厂商通过对部分全虚拟化和半虚拟化使用到的软件技术进行硬件化(具体将在下文详述)来提高性能。硬件辅助虚拟化技术常用于优化全虚拟化和半虚拟化产品,而不是独创一派,最出名的例子莫过于VMware Workstation,它虽然属于全虚拟化,但是在它的6.0版本中引入了硬件辅助虚拟化技术,比如Intel的VT-x和AMD的AMD-V。现在市面上的主流全虚拟化和半虚拟化产品都支持硬件辅助虚拟化,包括VirtualBox,KVM,VMware ESX和Xen。
优点:通过引入硬件技术,将使虚拟化技术更接近物理机的速度。(半虚拟化vmm能够在不修改guest os内核的基础上,同时支持两种不同的虚拟化架构,xen是最大的受益者)。
缺点:现有的硬件实现不够优化,还有进一步提高的空间。
未来:因为通过使用硬件技术不仅能提高速度,而且能简化虚拟化技术的架构,所以预见硬件技术将会被大多数虚拟化产品所采用。
CPU硬件虚拟化:Intel和AMD对x86架构CPU的改进使x86硬件能够支持“陷入-模拟”方式的虚拟化。 这就意味着,不需要对敏感和特权指令进行翻译或者修改Guest OS的内核,VMM也能很轻松地完成对CPU虚拟化的工作。
四、操作系统级虚拟化(Operating System Level Virtualization)
简介:这种技术通过对服务器操作系统进行简单地隔离来实现虚拟化,主要用于VPS。主要的技术有Parallels Virtuozzo Containers,Unix-like系统上的chroot和Solaris上的Zone等。
优点:因为它是对操作系统进行直接的修改,所以实现成本低而且性能不错。
缺点:在资源隔离方面表现不佳,而且对Guest OS的型号和版本有限定。
未来:不明朗,我觉得除非有革命性技术诞生,否则还应该属于小众,比如VPS
虚拟化的优缺点
优点
① 集中化管理(远程管理、维护)
② 提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了“空闲”容量)
③ 动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
④ 高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
缺点
① 前期高额费用(初期的硬件支持)
② 降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
③ 更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)
④ 实施配置复杂、管理复杂(管理人员运维、排障困难)
⑤ 一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
⑥ 安全性(虚拟化技术自身的安全隐患)
虚拟化前后对比
虚拟化前
① 每台主机拥有一个操作系统
② 软硬件紧密结合
③ 在同一个主机上运行多个应用程序通常会产生冲突
④ 系统资源利用率低(例如:5%)
⑤ 硬件成本高昂并且不够灵活
虚拟化后
① 打破了操作系统和硬件的互相依赖
② 通过封装到虚拟机的技术,管理操作系统和应用程序为单一的个体
③ 强大的安全和故障隔离
④ 虚拟机时独立于硬件的,它们可以在任何硬件上运行
对比:
1.操作系统方面(虚拟化前):
LAMP 架构中(以一台主机实现)
LINUX + Apache + MySQL + PHP
其中Apache 与 MySQL资源是共享的
如果架构要求服务间的安全性隔离比较高的话,Apache的页面和MySQL数据库的目录一定是不能互相碰面,如果Apache漏洞暴露出来,攻击者就
可以Apache的进程访问到MySQL的数据目录,从而获取MySQL中的数据,这种就是严重的安全隐患
而想解决这种潜在危险,可以通过实现内核级别的隔离(使用虚拟化技术)
2.软硬件结合
因为硬件和操作系统不兼容或者不支持,导致有些软、硬件功能无法正常使用(也是最难的问题)
使用虚拟化,软硬件之间是会通过虚拟化层驱动进行隔离(调配)的,
只要虚拟化层可以识别软/硬件应用,就可以将软硬件结合使用
3.在同一个主机上运行多个应用程序通常会产生冲突
Apache和Nginx 定位相同(80端口)
只能使用反向代理的方式进行分离,而同时如果在同一台机器使用这种方式,Apache
和Nginx中重要的数据文件如果同时被泄露出去....而虚拟化可以隔离服务
KVM简介
KVM(Kernel-based Vritual Machine)–基于内核的虚拟机
KVM 是基于虚拟化扩展的X86硬件的开源Linux原生的全虚拟化方案(要求cpu支持Intel-VT-x或AMD-V)
KVM内嵌于内核模块中,模拟处理器和内存以支持虚拟机运行
虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;
虚拟机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能,但KVM本身不执行任何模拟。需要客户空间程序(虚拟机)通过/dev/kvm(此虚拟设备需要开起硬件辅助虚拟化才能看到)接口设置一个客户机虚拟服务器的地址空间,并且由Qemu模拟I/O(ioctl)进行调度资源和维护管理
Libvirt:KVM的管理工具,除了可以管理KVM这类VMM,还可以管理Xen,VirtualBox,甚至OpenStack底层
Libvirt包含3个组件:后台daemon程序libvirtd、API库、命令行工具virsh
libvirtd是服务程序,接收和处理 API 请求;
API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;
virsh 是我们经常要用的 KVM 命令行工具
KVM架构及原理
kvm基本结构有二个部分构成:
kvm 驱动,现在已经是linux kernel的一个模块了。其主要负责虚拟机的创建,虚拟内存的分配,VCPU寄存器的读写以及VCPU的运行。
另个组成是Qemu,用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。
kvm基本结构:
kvm基本结构如上图。kvm已经是内核模块,被看作是一个标准的linux 字符集设备(/dev/kvm)。Qemu通过libkvm应用程序接口,用fd通过ioctl向设备驱动来发送创建,运行虚拟机命令。设备驱动kvm就会来解析命令
kvm 模块让Linux主机成为一个虚拟机监视器(VMM),并且在原有的Linux两种执行模式基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。在虚拟机运行时,三种模式的工作各为:
客户模式: 执行非I/O的客户代码,虚拟机运行在这个模式下。
用户模式:代表用户执行I/O指令,qemu运行在这个模式下。
内核模式:实现客户模式的切换,处理因为I/O或者其他指令引起的从客户模式退出(VM_EXIT)。kvm 模块工作在这个模式下。
在kvm的模型中,每一个Gust OS都是作为一个标准的linux进程,都可以使用linux进程管理命令管理。
这里假如qemu通过ioctl发出KVM_CREATE_VM 指令,创建了一个VM后,qemu需要需要发送一些命令给VM,如KVM_CREATE_VCPU。这些命令当然也是通过ioctl发送的,用户程序中用ioctl发送KVM_CREATE_VM得到的返回值就是新创建的VM对应的fd(kvm_vm),fd是创建的指向特定虚拟机实例的文件描述符,之后利用这个fd发送命令给VM进行访问控制。kvm解析这些命令的函数是kvm_vm_ioctl。
1、Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),
被KVM 置于一种受限制的CPU 模式下运行。
2、KVM 内核模块模拟处理器和内存以支持虚拟机运行
3、Qemu 主要处理I/O以及为客户提供一个用户空间/dev/kvm 工具libvirt 来进行虚拟机管理
ioctl(定义) 专用于设备输入输出操作的系统调用
libvirt:KVM管理工具
以上构成一个完整的虚拟化平台
KVM工作流程图
KVM工作流程图解释:
用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。 KVMDriver 为虚拟机创建虚拟 CPU 和虚拟内存, 然后执行 VMLAU·NCH 指令进入客户模式, 装载 Guest OS 并运行。 Guest OS 运行过程中如果发生中断或者影子缺页等异常, 将暂停 Guest OS 的运行并保存当前上下文退出到内核模式来处理这些异常。 内核模式处理这些异常时如果不需要 I/O则处理完成后重新进入客户模式。 如果需要 I/O 则进入到用户模式, 由 Qemu 来处理 I/O,处理完成后进入内核模式, 再进入客户模式
总结
思路:
1.KVM技术介绍
是什么技术:虚拟化
2.KVM技术定位(实际应用)
workstation、virtualbox
模拟硬件资源/设备
3.KVM虚拟化技术核心功能(原理方面)
QEMU(工作在用户层),控制libkvm工具(工具作用:控制内核中的KVM)来调用物理虚拟化资源
(调用物理虚拟化资源的方式是ioctl,供给虚拟机)
KVM(工作在内核层,虚拟化/抽象化物理硬件资源,供给Qemu组件调用);
虚拟机在进行硬件资源调用的时候。会向内核发出请求指令(触感指令,特权指令)
KVM会对敏感指令进行拦截,然后转交Qemu进行处理
4.KVM各核心组件功能
QEMU
功能:控制I/O虚拟化,调用硬件资源
KVM
功能:为虚拟机提供CPU、内存(硬件资源)的虚拟化
搭建KVM虚拟机
虚拟机要求:内存8G,硬盘300G,处理器4核,虚拟化引擎要勾选第一个
搭建实验环境
[root@server6 ~]# hostnamectl set-hostname KVM
[root@server6 ~]# su
[root@kvm ~]# vim /etc/ssh/sshd_config //关闭反向DNS,进行环境优化:设置DNS反向解析,设置为no可以让客户端连接服务器更快
115 UseDNS no //取消注释
安装KVM
[root@kvm ~]# yum -y install qemu-kvm //安装KVM模块
[root@kvm ~]# yum -y install virt-install //构建虚拟机的命令行工具
[root@kvm ~]# yum -y install qemu-img //qemu组件,创建磁盘,启动虚拟机等
[root@kvm ~]# yum -y install bridge-utils //网络支持工具
[root@kvm ~]# yum -y install libvirt //虚拟机管理工具
[root@kvm ~]# yum -y install virt-manager //图形界面管理虚拟机
检测CPU是否支持虚拟化
[root@kvm ~]# cat /proc/cpuinfo | grep vmx // 查看CPU是否支持虚拟化
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat
查看KVM模块是否已安装
Lsmod:显示已载入的系统模块
[root@kvm ~]# lsmod | grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
设置开启启动界面的显示模式
[root@kvm ~]# ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
设置KVM网络
KVM网络的两种模式:
1.NAT:默认模式,数据包由NAT方式通过主机的接口进行传送,可以访问外网,但是无法从外部访问虚拟机网络
2.网桥:这种模式允许虚拟机像一台独立的主机一样拥有网络外部的机器可以直接访问到虚拟机内部,但需要网卡支持(一般有线网卡都支持)
1.修改ens33网卡
[root@kvm ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
#IPADDR=20.0.0.16
#NETMASK=255.255.255.0
#GATEWAY=20.0.0.2
#DNS=20.0.0.2
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=7d6ddb70-e11a-4e7b-a7c7-aa0939a32489
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
2.增加br0网卡
[root@kvm ~]# vi /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=20.0.0.16
NETMASK=255.255.255.0
GATEWAY=20.0.0.2
创建KVM储存和镜像数据的目录、上传centos7镜像
[root@kvm ~]# cd /etc/sysconfig/network-scripts/
[root@kvm network-scripts]# mkdir -p /data_kvm/iso
[root@kvm network-scripts]# mkdir -p /data_kvm/store
[root@kvm network-scripts]# cd /data_kvm/
[root@kvm data_kvm]# ll
总用量 0
drwxr-xr-x. 2 root root 6 12月 9 16:39 iso //存储镜像
drwxr-xr-x. 2 root root 6 12月 9 16:39 store //存储数据
[root@kvm data_kvm]# cd iso/
[root@kvm iso]# ll
总用量 0
[root@kvm iso]# ls -lh //上传centos7镜像文件至该目录下,通过xshell传
总用量 4.3G
-rw-r--r--. 1 root root 4.3G 12月 9 18:23 CentOS-7-x86_64-DVD-1708.iso
使用虚拟机管理器管理虚拟机,虚拟机里面输入该内容
[root@kvm ]# virt-manager
创建存储池
双击QEMU/KVM
点击左下角+号
名称建立之后点击前进
点击完成
创建存储池储存镜像
点击左下角+号
点击前进
点击浏览,选择/data_kvm下的iso目录
点击完成
创建存储卷
点击上图+号,注意是卷右边一点的
创建名称并点击完成
创建虚拟机
点击下面的虚拟系统管理器或退出输入 [root@kvm ~]# virt-manager
点击文件 新建虚拟机
点击前进
浏览,选择iso路径
点击前进
CPU给4核,点击前进(管理选择store)
点击前进
勾选在安装前自定义配置,点击完成(选择引导选项,勾选自动启动,并开始安装)