| 本帖最后由 鸡爷 于 2019-11-22 15:47 编辑 
 
 本文是CSDN博主「CloudMan6」的原创文章 
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 命令行工具,后面会有使用的示例。 
 基本的 Linux操作系统装好之后,安装 KVM 需要的包  | 1 | $ 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,后面我们会讨论。 确认KVM实验基础环境 KVM是支持虚拟化嵌套,这使得我们可以在虚拟机中实验 KVM。 比如我在 VMWare Workstation 中安装了一个 Ubuntu14.04 的虚拟机,为了能让 KVM 能创建 嵌套的虚机,要把 CPU 的虚拟化功能打开。 ![]() Ubuntu 启动后,用以下命令确认 CPU 支持虚拟化
|  | # egrep -o '(vmx|svm)' /proc/cpuinfo # vmx | 
 确认 Libvirtd 服务已经启动 |  | # service libvirt-bin status libvirt-bin start/running, process 1478 | 
KVM 准备就绪,下一节我们将创建虚拟机 
 本节演示如何使用 virt-manager 启动 KVM 虚机。 首先通过命令 virt-manager 启动图形界面 点上面的图标创建虚机 给虚机命名为 kvm1,这里选择从哪里启动虚机。如果是安装新的 OS,可以选择第一项。如果已经有安装好的镜像文件,选最后一项(如上图) 接下来需要告诉 virt-manager 镜像的位置。 点击 “Browser” 在我的系统中存放了一个 cirros-0.3.3-x86_64-disk.img 镜像文件 。cirros 是一个很小的 linux 镜像,非常适合测试用,大家可以到 http://download.cirros-cloud.net/ 下载,然后放到  /var/lib/libvirt/images/ 目录下,这是 KVM 默认查找镜像文件的地方。 为虚拟机分配 CPU 和内存 点击 “Forward”, 再确认一下信息,就可以启动虚机了。 virt-manager 会打开虚机 kvm1 的控制台窗口,可以看到启动情况 virt-manager 可以对虚机进行各种管理操作,界面直观友好,很容易上手。 同时我们也可以用命令 virsh 管理虚机,比如查看宿主机上的虚机  | 1 2 3 4 | root@ubuntu:~# virsh list Id    Name              State -------------------------------- 8     kvm1              running | 
 
 KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。 Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,后面会详细讨论。Volume 是在 Storage Pool 中划分出的一块空间,宿主机将 Volume 分配给虚拟机,Volume 在虚拟机中看到的就是一块硬盘。目录类型的 Storage Pool 文件目录是最常用的 Storage Pool 类型。KVM 将宿主机目录 /var/lib/libvirt/images/ 作为默认的 Storage Pool。
 那么 Volume 是什么呢?答案就是该目录下面的文件了,一个文件就是一个 Volume。
 大家是否还记得我们之前创建第一个虚机 kvm1 的时候,就是将镜像文件 cirros-0.3.3-x8664-disk.img 放到了这个目录下。文件 cirros-0.3.3-x8664-disk.img 也就是Volume,对于 kvm1 来说,就是它的启动磁盘了。  那 KVM 是怎么知道要把 /var/lib/libvirt/images 这个目录当做默认 Storage Pool 的呢? 实际上 KVM 所有可以使用的 Storage Pool 都定义在宿主机的 /etc/libvirt/storage 目录下,每个 Pool 一个 xml 文件,默认有一个 default.xml,其内容如下:  注意:Storage Pool 的类型是 “dir”,目录的路径就是 /var/lib/libvirt/images  |