一、虚拟化技术
1.1 关于KVM
1).KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
2).是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
3).它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
4).KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
5).KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。
6).在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。

工作原理:KVM包含一个内核模块kvm.ko用来实现核心虚拟化功能,以及一个和处理器强相关的模块如kvm-intel.ko或kvm-amd.ko。KVM本身不实现任何模拟,仅仅是暴露了一个/dev/kvm接口,这个接口可被宿主机用来主要负责vCPU的创建,虚拟内存的地址空间分配,vCPU寄存器的读写以及vCPU的运行。有了KVM以后,guest os的CPU指令不用再经过QEMU来转译便可直接运行,大大提高了运行速度。但KVM的kvm.ko本身只提供了CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完整的虚拟化技术
KVM负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,QEMU模拟IO设备(网卡,磁盘等)整合两个最后形成了QEMU-KVM。
QEMU-KVM具有两大作用:提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟;对各种虚拟设备的创建,调用进行管理(QEMU负责)
目前QEMU-KVM已经与QEMU合二为一,所有特定于KVM的代码也都合入了QEMU,当需要与KVM模块配合使用的时候,只需要在QEMU命令行加上 --enable-kvm就可以。

在支持虚拟化的情况下,vbox 和 kvm 的性能差不多,主要是面向对象不同:kvm适用于服务器,vbox适用于桌面应用。
虚拟化组件:
用NFS-based实现存储池:


稀疏文件(Sparse File)
是UNIX类和NTFS等文件系统的一个特性。稀疏文件与其他普通文件基本相同,区别在于文件中的部分数据是全0,且这部分数据不占用磁盘空间。
一个稀疏文件一开始时不包含用户数据,也没有分配到用来存储用户数据的磁盘空间。当数据被写入稀疏文件时,NTFS逐渐地为其分配磁盘空间。
稀疏文件以64KB(不同文件系统不同)为单位增量增长,因此磁盘上稀疏文件的大小总是64KB的倍数。


1.2 Xen 虚拟化技术
Xen 支持半虚拟化和全虚拟化技术;
全虚拟化技术是通过中间层软件模拟真实的硬件设备,最终虚拟机使用模拟设备时就需要中间层软件将相应的指令转换成物理硬件指令进行操作,虚拟机无法直接发送操作指令给物理硬件;
半虚拟化技术:实现部分虚拟机与部分硬件直接通信,虚拟机可以直接发送操作指令给部分硬件设备,虚拟机的效率提高很多。


Qemu-kvm介绍
Qemu是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可以在一种架构(如PC机)下运行另一种架构(如ARM)下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率。当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够获得接近于物理机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,qemu可以虚拟x86、服务器和嵌入式powerpc,以及s390的系统。
Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成虚拟化工作,因为 KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O 虚拟化,在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建、管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但KVM不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。

qemu-img是QEMU的磁盘管理工具
基本用法如下:qemu-img command [command options]

