虚拟化技术之KVM

文章目录

    • 虚拟化技术之KVM
      • 一、前置知识
        • 1.计算机构成
        • 2.cpu
        • 3.上下文切换
        • 4.进程
        • 5.线程
        • 6.进程vs线程
        • 7.用户空间
        • 8.内核空间
        • 9.linux体系结构
        • 10.进程运行状态
      • 二、虚拟化
        • 1.虚拟化技术定义
        • 2.虚拟化技术分类
        • 3.虚拟化技术VMM
        • 4.虚拟化技术历史发展
          • 4.1 hypervisor两种类型
          • 4.2 Type1和Type2虚拟化
          • 4.3 x86服务器发展
          • 4.4 全虚拟化技术
          • 4.5 半虚拟化技术
          • 4.6 基于硬件辅助的全虚拟化
          • 4.7 虚拟化的技术的发展
      • 三、KVM
        • 1./dev/kvm & qemu
        • 2.安装&管理 KVM
          • 2.1 查看
          • 2.2 创建虚拟机步骤
      • 四、问题
        • 1.硬件虚拟化&软件虚拟化
        • 2.全虚拟化&半虚拟化
          • 2.1 全虚拟化技术
          • 2.2 半虚拟化技术
          • 2.3 虚拟化技术的实现
        • 3.qemu&kvm
        • 4.不同厂商虚拟化技术
          • 4.1 KVM
          • 4.2 Xen
          • 4.3 vmware
          • 4.4 微软hyperV
        • 5.kvm和openstack关系
          • 5.1 openstack
          • 5.2 kvm
          • 5.3 与Linux的缘分
          • 5.4 OpenStack与KVM相互辉映
        • 6.docker
        • 7.云计算
          • 6.1 定义
          • 6.2 按照服务分层模型

虚拟化技术之KVM

一、前置知识

1.计算机构成

  • cpu
  • RAM
  • 各种资源
    显卡
    光驱
    键盘
    等外设

2.cpu

虚拟化技术之KVM_第1张图片

3.上下文切换

​ context switching

4.进程

进程是程序运行的一次实例,进程是资源分配的最小单位
pid
进程描述符
内存
io等

5.线程

​ 线程是CPU调度的最小单位

6.进程vs线程

  • 做个简单的比喻:进程=火车,线程=车厢
  • 线程在进程下行进(单纯的车厢无法运行)
  • 一个进程可以包含多个线程(一辆火车可以有多个车厢)
  • 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
  • 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
  • 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
  • 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
  • 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
  • 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-“互斥锁”
  • 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”

7.用户空间

User space 是用户程序的运行空间。

8.内核空间

Kernel space 是 Linux 内核的运行空间

top
us
CPU 消耗在 User space 的时间百分比
sy
消耗在 Kernel space 的时间百分比
ni
niceness 的缩写,CPU 消耗在 nice 进程(低优先级)的时间百分比
id
idle 的缩写,CPU 消耗在闲置进程的时间百分比,这个值越低,表示 CPU 越忙
wa
wait 的缩写,CPU 等待外部 I/O 的时间百分比,这段时间 CPU 不能干其他事,但是也没有执行运算,这个值太高就说明外部设备有问题
hi
hardware interrupt 的缩写,CPU 响应硬件中断请求的时间百分比
si
software interrupt 的缩写,CPU 响应软件中断请求的时间百分比
st
stole time 的缩写,该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其他虚拟机偷走的时间百分比
time命令:查看命令运行时间
real:程序从开始运行到结束的全部时间,这是用户能感知到的时间,包括 CPU 切换去执行其他任务的时间。
user:程序在 User space 执行的时间
sys:程序在 Kernel space 执行的时间

进程CPU时间=user+sys

在多cpu情况,可能出现user+sys>real

9.linux体系结构

虚拟化技术之KVM_第2张图片

10.进程运行状态

虚拟化技术之KVM_第3张图片

二、虚拟化

1.虚拟化技术定义

​ 虚拟化技术(Virtualization)是一种资源管理(优化)技术,将计算机的各种物理资源(e.g. CPU、内存以及磁盘空间、网络适配器等 I/O 设备)予以抽象、转换,然后呈现出来的一个可供分割并任意组合为一个或多个(虚拟)计算机的配置环境。

2.虚拟化技术分类

