本篇博客大体介绍了虚拟化技术的总体轮廓,对一些容易混淆的概念进行了详细讲解,算是虚拟化技术的入门知识吧;

===================================================================

1 什么是虚拟化

2 虚拟化技术的分类

    2.1 硬件仿真

    2.2 完全虚拟化

    2.3 半虚拟化

    2.4 操作系统级虚拟化

    2.5 库虚拟化

    2.6 应用程序虚拟化

3 完全虚拟化和半虚拟化的区别

    3.1 完全虚拟化

        3.1.1 两大加速技术

        3.1.2 Intel硬件辅助虚拟化技术

    3.2 半虚拟化

4. 计算机不同组件的虚拟化方式

    4.1 CPU虚拟化

        4.1.1 模拟和虚拟的区别

    4.2 Memory虚拟化

        4.2.1 两大加速技术

    4.3 I/O虚拟化

        4.3.1 I/O设备类型及虚拟化类型

        4.3.2 I/O虚拟化的3种方式

    4.4 网络虚拟化

        4.4.1 桥接 

        4.4.2 隔离

        4.4.3 仅主机

        4.4.4 路由

        4.4.5 NAT

5. 虚拟化的两种实现模型

    5.1 Hypervisor模型

    5.2 Hosted模型

6. 虚拟网卡的实现原理

    6.1 TUN和TAP

7. 如何在Linux上建立桥设备

    7.1 配置文件方式

    7.2 brctl命令行方式

===================================================================


1. 什么是虚拟化

将一组物理平台抽象为多组彼此之间互相隔离的平台,且每个平台都仿佛使用全部的硬件资源;


2. 虚拟化技术的分类

2.1 硬件仿真(Emulation)

简介:属于Hosted模式,在物理机的操作系统上创建一个模拟硬件的程序(Hardware VM)来仿真所想要的硬件,并在此程序上跑虚拟机,而且虚拟机内部的客户操作系统(Guest OS)无需修改;

架构图

虚拟化技术之我见_第1张图片

产品:PearPC,Bochs,QEMU;

优点:Guest OS无需修改,而且非常适合用于操作系统开发,也利于进行固件和硬件的协作开发;

缺点:速度非常慢,有时速度比物理情况慢100倍以上;

2.2 完全虚拟化(Full Virtulization)

简介:主要是在客户操作系统和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使客户操作系统无需修改就能运行,速度会根据不同的实现而不同,但大致能满足用户的需求;这种方式是业界现今最成熟和最常见的,而且属于 Hosted 模式和 Hypervisor 模式的都有;

架构图

虚拟化技术之我见_第2张图片

产品:VMware Workstation,VMware ESX/ESXi,Parallels Desktop,KVM,Xen(HVM);

优点:Guest OS无需修改,速度和功能都非常不错,更重要的是使用非常简单;

缺点:基于Hosted模式的全虚拟产品性能方面不是特别优异,特别是I/O方面;

2.3 半虚拟化(Para Virtulization)

简介:它与完全虚拟化有一些类似,它也利用Hypervisor来实现对底层硬件的共享访问,但是由于在Hypervisor 上面运行的Guest OS已经集成与半虚拟化有关的代码,使得Guest OS能够非常好地配合Hyperivosr来实现虚拟化。通过这种方法将无需重新编译或捕获特权指令,使其性能非常接近物理机;

架构图

虚拟化技术之我见_第3张图片

产品:Xen,UML(user-mode linux);

优点:这种模式和全虚拟化相比,架构更精简,而且在整体速度上有一定的优势;

缺点:需要对Guest OS进行修改,所以在用户体验方面稍有欠缺;

2.4 操作系统级虚拟化(Operating System Level Virtulization)

简介:这种技术通过对服务器操作系统进行简单地隔离来实现虚拟化,主要用于VPS;

架构图

虚拟化技术之我见_第4张图片

产品:OpenVZ,lxc,Solaris Containers,FreeBSD jails;

优点:因为它是对操作系统进行直接的修改,所以实现成本低而且性能不错;

缺点:在资源隔离方面表现不佳,而且对Guest OS的型号和版本有限定;

2.5 库虚拟化:如wine

2.6 应用程序虚拟化:如jvm


