1.首先我们简单的了解以下什么是KVM:
KVM是Kernel-based Virtual Machine(基于内核的虚拟机)的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
准确的来说,KVM 仅仅是 Linux 内核的一个模块, 该内核模块使得 Linux 变成了一个 Hypervisor。KVM是由 Quramnet 开发,该公司于 2008年被 RedHat 收购、KVM支持 x86 (32 and 64位), s390, Powerpc等 CPU、KVM需要支持虚拟化扩展的 CPU、并且它是完全开源的。管理和创建完整的 KVM 虚拟机,需要更多的辅助工具。
QEMU-KVM:在 Linux 操作系统中,首先我们可以通过 modprobe 命令加载 KVM 模块(如果用通过RPM 安装 KVM软件包,系统会在启动时自动加载模块),加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有 KVM模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。关于用户空间的工具,KVM的开发者选择了已经成型的开源虚拟化软件 QEMU。
QEMU: 一个强大的虚拟化软件,它可以虚拟不同的 CPU 构架。比如说在 x86 的CPU 上虚拟一个 Power 的 CPU,并利用它编译出可运行在 Power 上的程序。
注意:KVM本身不执行任何硬件虚拟,需要客户的空间程序(如:QEMU)通过 /dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。它是KVM 虚机的核心部分,其主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚机的运行提供一定的支持。以在 Intel 上运行为例,KVM 模块被加载的时候,它执行以下相应步骤:
1)首先初始化内部的数据结构;
2)做好准备后,KVM 模块检测当前的CPU,然后打开CPU控制及存取的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统置于虚拟化模式的根模式;
3)最后,KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令;
Linux操作系统上用户空间、内核空间与虚拟机的关系如下图所示:
2.KVM的功能列表:
1)支持CPU 和memory 超分(Overcommit);
2)支持半虚拟化I/O (virtio);
3)支持热插拔(CPU、块设备、网络设备等);
4)支持对称多处理(Symmetric Multi-Processing,缩写为 SMP);
5)支持实时迁移(Live Migration);
6)支持 PCI 设备直接分配和 单根I/O 虚拟化 (SR-IOV);
7)支持内核同页合并 (KSM );
8)支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 );
3.了解KVM相关的工具集合:
1)libvirt:操作和管理KVM虚机的虚拟化API,使用 C 语言编写,可以由 Python、Ruby、 Perl、 PHP、 JAVA等语言调用。可以操作包括 KVM、vmware、XEN、Hyper-v、 LXC等Hypervisor;
2)Virsh:基于libvirt的命令行工具 (CLI);
3)Virt-Manager:基于 libvirt 的图形化工具(GUI);
4)Virt-v2v:虚机格式迁移工具;
5)Virt-*工具:包括 Virt-install (创建KVM虚机的命令行工具),Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等;
6)SVirt:安全工具;
4.KVM的优势:
1)打破“一台服务器对应一套应用”的模式,将物理服务器进行整合,提升利用率;
2)服务器和相关IT硬件更少,节省了机房空间,也减少了散热和电力需求;
3)具备灵活数据备份和应用迁移机制,保障服务永不中断;
4)资源动态调配和模板化部署,应用系统快速上线,及时响应业务变化;
5.了解Linux操作系统下如何安装部署KVM虚拟机:
实验环境:准备一台可以运行最新Linux内核的Intel处理器(含VT虚拟化技术)或AMD处理器(含SVM安全虚拟机技术的AMD处理器, 也叫AMD-V)的并且是64bit环境的计算机(因为Linux 发行版本必须在64bit环境中才能使用KVM)。
这里需要注意的是我的实验环境是在VMWare虚拟平台上虚拟了一台Linux操作系统的虚机,在该虚机中创建基于内核层的KVM虚拟机,所以CPU中的内存管理单元MMU(是通过页表的形式将程序运行的虚拟地址转换成实际物理地址)的页表则必须在一次查询的时候完成两次地址转换。因为除了将KVM客户机程序的虚拟地址转换成Linux客户机的物理地址外,还要将Linux客户机物理地址转化为真实物理地址。
5.1在进行实验之前我们首先需要开启我们Linux操作系统虚机的CPU虚拟化功能:
5.2通过以下命令查看虚拟化功能是否开启成功:
[root@localhost ~]# lsmod | grep kvm
kvm_intel 162153 0
kvm 525259 1 kvm_intel
[root@localhost ~]# grep vmx /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdqvmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ida arat epb pln pts dtherm hwp hwp_noitfy hwp_act_window hwp_epp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt
注意: 如果输出的结果包含 vmx,它是 Intel处理器虚拟机技术标志;如果包含 svm,它是 AMD处理器虚拟机技术标志;如果你什么都得不到,那么你的系统是不支持虚拟化处理的 ,相应的也就不能使用KVM。
5.3准备安装KVM的镜像资源(可以通过Xftp进行上传,也可以通过rz命名进行上传):
[root@localhost ~]# rz
#因为资源过大所以上传会比较的慢
#上传结束后,我们可通过下列命令查看镜像资源是否上传成功
[root@localhost ~]# ll
-rw-r--r--. 1 root root 4043309056 6月 19 2017 rhel-server-7.2-x86_64-dvd.iso
5.4图形化界面下进行安装(一般建议图形化界面下进行安装操作,因为在shell中执行安装操作无法进行相应配置的选择):
#首先挂载光盘镜像安装KVM图形化界面对应的软件程序包
[root@localhost ~]# mount /dev/sr0 /mnt/
[root@localhost ~]# yum install virt-manager –y
#启用图形化界面管理窗口
[root@localhost ~]# virt-manager
#首先安装命令行界面下安装KVM相应的软件程序包
[root@localhost ~]# yum install virt-install.noarch virt-viewer –y
#创建磁盘分区用于安装KVM虚拟机(注意不要将手动配置的分区进行格式化,格式化安装会出现错误)
[root@localhost ~]# fdisk /dev/sda
[root@localhost ~]# partprobe
#添加一块桥接网卡
[root@localhost ~]# nmcli connection add type bridge con-name br1 ifname br1
成功添加的连接 'br1'(07e5f9f3-307a-4704-875b-f76275e057bb)。
#添加从设备到桥接网络
[root@localhost ~]# nmcli connection add type bridge-slave con-name br1-port1 ifname eno33554984 master br1
[root@localhost ~]# nmcli connection show
#RHEL7.2版本执行以下命令进行安装操作
[root@localhost ~]#virt-install --name kvm2 --disk path=/dev/sda5 --check path_in_use=off --graphics spice --vcpus=1 --ram=1024 --location=/test/rhel.iso --network bridge=br1 --os-type=linux --os-variant=rhel7
注意:如果未创建桥接网卡,也可以设置—network=default(默认代表nat模式);–check path_in_use在RHEL7.2版本中是忽略图形界面安装,在RHEL7.0版本中是通过—force实现同样的功能。
了解命令相关的参数:
–name=虚拟机器的名字 ,用户可以自定义;
–disk path=指定虚拟机器安装的位置;
–ram=设置虚拟机器内存的大小 单位为MB;
–vcpu=虚拟cpu的数量;
–os-type=设置虚拟机操作系统的类型;
–os-variant=设置虚拟机操作系统的版本;
–file-size=虚拟硬盘的大小,单位为GB;
[root@localhost ~]# virt-install --name kvm2 --disk path=/dev/sda5 --force --graphics spice --vcpus=1 --ram=1024 --location=/test/rhel.iso --network bridge=br1 --os-type=linux --os-variant=rhel7
#安装完成可以通过以下命令查看是否安装成功
[root@localhost ~]# virsh -c qemu:///system list