根据对象类型不同

  • 平台虚拟化(Platform Virtualization)
    ​ 针对计算机和操作系统的虚拟化
  • 资源虚拟化(Resource Virtualization)
    ​ 针对特定的系统资源的虚拟化,如内存、存储、网络资源等
  • 应用程序虚拟化(Application Virtualization)
    ​ 包括仿真、模拟、解释技术等,如 Java 虚拟机(JVM)

硬件&软件虚拟化

虚拟化技术之KVM_第4张图片

3.虚拟化技术VMM

Virtual Machine Monitor,虚拟机监视器,又称Hypervisor
虚拟化系统结构的三个基本条件

  • 资源控制(Resource Control)。控制程序必须能够管理所有的系统资源。
  • 等价性(Equivalence)。在控制程序管理下运行的程序(包括操作系统),除时序和资源可用性之外的行为应该与没有控制程序时的完全一致,且预先编写的特权指令可以自由地执行。
  • 效率性(Efficiency)。绝大多数的客户机指令应该由主机硬件直接执行而无需控制程序的参与。

4.虚拟化技术历史发展

4.1 hypervisor两种类型

虚拟化技术之KVM_第5张图片

  • type2

    VMM 运行在传统的操作系统上,就像其他计算机程序那样运行。

    • 特点
      ​ VMM 作为应用程序运行在主操作系统环境内
      ​ 运行效率一般较类型 I 低
    • 实现案例
      ​ VMware 5.5 以前版本
      ​ Xen 3.0 以前版本
      ​ Virtual PC 2004

虚拟化技术之KVM_第6张图片

  • type1
    这些虚拟机管理程序直接运行在宿主机的硬件上来控制硬件和管理客户机操作系统
    • 特点
      ​ 需要硬件支持
      ​ VMM 作为主操作系统
      ​ 运行效率高
    • 实现案例:
      ​ VMware 5.5 及以后版本
      ​ workstation
      ​ esxi 基于linux操作系统
      ​ Xen 3.0 及以后版本
      ​ Virtual PC 2005
      ​ KVM

      虚拟化技术之KVM_第7张图片
4.2 Type1和Type2虚拟化

虚拟化技术之KVM_第8张图片

4.3 x86服务器发展
  • 带来的问题
    基础架构利用率低
    ​基础架构成本高
    ​IT 运维成本高
    ​故障切换和灾难保护不足
    ​最终用户桌面的维护成本高昂
  • x86 架构
    CPU 为了保证程序代码执行的安全性,多用户的独立性以及保证操作系统的稳定性,提出了 CPU 执行状态的概念。它有效的限制了不同程序之间的数据访问能力,避免了非法的内存数据操作,同时也避免了应用程序错误操作计算机的物理设备。一般的,CPU 都会划分为用户态和内核态,而 x86 CPU 更是细分为了 Ring 0~3 四种执行状态。
    • RING0
      ​Ring0 核心态(Kernel Mode):是操作系统内核的执行状态(运行模式),运行在核心态的代码可以无限制的对系统内存、设备驱动程序、网卡接口、显卡接口等外部设备进行访问。
      ​ 显然,只有操作系统能够无限制的访问内存、磁盘、鼠键等外围硬件设备的数据,因为操作系统就是作为计算机硬件资源管理器而存在的,操作系统就是为了让多个普通应用程序可以更简单、安全的运行在同一台计算机上而存在的 “特殊的应用程序”。
    • RING3
      Ring3 用户态(User Mode):运行在用户态的程序代码需要受到 CPU 的检查,用户态程序代码只能访问内存页表项中规定能被用户态程序代码访问的页面虚拟地址(受限的内存访问),而且还只能访问 I/O Permission Bitmap 中规定的能被用户态程序代码访问的端口,不能直接访问外围硬件设备、不能抢占 CPU。
      ​ 显然,所有的应用程序都应该运行在用户态中。当应用程序需要访问外围硬件设备时,CPU 会通过特别的接口去调用核心态的代码,以这种旁路的方式来应用程序对硬件设备的调用。如果用户态的应用程序直接调用硬件设备的话,就会被操作系统捕捉到并触发异常,弹出警告窗口。

虚拟化技术之KVM_第9张图片

