赞
踩
从目前接触到比较多的xenserver和KVM为入口,来看看虚拟化实现原理。都是查资料总结的,肯定会有错,以后遇到了再改。
两种虚拟化架构:
一种直接的在物理机上创建hypervisor(实际上hypervisor也是一种特殊的linux系统)。常见代表xen和vmware的ESXi。
第二种是在物理机上安装操作系统,再在操作系统层安装hypervisor模块。常见代表KVM、virtualBox、VMWare Workstation、Hyper-V。
两种架构比较
理论上讲:
1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;
2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。
软件虚拟化和硬件虚拟化:
最 纯粹 的 软件 虚拟 化 实现 当 属 QEMU。 在 没有 启用 硬件 虚拟 化 辅助 的 时候, 它 通过 软件 的 二进制 翻译仿真 出 目标 平台 呈现 给 客户 机, 客户 机 的 每一 条目 标 平台 指令 都 会被 QEMU 截取, 并 翻译 成 宿主 机 平台 的 指令, 然后 交给 实际 的 物理 平台 执行。 由于 每 一条 都 需要 这么 操作 一下, 其 虚拟 化 性能 是 比 较差 的, 同时 其 软件 复杂度 也 大大 增加。
以 x86 架构 为例, 它 提供 一个 略微 受限制 的 硬件 运行 环境 供 客户 机 运行( non- root mode), 在 绝大多数 情况下, 客户 机 在此 受限 环境 中 运行 与 原生 系统 在 非 虚拟 化 环境 中 运行 没有 什么 两样, 不需要 像 软件 虚拟 化 那样 每条 指令 都 先 翻译 再 执行, 而 VMM 运行 在 root mode, 拥有 完整 的 硬件 访问 控制 权限。 仅仅 在 少数 必要 的 时候, 某些 客户 机 指令 的 运行 才 需要 被 VMM 截获 并 做 相应 处理, 之后 客户 机 返回 并 继续 在 non- root mode 中 运行。 可以 想见, 硬件 虚拟 化 技术 的 性能 接近 于 原生 系统, 并且, 极大 地 简化 了 VMM (Virtual Machine Monitor( VMM, 虚拟 机 监控器, 也称 为 Hypervisor)
Intel 从 2005 年 就 开始 在 其 x86 CPU 中 加入 硬件 虚拟 化 的 支持—— Intel Virtualization Technology, 简称 Intel VT
一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度。虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。
半虚拟化和全虚拟化
让 客户 机 意识到 自己 是 运行 在 虚拟 化 环境 里, 并 做 相应 修改 以 配合 VMM虚拟机操作系统也修改自身的部分代码与虚拟机监视器进行配合, 这 就是 半 虚拟 化( Para- Virtualization)。准 虚拟 化 需要 修改 客户 机 操作系统 的 源 代码 来 实现 主动 通知。” 典型的 半 虚拟 化 技术 就是 virtio, 使用 virtio 需要 在 宿 主机/ VMM 和 客户 机 里 都 相应 地 装上 驱动。
半虚拟化最大的特点是大大降低了虚拟化技术带来的额外开销,主要体现在减少特权机转换和内存复制。另一方面,由于虚拟机操作系统知道自己处于虚拟化环境,并且会主动跟虚拟机监视器进行配合,从而消除了全虚拟化中黑盒调度带来的一些问题。半虚拟化的缺点是需要修改虚拟机操作系统,因此非开源的商业操作系统如Microsoft Windows 等不能直接运行在半虚拟化平台上。
与 半 虚拟 化 相反 的, 全 虚拟 化( Full Virtualization) 坚持 第一个 理想化 目标: 客户 机 的 操作系统 完全 不需要 改动。 进行实时的机器代码翻译。敏感 指令 在 操作系统 和 硬件 之间 被 VMM 捕捉 处理, 客户 操作系统 无须 修改, 所有 软件 都能 在 虚拟 机中 运行。 因此, 全 虚拟 化 需要 模拟 出 完整 的、 和 物理 平台 一模一样 的 平台 给 客户 机, 这 在 达到 了 第一个 目标 的 同时 也 增加 了 虚拟 化 层( VMM) 的 复杂度。由于软件模拟带来的额外开销,全虚拟化的缺点是运行效率比较低。在最初的Xen完全虚拟化技术中,使用Qemu来仿真PC硬件,包括BIOS、IDE硬盘控制器、VGA图形适配器(显卡)、USB控制器、网络适配器(网卡)等。因此在这样的全虚拟化架构下,其IO设备的性能是比半虚拟化架构下要低得多的。
以 Intel VT- x、 VT- d为 代表 的 硬件 虚拟 化 技术 的 兴起, 让 由 硬件 虚拟 化 辅助 的 全 虚拟 化 全面 超 过了 半 虚拟 化。 但是, 以 virtio 为 代表 的 半 虚拟 化 技术 也 一直 在演 进 发展, 性能 上 只是 略 逊于 全 虚拟 化, 加之 其 较少 的 平台 依赖性, 依然 受到 广泛 的 欢迎。
XenServer基于Xen开发,现在已经全部开源了全部源代码。Xen是2003年剑桥大学发布的虚拟化平台,当时还没有intel VT硬件辅助虚拟化的支持。
Xen Hypervisor:直接运行于硬件之上是Xen客户操作系统与硬件资源之间的访问接口。通过将硬件进行抽象,将相应的硬件CPU、内存的资源调度给上层的客户机使用。目前Xen Hypervisor并不直接操作IO硬件,不负责处理诸如网络、外部存储设备、视频或其他通用的I/O处理。
Domain 0:在xen中相当于管理员,管理其他虚拟客户机。
1、 在Domain 0 上运行XAPI(XenAPI)接口,由toolstack组成,提供给xencenter使用。
2、 运行了VNC软件,通过QEMU软件模拟VNC显示的后端设备,从而将虚拟机控制台在xencenter上显示。
3、 在Domain 0 中包含网络和存储的backend Driver,用于处理虚拟机的网络和存储需求。
Xen对硬件三类资源的管理和调度是这样运作的:对于CPU的管理和调度,加入了对Intel VT 技术和AMD Pacifica 技术的支持,因此可以使得虚拟机可以直接访问物理CPU资源;对于内存来说,硬件虚拟化技术IOMMU等等也简化了内存地址之间虚拟与真实的转换开销。
我个人理解是,xenserver也不算是半虚拟化,因为操作系统并不需要进行修改。虽然对虚拟机操作系统来说,需要安装网络和硬盘的PV(半虚拟化)驱动,但这和正常使用物理硬件需要安装硬件设备的驱动是一样的。
在xen中的虚拟机,CPU和内存是hypervisor直接提供,I/O驱动都是由dom0提供。在xen中包括dom0的后端设备驱动和虚拟机里的PV驱动,在半虚拟化中,我们在虚拟机上需要安装PV Driver。在访问外设时,Guest OS 中的前端驱动(Front-End)将请求通过共享内存的方式传递给Domain 0 中的后端驱动(Back-end),后端驱动再调用Linux OS 中的设备驱动程序来完成操作。虚拟机 访问I/O 设备相比VMware 的模型要直接很多,通过一条Hypercall 进入Hypervisor,由其直接访问硬件。
其实相比于全虚拟化,半虚拟化在可靠性和性能上更优。
XenCenter通过https协议走443端口,和XPAI进行安全通信,并取得state.db里面的配置信息并在图形界面上显示出来,对于虚拟机的图形状态显示通过VNC软件进行控制台显示输出。
state.db存放配置信息,对象和对象之间的对应关系。例如:VM和主机,VIF,存储VDI之间的对应关系。
Xentools:Citrix 半虚拟化网络和 SCSI 驱动程序。,可为虚拟机提供高性能的 I/O 服务,并且不会产生传统设备仿真所需的系统开销。这些驱动程序可替代仿真设备,在 Windows 和 XenServer 产品系列软件之间提供高速传输。在安装 Windows 操作系统期间,XenServer 使用传统的设备仿真为 VM 提供标准 IDE 控制器和标准网卡。通过这种方式,Windows 使用内置驱动程序完成安装,但由于控制器驱动程序仿真存在固有的系统开销,因而导致性能降低。一个Windows VM不安装XenTools也可以工作,只是没有XenTools,性能会显著下降。
在历史上看,xenserver基于xen开源架构,发展历史比KVM早,但最近却有被KVM追赶趋势,为什么大家都放弃xen而选择KVM?
先从二者的区别说起:
KVM和xen属于两种不用的虚拟化架构。Xen属于1型虚拟化,特点是直接在物理服务器上安装虚拟化层(hypervisor);而KVM是2型号虚拟化,在物理服务器上先部署一个正常的操作系统,然后在操作系统层增加hypervisor组件。需要注意的是,在部署xenserver的时候,其实也安装了一个linux centos的内核叫domain 0。它的作用是对hypervisor层进行资源监控、管理I/O驱动。
相比xen而言,KVM的一个优势是linux厂商内核的支持,另外,KVM支持虚拟化嵌套。
CPU硬件是否支持虚拟化?
在linux操作系统中,运行命令:
egrep '(vmx|svm)' /proc/cpuinfo
如果无任何返回,表明你的cpu不支持硬件虚拟化。相反则支持。但是仍需要确定在BIOS中启动了该硬件虚拟化技术。
参考文档:
KVM qcow2、raw、vmdk等镜像格式和转换
COW复制写和ROW重定向写的区别:
当我们为一个数据卷创建一个快照之后,这些预留的空间用来存放被变化数据更新的旧数据。当某个数据块发生改变时,在将旧的数据覆盖之前,首先将该块的旧数据复制到预留的快照卷,该步骤仅在数据卷相应数据块位置发生第一次写操作请求时进行。这个处理过程确保快照出来的数据与发起快照的那个精确时间点保持完全一致。这个过程也描述了“copy on write”这个名字的含义。COW快照有个缺点,它会引起数据卷性能的下降,这是因为创建快照之后,对数据卷的写操作会增加一个等待的过程 --即旧数据块复制到快照卷的过程。另外一个关键问题是每个快照卷必须依赖一个完整的数据卷。
COW的两次写包括:1、将旧数据写入快照卷;2、在数据卷写入新数据。而ROW只有写入新数据一步。
使用ROW快照,数据卷存放的是上一个快照时间点的旧数据,新数据最终存放在预留的快照空间。这里也有一个复杂的问题,就是快照的删除。被删除的快照上的数据必须被复制到原始数据卷,并且做一致性回退。创建的快照越多,维护快照的复杂度也会以指数级别上升。这些复杂性包括对原始数据的访问、快照数据和原始数据卷的跟踪、以及快照删除后的数据调整。另一个直接引发的严重问题是,原始数据集中会产生大量的碎片。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。