虚拟化基础知识

虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。

物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?
这个主要是通过一个叫做 Hypervisor 的程序实现的。

根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:
1型虚拟化和2型虚拟化

1型虚拟化

Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。

2型虚拟化

物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。

理论上讲:

1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;

2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

KVM

在 x86 平台上最热门运用最广泛的虚拟化方案莫过于 KVM 了。OpenStack 对 KVM 支持得也最好,我们的教程也理所当然选择 KVM 作为 实验环境的 Hypervisor。

KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。
KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。

那 IO 的虚拟化,比如存储和网络设备由谁实现呢?
这个就交给 Linux 内核和Qemu来实现。

说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

Libvirt

大家在网上看 KVM 相关文章的时候肯定经常会看到 Libvirt 这个东西。

Libvirt 是啥?
简单说就是 KVM 的管理工具

其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。
OpenStack 底层也使用 Libvirt,所以很有必要学习一下。

Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh

  1. libvirtd是服务程序,接收和处理 API 请求;
  2. API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具,后面我们也会介绍;
  3. virsh 是我们经常要用的 KVM 命令行工具,后面会有使用的示例

作为 KVM 和 OpenStack 的实施人员,virsh 和 virt-manager 是一定要会用的。

KVM 是 OpenStack 使用最广泛的 Hypervisor,本节介绍如何搭建 KVM 实验环境

上一节说了,KVM 是 2 型虚拟化,是运行在操作系统之上的,所以我们先要装一个 Linux。Ubuntu、Redhat、CentOS 都可以,这里我们以 Ubuntu14.04 为例。

基本的 Ubuntu 操作系统装好之后,安装 KVM 需要的包 



$           sudo           apt-get           install           qemu-kvm qemu-system libvirt-bin virt-manager bridge-utils vlan         



 通过这些安装包我们顺便复习一下上一节介绍的 KVM 的相关知识。

  1. qemu-kvm 和 qemu-system 是 KVM 和 QEMU 的核心包,提供 CPU、内存和 IO 虚拟化功能
  2. libvirt-bin 就是 libvirt,用于管理 KVM 等 Hypervisor
  3. virt-manager 是 KVM 图形化管理工具
  4. bridge-utils 和 vlan,主要是网络虚拟化需要,KVM 网络虚拟化的实现是基于 linux-bridge 和 VLAN,后面我们会讨论。

Ubuntu 默认不安装图形界面,手工安装一下 



sudo           apt-get           install           xinit         


          sudo           apt-get           install           gdm         


          sudo           apt-get           install           kubuntu-desktop         

 



 apt 默认会到官网上去下载安装包,速度很慢,我们可以使用国内的镜像站点。

配置/etc/apt/sources.list 



deb http:          //mirrors          .163.com          /ubuntu/           trusty main restricted universe multiverse         


          deb http:          //mirrors          .163.com          /ubuntu/           trusty-security main restricted universe multiverse         


          deb http:          //mirrors          .163.com          /ubuntu/           trusty-updates main restricted universe multiverse         


          deb http:          //mirrors          .163.com          /ubuntu/           trusty-proposed main restricted universe multiverse         


          deb http:          //mirrors          .163.com          /ubuntu/           trusty-backports main restricted universe multiverse         


          deb-src http:          //mirrors          .163.com          /ubuntu/           trusty main restricted universe multiverse         


          deb-src http:          //mirrors          .163.com          /ubuntu/           trusty-security main restricted universe multiverse         


          deb-src http:          //mirrors          .163.com          /ubuntu/           trusty-updates main restricted universe multiverse         


          deb-src http:          //mirrors          .163.com          /ubuntu/           trusty-proposed main restricted universe multiverse         


          deb-src http:          //mirrors          .163.com          /ubuntu/           trusty-backports main restricted universe multiverse         



 然后执行下面命令更新安装包 index



# apt update         



Redhat 和 CentOS 安装相对简单,安装过程中选择虚拟化和图形组件就可以了。

小窍门:Ubuntu 默认是不允许 root 通过 ssh 直接登录的,可以修改 /etc/ssh/sshd_config,设置 



PermitRootLogin           yes         



 然后重启 ssh 服务即可



# service ssh restart         


          ssh           stop          /waiting         


          ssh           start          /running          , process 27639         



  

在虚拟机上做实验

作为 2型虚拟化的 KVM,是支持虚拟化嵌套,这使得我们可以在虚拟机中实验 KVM。 比如我在 VMWare Workstation 中安装了一个 Ubuntu14.04 的虚拟机,为了能让 KVM 能创建 嵌套的虚机,要把 CPU 的虚拟化功能打开。如下图在 VMWare 中设置以下 CPU 的模式

Ubuntu 启动后,用以下命令确认 CPU 支持虚拟化



# egrep -o '(vmx|svm)' /proc/cpuinfo         


          # vmx         



 确认 Libvirtd 服务已经启动



# service libvirt-bin status         


          libvirt-bin start          /running          , process 1478         



KVM 准备就绪,下一节我们将创建虚拟机

一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度。 比如在我的实验机上运行的虚机 kvm1 在宿主机中 ps 能看到相应的进程。

KVM openstack 环境搭建 openstack_运维

虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。看下图

KVM openstack 环境搭建 openstack_操作系统_02

在这个例子中,宿主机有两个物理 CPU,上面起了两个虚机 VM1 和 VM2。 VM1 有两个 vCPU,VM2 有 4 个 vCPU。可以看到 VM1 和 VM2 分别有两个和 4 个线程在两个物理 CPU 上调度。

这里也演示了另一个知识点,即虚机的 vCPU 总数可以超过物理 CPU 数量,这个叫 CPU overcommit(超配)。 KVM 允许 overcommit,这个特性使得虚机能够充分利用宿主机的 CPU 资源,但前提是在同一时刻,不是所有的虚机都满负荷运行。 当然,如果每个虚机都很忙,反而会影响整体性能,所以在使用 overcommit 的时候,需要对虚机的负载情况有所了解,需要测试。