一 虚拟化概述

1 KVM 概述

1 概述

Kvm : 基于内核的虚拟机(kernel-based Virtual Machine),其是Linux一个内核模块,其模块使得Linux变成了一个hyperisor


KVM 是基于虚拟化扩展(INTEL VT 或 AMD-V)的X86 硬件的开源的Linux原生的全虚拟化解决方案,KVM中,虚拟机被实现为常规的Linux进程,由标准的Linux调度程序进行调度,

虚拟的每一个虚拟CPU被实现为一个常规的Linux进程,这使得KVM 能够使用Linux内核已有的功能


但KVM 本身不执行任何硬件的模拟,需要客户端空间程序通过/dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射会宿主机的显示屏幕,目前这个应用程序时QUMU。


KVM 本身的功能:
1 运行在内核空间,提供CPU和内存的虚拟化,以及客户端的IO拦截,Guest 的I/O 被KVM拦截后,交给QEMU 处理

2 总述

1 KVM 是内核级别的虚拟化
2 KVM 将每个CPU虚拟化成一个进程,并可使用宿主机的内核功能
3 KVM 不提供硬件虚拟化,其是通过/dev/kvm接口设置一个客户端服务器的地址空间,向它提供模拟IO,并将实现的结果返回宿主机屏幕。

2 QEMU 和 KVM

1 QEMU功能

早期的QEMU-KVM
其之前是一个纯软件实现的虚拟化系统,所以其性能低下,但其QEMU中包含整套虚拟机的实现,包括处理器虚拟化,内存虚拟化,以及KVM需要使用的虚拟设备模拟(网卡,显卡,控制器和硬盘等)

2 KVM 对QUMU 的改进

VM 运行期间,QEMU 会通过KVM 模拟提供的系统调用进入内核,由KVM 负责将虚拟机置于处理的特殊模式运行,遇到虚拟机进行IO操作,KVM 会从上次的系统调用出口返回QEMU,由QEMU来负责解析和模拟这些设备


从QEMU 看,是KVM 模块的虚拟化功能,为自己的虚拟提供了硬件虚拟化加速,


虚拟机的配置和创建,运行机的运行,虚拟机运行时的用户环境和交互,机动态迁移,都是QEMU 自己实现的


运行在用户空间。提供硬件IO虚拟化,通过 IOCTL /dev/kvm 设备和KVM交互

3 KVM 拦截虚拟机的IO 请求原理

CPU 对特殊指令的截获和重定向的支持,支持虚拟化技术的CPU带有特别指令急来控制虚拟化过程,通过这些指令集

4 VMM 虚拟机管理器

1 老式的处理机制
VMM 可将客户都安至于一种受限制的模式下运行,一旦客户客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权教会给VMM,由VMM 处理和显示


2 硬件虚拟化的设计

VMM 还可以利用硬件的虚拟化增强机制,将客户机在受限模式下对一些特定资源的访问,完全交由硬件资源重定向到VMM指定的虚拟资源,整个过程不需要暂停客户机的运行和VMM的参与,

由于虚拟化硬件的全新架构,支持操作系统直接在其上面运行,无需二进制转换,减少了响应的开销,简化了VMM设计, InteLVT 技术


GUEST: 客户机系统,包括CPU,内存,驱动,等,被KVM 置于一种受限制的CPU模式下运行。

5 KVM 和 QEMU

KVM 内核模块在运行时安需加载进入内核空间运行,需要通过QEMU 通过 /dev/kvm 接口设置一个GUESTOS 的地址空间,向它提供模拟IO设备,并将它 的视频显示回宿主机的显示器,KVM 内核模块 是KVM 虚拟机的核心部分,其主要功能是初始化CPU硬件,打开虚拟化模式,然后将客户机运行在虚拟化模式下,并对虚拟机提供一定的支持。


Intel 运行的KVM 模块情况:

1 首先初始化内部的数据结构
2 KVM 模块检测当前的CPU,然后打开CPU控制机存取CR4的虚拟化开关,并通过VMXON 指令将宿主机操作系统置于虚拟化模式的根模式
3 最后,KVM 模块创建特殊设备文件/dev/kvm 并等待来自用户空间的指令


创建和运行过程是KVM 和QEMU 相互配合完成的,两者的通信接口主要是一系列针对特殊设备文件 /dev/kvm 的IOCTL 调用,最重要的是创建虚拟机,其可以理解为KVM 为了某个特定的虚拟机创建对应的内核数据接口,同时,KVM 返回一个文件句柄来代表其所创建的虚拟机。

针对这该句柄调用可以对虚拟机进行响应的管理操作,如创建用户空间虚拟地址和客户机物理地址,真实物理地址之间的映射关系,创建VCPU等,

