何为虚拟化及虚拟机?
为什么要虚拟化呢?
虚拟化有哪些优点和缺点?
什么是cpu虚拟化,硬件辅助虚拟化,全虚拟化,准虚拟化,操作系统级别虚拟化(openvz,lxc等)?
虚拟化磁盘镜像文件都有哪些格式(主要是raw,
qcow2),各有什么特点?
LXC(Linux Containers,操作系统级的轻量级虚拟化)为何物,相比传统VM有何不同?
何为虚拟化?
虚拟化技术是一套解决方案,完整的情况需要CPU、主板芯片组、BIOS和软件的支持。
将服务器
物理资源抽象成逻辑资源,让一台服务器变成几台甚至上百台相互隔离的虚拟服务器,不再受限于物理上的界限,而是让CPU、内存、磁盘、I/O等硬件变成可以
动态管理的“资源池”的过程。
在一个给定的硬件平台(例如Intel X86)上
宿主机创造一个模拟的计算机环境(虚拟机)提供给客户机。客户机系统对于用户应用程序没有限制;宿主机允许客户机运行真实的操作系统。客户机就好像直接运行在计算机硬件上。虚拟机对硬件资源(如网络,显示器,键盘,硬盘)的访问被统一管理在一个比处理器和系统内存更有限制性的层次(虚拟化层)上。
通俗点讲,通过虚拟化技术将
一台实体计算机(看得见摸得着)
变成为
多台逻辑上计算机(看不见摸不着)。
何为虚拟机呢?
虚拟机(Virtual machine或VM),可以像真实机器一样运行程序的计算机的软件实现。
对真实物理机器的一种虚拟化实现,可以像实体机器一样安装OS,运行应用程序。
为什么要使用虚拟化呢?
省钱?
提供硬件资源的使用率?可能这只是选择虚拟化其中的一部分原因。
除此之外,虚拟化给我们带来了什么?
动态迁移 :开机状态,虚拟机动态迁移
克隆技术 :可以保证一个集群中所有机器环境的一致性。
虚拟快照,快速恢复 : 有了快照功能,跟时光机差不多,故障恢复相当快。
安全: 虚拟机的异常操作不会影响到物理机器。
虚拟化有哪些优点?
1.降低能耗
通过将物理服务器变成虚拟服务器减少物理服务器的数量,可以在电力和冷却成本上获得巨大节省。
2.节省空间(少买机柜和交换机等网络设备)
使用虚拟化技术大大节省了所占用的空间,减少了数据中心里服务器和相关硬件的数量。
3.节约成本 (老板最关心的问题)
使用虚拟化技术大大削减了采购服务器的数量,同时相对应的占用空间和能耗都变小了,自然就省钱了。
4.提高基础架构的利用率
通过将基础架构资源池化并打破一个应用一台物理机的藩篱,虚拟化大幅提升了资源利用率。
5.提高稳定性
提高可用性,带来具有透明负载均衡、动态迁移、故障自动隔离、系统自动重构的高可靠服务器应用环境。通过将操作系统和应用从服务器硬件设备隔离开,病毒与其他安全威胁无法感染其他应用。
6.减少宕机事件
迁移虚拟机服务器虚拟化的一大功能是支持将运行中的虚拟机从一个主机迁移到另一个主机上,而且这个过程中不会出现宕机事件。有助于虚拟化服务器实现比物理服务器更长的运行时间。
7.提高灵活性
通过动态资源配置提高IT对业务的灵活适应力,支持异构操作系统的整合,支持老应用的持续运行,减少迁移成本。支持异构操作系统的整合,支持老应用的持续运行,支持快速转移和复制虚拟服务器,提供一种简单便捷的灾难恢复解决方案。
服务器虚拟化有哪些缺点?
额外的开销消耗,每一个虚拟机都需要单独的OS,消耗不必要的资源。
故障风险(一个篮子多个鸡蛋),IO性能问题,硬件要求高等
java虚拟机和我们这里说的虚拟化有关系吗?
虚拟机根据它们的运用和与直接机器的相关性分为两大类:
系统虚拟机提供一个可以
运行完整操作系统的完整系统平台。相反,
程序虚拟机为
运行单个计算机程序设计,这意谓它
支持单个进程。虚拟机的一个本质特点是
运行在虚拟机上的软件被局限在虚拟机提供的资源里――它不能超出虚拟世界。
虚拟化分为:
资源虚拟化,
应用程序虚拟化,
平台虚拟化
。
平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化。
资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。
应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。
Java虚拟机(
JVM)属于
程序级别的虚拟化,不在我们今天的讨论范围。
今天我们主要讨论
平台级的虚拟化(典型代表太多,KVM,XEN,LXC等):
平台虚拟化又可以细分为如下几个子类:
1.全虚拟化(Full Virtualization)
全虚拟化是
处理器密集型技术,虚拟机
模拟了完整的底层硬件,包括
处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件
完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。
全虚拟化 VMM 以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。
在完全虚拟化(full virtualization)中,虚拟机模拟一个足够强大的硬件使客户机操作系统独立运行。举例而言,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 必须全权管理,Guest OS 理解的物理地址只是客户机物理地址(Guest Physical Address),并不是最终的主机物理地址(Host Physical Address)。当 Guest OS 发生缺页异常时,VMM 需要知道缺页异常的原因,是 Guest 进程试图访问没有权限的地址,或是客户机线性地址(Guest Linear Address)尚未翻译成 Guest Physical Address,还是客户机物理地址尚未翻译成主机物理地址。一种可行的解决方法是 VMM 为 Guest OS 的每个进程的页表构造一个影子页表,维护 Guest Linear Address 到 Host Physical Address 的映射,主机 CR3 寄存器存放这个影子页表的物理内存地址。VMM 同时维护一个 Guest OS 全局的 Guest Physical Address 到 Host Physical Address 的映射表。发生缺页异常的地址总是Guest Linear Address,VMM 先去 Guest OS 中的页表检查原因,如果页表项已经建立,即对应的Guest Physical Address 存在,说明尚未建立到 Host Physical Address的映射,那么 VMM 分配一页物理内存,将影子页表和映射表更新;否则,VMM 返回到 Guest OS,由 Guest OS 自己处理该异常。
比较著名的全虚拟化 VMM 有 Microsoft Virtual PC、VMware Workstation, Virtual Box 和 qemu。 VMware,Microsoft商用产品利用了,在完全虚拟化的环境下,hypervisor运行在裸硬件上,充当主机操作系统;而由hypervisor管理的虚拟服务器运行客户端操作系统(guest OS)。Linux KVM是基于核心,面向Linux操作系统的完全虚拟化。
2.准虚拟化(Paravirtualization)
虚拟机不需要模拟硬件,而是提供一个特殊的API只能被特制的客户机操作系统使用。修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化虚拟机中,
部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。操作系统作为虚拟服务器在Xen hypervisor上运行之前,它必须在核心层面进行某些改变。因此,Xen适用于BSD、Linux、Solaris及其他开源操作系统,但不适合对像Windows这些专有的操作系统进行虚拟化处理,因为它们无法改动。准虚拟化技术的优点是性能高。经过准虚拟化处理的服务器可与hypervisor协同工作,其响应能力几乎不亚于未经过虚拟化处理的服务器。由于不需要产生额外的异常和模拟部分硬件执行流程,
准虚拟化可以大幅度提高性能,
隔离性问题未得到很好的解决,比较著名的 VMM 有 Denali、Xen。
3.硬件辅助虚拟化(Hardware-Assisted Virtualization)
硬件辅助虚拟化是指
借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。
硬件提供结构支持帮助创建虚拟机监视并允许客户机操作系统独立运行。例如有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地完全隔离开来,Guest OS 有自己的“全套寄存器”,可以直接运行在最高级别。因此在上面的例子中,Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。 支持硬件辅助虚拟化的有 Linux KVM, VMware Workstation, VMware Fusion, Microsoft Virtual PC, Xen, Parallels Desktop for Mac,VirtualBox and Parallels Workstation。
Intel 和AMD 分别对CPU有相应的虚拟化技术。
CPU的虚拟化就属于硬件辅助虚拟化,也就是所谓的硬件辅助实现全虚拟化的技术。
CPU虚拟化技术就是单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化技术与
多任务以及
超线程技术是完全
不同的。多任务是指在一个操作系统中多个程序同时并行运行,而在虚拟化技术中,则可以同时运行多个操作系统,而且每一个操作系统中都有多个程序运行,每一个操作系统都运行在一个虚拟的CPU或者是虚拟主机上;而超线程技术只是单CPU模拟双CPU来平衡程序运行性能,这两个模拟出来的CPU是不能分离的,只能协同工作。
4.部分虚拟化(Partial Virtualization)
VMM 只模拟部分底层硬件,因此
客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在部分虚拟化(partial virtualization)中(包括地址空间虚拟化),
虚拟机模拟数个(但不是全部)底层硬件环境,特别是地址空间。这样的环境
支持资源共享和线程独立,但是不允许独立的客户机操作系统。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。
5.操作系统级虚拟化(Operating System Level Virtualization)
在
操作系统层虚拟化(OS-level virtualization)中,独
立主机被虚拟化在操作系统层中,这使得多个独立且安全虚拟化的服务器运行在一台计算机上。客户操作系统环境与宿主服务器分享同一个操作系统,例如,相同的系统内核被用来创建客户机环境。程序运行在被视为独立系统的客户机环境中。
主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。一个明显的区别是,如果使用
操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统(不过每个实例有各自的应用程序和用户账户)。操作系统层虚拟化的
灵活性比较差,但本机速度性能比较高。此外,由于架构在所有虚拟服务器上使用单一、标准的操作系统,管理起来比异构环境要容易。在传统操作系统中,所有用户的进程本质上是
在同一个操作系统的实例中运行,因此
内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术,
内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container [2],FreeBSD Jail 和 openVZ,
LXC 等。
分类并不是绝对的,一个优秀的虚拟化软件往往融合了多项技术。
VMware Workstation 是一个著名的全虚拟化的 VMM,但是它使用了一种被称为动态二进制翻译的技术
把对特权状态的访问转换成对影子状态的操作,从而避免了低效的 Trap-And-emulate 的处理方式,这与超虚拟化相似,只不过
超虚拟化是静态地修改程序代码。对于超虚拟化而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能
虚拟化镜像文件都有哪些格式(主要是raw,qcow2),各有什么特点?
Raw,Vhd,VDI,QCOW2,VMDK,OVF
raw :
最原始的文件格式,
直读直写,性能好,原生特性
简单,并能够导出为其他虚拟机的虚拟硬盘格式
能够改变空间最大值
能够直接被宿主机挂载,不用开虚拟机即可在宿主和虚拟机间进行数据传输
qcow2:
更小的存储空间
支持多个snapshot,对历史snapshot进行管理
支持zlib的磁盘压缩
支持AES的加密
vmdk :
VMware虚拟化专有格式,性能好,有非常多的高级特性,结合vmware特有功能。
vdi:
VirtualBox 的镜像格式,特点嘛就是只能自己用。
虚拟机镜像格式:
VMDK�C>qcow2:
qemu-img convert -f vmdk -O qcow2
qcow2�C>raw:
qemu-img convert -O qcow2
LXC(Linux Containers,操作系统级的轻量级虚拟化)为何物,相比传统VM有何不同?
Containers可以作为OS层面的虚拟化的一个替代方案,可以在一个宿主机上运行多个隔离的系统。在单一的操作系统下运行container更加高效,因此,container将会替代VM,成为未来云计算基础架构中的主导技术。
LXC:Linux容器,允许独立进程在比普通Unix进程更高的隔离级别上运行。使用的技术术语是
集装箱化:
一个容器里运行一个进程。
容器支持的隔离级别有:
文件系统:容器只能访问自己的沙箱文件系统(类似于chroot),否则要专门挂载到容器的文件系统中才能访问。
用户名字空间:容器有自己的用户数据库(也就是容器的root不等于主机的root账户)。
进程名字空间:只有容器里的进程才是可见的(ps aux的输出会非常简洁)。
网络名字空间:每个容器都有自己的虚拟网络设备和虚拟IP(因此它可以绑定任意端口,不用占用主机端口)。
VM的好处在于可以上下扩展,可控的计算资源,安全隔离,并可以通过API进行部署;但其缺点在于,
每一台VM都消耗了一部分资源用于运转一个完整的操作系统。
VM是指全虚拟化/半虚拟化,即传统意义上的虚拟机,其机制是
虚拟出硬件来,guest os跑在这些虚拟硬件上。而
container是在
OS级别的资源隔离和命名空间,本质上
guest和host是一个OS。container 是namespace+cgroup,有些公司仅仅用cgroup做资源的隔离,比如说:你在一台机器上同时运行MySQL和Apache,你又怕他们相互影响,所以用cgroup就可以很方便地设定MySQL用40%的cpu和2G的内存,Apache用60%的cpu和1G的内存。就是所谓的资源隔离。
LXC 功能类似chroot,但比chroot提供了更多的隔离功能。LXC基于chroot实现了完整的系统虚拟化,并在Linux现有的进程管理架构上添加了资源管理和隔离的机制。
Linux Containers从根本上提供了
原生的性能,可以实时进行资源分配的管理。Linux Container当中运行的二进制程序实际上是
直接在宿主机的内核上运行的一个普通的进程,跟其他进程没什么两样。这同时也意味着CPU和I/O的规划更加公平,而且可以进行微调。Container下拿到的磁盘I/O性能是系统虚拟化所无法比拟的(即使在Xen下使用paravirt模式也无法达到)。你可以在Linux Container当中运行磁盘I/O较重的应用,如数据库。
LXC无法运行其他非Linux系统。不过,你可以在同一个宿主机内核下的不同containers里面运行不同的Linux发行版。
管理 LXC的Docker的主要特性如下:
文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次***互shell。
传统VM与LXC:
传统VM
LXC
参考资源:
http://zh.wikipedia.org/wiki/%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%AF%94%E8%BE%83#.E8.99.9B.E6.93.AC.E6.A9.9F.E5.99.A8.E6.AF.94.E8.BC.83
http://zh.wikipedia.org/wiki/Xen
http://zh.wikipedia.org/wiki/VirtualBox
http://www.baike.com/wiki/%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF
http://baike.baidu.com/view/13605.htm
http://www.ibm.com/developerworks/cn/linux/l-linuxvirt/
https://linuxcontainers.org/
http://www.ibm.com/developerworks/cn/linux/l-lxc-containers/