远程管理 KVM 虚机
upload-ueditor-p_w_picpath-20160308-1457443987

    上一节我们通过 virt-manager 在本地主机上创建并管理 KVM 虚机。其实 virt-manager 也可以管理其他宿主机上的虚机。只需要简单的将宿主机添加进来

upload-ueditor-p_w_picpath-20160308-1457443988

填入宿主机的相关信息,确定即可。 

upload-ueditor-p_w_picpath-20160308-1457443988

接下来,我们就可以像管理本地虚机一样去管理远程宿主机上的虚机了。 

upload-ueditor-p_w_picpath-20160308-1457443988

这里其实有一个要配置的地方。 因为 KVM(准确说是 Libvirt)默认不接受远程管理,需要按下面的内容配置被管理宿主机中的两个文件 

/etc/default/libvirt-bin 

startlibvirtd="yes" 

libvirtdopts="-d -l" 

/etc/libvirt/libvirtd.conf 

listentls = 0 

listentcp = 1 

unixsockgroup = "libvirtd" 

unixsockroperms = "0777" 

unixsock_rwperms = "0770" 

authunixro = "none" 

authunixrw = "none" 

authtcp = "none" 

然后重启 Libvirtd 服务就可以远程管理了。 

service libvirt-bin restart 


CPU 和内存虚拟化原理 

upload-ueditor-p_w_picpath-20160310-1457622635

    前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要。不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助。

CPU 虚拟化

      KVM 的虚拟化是需要 CPU 硬件支持的。还记得我们在前面的章节讲过用命令来查看 CPU 是否支持KVM虚拟化吗?

root@ubuntu:~# egrep -o '(vmx|svm)' /proc/cpuinfo 

vmx

    如果有输出 vmx 或者 svm,就说明当前的 CPU 支持 KVM。CPU 厂商 Intel 和 AMD 都支持虚拟化了,除非是非常老的 CPU。 

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

upload-ueditor-p_w_picpath-20160310-1457622636

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

upload-ueditor-p_w_picpath-20160310-1457622636

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

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

内存虚拟化

KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。看下图

upload-ueditor-p_w_picpath-20160310-1457622636

    为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。虚机 OS 控制虚拟地址到客户内存物理地址的映射 (VA -> PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -> MA)。具体的实现就不做过多介绍了,大家有兴趣可以查查资料。 

还有一点提醒大家,内存也是可以 overcommit 的,即所有虚机的内存之和可以超过宿


KVM 存储虚拟化 

upload-ueditor-p_w_picpath-20160313-1457875033

    KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。

Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,后面会详细讨论。Volume 是在 Storage Pool 中划分出的一块空间,宿主机将 Volume 分配给虚拟机,Volume 在虚拟机中看到的就是一块硬盘。

下面我们学习不同类型的 Storage Pool

目录类型的 Storage Pool

文件目录是最常用的 Storage Pool 类型。
KVM 将宿主机目录 /var/lib/libvirt/p_w_picpaths/ 作为默认的 Storage Pool。

那么 Volume 是什么呢?
答案就是该目录下面的文件了,一个文件就是一个 Volume。

大家是否还记得我们之前创建第一个虚机 kvm1 的时候,就是将镜像文件 cirros-0.3.3-x8664-disk.img 放到了这个目录下。文件 cirros-0.3.3-x8664-disk.img 也就是Volume,对于 kvm1 来说,就是它的启动磁盘了。 

upload-ueditor-p_w_picpath-20160313-1457875033

         那 KVM 是怎么知道要把 /var/lib/libvirt/p_w_picpaths 这个目录当做默认 Storage Pool 的呢? 实际上 KVM 所有可以使用的 Storage Pool 都定义在宿主机的 /etc/libvirt/storage 目录下,每个 Pool 一个 xml 文件,默认有一个 default.xml,其内容如下: 

upload-ueditor-p_w_picpath-20160313-1457875033

注意:Storage Pool 的类型是 “dir”,目录的路径就是 /var/lib/libvirt/p_w_picpaths 

下面我们为虚机 kvm1 添加一个新的磁盘,看看有什么变化。 在 virt-manager 中打开 kvm1 的配置页面,右键添加新硬件 

upload-ueditor-p_w_picpath-20160313-1457875038