真奢侈!!!

  • x86虚拟化
    • x86 架构天然不是一个可虚拟化的架构。x86 架构的 CPU 中有 17 条指令成为了虚拟化最大的障碍,错误执行这些指令会导致操作系统显示警告、终止应用程序甚至完全崩溃。
    • 当时 VMware 提出了解决这个问题的思路:在虚拟机生成这些特殊的指令时将它们 “困住”,然后将它们转换成可虚拟化的安全指令,同时保证其他所有的指令不受到干扰地执行。这样就产生了一种与主机硬件匹配并保持软件完全兼容性的高性能虚拟机。
      全虚拟化
      ​ 必须使用纯软件实现的方式构造 VMM。VMware 首创了这项技术,一举稳坐虚拟化龙头老大。

虚拟化技术之KVM_第10张图片

4.4 全虚拟化技术

虚拟化技术之KVM_第11张图片

全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。

4.5 半虚拟化技术

虚拟化技术之KVM_第12张图片

半虚拟化是一种通过修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给 Guest OS,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。

虚拟化技术之KVM_第13张图片

4.6 基于硬件辅助的全虚拟化

虚拟化技术之KVM_第14张图片

Intel-VT(Intel Virtualization Technology)和 AMD-V 是目前 x86 平台上可用的两种硬件辅助虚拟化技术。
进BIOS打开

4.7 虚拟化的技术的发展
  • 2007 年 1 月,Sun 公司发布了开源虚拟化软件 VirtualBox。同年 Xen 被 Citrix(思杰)收购。
  • 2007 年 2 月,Linux Kernel 2.6.20 合入了由以色列公司 Qumranet 开发的虚拟化内核模块 KVM(Kernel-based Virtual Machine,基于内核的虚拟机),支持 KVM 的前提是 CPU 必须要支持虚拟化技术。
  • 2008 年第一季度,微软同时发布了 Windows Server 2008 R2 及虚拟化产品 Hyper-V。
  • 2008 年 6 月,Linux Container(LXC) 发布 0.1.0 版本,其可以提供轻量级的虚拟化,用来隔离进程和资源。是 Docker 最初使用的容器技术支撑。
  • 2008 年 9 月 4 日,Red Hat 收购以色列公司 Qumranet,并着手使用 KVM 替换在 Red Hat 中的使用的 Xen。
  • 2010 年 10 月 21 日,NASA 发布了可以 IaaS(基础设施即服务)云操作系统 OpenStack,第一个版本便是众所周知 Austin(奥斯丁)。
    • R
    • S

三、KVM

Kernel-Based Virtual Machine

1./dev/kvm & qemu

虚拟化技术之KVM_第15张图片

  • 在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建、管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但KVM不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。
  • QEMU-KVM两大作用
    • 提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟
    • 对各种虚拟设备的创建,调用进行管理(QEMU负责)
  • 这个方案中,QEMU模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能。于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。

先关机,在虚拟机设置上找到处理器,选择第二个

2.安装&管理 KVM

2.1 查看
[root@localhost tmp]# egrep -c 'vmx|svm'  /proc/cpuinfo
1
[root@localhost tmp]# ls -l /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 Mar 21 05:06 /dev/kvm
[root@localhost tmp]# modinfo kvm
[root@localhost tmp]# lsmod  | grep kvm
kvm_intel             170086  0 
kvm                   566340  1 kvm_intel
irqbypass              13503  1 kvm

虚拟化技术之KVM_第16张图片

安装

[root@localhost tmp]# yum install libvirt qemu-kvm qemu-kvm-tools

管理启动libvirtd

[root@localhost tmp]# systemctl start libvirtd.service
[root@localhost tmp]# systemctl enable libvirtd.service

通过 ifconfig 可以看到一个 virbr0 桥接网卡

[root@localhost tmp]# ifconfig

虚拟化技术之KVM_第17张图片

通过 ps aux | grep dns 看到自动启动了 dnsmasq(dns 和 dhcp 功能)

[root@localhost tmp]# ps aux | grep dns

虚拟化技术之KVM_第18张图片

2.2 创建虚拟机步骤
  • 关闭 selinux 并设置防火墙
    • centos6
      • vim /etc/selinux/config
        • selinux=disabled
      • iptables -F && /etc/init.d/iptables save
    • centos7
      • vim /etc/selinux/config
        • selinux=disabled
      • firewall-cmd --zone=public --add-port=5900/tcp --permanent
        • 用于 vnc 远程

准备工作

关闭 selinux 并设置防火墙

[root@localhost tmp]# vim /etc/selinux/config
SELINUX=disabled

用于 vnc 远程

