引言
认识虚拟化
在计算机中,虚拟化
(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源
包括计算能力和资料存储。在实际的生产环境中,虚拟化技术
主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件。
虚拟化技术的分类
虚拟化
技术主要分为以下几个大类 [1]:
平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化
。
资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化
,比如内存、存储、网络资源等。
应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。
我们通常所说的虚拟化
主要是指平台虚拟化技术
,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor 或 Hypervisor),隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。虚拟机中运行的操作系统被称为客户机操作系统(Guest OS),运行虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如 VMWARE 的 ESX 产品)。运行虚拟机的真实系统我们称之为主机系统。
平台虚拟化技术
又可以细分为如下几个子类:
全虚拟化(Full Virtualization)
全虚拟化
是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化
VMM 以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。举例而言,x86 体系结构中,对于操作系统切换进程页表的操作,真实硬件通过提供一个特权 CR3 寄存器来实现该接口,操作系统只需执行 “mov pgtable,%%cr3” 汇编指令即可。全虚拟化
VMM 必须完整地模拟该接口执行的全过程。如果硬件不提供虚拟化
的特殊支持,那么这个模拟过程将会十分复杂:一般而言,VMM 必须运行在最高优先级来完全控制主机系统,而 Guest OS 需要降级运行,从而不能执行特权操作。当 Guest OS 执行前面的特权汇编指令时,主机系统产生异常(General Protection Exception),执行控制权重新从 Guest OS 转到 VMM 手中。VMM 事先分配一个变量作为影子 CR3 寄存器给 Guest OS,将 pgtable 代表的客户机物理地址(Guest Physical Address)填入影子 CR3 寄存器,然后 VMM 还需要 pgtable 翻译成主机物理地址(Host Physical Address)并填入物理 CR3 寄存器,最后返回到 Guest OS中。随后 VMM 还将处理复杂的 Guest OS 缺页异常(Page Fault)。比较著名的全虚拟化
VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac 和 QEMU。
超虚拟化
(Paravirtualization)
这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化
虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,超虚拟化
可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。
硬件辅助虚拟化
(Hardware-Assisted Virtualization)
硬件辅助虚拟化
是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化
。例如有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地完全隔离开来,Guest OS 有自己的“全套寄存器”,可以直接运行在最高级别。因此在上面的例子中,Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化
技术。
部分虚拟化
(Partial Virtualization)
VMM 只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在历史上,部分虚拟化
是通往全虚拟化
道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。
操作系统级虚拟化
(Operating System Level Virtualization)
在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化
是一种在服务器操作系统中使用的轻量级的虚拟化
技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container [2],FreeBSD Jail 和 OpenVZ 等。
这种分类并不是绝对的,一个优秀的虚拟化
软件往往融合了多项技术。例如 VMware Workstation 是一个著名的全虚拟化
的 VMM,但是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操作,从而避免了低效的 Trap-And-Emulate 的处理方式,这与超虚拟化
相似,只不过超虚拟化
是静态地修改程序代码。对于超虚拟化
而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。
正文
认识KVM
好了,虚拟化的概念就简单的说这么多了。是时候介绍一下今天的主角————KVM
了。
KVM
全称***Kernel-based Virtual Machine***
, 其实kvm只是一个内核模块,提供虚拟cpu和内存管理的模块,至于其它的设备是由qemu模拟的,如网卡,显卡,磁盘等。后来redhat联合IBM以及Linux社区创造了libvirt,模拟的设备性能要比qemu的好很多,并提供了一系列的管理工具和api,整个集成了kvm虚拟化的解决方案。Linux(redhat系)装载kvm模块后,摇身一变成为了VM Monitor,也称为Hypervisor,部署使用简单,需要硬件支持虚拟化。
安装KVM
0.实验/作业环境
1 | #物理主机端: |
1.检测硬件是否支持虚拟化
1 | [root@myprecious ~]# egrep '(vmx|svm)' --color=always /proc/cpuinfo |
如果输出结果含有vmx或者svm字样,则表示支持CPU虚拟化,Intel是vmx,AMD是svm,也需要检测是否有kvm_xxx模块,如果装载不成功,可能是没有开启硬件虚拟化,需要bios中开启,具体开启方式请联系厂家。
2.升级安装常用软件及虚拟化服务并启动
1 | [root@myprecious ~]# yum clean all |
注:centos7上服务的管理方式换成了systemctl
3.检查是否有kvm模块,如果有则继续
1 | [root@myprecious ~]# lsmod | grep kvm |
4.配置桥接网络br0
centos7上默认已不再是eth0、eth1,比如,在我的机器上安装好的第一块网卡成为了eno16777736,修改步骤和centos6上没有区别。拿我这台测试电脑来说,常见配置网桥方法如下:
1 | [root@myprecious ~]# cd /etc/sysconfig/network-scripts/ |
***说明***
:以上网卡配置文件中,NM_CONTROLLED
这个属性值,根据redhat公司的文档是必须设置为“no”的(这个值为“yes”表示可以由服务NetworkManager
来管理。NetworkManager
服务不支持桥接,所以要设置为“no”。)
由于该宿主机使用的是虚拟化环境非原生的物理网络,由VMWare与Windows桥接(通常在Windows中被识别为VMnet0的虚拟网卡)使用,VMWare已经为我们创建了虚拟网桥virbr0
,所以这里我们就不用配置了。如下:
1 | [root@myprecious ~]# ip add show |
注:由于
ip命令属于
iproute2软件包中的工具,由于代替旧的
ifconfig命令,尽可能的习惯使用新的命令和工具包来淘汰老的软件和工具。
5.关闭selinux
同centos6
1 | [root@myprecious ~]# setenforce 0 |
–(待续)–
参考信息:http://www.ibm.com/developerworks/cn/linux/l-cn-vt/index.html(虚拟化介绍)