一、虚拟化

      虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。

  计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件


二、cpu虚拟化

1、模拟 emulation    

             软件方式实现,上层架构和底层可以不一样;需要模拟环0,1,2,3

2、虚拟 virtulization  

             上层架构和底层要保持一致

             完全虚拟化(full-virtulization):宿主机完全虚拟出一个完整的平台,guest不清楚自己运行在虚拟环境中;只需要模拟环0,假设各guest的内核运行在环1(实际上不可能运行在环1,因为环1没有特权指令)

                          BT:二进制翻译(软件) 

                          HVM:硬件辅助的虚拟化(硬件),模拟出环-1,host的内核运行在环-1,guest内核运行在环0上,此时环0上没有特权指令,guest运行特权时指令cpu会被触发,这个过程不需要hyper进行监控,提高性能

               半虚拟化(para-virtulization):各host知道自己运行在虚拟化环境中,当需要运行特权指令时,直接请求宿主机的内核

vm monitor=hypervisor 虚拟化监视器相当于内核

hypervisor运行在硬件平台上,对底层硬件(cpu和内存不包括io)使用分配过程虚拟成hyper call(hyper 调用),虚拟机的内核运行特权指令时,调用hyper call


二、内存虚拟化

进程视角看内存:线性地址空间 虚拟地址 

内核视角看内存:物理地址空间


MMU将线性地址转化为物理地址

1、MMUmemory management unit,称为内存管理单元,或者是存储器管理单元,

        MMU是硬件设备,它被保存在主存(main memory)的两级也表控制,并且是由协处理器CP15的寄存器1的M位来决定是enabled还是disabled。MMU的主要作用是负责从CPU内核发出的虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。MMU使得每个用户进程拥有自己的地址空间(对于WINCE5.0,每个进程是32MB;而对于WINCE6.0,每个进程的独占的虚拟空间是2GB),并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏

 

VA:virtual address 称为虚拟地址

PA:physical address称为物理地址

       CPU通过地址来访问内存中的单元,如果CPU没有MMU,或者有MMU但没有启动,那么CPU内核在取指令或者访问内存时发出的地址(此时必须是物理地址,假如是虚拟地址,那么当前的动作无效)将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(物理内存)接收,这时候的地址就是物理地址。如果CPU启用了MMU(一般是在bootloader中的eboot阶段的进入main()函数的时候启用),CPU内核发出的地址将被MMU截获,这时候从CPU到MMU的地址称为虚拟地址,而MMU将这个VA翻译成为PA发到CPU芯片的外部地址引脚上,也就是将VA映射到PA中。MMU将VA映射到PA是以页(page)为单位的,对于32位的CPU,通常一页为4k,物理内存中的一个物理页面称页为一个页框(page frame)。

虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。


2、CPU访问内存时的硬件操作顺序

1)CPU内核发出VA请求读数据,TLB(translation lookaside buffer)接收到该地址,那为什么是TLB先接收到该地址呢?

       因为TLB是MMU中的一块高速缓存(也是一种cache,是CPU内核和物理内存之间的cache),它缓存最近查找过的VA对应的页表项,如果TLB里缓存了当前VA的页表项就不必做translation table walk了,否则就去物理内存中读出页表项保存在TLB中,TLB缓存可以减少访问物理内存的次数。

2)页表项中不仅保存着物理页面的基地址,还保存着权限和是否允许cache的标志。MMU首先检查权限位,如果没有访问权限,就引发一个异常给CPU内核。然后检查是否允许cache,如果允许cache就启动cache和CPU内核互操作。 

3)如果不允许cache,那直接发出PA从物理内存中读取数据到CPU内核。

4) 如果允许cache,则以VA为索引到cache中查找是否缓存了要读取的数据

,如果cache中已经缓存了该数据(称为cache hit)则直接返回给CPU内核,如果cache中没有缓存该数据(称为cache miss),则发出PA从物理内存中读取数据并缓存到cache中,同时返回给CPU内核。但是cache并不是只去CPU内核所需要的数据,而是把相邻的数据都去上来缓存,这称为一个cache line。ARM920T的cache line是32个字节,例如CPU内核要读取地址0x30000134~0x3000137的4个字节数据,cache会把地址0x30000120~0x3000137(对齐到32字节地址边界)的32字节都取上来缓存。


3、TLB:Translation Lookaside Buffer.

       根据功能可以译为快表,直译可以翻译为旁路转换缓冲,也可以把它理解成页表缓冲里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。当处理器要在主内存寻址时,不是直接在内存的物理地址里查找的,而是通过一组虚拟地址转换到主内存的物理地址,TLB就是负责将虚拟内存地址翻译成实际的物理内 存地址,而CPU寻址时会优先在TLB中进行寻址。处理器的性能就和寻址的命中率有很大的关系。