3. 完全虚拟化和半虚拟化的区别

3.1 完全虚拟化(Full Virtualization):宿主机Host完全虚拟出一个平台,使得虚拟机guest无法意识到自己运行在虚拟化平台上;中间一定有一个对特权指令的转换过程;

3.1.1 两大加速技术

  • BT技术:Binary Translation 二进制翻译技术,前提是虚拟架构和底层物理架构需要保持一致;

    • 能将各guest对特权指令的调用,按需要在运行时,在调用的一刻直接翻译成对Host中特权指令的调用,无需软件层面多次解码,且可以边运行边调用边转换;

    • 可将虚拟机guest对比底层硬件的性能从60%提升到80%~85%; 

    • BT机制中,guest的用户空间运行在环3上,guest的内核空间运行在环1上,宿主机(Host)的内核空间运行在环0上,BT就监控在环1上,随时将guest内核的调用转换成特权指令调用; 

  • HVM技术:Hardware Virtualization Machine,硬件辅助虚拟化技术;

    • 如针对CPU的硬件虚拟化技术,使得物理CPU拥有5个环,环-1~环3,虚拟机的内核运行在CPU的环0上,而宿主机(Host)的内核运行在环-1上(特权指令环);

    • Host能够捕获guest对环0上的特权指令的调用,进而利用CPU硬件转换成环-1上的特权指令,无需软件参与;

    • 这种转换需要激活Host的内核;HVM技术能将虚拟机guest对比底层硬件的性能提升至85%;

3.1.2 Intel硬件辅助虚拟化技术包括: 

  • 第一类:跟处理器相关:vt-x 

  • 第二类:跟芯片相关:vt-d 

  • 第三类:跟IO相关,VMDq和SR-IOV

3.2 半虚拟化(para-virtualization):各虚拟机的内核在发起特权指令时,需要调用hyper call,能够意识到hypervisor的存在;

  • 执行特权指令是直接调用,而非翻译,大大简化了特权指令的执行过程;

  • 能将虚拟机guest对比底层硬件的性能提升至90-95%;


4. 计算机不同组件的虚拟化方式

4.1 CPU虚拟化

通过软件,集合硬件CPU的微编码,实现一个模拟的CPU,供虚拟机使用;

因为虚拟机上的程序需要运行特权指令时,则需要通过虚拟机内核和宿主机内核这2层转化,导致性能低下;

4.1.1 模拟和虚拟的区别

  • 模拟:emulation,物理架构和虚拟架构不一致,如物理x86架构上虚拟ppc架构,则虚拟架构上的非特权指令和特权指令都需要转换,才可以运行在物理CPU上,故需模拟虚拟机内核的环0、1、2、3;

  • 虚拟:virtulization,物理架构和虚拟架构一致,虚拟机上的非特权指令可以直接运行在物理CPU上,故只需模拟虚拟机内核的环0;

4.2 Memory虚拟化

    Memory在非虚拟化的操作系统中就是一种虚拟化实现,进程看到的是线程地址空间,而内核看到的是物理地址空间;

    在虚拟化环境下,hypervisor将物理内存分配成内存页(page frame),然后被分隔后划分给各虚拟机,故各虚拟机所获得的就是离散、非完整的内存;

    虚拟机中的进程访问内存需经过2次转换,首先由MMU转换成内核的连续虚拟地址空间,再经由hypervisor(利用shadow page table手段)转换成物理地址空间;

    在虚拟机guest发生切换时,TLB缓存的结果可能会导致误解,故每次虚拟机切换则不得不清空TLB,所以TLB的缓存命中率低下;

4.2.1 两大加速技术

  • MMU(Memory Management Unit)的虚拟化:实现了GVA到HPA的直接转换,具体实现技术有:

    • Intel:EPT技术(Extended Page Table,扩展的页面技术)

    • AMD:NTP技术(Nested Page Table,嵌套的页面技术)

    • 具体实现原理如下图:

虚拟化技术之我见_第5张图片

  • TLB(Translation Lookaside Buffer)的虚拟化:tagged TLB:记录(GuestA,GVA,HPA)的直接映射关系,需要CPU支持此特性;

4.3 I/O虚拟化

