美文网首页计算机科学
kvm虚拟化技术实现原理

kvm虚拟化技术实现原理

作者: 任总 | 来源:发表于2018-12-09 17:30 被阅读78次

    一、 虚拟化技术

    • 虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。
      物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)

    1、虚拟化技术的分类:

    (1) 模拟:Emulation

    Qemu, PearPC, Bochs, ...

    (2) 完全虚拟化:Full Virtualization,Native Virtualization
    • 完全虚拟化提供底层物理系统的全部抽象化,且创建一个新的虚拟系统,客户机操作系统可以在里面运行。不需要对客户机操作系统或者应用程序进行修改(客户机操作系统或者应用程序像往常一样运行,意识不到虚拟环境的存在)。
    • VMware是一款完全虚拟化软件。完全虚拟的弱点是效率不如半虚拟化的高
      半虚拟化系统性能可以接近在裸机上的性能。

    VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)

    (3) 半虚拟化:Para-Virutalization
    • 半虚拟化需要对运行在虚拟机上的客户机操作系统
      进行修改(这些客户机操作系统会意识到它们运行在虚拟环境里)并提供相近的性能,但半虚拟化的性能要比完全虚拟化更优越。

    • 特点:GuestOS明确知道自己运行虚拟机之上;
      xen, UML(user-mode linux)

    (4) 容器级虚拟化:

    LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, ...

    (5) 库级别虚拟化:

    wine

    (6) 程序级虚拟化

    jvm, pvm, ...

    2、主机虚拟化:Emulation, Full Virtualization, Para-Virutalization

    Type-I:Hypervisor直接运行于硬件;
    Type-II:Hypervisor运行主机OS之上;

    3、云栈的类别:

    • IaaS(Infrastructure-as-a-Service)基础设施服务
    • PaaS(Platform-as-a-Service)系统平台服务
    • SaaS(Software-as-a-Service)软件服务
    • FWaaS(FireWall as a Service)防火墙服务
    • DBaaS(DataBase-as-a-Service)数据库服务
    • LBaas (load-balancer-as-a-service)负载均衡服务

    二、主机虚拟化:

    1、cpu的虚拟化:

    • 模拟类型:emulation,虚拟机的arch与物理平台的arch可以不同;qemu
    • 虚拟类型:virtualization
      完全虚拟化(full-virt)
      * BT:通过软件二进制转换
      * HVM:硬件辅助的虚拟化
      半虚拟化: (pare-virt)
      * GuestOS明确知道自己运行于虚拟技术中
    硬件级物理cup虚拟化技术
    • 英特尔硬件虚拟化技术interl-VT
    • AMD硬件虚拟化技术AMD-V

    2、内存虚拟化管理

    • 早期,虚拟机中的内存到物理内存地址机制,用软件实现, shadowmmu很低效
      硬件内存中添加了,标识虚拟机标签机制tagged TLB。

    • MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

    硬件级内存虚拟化:

    硬件级物理内存映射到虚拟机

    • 英特尔硬件虚拟化技术EPT,Extended Page Table
    • AMD硬件虚拟化技术NTP,Nested Page Table

    3、硬盘的虚拟化:

    • 虚拟机如何使用硬盘的空间:虚拟机在物理硬盘上划分一个文件来使用,此文件也是靠宿主机通过文件系统将磁盘分区后,并创建文件系统后,分给虚拟机一个文件的大小的空间。在宿主机上表现的就是一个文件,而在虚拟机上表现的就是一块硬盘。所以还需要用软件的方式模拟一个适配器,将此文件,模拟成硬盘。

    4、网络虚拟化

    • 用软件的方式给每个虚拟机虚拟一块网卡和MAC地址,当通信时使用同一块物理网卡,网卡通讯有排队方式,在同一台物理网卡上,排队执行任务。(将物理网卡设为混杂模式;无论是不是发向本机物理网卡的内容都给与接收);此时将物理网卡也虚拟化一个MAC地址,把物理网卡当作交换机来使用。

    5、IO虚拟化

    I/O全虚拟化技术
    • 通过VMM模拟I/O设备(磁盘和网卡等)实现虚拟化。
      Guest OS所能看到就是一组统一的I/O设备。VMM截获Guest OS对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对Guest而言非常透明,无需考虑底层硬件的情况。
    I/O半虚拟化技术
    • 通过前端(Front-End)/后端(Back-End)模拟实现虚拟化。
      Guest OS中的驱动程序为前端,VMM提供的与Guest通信的驱动程序为后端。前端驱动将Guest OS的请求通过与VMM间的特殊通信机制发送给VMM的后端驱动,后端驱动在处理完请求后再发送给物理驱动。
    I/O透传技术
    • 设备透传就是向一个特定客户操作系统提供一种设备隔离,对于性能而言,使用设备透传可以获得近乎本机的性能。对于某些网络应用程序(或那些拥有高磁盘 I/O 的应用程序)来说,这种技术简直是完美的。这些网络应用程序没有采用虚拟化,原因是穿过管理程序(达到管理程序中的驱动程序或从管理程序到用户空间模拟)会导致竞争和性能降低。但是,当这些设备不能被共享时,也可以将它们分配到特定的客户机中。例如,如果一个系统包含多个视频适配器,则那些适配器可以被传递到特定的客户域中。

    6、一型虚拟化type-1

    • 特点:于硬件级别直接运行hypervisor虚拟机管理控制
      xen,vmware ESX/ESXI


      xen虚拟过程

    7、二型虚拟化type-2

    • 特点:host主机上建立guest虚拟系统,有宿主机
      在硬件级别运行一个os(host os),而此上运行一个vmm监视器,用于管理guest虚拟系统
      vmwarworkstations, kvm,virtualbox

    三、容器级级虚拟化

    • 缺点:相较于主机级虚拟化隔离的不彻底
      方案:lxc, libcontainer, runC, openvz

    • Linux内核运行在物理设备上;在内核上运行多个操作系统如:centos,wubantu;susan;等,因为他们都是基于linux内核来开发的不同界面的操作系统而已,底层运行的内核是相同的。在每个操作系统上在运行每个应用。在内核上运行一个软件来创建和管理容器,是一个很小的软件,基本不消耗性能。

    • 由于多个操作系统使用的是同一个内核,当在操作系统上执行关机命令,就会将内核关闭,所以需要将每个操作系统隔离开来,关掉的只是自身容器 本身而已。各个操作系统之间的操作互补干扰。(共享内核)

    四、KVM虚拟技术

    1、KVM概述

    • 以色列qumranet公司研发,后被RedHad公司收购
      (1)kvm只支持x86平台
      (2)依赖于 HVM,inter VT AMD-v
    • KVM是(Kernel-based Virtual Machine)的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。
    • KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
    工作原理

    KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。
    但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。


    virtio虚拟方案

    2、KVM的核心组件:

    (1)、 kvm.ko内核模块
    • (kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能;
    (2)、 qemu-kvm:用户空间的工具程序
    • qemu-kvm进程:工作于用户空间,用于实现IO设备模拟;用于实现一个虚拟机实例;
    (3)libvirt:工具箱用于与主流操作系统虚拟化进行交互工具
    • libvirt是cs架构应用:
      • 客户端:libvirt-client
        virt-manager
      • daemon:图像化工具
        libvirt-deaemon

    3、KVM运行模式

    KVM模块load进内存之后,系统的运行模式:

    • 内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式;
    • 用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
    • 来宾模式:GuestOS的用户模式;所有的非IO类请求;

    4、KSM机制

    扫描物理内存,发现多个虚拟机实例有相同的内存空间,合并成为一个共享内存空间,节省内存。

    5、kvm工具集:

    image.png
    • qemu工具

      • qemu-kvm:用户空间的工具程序,创建管理虚拟机

      • qemu-img:是 QEMU 的磁盘管理工具

    • libvirt工具

      • GUI:virt-manager, virt-viewer:图形化管理
      • CLI: virsh, virt-install:创建管理虚拟机
    • 集群工具:
      libvirtd:管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。Libvirt是一个C工具包的虚拟化功能与最新版本的Linux(以及其他操作系统)。主包包含libvirtd服务器虚拟化支持出口。

    5、KVM快速安装

    (1)判断CPU是否支持硬件虚拟化:
    grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
    vmx:Intel VT-x
    svm:AMD AMD-v
    

    运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机;

    (2)、装载内核模块

    kvm:核心模块

    kvm-intel|kvm-amd
    
    (3)、使用virt-manager管理KVM
    # yum install qemu-kvm libvirt-daemon-kvm  virt-manager
    # modprobe kvm
    
    # systemctl start libvirtd.service
    
    # virt-manager &
    
    (4)、网络虚拟化:

    CentOS 7创建物理桥,使用内核自带的桥接模块实现:
    桥接口配置文件保留地址信息;

    TYPE=Bridge
    Device=BRIDGE_NAME
    

    物理网卡配置文件:
    删除地址、掩码和网关等相关的配置,添加

    BRIDGE=BRIDGE_NAME
    

    重启网络服务即可:

    五、安装KVM示例

    • 安装前首先开启虚拟机Inter VT


      实验前开启
    #检查主机cpu是否支持虚拟化
    [root@node-64 ~]# grep -E -i "svm|vmx" /proc/cpuinfo
    ..........vmx ......... #出现这个字段即可支持虚拟化
    
    #安装kvm模块
    [root@node-64 ~]# modprobe kvm
    [root@node-64 ~]# lsmod | grep kvm
    kvm_intel             170086  0 
    kvm                   566340  1 kvm_intel
    irqbypass              13503  1 kvm
    [root@node-64 ~]# ls /dev/kvm
    /dev/kvm
    
    [root@node-64 ~]# yum install libvirt libvirt-daemon virt-manager -y
    [root@node-64 ~]# systemctl start libvirtd.service
    [root@node-64 ~]# systemctl enable libvirtd.service
    
    #安装物理桥
    [root@node-64 ~]# ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.1.64  netmask 255.255.255.0  broadcast 192.168.1.255
    #创建网桥
    [root@node-64 ~]# virsh iface-bridge ens33 br0
    Created bridge br0 with attached device ens33
    

    此时会断网,到虚拟机重启一下,发现已生成网桥,但还要配置网桥的dns,否则无法上网。

    [root@node-64 ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0 
    
    DEVICE="br0"
    ONBOOT="yes"
    TYPE="Bridge"
    BOOTPROTO="none"
    IPADDR="192.168.1.64"
    NETMASK="255.255.255.0"
    GATEWAY="192.168.1.1"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    DHCPV6C="no"
    STP="on"
    DELAY="0"
    DNS1=202.106.46.151   #添加
    DNS2=8.8.8.8          #添加
    
    #重启网络
    [root@node-64 ~]#systemctl restart network.service
    
    [root@node-64 ~]# ifconfig
    br0:    #生成虚拟网桥,并获得物理网卡的地址
    flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.1.64  netmask 255.255.255.0  broadcast 192.168.1.255
    
    ens33:    #原物理网卡变成虚拟交换机
     flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            ether 00:0c:29:79:2e:94  txqueuelen 1000  (Ethernet)
    

    其他终端图形登录[root@node-60 ~]# ssh -X root@192.168.1.64

     ssh -X root@192.168.1.64
    [root@node-64 ~]# virt-manager
    

    参考链接:
    http://www.178linux.com/103971
    https://www.cnblogs.com/sunhao96/p/7605865.html
    https://bbs.csdn.net/topics/391040787
    https://www.ibm.com/developerworks/cn/linux/l-pci-passthrough

    相关文章

      网友评论

        本文标题:kvm虚拟化技术实现原理

        本文链接:https://www.haomeiwen.com/subject/kyoqcqtx.html