[root@localhost tmp]# firewall-cmd --zone=public --add-port=5900/tcp --permanent
success

1.创建一个虚拟磁盘

[root@localhost ~]# qemu-img create -f raw /data/virt/centos-7.raw 10G
Formatting '/data/virt/centos-7.raw', fmt=raw size=10737418240 

记得先创建/data/virt文件夹

2.使用 virt-install 安装虚拟机

[root@localhost tmp]# yum install virt-install

3.开启libvirtd服务

[root@localhost ~]# systemctl enable libvirtd.service
[root@localhost ~]# systemctl start libvirtd.service
[root@localhost ~]# systemctl status libvirtd.service

虚拟化技术之KVM_第19张图片

4.下载镜像文件

[root@localhost virt]# wget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso

创建默认网络虚拟机

virt-install --virt-type kvm --name Centos7 --ram 2048 --cdrom /data/virt/CentOS-7-x86_64-Minimal-1908.iso --disk path=/data/virt/centos-7.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

虚拟化技术之KVM_第20张图片

在创建完虚拟机后会在/run/libvirt/qemu/目录下生成一个xml文件,是自动生成的,通过编辑此xml文件可对虚拟机内存、cpu颗数等信息进行修改,下文会详细介绍如何管理及优化kvm虚拟机

5900端口是否被监听,kvm虚拟机监听端口会从5900开始逐渐递增

[root@localhost virt]# netstat -lntup | grep kvm
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      41733/qemu-kvm 

5.通过 virsh 管理虚拟机

有关命令

• domain 虚拟机

• virsh list --all

[root@localhost virt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     Centos7                        running

• virsh domstats NAME

• virsh start NAME

• virsh suspend NAME

• virsh resume NAME

• virsh dumpxml NAME > x.xml 备份

[root@localhost qemu]# virsh dumpxml Centos7 > x.xml
[root@localhost qemu]# ls
Centos7.pid  Centos7.xml  x.xml

• virsh edit NAME

• virsh define x.xml

• virsh undefine NAME 删除

• virsh destroy NAME 关闭

6.修改.xml文件

修改虚拟机 xml 文件

[root@localhost virt]# vim /run/libvirt/qemu/Centos7.xml
修改一下参数
4 

重启虚拟机

[root@localhost virt]# virsh shutdown Centos7
[root@localhost virt]# virsh start Centos7

7.动态调整 vcpus

[root@localhost virt]# virsh setvcpus Centos7 2 --live
error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 2 > 1

当然前提是需要有足够的CPU,这里不够

8.内存动态调整

[root@localhost virt]# virsh qemu-monitor-command Centos7 --hmp --cmd balloon 1024

9.磁盘管理

虚拟化技术之KVM_第21张图片

查看虚拟机的磁盘信息

[root@localhost qemu]# qemu-img info Centos7.xml
image: Centos7.xml
file format: raw
virtual size: 10K (10240 bytes)
disk size: 12K

raw 镜像格式可以转换成其他的格式,相反不行

[root@localhost qemu]# qemu-img convert -f raw -O qcow2 /data/virt/centos-7.raw /data/virt/centos-7.qcow2

10.网络管理

将虚拟机设为桥接模式

  • 宿主机添加桥接网卡,并桥接物理网卡 eth0

1.查看

[root@localhost qemu]# brctl show

在这里插入图片描述

2.添加br0

[root@localhost qemu]# brctl addbr br0
[root@localhost qemu]# brctl show

删除delbr

虚拟化技术之KVM_第22张图片

3.将ens33 桥接到 br0

# 将ens33端口加入网桥br0
brctl addif br0 ens33

# 从网桥br0中删除ens33端口
brctl delif br0 ens33
  • 宿主机源网卡地址迁移到桥接网卡上去
    vim /etc/sysconfig/network-scripts/ifcfg-eth0
    bridge=br0
    vim /etc/sysconfig/network-scripts/ifcfg-br0
    ip,netmask,gateway

inet 192.168.184.100 netmask 255.255.255.0 broadcast 0.0.0.0

  • 编辑虚拟机的 xml 文件

 
 
 
 

四、问题

1.硬件虚拟化&软件虚拟化

硬件虚拟化

  • 硬件虚拟化就是硬件物理平台本身提供了对特殊指令的截获和重定向的支持。支持虚拟化的硬件,也是一些基于硬件实现软件虚拟化技术的关键。在基于硬件实现软件虚拟化的技术中,在硬件是实现虚拟化的基础,硬件(主要是CPU)会为虚拟化软件提供支持,从而实现硬件资源的虚拟化。

支持虚拟化的硬件有:

  • Intel-VT-(Intel Virtualization Technology),Intel公司为解决纯软件虚拟化解决方案在可靠性、安全性和性能上的不足而引进的技术。它可以让一个CPU工作起来像多个CPU在并行运行,从而使得在一部电脑内同时运行多个操作系统成为可能
  • AMD-V-(AMD Virtualization),是AMD公司的虚拟化技术。它是对x86处理器系统架构的一组硬件扩展和硬件辅助虚拟化技术,可以简化纯软件的虚拟化解决方案,改进VMM(虚拟机监视器)的设计,更充分地利用硬件资源,提高服务器和数据中心的虚拟化效率

软件虚拟化

软件虚拟化就是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。在软件虚拟化技术中,有些技术不需要硬件支持,如:QEMU;而有些软件虚拟化技术,则依赖硬件支持,如:VMware、KVM。

对软件虚拟化进行细分,又可以分为以下几类:

  • 完全虚拟化:(Full Virtualization)虚拟机模拟完整的底层硬件环境和特权指令的执行过程,使客户机操作系统可以独立运行。支持完全虚拟化的软件有:Parallels Workstation、VirtualBox、Virtual Iron、Oracle VM、Virtual PC、Virtual Server、Hyper-V、VMware Workstation、QEMU等
  • 硬件辅助虚拟化:(Hardware-assisted Virtualization)是指通过硬件辅助支持模拟运行环境,使客户机操作系统可以独立运行,实现完全虚拟化的功能。支持硬件辅助虚拟化的软件有:Linux KVM、VMware Workstation、VMware Fusion、Virtual PC、Xen、VirtualBox、Parallels Workstation等
  • 部分虚拟化:(Partial Virtualization)只针对部分硬件资源进行虚拟化,虚拟机模拟部分底层硬件环境,特别是地址空间。这样的环境支持资源共享和线程独立,但是不允许建立独立的客户机操作系统。
  • 平行虚拟化:(Para-Virtualization)虚拟机不需要模拟硬件,而是将部分硬件接口以软件的形式提供给客户机操作系统。如:早期的Xen。
  • 操作系统层虚拟化:(OS-level virtualization)这种技术将操作系统内核虚拟化,可以允许使用者空间软件实例被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)、虚拟引擎(Virtualization engine)、虚拟专用服务器(virtual private servers)。每个容器的进程是独立的,对于使用者来说,就像是在使用自己的专用服务器。
    Docker容器技术就是属于操作系统层虚拟化的范畴。