KVM 为每一个VCPU生成一个对应的文件句柄,对其相应的IOCTL 调用,就可以对VCPU 进行管理,其中最重要的就是"执行虚拟处理器",通过它,虚拟机在KVM支持下,被置于虚拟化模式的非跟模式下,开始执行二进制指令,在非跟模式下,所有敏感的二二进制指令都被CPU捕捉到,CPU在保存现场后自动切换到根模式,有KVM决定如何处理。


除了CPU 虚拟化,内存虚拟化也是KVM实现的,CPU 中的内存管理单元MMU是通过页表的形式将程序的虚拟地址转换成实际的物理地址,在虚拟机模式下,MMU的页表则必须在依次查询完成两次地址转换,因为除了将客户端程序的虚拟机转换为物理地址外,还需要将客户机的物理地址转换为真正的物理地址。

2 KVM 功能列表

KVM 支持的功能

1 CPU 和 memory 部分
2 支持半虚拟化IO (virtio)
3 支持热插拔(CPU ,块存储,网络设备等)
4 支持对称多处理(symmetric multi-processing,缩写为SMP)
5 支持实时迁移
6 支持 PCI 设备直接分配和单根IO虚拟化
7 支持内核同页合并
8 支持NUMA(non-uniform memory access ,非一致性存储房访问结构)

3 KVM 工具集合

libvirt: 操作和管理KVM 虚拟机的虚拟API,使用C编写,支持多种语言。可以操作包括KVM,VMware,XEN,hyper-V , LXC 等hypervisor

Virsh 基于 libvirt 的命令行工具

Virt-manager : 基于 里比如他的GUI工具

Virt-v2v : 虚拟格式迁移工具

Virt-* 包括 virt-install 创建虚拟机命令行工具 virt-viewer 连接虚拟机屏幕工具 。virt-clone虚拟机克隆工具 virt-top 等

Svirt 安全工具

二 静态迁移

一 概述 :

libvirt 提供了两种方案
1 基于hypervisor native transport 的迁移
一般的迁移方式
2 基于libvirt tunnelled transport 的迁移 (使用RPC协议可以实现加密功能,在传递时多了一个步骤,在单一的网络执行并发的操作)

二 迁移时的通信控制

A 受管理的直接迁移
(同时连接到源和目标主机的libvirt主机(用户名,密码,SSH,证书))如果迁移过程中链路发生故障,则源宿主机会回退到之前的情况,(极端情况,如果不能回退,则可以进行重新启动)

B 受管理的点对点迁移((管理端和源建立连接,源和目标端建立连接进行认证并进行迁移))如果管理程序崩溃,则不会影响,因为指令已经发送

C 不受管理的直接迁移((由两台主机之前的hypervisor进行控制))

统一资源标识 URI
通过URI 连接远端的服务

1 同一宿主机之间的迁移

KVM 虚拟机迁移_第1张图片

KVM 虚拟机迁移_第2张图片

KVM 虚拟机迁移_第3张图片
KVM 虚拟机迁移_第4张图片
通过编译配置文件进行指定磁盘的指定路径来保证正常启动
KVM 虚拟机迁移
修改前
KVM 虚拟机迁移_第5张图片
修改后
KVM 虚拟机迁移_第6张图片

KVM 虚拟机迁移_第7张图片

2 不同宿主机之间的迁移

KVM 虚拟机迁移_第8张图片

KVM 虚拟机迁移

KVM 虚拟机迁移_第9张图片

KVM 虚拟机迁移

KVM 虚拟机迁移

KVM 虚拟机迁移_第10张图片

KVM 虚拟机迁移_第11张图片

KVM 虚拟机迁移_第12张图片

3 折中迁移方式

1 迁移配置文件

KVM 虚拟机迁移_第13张图片

KVM 虚拟机迁移_第14张图片

KVM 虚拟机迁移_第15张图片

2 其磁盘文件必须在其中

KVM 虚拟机迁移

KVM 虚拟机迁移_第16张图片

三 动态迁移

1 要求

1 确保两台主机均启用了libvirtd 服务
2 迁移的平台和版本符合兼容性要求
3 正确配置防火墙,允许所需端口的通信
4 两个主机在相同的虚拟网络
5 如果是共享存储,建议在两个主机上的mount 路径一致

2 基于共享存储的动态迁移

1 NFS 服务器配置存储

KVM 虚拟机迁移_第17张图片

KVM 虚拟机迁移_第18张图片

KVM 虚拟机迁移_第19张图片
KVM 虚拟机迁移_第20张图片
创建vm 并挂载:
KVM 虚拟机迁移_第21张图片
KVM 虚拟机迁移

KVM 虚拟机迁移
rw : 读写
all_squash: 将远程访问的所有普通用户及组都映射为匿名用户或者用户组
no_all_squash: 与all_squash 相关
sync: 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
KVM 虚拟机迁移_第22张图片

2 进行远端挂载生效

