虚拟化就是将一组物理平台抽象为多组彼此隔离的计算平台。虚拟化起始于上世纪60年代的IBM公司,当时的主机体积很大一台主机上可能用于实现多种功能,不可能为每一个功能就买一个主机,虚拟化技术的出现解决了这个问题。后来PC机的出现取代了虚拟化的必要性,虚拟化技术渐渐走下坡路,但随着x86平台的主机性能的逐渐提升,使得有些中小型企业的服务器在大多数的情况下主机资源的利用率连10%都不到,造成了资源的浪费。如果在一个物理机器上只是用其中的某些资源就能够满足企业的需求时,虚拟化技术再一次走进了人们的视野。


虚拟化技术的分类

模拟虚拟化:

        底层为硬件,在硬件上运行一个主机,在主机上运行一个虚拟化模拟器软件,然后使用软件模拟出一个或多个硬件环境,模拟出完整的CPU、完整的内存与IO设备。著名的模拟器:PearPC、Bochs、QEMU。运行在此之上的GuestOS虚拟机不需要修改。

完全虚拟化:

        CPU不做模拟只对它做相应的分配和管理,内存也不做模拟,IO等需要模拟。完全虚拟化的性能要高于模拟虚拟化。完全虚拟化技术:VMware Workstation(个人虚拟化),VMware Server,Parallels Desktop,KVM,Xen(HVM)。

无标题.png

不同之出:完全虚拟化与模拟虚拟化的不同之处在于CPU平台要保持一直,其架构同模拟虚拟化。

半虚拟化:

        虚拟出的架构与底层硬件架构完全相同,内核不能够直接操作硬件,需要修改GuestOS内核,明确知晓自己是运行在虚拟化环境中的,这对操作系统有要求。解决方案有:Xen,UML。

底层运行hypervisor,hypervisor通过将底层功能通过hyper call向上进行输出,虚拟机的内核要进行修改,需要知道自己要发生hyper call调用。

无标题.png

        相比较上面的两种虚拟化半虚拟化的性能要好得多。

hypervisor:

        Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,hypervisor本身就是一个完整的操作系统。

OS级别的虚拟化:

        这个级别的虚拟化只是虚拟出了用户空间,将用户空间切割为多份,彼此之间互相隔离,每一份被看作一个虚拟机,从而实现的虚拟化。或者称为容器及虚拟化。OpenVZ、LXC、libcontainer、Linux V Servers等都是用户空间的虚拟化。

无标题2.png

库级别的虚拟化:

        虚拟化出程序运行所依赖的库环境,如WINE可以在linux上运行windows的桌面环境。如java的JVM,还有python的PVM等都是库级别的虚拟化。


虚拟化方式


虚拟化的两种方式:

        Type-I:在硬件上直接运行hypervisor,在hypervisor之上运行各个虚拟机。

        Type-II:在物理机上运行一个宿主机,在宿主机之上运行一个vmm(虚拟机监控器),然后在其上面运行各个虚拟机。

        Hypervisor:(是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件)也叫VMM(Virtual Machine Monitor 虚拟机监视器)。

        如果使用分布式的跨多主机来实现虚拟机管理的话叫IaaS(infrastructure as a service)云,使用的技术是Xen或kvm叫基础架构服务。如果是容器级别的虚拟化则是PaaS(platfrom as a service)云,叫平台级服务。


Xen:

        Xen hypervisor 直接运行在硬件之上的 Type-I 型虚拟化。Xen只是虚拟化了CPU和内存。对IO设备没有虚拟化。Xen直接运行在硬件上所以Xen必须直接驱动CPU和内存,但是对于一些IO设备,如显示器等没有驱动。通过创建第一个虚拟机作为Xen的助手,并在第一个虚拟机上提供一个虚拟机的管控接口,就可以通过这个接口来管控其他虚拟机了,所以对其他虚拟机的管控都要通过第一个虚拟机,而这个虚拟机是被定制的linux操作系统,这个操作系统上的驱动是被专门开发好的,通过这个linux的内核来启动各种IO设备,如显卡、声卡、网卡等等。

        其他的虚拟机要想使用内存和CPU是由Xen hypervisor提供,如果想使用IO设备则向第一个虚拟机来请求,第一个虚拟机则通过软件来模拟出IO设备或其他的一些方式,这些IO设备经由第一个虚拟机内核驱动后转换成对这些硬件的调用。如果有多个虚拟机就可以在第一个虚拟机的用户空间中模拟出多个IO设备,这个模拟是由Qemu来实现的。

        Xen只是提供了CPU和内存的虚拟化,IO设备则是由Qemu模拟来实现的。在Xen上每一个虚拟机被称为一个Domain(域),第一个必须启动的虚拟机我们称之为Domain0-->Dom0。也叫特权Domain,其他的叫DomU。

QQ截图20180529160239.png

在CentOS6.5上安装Xen:

创建镜像文件:

vim /etc/yum.repos.d/Xen4.repo

写上如下信息:

[xen4CentOS]
name=xen4
baseurl=https://mirrors.aliyun.com/centos/6.9/virt/x86_64/xen-44/
gpgcheck=0

安装xen:

yum install xen -y

安装xen后修改 /boot/grub/grub.conf 文件:

vim /boot/grub/grub.conf

新安装的内核为4.9找到title为4.9的行,如下:

title CentOS (4.9.86-30.el6.x86_64)

在新安装的内核下添加如下内容:

kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin

然后将后面的kernel 和 initrd 都改为模块 module。修改后的内容如下:

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (4.9.86-30.el6.x86_64)
        root (hd0,0)
        kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin
        module /vmlinuz-4.9.86-30.el6.x86_64 ro root=/dev/mapper/vg_qiyang-lv_root rd_LVM_LV=vg_qiyang/lv_swap rd_NO_LUKS rd_LVM_LV=vg_qiyang/lv_root rd_NO_MD crashkernel=auto.UTF-8  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        module /initramfs-4.9.86-30.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_qiyang-lv_root rd_LVM_LV=vg_qiyang/lv_swap rd_NO_LUKS rd_LVM_LV=vg_qiyang/lv_root rd_NO_MD crashkernel=auto.UTF-8  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.el6.x86_64.img


kvm:

        kernel-based Vitual Machine,基于内核的虚拟机,kvm是linux的一个内核模块,当启用kvm模块时宿主机的内核部分就成为一个hypervisor,宿主机的用户空间就成为控制台管理接口的运行位置。然后就可以创建虚拟机了,创建出的虚拟机事实上就是运行在宿主机用户空间的进程,使用ps命令就可以看到进程,使用kill就可以关闭进程。kvm充分利用了现代硬件设计中的优势,kvm必须依赖HVM技术(硬件辅助的虚拟化),如Inter VT-x 与 AMD ADM-v。

无标题.png

xen vs kvm:

        xen是将xen hypervisor运行在硬件之上的,kvm是将linux内核转变为hypervisor,运行在硬件上的任然是Linux。xen本身就实现了一个操作系统本身的所具备的基本功能。尤其是CPU和内存及中断处理的功能,但是把IO的能力托付给了Dom0来实现。而kvm没有试图再造一个轮子并利用linux内核本身就提供了的内存管理进程调度IO栈、设备驱动等等功能直接拿来用了。