由于CPU首先接到的是由程序传来的ee虚拟内存地址,所以CPU必须先到物理内存中取页表,然后对应程序传来的虚拟页面号,在表里找到对应的物理页面 号,最后才能访问实际的物理内存地址,也就是说整个过程中CPU必须访问两次物理内存(实际上访问的次数更多)。因此,为了减少CPU访问物理内存的次 数,引入TLB。


MMU的虚拟化:

           INTEL:EPT,Extended Page Table

           AMD:NTP,Nested Page Table

TLB的虚拟化:

            tagged TLB


三、I/0虚拟化

I/0:

    外存:

   硬盘、光盘、u盘

网络设备:

          网卡

显示设备:

         VGA:frame buffer机制,

键盘鼠标:

         ps/2,usb:完全模拟实现,当前焦点捕获,将虚拟设备和物理设备建立关联关系

I/O虚拟化的方式:

                           模拟:完全使用软件来模拟真实硬件

                    半虚拟化:

       IO-through:IO透传,让虚拟机直接使用物理设备,几乎接近于硬件性能,硬件必须要支持透传技术: Intel:VT-d   基于北桥的硬件辅助的虚拟化技术


四、两种虚拟化的实现方式

1、主机虚拟化技术的两种类型

虚拟化一、虚拟化技术基础原理_第1张图片

Type-I(能等同于半虚拟化吗?):

             xen,vmware ESX/ESXi

Type-II(能等同于完全虚拟化吗?):

             kvm,vmware workstation,virtualbox    


2、Intel硬件辅助的虚拟化

       cpu:vt-x,EPT,tagged-TLB

    i0/cpu:vt-d,IOV,VMDq


3、虚拟化技术的分类

模拟:Emulation  

          上层的虚拟机架构和底层可以不一样,性能比较差

           著名的模拟器  PearPC,Bochs,QEMU

完全虚拟化: Full Vitualization 也称为native virtulization

            类似于模拟但不完全等同于模拟(模型相同)

            cpu和内存不做模拟,只作管理,i/o需要模拟。

    两种加速方式:BT,HVM

            著名软件实现:VMware Workstation,VMware Server,VirtuaBox,Parallels Desktop(实现虚拟化的方式灵活,轻量),KVM,Xen(HVM)

半虚拟化:para-virtualization 

            hyper将底层物理硬件平台略加修改后输出为虚拟机环境,虚拟机的架构和底层架构完全一样

            虚拟机上的操作系统内核需要做修改,让其明确知道自己运行在虚拟化环境中,其内核不能直接发起系统调用、而是发起hypercall来实现

            Xen,UML(user-mode linux)

OS虚拟化:

         本身没有hyper,直接运行于物理硬件上,

         将操作系统的用户空间切割成多份,每份各自独立,互相隔离,每个用户空间当成一个虚拟机来用

         性能好,但隔离性,稳定性不好

         更多地被称为容器级虚拟化,OpenVZ,LXC(linux container),libcontainer, Solaris Containers,FreeBSD jails

库虚拟化:

         虚拟化一个程序的运行环境

         wine,

应用程序虚拟化:

          jvm,


五、网络虚拟化

1、网络虚拟化模型

  1)bridge 桥接

       把物理机上的网卡当作交换机

 在桥接方式下,模拟一个虚拟的网卡给客户系统,主系统对于客户系统来说相当于是一个桥接器。客户系统好像是有自己的网卡一样,自己直接连上网络,也就是说客户系统对于外部直接可见。

  2)Host-Only 仅主机

     纯软件的方式虚拟出一个交换机,各虚拟机的虚拟网卡都连在虚拟交换机上,在物理机系统上虚拟出一个虚拟网卡连在虚拟交换机上。物理系统上的物理网卡和虚拟交换机没有任何关系,

默认情况下,虚拟机只能到主机访问虚拟机之间也能互相通信而不能访问Internet。这也是hostonly的名字的意义。

默认情况下,DHCP服务加载到vmnet1上。这样连接到vmnet1上的虚拟机仍然可以设置成dhcp,方便系统的配置。

  3)route 路由

     仅主机模式只要物理机打开网卡间转发功能就成了route模式

  4)NAT  

    仅主机模式模型一样

  5)isolation 隔离

      各虚拟机虚拟网卡连在虚拟交换机上,虚拟机之间能互相通信,但虚拟机与主机和internet不能通信


2、TUN与TAP

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

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

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


3、在linux主机上启动桥功能

注意:桥功能不支持NetworkManager来管理网络服务,关闭NetworkManager和禁止其开机启动

