本帖最后由 鸡爷 于 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 |