硬件&软件虚拟化

虚拟化技术之KVM_第23张图片

2.全虚拟化&半虚拟化

2.1 全虚拟化技术

虚拟化技术之KVM_第24张图片

全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。

2.2 半虚拟化技术

虚拟化技术之KVM_第25张图片

半虚拟化是一种通过修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给 Guest OS,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。

2.3 虚拟化技术的实现

内核,是指的操作系统内核。

所有的操作系统都有内核,无论是Windows还是Linux,都管理着三个重要的资源:计算,网络,存储。

计算指CPU和内存,网络即网络设备,存储即硬盘之类的。

虚拟化技术之KVM_第26张图片

内核是个大管家,想象你的机器上跑着很多的程序,有word,有excel,看着视频,听着音乐,每个程序都要使用CPU和内存,都要上网,都要存硬盘,如果没有一个大管家管着,大家随便用,就乱了。所以需要管家来协调调度整个资源,谁先用,谁后用,谁用多少,谁放在这里,谁放在那里,都需要管家操心。

所以在这个计算机大家庭里面,管家有着比普通的程序更高的权限,运行在内核态,而其他的普通程序运行在用户态,用户态的程序一旦要申请公共的资源,就需要向管家申请,管家帮它分配好,它才能用。

为了区分内核态和用户态,CPU专门设置四个特权等级0,1,2,3 来做这个事情。

虚拟化技术之KVM_第27张图片

当时写Linux内核的时候,估计大牛们还不知道将来虚拟机会大放异彩,大牛们想,一共两级特权,一个内核态,一个用户态,却有四个等级,好奢侈,好富裕,就敞开了用,内核态运行在第0等级,用户态运行在第3等级,占了两头,太不会过日子了。