使用brctl的配置的过程示例:

# brctl addbr br0

# brctl stp br0 on

# ifconfig eth0 0 up

# brctl addif br0 eth0

# ifconfig br0 IP/NETMASK up

# route add default gw GW

[root@BAIYU_179 ~]# rpm -ql bridge-utils
/usr/sbin/brctl
/usr/share/doc/bridge-utils-1.2
/usr/share/doc/bridge-utils-1.2/AUTHORS
/usr/share/doc/bridge-utils-1.2/COPYING
/usr/share/doc/bridge-utils-1.2/FAQ
/usr/share/doc/bridge-utils-1.2/HOWTO
/usr/share/man/man8/brctl.8.gz

[root@BAIYU_179 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
[root@BAIYU_179 ~]# brctl addbr br0
[root@BAIYU_179 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000000000000	no		
[root@BAIYU_179 ~]# brctl stp br0 on
[root@BAIYU_179 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000000000000	yes		
[root@BAIYU_179 ~]# ifconfig eth0 0
[root@BAIYU_179 ~]# brctl addif br0 eth0
[root@BAIYU_179 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29566ef4	yes		eth0
[root@BAIYU_179 ~]# ifconfig br0 192.168.100.179/24 up
[root@BAIYU_179 ~]# ifconfig
br0       Link encap:Ethernet  HWaddr 00:0C:29:56:6E:F4    
          inet addr:192.168.100.179  Bcast:192.168.100.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe56:6ef4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:238 (238.0 b)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:56:6E:F4  
          inet6 addr: fe80::20c:29ff:fe56:6ef4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1078699 errors:0 dropped:0 overruns:0 frame:0
          TX packets:198700 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:101666119 (96.9 MiB)  TX bytes:15187221 (14.4 MiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:56:6E:FE  
          inet addr:172.16.11.135  Bcast:172.16.11.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe56:6efe/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2172706 errors:0 dropped:0 overruns:0 frame:0
          TX packets:126893 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:216073459 (206.0 MiB)  TX bytes:10634543 (10.1 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:11790 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11790 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:759673 (741.8 KiB)  TX bytes:759673 (741.8 KiB)
[root@BAIYU_179 ~]# route add default gw 192.168.100.1 
[root@BAIYU_179 ~]# brctl show br0
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29566ef4	yes		eth0

这种方法重启计算机将失效,下面再演示一下把配置写在配置文件中的方式:

[root@BAIYU_179 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
[root@BAIYU_179 ~]# cd /etc/sysconfig/network-scripts/
[root@BAIYU_179 network-scripts]# ls
ifcfg-eth0       ifdown-bnep  ifdown-ppp     ifup-bnep  ifup-plusb   ifup-wireless
ifcfg-eth0.orig  ifdown-eth   ifdown-routes  ifup-eth   ifup-post    init.ipv6-global
ifcfg-eth1       ifdown-ippp  ifdown-sit     ifup-ippp  ifup-ppp     net.hotplug
ifcfg-eth1.orig  ifdown-ipv6  ifdown-tunnel  ifup-ipv6  ifup-routes  network-functions
ifcfg-lo         ifdown-isdn  ifup           ifup-isdn  ifup-sit     network-functions-ipv6
ifdown           ifdown-post  ifup-aliases   ifup-plip  ifup-tunnel
[root@BAIYU_179 network-scripts]# vi ifcfg-br0 
[root@BAIYU_179 network-scripts]# vi ifcfg-eth0
[root@BAIYU_179 network-scripts]# cat ifcfg-br0
DEVICE=br0
BOOTPROTO=static
TYPE=Bridge         #注意这行一定要写而且Bridge的B一定要大写,其它的一定要小写
#HWADDR=00:0C:29:53:F6:29
IPADDR=192.168.100.179
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
ONBOOT=yes

[root@BAIYU_179 network-scripts]# cat ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
BRIDGE=br0
#HWADDR=00:0C:29:53:F6:29
#IPADDR=192.168.100.179
#NETMASK=255.255.255.0
#GATEWAY=192.168.100.1
ONBOOT=yes

[root@BAIYU_179 network-scripts]# service network restart
[root@BAIYU_179 network-scripts]# ifconfig
br0       Link encap:Ethernet  HWaddr 00:0C:29:56:6E:F4  
          inet addr:192.168.100.179  Bcast:192.168.100.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1280 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:92815 (90.6 KiB)  TX bytes:70438 (68.7 KiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:56:6E:F4  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6632 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6319 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:500126 (488.4 KiB)  TX bytes:390685 (381.5 KiB)
[root@BAIYU_179 network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29566ef4	yes		eth0