1)check [-f ] filename 对磁盘镜像文件进行一致性检查,查找镜像文件中的错误
 参数-f 是指定文件的格式;filename是磁盘镜像文件的名称(包括路径)。
 qemu-img 支持非常多种的文件格式,其中 raw 和 qcow2 是比较常用的两种,raw 是 qemu-img 命令默认的, qcow2 是 qemu 目前推荐的镜像格式,是功能最多的格式。
 ]# qemu-img check rhel6u3.qcow2
 2) create [-f fmt] 【-o options】 filename [size] 创建一个格式为fmt大小为size文件名为filename的镜像文件。
 使用“-b backfile”参数也与“-o backing_file=backfile” 指定后端镜像文件
 3) commit [-f fmt] filename 提交filename文件中的更改到后端支持镜像文件(创建时通过backing_file指定的)中去。
 4) convert [-c] [-f fmt] [-O output_fmt] [-o options] filenam% [filename2 […]] output_filename
 将fmt格式的filename镜像文件根据options选项转换为格式为output_fmt的名为output_filename的镜像文件。支持不同格式的镜像文件之间的转换,这对从其他虚拟化方案转移到KVM上的用户非常有用。一般来说,输入文件格式fmt由qemu-img工具自动检测到,而输出文件格式output_fmt根据自己需要来指定,默认会被转换为与raw文件格式(且默认使用稀疏文件的方式存储以节省存储空间)。使用“-o options”来指定各种选项,如:后端镜像、文件大小、是否加密等等。“-c”参数是对输出的镜像文件进行压缩,不过只有qcow2和qcow格式的镜像文件才支持压缩。-O 目标镜像的格式,想看要转化的格式支持的-o选项有哪些,可以在命令末尾加上 -o ?
 qemu-img convert -f raw centos.img -O qcow2 centos.qcow2
 5) info [-f fmt] filename 展示filename镜像文件的信息。
 6) resize filename [+ | -]size 改变镜像文件的大小,使其不同于创建之时的大小。
 “+”和“-”分别表示增加和减少镜像文件的大小,而size也是支持K、M、G、T等单位的使用。qcow2格式文件不支持缩小镜像的操作
 7)snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename
 “-l” 选项是查询并列出镜像文件中的所有快照,“-a snapshot”是让镜像文件使用某个快照,“-c snapshot”是创建一个快照,“-d”是删除一个快照。
 8)rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
 改变镜像文件的后端镜像文件,只有qcow2和qed格式支持rebase命令。使用“-b backing_file”中指定的文件作为后端镜像,后端镜像也被转化为“-F backing_fmt”中指定的后端镜像格式。
例子:]# qemu-img create -f qcow2 disk1.qcow2 10G
 ]# qemu-img info disk1.qcow2

快照:
参考文章:https://blog.51cto.com/koumm/1291893快照作用:在虚拟机磁盘镜像内记录不同时间点的状态数据备份;必要时可将虚拟机恢复到指定的快照;
快照创建就是生成了一个XML的配置文件,记录下当前的信息。
注意要使用KVM的快照功能,虚拟机的硬盘一定要是qcow2格式,否则无法使用快照功能。
注意要使用virsh shutdown命令进行关闭虚拟机的话,一定要安装acpid服务。同时经过多次测试证明如果虚拟机有快照的话,就无法使用virsh shutdown/reboot,命令进行关机或者重启。或者使用virsh destroy命令进行强制性关机。
方法一、使用qemu-img snapshot命令进行生成快照 基本用法:(不推荐这种方式,容易出问题)
qemu-img snapshot -c 快照名 qcow2磁盘 ##创建快照
qemu-img snapshot -l qcow2磁盘 ##查询快照
qemu-img snapshot -a 快照名 qcow2磁盘 ##恢复快照
qemu-img snapshot -d 快照名 qcow2磁盘 ##删除快照
案例:

#cd /var/lib/libvirt/images/
 ]# qemu-img snapshot -c template web01.qcow2
 ]# qemu-img snapshot -l web01.qcow2
 ID TAG VM SIZE DATE VM CLOCK
 1 template 0 2019-08-08 09:04:32 00:00:00.000
 ]# qemu-img snapshot -d template web01.qcow2
方法二、使用virsh snapshot-create-as命令进行生成快照fo web01.img
 2) 关闭虚拟机并转换磁盘格式:
 】# virsh shutdown web01.img
 】# qemu-img convert -f raw -O qcow2 web01.img web01.qcow2
 ( -f 源镜像的格式 ; -O 目标镜像的格式)
 #qemu-img info web01.qcow2
 3) 对虚拟机创建快照管理
 ]# virsh
 virsh # snapshot-create-as web01 template ##创建快照
 virsh # snapshot-list web01 ##列出快照
 virsh # snapshot-info web01 template ##查看快照信息
 4) 启动web01虚拟机,安装httpd,以及acpid,然后关闭虚拟机,再生成快照
 virsh # shutdown web01
 virsh # snapshot-create-as web01 template01
 virsh # snapshot-list web01
 5) 恢复虚拟机到安装httpd之前
 virsh # snapshot-revert web01 template
 快照配置文件在/var/lib/libvirt/qemu/snapshot/虚拟机名称/下
 ]# cd /var/lib/libvirt/qemu/snapshot/
 web01
 ]# ls web01
 template01.xml template.xml
 virsh # domstate web01 ##查看 虚拟机的状态(运行还是关闭)
 6) 删除快照
 virsh # snapshot-delete web01 template