大牛们在写Linux内核的时候,如果用户态程序做事情,就将扳手掰到第3等级,一旦要申请使用更多的资源,就需要申请将扳手掰到第0等级,内核才能在高权限访问这些资源,申请完资源,返回到用户态,扳手再掰回去。

这个程序一直非常顺利的运行着,直到虚拟机的出现。

如果大家用过Vmware桌面版,或者Virtualbox桌面版,你可以用这个虚拟化软件创建虚拟机,在虚拟机里面安装一个Linux或者windows,外面的操作系统也可以是Linux或者Windows。

当你使用虚拟机软件的时候,和你的excel一样,都是在你的任务栏里面并排的放着,是一个普通的应用。

当你进入虚拟机的时候,虚拟机里面的excel也是一个普通的应用。

但是当你设身处地的站在虚拟机里面的内核的角度思考一下人生,你就困惑了,我到底个啥?

在硬件上的操作系统来看,我是一个普通的应用,只能运行在用户态。可是大牛们生我的时候,我的每一行代码,都告诉我,我是个内核啊,应该运行在内核态,当虚拟机里面的excel要访问网络的时候,向我请求,我的代码就要努力的去操作网络资源,我努力,但是我做不到,我没有权限!

我分裂了。

虚拟化层,也就是Vmware或者Virtualbox需要帮我解决这个问题。

第一种方式,完全虚拟化,其实就是骗我。虚拟化软件模拟假的CPU,内存,网络,硬盘给我,让我自我感觉良好,终于又像个内核了。

真正的工作模式是这样的。

虚拟机内核:我要在CPU上跑一个指令!
虚拟化软件:没问题,你是内核嘛,可以跑
虚拟化软件转过头去找物理机内核:报告管家,我管理的虚拟机里面的一个要执行一个CPU指令,帮忙来一小段时间空闲的CPU时间,让我代他跑个指令。
物理机内核:你等着,另一个跑着呢。好嘞,他终于跑完了,该你了。
虚拟化软件:我代他跑,终于跑完了,出来结果了
虚拟化软件转头给虚拟机内核:哥们,跑完了,结果是这个,我说你是内核吧,绝对有权限,没问题,下次跑指令找我啊。
虚拟机内核:看来我真的是内核呢。可是哥,好像这点指令跑的有点慢啊。
虚拟化软件:这就不错啦,好几个排着队跑呢。

内存的申请模式如下。

虚拟机内核:我启动需要4G内存,我好分给我上面的应用。
虚拟化软件:没问题,才4G,你是内核嘛,马上申请好。
虚拟化软件转头给物理机内核:报告,管家,我启动了一个虚拟机,需要4G内存,给我4个房间呗。
物理机内核:怎么又一个虚拟机啊,好吧,给你90,91,92,93四个房间。
虚拟化软件转头给虚拟机内核:哥们,内存有了,0,1,2,3这个四个房间都是你的,你看,你是内核嘛,独占资源,从0编号的就是你的。
虚拟机内核:看来我真的是内核啊,能从头开始用。那好,我就在房间2的第三个柜子里面放个东西吧。
虚拟化软件:要放东西啊,没问题。心里想:我查查看,这个虚拟机是90号房间开头的,他要在房间2放东西,那就相当于在房间92放东西。
虚拟化软件转头给物理机内核:报告,管家,我上面的虚拟机要在92号房间的第三个柜子里面放个东西。

好了,说完了CPU和内存的例子,不细说网络和硬盘了,也是类似,都是虚拟化软件模拟一个给虚拟机内核看的,其实啥事儿都需要虚拟化软件转一遍。

这种方式一个坏处,就是慢,往往慢到不能忍受。

于是虚拟化软件想,我能不能不当传话筒,还是要让虚拟机内核正视自己的身份,别说你是内核,你还真喘上了,你不是物理机,你是虚拟机。

但是怎么解决权限等级的问题呢?于是Intel的VT-x和AMD的AMD-V从硬件层面帮上了忙。当初谁让你们这些写内核的大牛用等级这么奢侈,用完了0,就是3,也不省着点用,没办法,只好另起炉灶弄一个新的标志位,表示当前是在虚拟机状态下,还是真正的物理机内核下。

对于虚拟机内核来讲,只要将标志位设为虚拟机状态,则可以直接在CPU上执行大部分的指令,不需要虚拟化软件在中间转述,除非遇到特别敏感的指令,才需要将标志位设为物理机内核态运行,这样大大提高了效率。