4.3.1 I/O设备类型及虚拟化类型

  • 外存:硬盘、光盘、U盘(一般使用模拟方式)

  • 网络设备:网卡(一般使用半虚拟化方式)

  • 显示设备:VGA(使用帧缓冲机制(frame buffer))

  • 键盘鼠标:PS2、USB(利用焦点捕获方式,实现将模拟的设备和物理设备建立关联关系)

4.3.2 I/O虚拟化的3种方式

  • 模拟:如利用本地回环文件模拟实现硬盘功能,完全使用软件来模拟真实硬件;性能较低;对于I/O设备来说,模拟和完全虚拟化,没有区别;

  • 半虚拟化:IO frontend,IO backend,仅适用于硬盘和网卡;性能比模拟方式高;

  • IO-through:IO透传技术,即让虚拟机直接使用物理设备;需hypervisor协调,但能以接近硬件设备的性能来使用硬件,性能最高;如Intel的VT-d技术,是基于北桥芯片的硬件辅助虚拟化技术,完成IO设备的硬件虚拟化 ,主要功能是用来提升IO设备的可靠性、灵活性和性能的;

  • I/O设备模拟和半虚拟化的对比图如下:

虚拟化技术之我见_第6张图片

4.4 网络虚拟化

4.4.1 桥接:bridge mode,Host上的物理网卡(如eth0)虚拟化为交换机,为其上的guest虚拟机提供对外通信功能,而新建的桥接口(如br0)则接收发往Host的的数据报文;

4.4.2 隔离:isolation mode,利用软件实现一个虚拟交换机,各虚拟机连接至此虚拟交换机,即可实现虚拟机间通信;但各虚拟机和宿主机Host间也是无法通信的;

4.4.3 仅主机:Host-only mode,虚拟出一个交换机,并在Host上模拟一个虚拟网卡,连接在此虚拟交换机上,用以虚拟机间通信及虚拟机和宿主机间通信,但与外部网络是隔离的;

4.4.4 路由:routed  mode,在Host-only mode的基础上,打开Host上虚拟网卡和物理网卡间的路由转发功能,实现对外通信;若要实现host1访问guest1,则host1必须配置有pnet0网卡的静态路由,故不常用;

4.4.5 NAT:在Host-only模式下打开了NAT转发功能,经过物理网卡发出去的数据报文的源地址就是物理网卡的地址,以实现内部虚拟网络对外透明;

详细对比图如下:

虚拟化技术之我见_第7张图片


5. 虚拟化的两种实现模型

5.1 Hypervisor模型

如:Xen,vmware ESX/ESXi等;

5.2 Hosted模型

如:kvm,vmware workstation,virtualbox等;

二者的结构对比图如下:

虚拟化技术之我见_第8张图片


6. 虚拟网卡的实现原理

虚拟化技术之我见_第9张图片

6.1 TUN与TAP

    在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能;

    TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包;

    操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后一种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程;


7. 如何在Linux上建立桥设备

前提条件:关闭NetworkManager;安装管理桥设备的程序包:yum -y install bridge-utils

7.1 配置文件方式:永久生效,但配置较繁琐;

cd /etc/sysconfig/network-scripts
vi ifcfg-br0
    DEVICE=br0
    BOOTPROTO=none
    NM_CONTROLLED=no
    ONBOOT=yes
    TYPE=Bridge
    IPADDR=172.16.25.40
    NETMASK=255.255.0.0
    GATEWAY=172.16.0.1
    DNS1=172.16.0.1
    IPV6INIT=no
    USERCTL=no
vi ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=none
    NM_CONTROLLED=no
    ONBOOT=yes
    TYPE=Ethernet
    BRIDGE=br0
    IPV6INIT=no
    USERCTL=no
brctl stp br0 on    # 开启STP生成树协议
service network restart

7.2 brctl命令行方式:网络重启后失效,但配置方便,可写进脚本直接执行;

brctl addbr  br0    # 添加桥接口br0
brctl stp br0 on    # 开启STP(生成树)协议
ifconfig eth0 0 up  # 拆除eth0上的IP地址
brctl addif br0 eth0    # 为桥关联网卡接口
ifconfig br0 172.16.100.8/16 up # 为桥设备配置IP地址
route add default gw 172.16.0.1 # 配置默认网关