KVM 虚拟机迁移_第23张图片

3 修改配置文件和迁移磁盘到共享存储

KVM 虚拟机迁移

KVM 虚拟机迁移_第24张图片

KVM 虚拟机迁移_第25张图片

KVM 虚拟机迁移_第26张图片

KVM 虚拟机迁移

KVM 虚拟机迁移_第27张图片

KVM 虚拟机迁移_第28张图片

4 使用图形化界面进行迁移

KVM 虚拟机迁移
KVM 虚拟机迁移_第29张图片
KVM 虚拟机迁移_第30张图片
KVM 虚拟机迁移_第31张图片
KVM 虚拟机迁移_第32张图片
KVM 虚拟机迁移_第33张图片
KVM 虚拟机迁移_第34张图片
KVM 虚拟机迁移_第35张图片
KVM 虚拟机迁移_第36张图片
KVM 虚拟机迁移_第37张图片
KVM 虚拟机迁移_第38张图片
临时迁移的意思是在源主机上保留相应的配置
源主机配置文件
KVM 虚拟机迁移

如果选择不可靠的,则在进行迁移时磁盘产生的缓存在没有被刷新到磁盘上时提示已经成功,此时可能会造成一定的损失,但其性能好。生产中建议使用none

KVM 虚拟机迁移_第39张图片

KVM 虚拟机迁移_第40张图片
KVM 虚拟机迁移_第41张图片
KVM 虚拟机迁移_第42张图片
KVM 虚拟机迁移_第43张图片

KVM 虚拟机迁移_第44张图片

KVM 虚拟机迁移_第45张图片

5 virsh migrate 命令在线迁移虚拟机

KVM 虚拟机迁移_第46张图片
KVM 虚拟机迁移_第47张图片

KVM 虚拟机迁移_第48张图片
迁移相关参数
--live 表示在线迁移
--unsafe 表示允许不可靠迁移
--persistent 表示永久迁移
--UNdefinesource
KVM 虚拟机迁移_第49张图片

KVM 虚拟机迁移_第50张图片

6 其他相关方式迁移

1 可指定专门的URI进行迁移

virsh migrate rhel7.3 qemu+ssh://root@server6/system \
--migrateuri tcp://192.168.1.60 --live --persistent --undefinesource
2 p2p 的迁移方式
3 --direct
不支持qemu 必须是Xen
4 --tunnelled (必须同时使用--p2p参数)
隧道式的迁移,是隧道之间的迁移使用,必须使用SSH认证
KVM 虚拟机迁移_第51张图片
KVM 虚拟机迁移_第52张图片

3 基于本机存储的动态迁移

1 无共享存储的必要条件

一 使用virsh 的 --copy-storage-all
二 需要有实时存储迁移(块迁移)支持
1 标准的RHEL/CentOS7的qemu-kvm 不支持
2 ovirt 或 RHEV 支持
centos 7.2 必须安装一下两个包
yum -y install centos-release-qemu-ev
yum -y install qemu-kvm-ev
三 虚拟机要在存储池中

2 使图形化界面进行虚拟机的迁移

KVM 虚拟机迁移_第53张图片
KVM 虚拟机迁移_第54张图片
KVM 虚拟机迁移_第55张图片
KVM 虚拟机迁移_第56张图片
KVM 虚拟机迁移_第57张图片
KVM 虚拟机迁移
KVM 虚拟机迁移_第58张图片

KVM 虚拟机迁移_第59张图片

注 :由此可知,直接迁移因为其磁盘文件不能同步而导致迁移失败,可进行手工迁移实验

3 命令行方式迁移

A 安装相关虚拟迁移需要软件包,并重启服务器

KVM 虚拟机迁移_第60张图片

KVM 虚拟机迁移

KVM 虚拟机迁移_第61张图片

[qemu-kvm-rhev]
name=Virt rebuilds of qemu-kvm-rhev
baseurl=http://resources.ovirt.org/pub/ovirt-3.5/rpm/el7Server/
mirrorlist=http://resources.ovirt.org/pub/yum-repo/mirrorlist-ovirt-3.5-el7Server
enabled=1
skip_if_unavailable=1
gpgcheck=0

KVM 虚拟机迁移_第62张图片

KVM 虚拟机迁移_第63张图片

KVM 虚拟机迁移_第64张图片

KVM 虚拟机迁移_第65张图片

KVM 虚拟机迁移_第66张图片

KVM 虚拟机迁移

KVM 虚拟机迁移

KVM 虚拟机迁移

KVM 虚拟机迁移_第67张图片

B 创建相关资源池

KVM 虚拟机迁移_第68张图片

KVM 虚拟机迁移_第69张图片

KVM 虚拟机迁移_第70张图片

C 迁移并进行测试

KVM 虚拟机迁移
KVM 虚拟机迁移
KVM 虚拟机迁移_第71张图片