所以安装虚拟机的时候,务必要将物理CPU的这个标志位打开,是否打开对于Intel可以查看grep “vmx” /proc/cpuinfo,对于AMD可以查看grep “svm” /proc/cpuinfo

这叫做硬件辅助虚拟化。

另外就是访问网络或者硬盘的时候,为了取得更高的性能,也需要让虚拟机内核加载特殊的驱动,也是让虚拟机内核从代码层面就重新定位自己的身份,不能像访问物理机一样访问网络或者硬盘,而是用一种特殊的方式:我知道我不是物理机内核,我知道我是虚拟机,我没那么高的权限,我很可能和很多虚拟机共享物理资源,所以我要学会排队,我写硬盘其实写的是一个物理机上的文件,那我的写文件的缓存方式是不是可以变一下,我发送网络包,根本就不是发给真正的网络设备,而是给虚拟的设备,我可不可以直接在内存里面拷贝给他,等等等等。

一旦我知道我不是物理机内核,痛定思痛,只好重新认识自己,反而能找出很多方式来优化我的资源访问。

这叫做类虚拟化或者半虚拟化。

3.qemu&kvm

虚拟化技术之KVM_第28张图片

  • 在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建、管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但KVM不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。
  • QEMU-KVM两大作用
    • 提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟
    • 对各种虚拟设备的创建,调用进行管理(QEMU负责)
  • 这个方案中,QEMU模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能。于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。

4.不同厂商虚拟化技术

​ xen
​ vmware
​ 微软hyperV
​ kvm

4.1 KVM

KVM是指基于Linux内核(Kernel-based)的虚拟机(Virtual Machine)。KVM最大的好处就在于它是与Linux内核集成的,所以速度很快。KVM的宿主操作系统必须是Linux,支持的客户机操作系统包括Linux、Windows、Solaris和BSD,运行在支持虚拟化扩展的x86和x86_64硬件架构上,cpu支持VT技术。

虚拟化技术之KVM_第29张图片

4.2 Xen

Xen是一个开放源代码虚拟机监视器,由剑桥大学开发。Xen的缺点是操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性),所以比较麻烦。使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。Linux的官方内核在较早之前已经去掉了对Xen的支持。

虚拟化技术之KVM_第30张图片

4.3 vmware

VMWare (Virtual Machine ware)是一个“虚拟PC”虚拟机管理管理软件。它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就象标准Windows应用程序那样切换。而且每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便。安装在VMware操作系统性能上比直接安装在硬盘上的系统低不少,因此,比较适合学习和测试。

虚拟化技术之KVM_第31张图片

4.4 微软hyperV

Hyper-V 是微软提出的一种系统管理程序虚拟化技术,采用微内核的架构,兼顾了安全性和性能的要求。Hyper-V 底层的 Hypervisor 运行在最高的特权级别下,微软将其称为 ring -1(而 Intel 则将其称为 root mode),而虚机的 OS 内核和驱动运行在 ring 0,应用程序运行在 ring 3 下,这种架构就不需要采用复杂的 BT(二进制特权指令翻译)技术,可以进一步提高安全性。从架构上讲 Hyper-V 只有“硬件-Hyper-V-虚拟机”三层,本身非常小巧,代码简单,且不包含任何第三方驱动,所以安全可靠、执行效率高,能充分利用硬件资源,使虚拟机系统性能更接近真实系统性能。

Hyper-V 支持分区层面的隔离。分区是逻辑隔离单位,受虚拟机监控程序支持,并且操作系统在其中执行。Microsoft 虚拟机监控程序必须至少有一个父 / 根分区,用于运行 64 位版本的 Windows Server 2008 操作系统。虚拟化堆栈在父分区中运行,并且可以直接访问硬件设备。随后,根分区会创建子分区用于承载来宾操作系统。根分区使用虚拟化调用应用程序编程接口 (API) 来创建子分区。

分区对物理处理器没有访问权限,也不能处理处理器中断。相反,它们具有处理器的虚拟视图,并运行于每个来宾分区专用的虚拟内存地址区域。虚拟机监控程序负责处理处理器中断,并将其重定向到相应的分区。Hyper-V 还可以通过输入输出内存管理单元 (IOMMU) 利用硬件加速来加快各个来宾虚拟地址空间相互之间的地址转换。IOMMU 独立于 CPU 使用的内存管理硬件运行,并用于将物理内存地址重新映射到子分区使用的地址。从系统的结构图,我们可以看出来 Hyper-V 与 Xen 的架构很相似。