在默认 Pool 中创建一个 8G 的卷。 

upload-ueditor-p_w_picpath-20160313-1457875038

点击 “Finish”,可以看到新磁盘的信息。 

spacer.gifupload-ueditor-p_w_picpath-20160313-1457875038

在 /var/lib/libvirt/p_w_picpaths/ 下多了一个 8G 的文件 kvm1.img 

root@ubuntu:~# ls -l /var/lib/libvirt/p_w_picpaths/        
total 14044 

-rw-r--r-- 1 root root   14417920 Sep  4 11:24 cirros-0.3.3-x86_64-disk.img 

-rw------- 1 root root 8589934592 Sep  4 21:39 kvm1.img 

使用文件做 Volume 有很多优点:存储方便、移植性好、可复制、可远程访问。 前面几个优点都很好理解,这里对“可远程访问”多解释一下。 

远程访问的意思是镜像文件不一定都放置到宿主机本地文件系统中,也可以存储在通过网络连接的远程文件系统,比如 NFS,或者是分布式文件系统中,比如 GlusterFS。 

这样镜像文件就可以在多个宿主机之间共享,便于虚机在不同宿主机之间做 Live Migration;如果是分布式文件系统,多副本的特性还可以保证镜像文件的高可用。 

KVM 支持多种 Volume 文件格式,在添加 Volume 时可以选择 

upload-ueditor-p_w_picpath-20160313-1457875039

raw 是默认格式,即原始磁盘镜像格式,移植性好,性能好,但大小固定,不能节省磁盘空间。 

qcow2 是推荐使用的格式,cow 表示 copy on write,能够节省磁盘空间,支持 AES 加密,支持 zlib 压缩,支持多快照,功能很多。 

vmdk 是 VMWare 的虚拟磁盘格式,也就是说 VMWare 虚机可以直接在 KVM上 运行。 

 

 

LVM 类型的 Storage Pool 

upload-ueditor-p_w_picpath-20160315-1457995870

 

LVM 类型的 Storage Pool

不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上 VG 中的 LV 也可以作为虚拟磁盘分配给虚拟机使用。

不过,LV 由于没有磁盘的 MBR 引导记录,不能作为虚拟机的启动盘,只能作为数据盘使用。 

这种配置下,宿主机上的 VG 就是一个 Storage Pool,VG 中的 LV 就是 Volume。 LV 的优点是有较好的性能;不足的地方是管理和移动性方面不如镜像文件,而且不能通过网络远程使用。 

下面举个例子。 

首先,在宿主机上创建了一个容量为 10G 的 VG,命名为 HostVG。 

upload-ueditor-p_w_picpath-20160315-1457995870

然后创建了一个 Storage Pool 的定义文件 /etc/libvirt/storage/HostVG.xml,内容为 

upload-ueditor-p_w_picpath-20160315-1457995871

然后通过 virsh 命令创建新的 Storage Pool “HostVG” 

upload-ueditor-p_w_picpath-20160315-1457995871

并启用这个 HostVG 

upload-ueditor-p_w_picpath-20160315-1457995871

现在我们可以在 virt-manager 中为虚机 kvm1 添加 LV 的虚拟磁盘了。 

upload-ueditor-p_w_picpath-20160315-1457995871

点击 Browse 

upload-ueditor-p_w_picpath-20160315-1457995871

可以看到 HostVG 已经在 Stroage Pool 的列表中了,选择 HostVG 

upload-ueditor-p_w_picpath-20160315-1457995871upload-ueditor-p_w_picpath-20160315-1457995871

为 volume 命名为 newlv 并设置大小 100MB 

upload-ueditor-p_w_picpath-20160315-1457995872

点击 Finish,newlv 创建成功 

upload-ueditor-p_w_picpath-20160315-1457995872

点击 Choose Volume 

upload-ueditor-p_w_picpath-20160315-1457995872

点击 Finish 确认将 newlv 作为 volume 添加到 kvm1 

upload-ueditor-p_w_picpath-20160315-1457995872

新 volume 添加成功 在宿主机上则多了一个命名为newlv的LV 

upload-ueditor-p_w_picpath-20160315-1457995873

其他类型的Storage Pool

KVM 还支持 iSCSI,Ceph 等多种类型的 Storage Pool,这里就不一一介绍了,最常用