虚拟化技术之KVM_第32张图片

虚拟化技术 服务器虚拟化 桌面虚拟化 应用程序虚拟化 存储虚拟化 网络虚拟化 云管理平台
VMWare vSphere Horizon ThinApp vSAN NSX vRealize Suit
Microsoft Hyper-V RDS APP-V Storage Space Direct Network Controller System Center
Citrix XenServer XenDesktop XenApp PVS SD-WAN Citrix Cloud Services
HuaWei FusionCompute FusionAccess FusionAccess FusionStorage FusionNetwork ManageOne

5.kvm和openstack关系

虚拟化技术之KVM_第33张图片

5.1 openstack

OpenStack:开源管理项目

OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它不是一个软件,而是由几个主要的组件组合起来完成一些具体的工作。OpenStack由以下五个相对独立的组件构成:

lOpenStack Compute(Nova)是一套控制器,用于虚拟机计算或使用群组启动虚拟机实例;

lOpenStack镜像服务(Glance)是一套虚拟机镜像查找及检索系统,实现虚拟机镜像管理;

lOpenStack对象存储(Swift)是一套用于在大规模可扩展系统中通过内置冗余及容错机制,以对象为单位的存储系统,类似于Amazon S3;

lOpenStack Keystone,用于用户身份服务与资源管理

lOpenStack Horizon,基于Django的仪表板接口,是个图形化管理前端。

这个起初由美国国家航空航天局和Rackspace在2010年末合作研发的开源项目,旨在打造易于部署、功能丰富且易于扩展的云计算平台。OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性企图成为数据中心的操作系统,即云操作系统。

5.2 kvm

KVM:开放虚拟化技术

KVM(Kernel-based Virtual Machine)是一个开源的系统虚拟化模块,它需要硬件支持,如Intel VT技术或者AMD V技术,是基于硬件的完全虚拟化,完全内置于Linux。

2008年,红帽收购Qumranet获得了KVM技术,并将其作为虚拟化战略的一部分大力推广,在2011年发布RHEL6时支持KVM作为唯一的hypervisor。KVM主打的就是高性能、扩展性、高安全,以及低成本。

5.3 与Linux的缘分

一个被某些热心支持者成为云时代的Linux,是公有云与私有云的开源操作系统。一个则是Linux内核的一部分,将Linux转换成一个Type-1 hypervisor,无需任何变更就能享受现有的Linux内核进程调度、内存管理和设备支持。

OpenStack炙手可热,它如同Linux一样,旨在构建一个内核,所有的软件厂商都围绕着它进行工作。OpenStack的许多子项目,对云计算平台中的各种资源(如计算能力、存储、网络)提供敏捷管理。此外,OpenStack也提供对虚拟化技术的支持。

KVM集成在Linux的各个主要发行版本中,使用Linux自身的调度器进行管理。KVM专注于成为最好的虚拟机监控器,是使用Linux企业的不二选择,加上它还支持Windows平台,所以也是异构环境的最佳选择。

5.4 OpenStack与KVM相互辉映

OpenStack几乎支持所有的虚拟化管理程序,不论是开源的(Xen与KVM)还是厂商的(Hyper-V与VMware)。但在以前,OpenStack是基于KVM开发的,KVM常常成为默认的虚拟机管理程序。两者都使用相同的开放源理念与开发方法。

6.docker

​ 轻量级虚拟机,轻量体现在什么地方
​ 相比于传统虚拟化技术用有什么优势

  • docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。

  • docker需要的资源更少,docker在操作系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor与内层的虚拟化。

  • docker更轻量,docker的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量,对系统的利用率非常高。

  • 与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离

虚拟化技术之KVM_第34张图片

7.云计算

6.1 定义

1.一种资源交付模式

2.必须通过网络来使用

3.弹性计算,按需付费,快速扩展

6.2 按照服务分层模型

​ IAAS
​ PAAS
​ SAAS

1.IAAS

  • 基础设施即服务

2.PAAS

  • 平台即服务

3.SAAS

  • 软件即服务
    • 云盘,企业邮箱等

虚拟化技术之KVM_第35张图片

你可能感兴趣的:(KVM)