KVM相关介绍

一、云计算简介

1.什么是云计算?
云计算:配置各种资源的方式。
2.云计算的分类

基础设施即服务Iaas:指把IT基础设施作为一种服务通过网络对外提供,并根据用户对资源的实际使用量或占用量进行计费的一种服务模式。

平台即服务Paas:指将软件研发的平台作为一种服务,以SaaS的模式提交给用户。

软件即服务Saas:通过网络提供软件服务。

3.按照不同的部署方式

公有云、私有云、混合云

二、KVM简介

1.虚拟化发展历史
在这里插入图片描述
2.为什么需要CPU虚拟化
X86操作系统是设计在直接运行在裸硬件设备上的,因此它认为自己完全占有计算机硬件。x86架构提供四个特权级别给操作系统和应用程序来访问硬件。Ring是指CPU的运行级别,Ring0是最高级别,Ring1次之,Ring2更次之,Ring3最低级别。对于Linux+x86来说,操作系统(内核)需要直接访问硬件和内存,因此它的代码需要运行在最高运行级别上,这样它可以使用特权指令,控制中断、修改页表、访问设备等。应用程序的代码运行在最低运行级别上,不能做受控操作。如果要做,比如要访问磁盘,写文件,需要通过执行系统调用(函数),执行系统调用时,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。
在这里插入图片描述
虚拟化在这里就遇到了一个难题,因为宿主操作系统是工作在ring0的,客户操作系统就不能也在ring0了,但是它不知道这一点,以前执行什么指令,现在还是执行什么指令,但是没有执行权限,会出错。所以这时候虚拟机管理程序(VMM)需要避免这种事情发生。虚拟机如何通过VMM实现Guest CPU对硬件的访问,根据其原理不同有三种实现技术。

(1)全虚拟化

(2)半虚拟化

(3)硬件辅助的虚拟化

基于二进制翻译的全虚拟化(Full Virtualization with Binary Translation)
在这里插入图片描述
客户操作系统运行在Ring1,它在执行特权指令时,会触发异常(CPU的机制,没权限的指令会触发异常),然后VMM捕获这个异常,在异常里面做翻译,模拟,最后返回到客户操作系统内,客户操作系统认为自己的特权指令工作正常,继续运行。但是这个性能损耗非常大,简单的一条指令现在却要通过复杂的异常处理过程。异常“捕获(trap)-翻译(handle)-模拟(emulate)”过程:
在这里插入图片描述
超虚拟化(或者半虚拟化/操作系统辅助虚拟化Paravirtualization)
半虚拟化的思路是修改操作系统内核,替换掉不能虚拟化的指令,通过超级调用(hypercall)直接和底层的虚拟化层hypervisor来通讯,hypervisor同时也提供了超级调用接口来满足其它关键内核操作,比如内存管理、中断和时间保持。这种做法省去了全虚拟化中的捕获和模拟,大大提高了效率。所以像XEN这种半虚拟化技术,客户机操作系统都是有一个专门的定制内核版本,和x86、mips、arm这些内核版本等价。这样就不会有捕获异常、翻译、模拟的过程了,而且性能损耗非常低。这就是XEN这种半虚拟化架构的优势。这也是为什么XEN只支持虚拟化Linux,无法虚拟化windows原因,微软不改代码。
在这里插入图片描述
硬件辅助的全虚拟化
2005年以后,CPU厂商Intel和AMD开始支持虚拟化。Intel引入了Intel-VT(Virtualization Technology)技术。这种CPU有VMX root operation和VMX non-root operation两种模式,两种模式都支持Ring0 ~ Ring3共4个运行级别。VMM可以运行在VMX root operation模式下,客户OS运行在VMX non-root operation模式下。
在这里插入图片描述
而且两种操作模式可以互相转换。运行在VMX root operation模式下的VMM通过显式调用VMLAUNCH或VMRESUME指令切换到VMX non-root operation模式,硬件自动加载Guest OS的上下文,于是Guest OS获得运行,这种转换称为VM entry。Guest OS运行过程中遇到需要VMM处理的事件,例如外部中断或缺页异常,或者主动调用VMCALL指令调用VMM的服务时(与系统调用类似),硬件自动挂起Guest OS,切换到VMX root operation模式,恢复VMM的运行,这种转换称为VM exit。VMX root operation模式下软件的行为与在没有VT-x技术的处理器上的行为基本一致;而VMX non-root operation模式则有很大不同,最主要的区别是此时运行某些指令或遇到某些事件时,发生VM exit。也就是说,硬件这层做了区分,这样在全虚拟化下,那些靠“捕获异常-翻译-模拟”的实现就不需要了。而且CPU厂商支持虚拟化的力度越来越大,靠硬件辅助的全虚拟化技术的性能逐渐逼近半虚拟化,再加上全虚拟化不需要修改客户操作系统这一优势,全虚拟化技术应该是未来的发展趋势。

利用二进制翻译的全虚拟化硬件辅助虚拟化操作系统协助/半虚拟化
实现技术(二进制翻译)BT和直接执行遇到特权指令转到root模式下执行Hypercall
客户操作系统修改/兼容性无需修改客户操作系统,最佳兼容性无需修改客户操作系统,最佳兼容性客户操作系统需要修改来支持hypercall,因此它不能运行在物理硬件本身或其他的hypervisor上,兼容性差,不支持Windows
性能全虚拟化下,CPU需要两种模式之间切换,带来性能开销;但是其性能在逐渐逼近半虚拟化好。半虚拟化下CPU性能开销几乎为0,虚机的性能接近于物理机
应用厂商VMware Workstation/QEMU/Virtual PCVMware ESXi/Microsoft Hyper-V/Xen3.0/KVMXen

3.KVM简介
KVM官方网站
KVM全称是基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux的一个内核模块,该内核模块使得Linux变成了一个Hypervisor:它由Quramnet开发,该公司于2008年被Red Hat收购。它支持x86(32 and 64 位),s390,Powerpc等CPU。它从Linux 2.6.20起就作为一个模块被包含在Linux内核中。它需要支持虚拟化扩展的CPU。它是完全开源的。
4.KVM架构简介
KVM是基于虚拟化扩展(Intel VT或者AMD-V)的X86硬件开源的Linux原生的全虚拟化解决方案。在KVM中,虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度;虚拟机的每个虚拟CPU被实现为一个常规的Linux进程。这使得KVM能够使用Linux内核的已有功能。但是KVM本身不执行任何硬件模拟,需要客户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是QEMU。
5.Linux上的用户空间、内核空间和虚机
在这里插入图片描述
名词解释

Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O设备驱动等),被KVM置于一种受限制的CPU模式下运行。

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

QEMU:修改过的为KVM虚机使用的QEMU代码,运行在用户空间,提供硬件I/O虚拟化,通过IOCTL /dev/kvm设备和KVM交互。

6.KVM实现拦截虚机的I/O请求原理
现代CPU本身实现了对特殊指令的截获和重定向的硬件支持,甚至新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化从而提高性能。以X86平台为例,支持虚拟化技术的CPU带有特别优化过的指令集来控制虚拟化过程。通过这些指令集,VMM很容易将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM处理。VMM还可以利用硬件的虚级化增强机制,将客户机在受限模式下对一些特定资源的访问,完全由硬件重定向到VMM指定的虚拟资源,整个过程不需要暂停客户机的运行和VMM的参与。由于虚拟化硬件提供全新的架构,支持操作系统直接在上面运行,无需进行二进制转换,减少了相关的性能开销,极大简化了VMM的设计,使得VMM性能更加强大。从2005年开始,Intel在其处理器产品线中推广Intel Virtualization Technology即IntelVT技术。
7.QEMU-KVM简介
QEMU原本不是KVM的一部分,它自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是QEMU代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及KVM需要使用到的虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。为了简化代码,KVM在QEMU的基础上做了修改。KVM运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM负责将虚拟机置于处理的特殊模式运行。遇到虚机进行I/O操作,KVM会从上次的系统调用出口处返回QEMU,由QEMU来负责解析和模拟这些设备。
从QEMU的角度看,QEMU使用了KVM模块的虚拟化功能,为自己的虚机提供了硬件虚拟化加速。除此以外,虚机的配置和创建、虚机运行所依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是QEMU自己实现的。
8.KVM详解
KVM内核模块在运行时按需加载进入内核空间运行。KVM本身不执行任何设备模拟,需要QEMU通过/dev/kvm接口设置一个GUEST OS的地址空间,向它提供模拟的I/O设备,并将它的视频显示映射回宿主机的显示屏。它是KVM虚机的核心部分,其主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚机的运行提供一定的支持。
以在Intel上运行为例,KVM模块被加载时:
首先初始化内部的数据结构;做好准备后,KVM模块检测当前的CPU,然后打开CPU控制及存取CR4的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统置于虚拟化模式的根模式;最后,KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的指令。
接下来虚机的创建和运行将是QEMU和KVM相互配合的过程。两者的通信接口主要是一系列针对特殊设备文件/dev/kvm的IOCTL调用。其中最重要的是创建虚机。它可以理解成KVM为了某个特定的虚机创建对应的内核数据结构,同时KVM返回一个文件句柄来代表所创建的虚机。
针对该句柄的调用可以对虚机做相应地管理,比如创建用户空间虚拟地址和客户机物理地址、真实物理地址之间的映射关系,再比如创建多个vCPU。KVM为每一个vCPU生成对应的文件句柄,对其相应地IOCTL调用,就可以对vCPU进行管理。其中最重要的就是“执行虚拟处理器”。通过它,虚机在KVM的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都被CPU捕捉到,CPU在保存现场之后自动切换到根模式,由KVM决定如何处理。除了CPU的虚拟化,内存虚拟化也由KVM实现。实际上,内存虚拟化是一个虚机实现中最复杂的部分。CPU中的内存管理单元MMU是通过页表的形式将程序运行的虚拟地址转换成实际物理地址。在虚拟机模式下,MMU的页表则必须在一次查询的时候完成两次地址转换。因为除了将客户机程序的虚拟地址转换了客户机的物理地址外,还要将客户机物理地址转化成真实物理地址。
9.KVM虚机的创建过程
在这里插入图片描述
在这里插入图片描述
总结

(1)qemu-kvm通过对/dev/kvm的一系列IOCTL命令控制虚机;

(2)一个KVM虚机即一个Linux qemu-kvm进程,与其它Linux进程一样被Linux进程调度器调度;

(3)KVM虚机包括虚拟内存、虚拟CPU和虚机I/O设备,其中内存和CPU的虚拟化由KVM内核模块负责实现,I/O设备的虚拟化由QEMU负责实现;

(4)KVM客户机系统的内存是qumu-kvm进程的地址空间的一部分;

(5)KVM虚机的vCPU作为线程运行在qemu-kvm进程的上下文中;

vCPU、QEMU进程、LInux进程调度和物理CPU之间的逻辑关系:
在这里插入图片描述
因为CPU中虚拟化功能的支持,并不存在虚拟的CPU,KVM Guest代码是运行在物理CPU之上。 KVM实现客户机内存的方式是利用mmap系统调用,在QEMU主线程的虚拟地址空间中申明一段连续大小的空间用于客户机物理内存映射。在有两个虚机的情况下,情形是这样的:
在这里插入图片描述
KVM为了在一台机器上运行多个虚拟机,需要增加一个新的内存虚拟化层,也就是说,必须虚拟MMU来支持客户操作系统,来实现VA -> PA -> MA的翻译。客户操作系统继续控制虚拟地址到客户内存物理地址的映射 (VA -> PA),但是客户操作系统不能直接访问实际机器内存,因此VMM需要负责映射客户物理内存到实际机器内存(PA->MA)。
VMM内存虚拟化的实现方式:

软件方式:通过软件实现内存地址的翻译,比如Shadow page table(影子页表)技术。

硬件实现:基于CPU的辅助虚拟化功能,比如AMD的NPT和Intel的EPT技术。

KVM中,虚拟机的物理内存即为qemu-kvm进程所占用的内存空间。KVM使用CPU辅助的内存虚拟化方式。
在Intel和AMD平台,其内存虚拟化的实现方式分别为:

AMD平台上的NPT(Nested Page Tables)技术

Intel平台上的EPT(Extended Page Tables)技术 

10.KVM的整体结构
从GUI到Linux内核,包括以下五个组件:

(1)virt-manager
一个用来管理VM的GUI/CUI用户接口;它使用libvirt调用VM的各种功能。 

(2)libvirt
一个工具及接口,作为较通用的服务器虚拟化软件,它支持Xen,VMware ESX/GSX,当然,还有QEMU/KVM。

(3)QEMU
一个和KVM内核模块交互的模拟器,处理多种客户机系统请求如I/O;一个QEMU进程对应一个客户机系统。

(4)KVM内核模块
从狭义上来说,KVM是一个Linux内核模块,处理客户机系统的VM Exits和执行VM Entry指令。

(5)Linux内核
既然QEMU作为一个普通的用户进程运行,相应客户机系统的调度就由Linux内核自己来处理。

所有的组件都是开放源码软件(OSS)。
在这里插入图片描述
11.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,非一致存储访问结构)

12.KVM工具集合

libvirt:操作和管理KVM虚机的虚拟化API,使用C语言编写,可以由Python,Ruby,Perl,PHP,Java等语言调用。
可以操作包括KVM,vmware,XEN,Hyper-v,LXC等Hypervisor。

Virsh:基于libvirt的命令行工具(CLI)。

Virt-Manager:基于libvirt的GUI工具。

virt-v2v:虚机格式迁移工具。

virt-*工具:包括Virt-install(创建KVM虚机的命令行工具),Virt-viewer(连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top等。

sVirt:安全工具和selinux相关。

三、KVM的安装

1.环境要求
(1)如果是物理服务器,需要在BIOS中打开虚拟化功能(Virtualization Technology),一般的服务器默认是打开这个功能的。
在这里插入图片描述
(2)如果是用VMware Workstation做实验,建立的虚拟机的CPU要勾选虚拟化功能,这样虚拟机才会支持KVM虚拟化。
在这里插入图片描述
2.安装方式
(1)最简单的安装方法就是在安装系统的时候,安装上虚拟化功能,这里以CentOS7.3为例,选择安装包的时候,如下图选择即可,选择“带GUI的服务器”,并勾选“虚拟化客户端”,“虚拟化Hypervisor”,“虚拟化工具”。
在这里插入图片描述
(2)如果系统是最小化安装,应该安装以下所需软件。

[root@localhost ~]# yum -y groupinstall "GNOME 桌面"  #安装GNOME桌面环境
[root@localhost ~]# yum -y install qemu-kvm  #KVM核心模块
[root@localhost ~]# yum -y install qemu-kvm-tools  #KVM调试工具,可以选择性安装
[root@localhost ~]# yum -y install qemu-img  #允许你创建、转换和修改镜像,能处理被qemu支持的所有镜像格式
[root@localhost ~]# yum -y install libvirt  #管理虚拟机的工具包
[root@localhost ~]# yum -y install virt-install  #virt-install是一个使用libvirt库构建新虚拟机的命令行工具
[root@localhost ~]# yum -y install virt-manager  #图形界面管理虚拟机
[root@localhost ~]# yum -y install bridge-utils  #配置linux以太网桥

(3)验证
安装系统后,可以使用下面的命令检查CPU是否支持虚拟化功能。如果值为0,说明不支持,如果非0,说明支持。

[root@localhost ~]# egrep -c "(vmx|svm)" /proc/cpuinfo

(4)检查KVM模块是否安装

[root@localhost ~]# lsmod | grep kvm
kvm_intel 170181 0
kvm 554609 1 kvm_intel
irqbypass 13503 1 kvm
[root@localhost ~]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-11-16 13:45:13 CST; 1min 52s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 1288 (libvirtd)
    Tasks: 22 (limit: 32768)
   CGroup: /system.slice/libvirtd.service
           ├─1288 /usr/sbin/libvirtd
           ├─1995 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.con...
           ├─1996 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.con...
           ├─2001 /usr/bin/mount 192.168.229.156:/kvmshare /kvm-share -o nodev,nosui...
           └─2004 /sbin/mount.nfs 192.168.229.156:/kvmshare /kvm-share -o rw,nodev,n...

Nov 16 13:45:13 kvm01 dnsmasq[1995]: started, version 2.76 cachesize 150
...

如果libvirtd服务停止运行,你将不能管理虚拟机,也就是不能使用virt-manager等工具来管理虚拟机。
3.创建虚拟机之前的准备工作
(1)操作系统安装介质:ISO文件,并上传到系统的/iso目录下。

[root@localhost ~]# ls /iso/
CentOS-7-x86_64-DVD-1611.iso

(2)磁盘空间准备
(3)添加新磁盘
(4)创建LVM
(5)创建文件系统及挂载点,并设置开机自动挂载。

pvcreate /dev/sdb
vgcreate vmvg /dev/sdb
lvcreate -n kvm-lv -l 20479 vmvg
mkdir /kvm-vm
mount /dev/vmvg/kvm-lv /kvm-vm/

4.使用virt-manager图形界面创建
virt-manager是基于libvirt的图形化虚拟机管理软件。在命令行中以root身份输入virt-manager命令,出现virt-manager管理界面。
在这里插入图片描述
5.创建存储池
双击“QEMU/KVM”,然后选择“存储”选项卡,然后单击“+”按钮新建存储池,命名为“vm”,单击“前进”,然后输入上面创建的lvm挂载目录,单击完成。
在这里插入图片描述
在这里插入图片描述
以同样的方法创建一个镜像存储池,命名为vm_iso,目录为/iso即可,用于放置以后KVM虚拟机使用的iso光盘镜像文件。
在这里插入图片描述
创建存储卷,其实就是KVM虚拟机的硬盘文件,选择刚建的“vm”存储卷,点击新建卷,设置名字和大小。
在这里插入图片描述
在虚拟系统管理器中选择“新建虚拟机”,选择“本地安装介质”,“前进”
在这里插入图片描述
选择“浏览”,选择镜像文件
在这里插入图片描述
选择内存和CPU设置
在这里插入图片描述
选择虚拟机存储硬盘,选择刚刚创建的硬盘文件。
在这里插入图片描述
网络使用默认的NAT网络即可
在这里插入图片描述
单击完成后,虚拟机就开始创建,然后按照操作系统即可
在这里插入图片描述
6.使用vrit-install命令行创建
使用qemu-img命令创建一个qcow2格式的虚拟机磁盘文件

qemu-img create -f qcow2 /kvm-vm/centos7-vm002.qcow2 10G

使用virt-install命令创建虚拟机

virt-install --name vm002 --vcpus 1 --ram 1024 --disk /kvm-vm/centos7-vm002.qcow2,format=qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=centos7.0 --location=/iso/CentOS-7-x86_64-DVD-1611.iso

参数解释:

--name vm002  #指定虚拟机的名字
--vcpus 1 --ram 1024  #指定vcpu数量和内存大小
--disk /kvm-vm/centos7-vm002.qcow2,format=qcow2  #指定虚拟磁盘及格式
--network network=default  #指定虚拟机采用的网络为默认,默认为NAT
--graphics vnc,listen=0.0.0.0 --noautoconsole  #指定虚拟机显示协议为VNC
--os-type=linux --os-variant=centos7.0  #指定操作系统类型及版本
--location=/iso/CentOS-7-x86_64-DVD-1611.iso  #指定安装介质

然后到桌面系统,打开virt-manager,完成后续的安装操作系统的工作即可。如果不希望手动安装操作系统,也可以指定应答文件来自动完成安装过程,增加–extra-args参数

--extra-args=’ks=http://192.168.1.100/mini.txt’(mini.txt为应答文件)

如果希望通过PXE安装虚拟机,可以使用以下命令参数:

--pxe 指定使用PXE协议从网络引导

7.virt-install命令参数
通用选项

-n NAME,--name=NAME  #虚拟机名称
-r MEMORY, --ram=MEMORY  #以MB为单位为客户端事件分配的内存
--vcpus=VCPUS  #配置虚拟机的虚拟CPU(vcpu)数量
如:
          --vcpus 5
          --vcpus 5, maxcpus=10
          --vcpus socket=2,cores=4,threads=2
--cpuset=CPUSET Set which physical CPUs domain can use.
--cpu=CPU  #CPU型号及功能
如:
          --cpu coreduo,+x2apic
--description=DESCRIPTION  #在生成的XML中保存的可读VM描述。
--security=SECURITY  #设定域安全驱动器配置
--numatune=NUMATUNE  #为域进程调整NUMA策略

8.安装方法选项

-c CDROM, --cdrom=CDROM  #光驱安装介质
-l LOCATION, --location=LOCATION
          安装源(例如:nfs:host:/path、http://host/path ftp://host/path)
--pxe  #使用PXE协议从网络引导
--import  #在磁盘映像中构建客户机
--livecd  #将光驱介质视为Live CD
-x EXTRA, --extra-args=EXTRA
          #附加到使用--location引导的内核的参数
--os-type=DISTRO_TYPE
          #要安装的操作系统类型,例如:'linux'、'u nix'、'windows'
--os-variant=DISTRO_VARIANT
          The OS variant being installed guests, e.g.
          'fedora6','rhel5', 'solaris10', 'win2k'
          #可以通过osinfo-query os命令查询
--boot=BOOTOPTS  #自选配置后安装引导顺序、菜单、永久kernel引导,等等。

9.存储配置

--disk=DISKOPTS  #用各种选项指定存储。Ex.
          --disk path=/my/existing/disk
          --disk path=/my/new/disk,size=5 (in gigabytes)
          --disk vol=poolname:volname,device=cdrom,bus=scsi,...
--nodisks  #不要为该客户端设置任何磁盘
--filesystem=FILESYSTEMS
          #将主机目录传递给虚拟机。例如:
          --filesystem /my/source/dir,/dir/in/guest
          --filesystem template_name,/,type=template

10.联网配置

-w NETWORK, --network=NETWORK
          #配置客户网络接口。Ex:
          --network bridge=mybr0
          --network network=my_libvirt_virtual_net
          --network network=mynet,model=virtio,mac=00:11...
--nonetworks  #不要为该客体创建网络接口

11.图形配置

--graphics=GRAPHICS
          #配置虚拟机显示设置。例如:
          --graphics vnc
          --graphics spice,port=5901,tlsport=5902
          --graphics none
          --graphics vnc,password=foobar,port=5910,keymap=ja
--noautoconsole  #不要自动尝试连接到客户端控制台

12.设备选项

--serial=SERIALS  #配置虚拟机串口设备
--parallel=PARALLELS  #配置虚拟机并口设备
--channel=CHANNELS  #配置虚拟机沟通频道
--console=CONSOLES  #配置虚拟机与主机之间的文本控制台连接
--host-device=HOSTDEVS  #配置与客户相连的物理主机设备
--soundhw=SOUNDHW  #配置客户声音设备仿真
--watchdog=WATCHDOG  #配置虚拟机watchdog设备
--video=VIDEO  #配置虚拟机视频硬件。
--smartcard=SMARTCARD  #配置虚拟机智能卡设备。例如:
          --smartcard mode=passthrough
--redirdev=REDIRDEV
          Configure a guest redirection device. Ex:
          --redirdev usb,type=tcp,server=192.168.1.1:4000
--panic=PANIC Configure a guest panic device.Ex:
          --panic default

13.虚拟化平台选项

-v, --hvm  #客户端应该是一个全虚拟客户端
-p, --paravirt  #这个客户端是一个半虚拟客户端
--container This guest should be a container guest
--virt-type=HV_TYPE  #要使用的管理程序名称(kvm、qemu、xen等等)
--arch=ARCH  #模拟的CPU构架
--machine=MACHINE The machine type to emulate
--noapic  #为全虚拟客户端禁用APIC(在os-type/os- variant db中覆盖数值)
--noacpi  #为全虚拟客户端禁用ACPI(在os-type/os- variant db中覆盖数值)
-u UUID, --uuid=UUID  #客户端 UUID

14.其它选项

--autostart  #引导主机时自动启动域
--print-xml  #输出所生成域的XML,而不是定义虚拟机
--print-step=XMLSTEP  #输出具体安装步骤(1,2,3,all)的XML
--noreboot  #完成安装后不要引导虚拟机
--wait=WAIT  #要等待的时间(以分钟为单位)
--dry-run  #完成安装步骤,但不要创建设备或者定义虚拟机
--force  #对任意应用程序提示强制回答‘yes’,终止其它提示
-q, --quiet  #禁止无错误输出
--prompt  #要求用户为模糊情况或者需要的选项输入
-d, --debug  #输入故障排除信息

15.安装半虚拟化驱动virtio
目的:为了提高内存、硬盘、网络的性能,需要支持半虚拟化。
virtIO是一种半虚拟化驱动,广泛用于在XEN平台和KVM虚拟化平台,用于提高客户机IO的效率。事实证明,virtIO极大的提高了VM IO效率,配备virtIO前后端驱动的情况下,客户机IO效率基本达到和宿主机一样的水平。
在这里插入图片描述
(1)没有使用virtio驱动的执行过程
在这里插入图片描述
(2)使用virtio驱动后的执行过程
在这里插入图片描述
(3)性能比较
在这里插入图片描述
16.如何获得virtio驱动程序
(1)红帽RHEL4.8之后自动加载和安装virtio驱动

[root@localhost ~]# lsmod | grep virtio
virtio_balloon  3866  0
virtio_net      13237 0
virtio_blk      6091  3
virtio_pci      5392  0
virtio_ring     7020  4 virtio_balloon,virtio_net,virtio_blk,virtio_pci
virtio          3760  4 virtio_balloon,virtio_net,virtio_blk,virtio_pci

(2)windows操作系统需要额外安装virtio驱动。
下载网址

http://www.linux- kvm.org/page/WindowsGuestDrivers/Download_Drivers

在这里插入图片描述
17.在已经安装好的Windows虚拟机上安装virtio驱动
通过向导创建的VM,默认磁盘为IDE接口,网卡为rtl8139,即全虚拟化驱动。一定要按照以下步骤进行操作,否则会出现蓝屏错误。

(1)关闭虚拟机。编辑虚拟机的配置,添加一个很小的virtio硬盘、一块virtio网卡

(2)虚拟光驱加载上传的ISO文件

(3)启动虚拟机。登陆后,Windows会发现新的硬件,但是没有驱动

(4)通过设备管理器安装驱动

18.QEMU Guest Agent安装与配置
如果VM中安装了QEMU Guest Agent,Host主机就可以使用libvirt向VM发送命令,例如“冻结”、“释放”文件系统,虚拟CPU的热添加及移除等。
RHEL/CentOS7中有相应的安装包。

qemu-guest-agent-2.8.0-2.el7.x86_64.rpm

直接安装并启动服务即可

systemctl status qemu-guest-agent.service

Windows需要手动安装。virtio-win-0.1.141.iso光盘镜像中就有这个程序
在这里插入图片描述
19.通过libvirt来使用QEMU guest agent
安装QEMU guest agent后,对libvirt命令有如下的增强。

virsh shutdown --mode=agent  #比--mode=acpi更加安全地关闭操作系统
virsh snapshot-create -quiesce  #在创建快照之前,将缓存的内容刷入到磁盘
virsh domfsfreeze  #静默文件系统
virsh domfsthaw  #恢复静默的文件系统
virsh domfstrim  #让虚拟机trim文件系统
virsh domtime  #获得虚拟机的时间
virsh setvcpus  #配置虚拟机的vcpu
virsh domifaddr --source agent  #查询虚拟机的IP地址
virsh domfsinfo  #显示虚拟机的文件系统列表
virsh set-user-password  #设置虚拟机用户的密码

20.虚拟化的不同的方式

基于二进制的全虚拟化:
半虚拟化:Xen
全虚拟化: KVM、VMware

21.KVM的概念
基于内核的虚拟机(Kernel-Based virtual machine)
在这里插入图片描述
在这里插入图片描述
22.基本环境
firewalld和Selinux全部关闭。

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0

23.打开KVM方式
准备2个目录,一个目录放置iso系统镜像文件,还有一个目录作为磁盘的存储池。

[root@localhost ~]# mkdir /kvm-vm
[root@localhost ~]# mkdir /iso
[root@localhost ~]# virt-manager

或者
在这里插入图片描述
24.确认此服务开启

[root@localhost ~]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-11-16 13:45:13 CST; 1min 52s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 1288 (libvirtd)
    Tasks: 22 (limit: 32768)
   CGroup: /system.slice/libvirtd.service
           ├─1288 /usr/sbin/libvirtd
           ├─1995 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.con...
           ├─1996 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.con...
           ├─2001 /usr/bin/mount 192.168.229.156:/kvmshare /kvm-share -o nodev,nosui...
           └─2004 /sbin/mount.nfs 192.168.229.156:/kvmshare /kvm-share -o rw,nodev,n...

Nov 16 13:45:13 kvm01 dnsmasq[1995]: started, version 2.76 cachesize 150
...

图形化创建KVM虚拟机
1.创建存储池(一个是存盘存储文件,一个是iso镜像文件)
2.创建存储卷。同时,iso存储池内,应该能够看到我们上传的iso系统镜像文件。
25.使用命令行的方式创建虚拟机域

[root@localhost ~]# virt-install --os-type=linux --os-variant centos7.0 --name test01 --ram 1024 --vcpus 1 --disk=/kvm-vm/test01.raw,format=raw,size=5 --location /iso/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

自动补全

[root@kvm ~]# yum -y install bash-completion libvirt-bash-completion
四、KVM相关操作命令

1.查看虚拟机列表
查看正在运行的虚拟机,默认只能查看正在运行的虚拟机域,如果想查看所有需要加–all

[root@kvm ~]# virsh list
[root@kvm ~]# virsh list --all

2.查看虚拟机详细信息域

[root@kvm ~]# virsh dominfo test01(虚拟机名)

3.虚拟机域的开关机
开机

[root@kvm ~]# virsh start test01(虚拟机名)

关机(温柔的关机)

[root@kvm ~]# virsh shutdown test01(虚拟机名)

强制关机(类似于拔电源)

[root@kvm ~]# virsh destroy test01(虚拟机名)

4.导出配置(备份)

[root@kvm ~]# virsh dumpxml test01(虚拟机名) > test01.xml
一个完整KVM域,生成之后会有两个文件。
(1)磁盘文件,在部署之处已经指定;
(2)xml配置文件,默认在/etc/libvirt/qemu/;

5.删除虚拟机

[root@kvm ~]# virsh undefine test01(虚拟机名)
PS:删除虚拟机域的操作,会删除虚拟机域的xml配置文件,而磁盘文件则需要手动删除。

6.根据配置文件恢复虚拟机

[root@kvm ~]# virsh define test01.xml

思考
能否根据test01的xml配置文件和磁盘文件,生成新的虚拟机test02?
有虚拟机域所需要的xml配置文件和磁盘文件,即可以生产新的虚拟机域,不过需要注意,xml配置文件和之前的xml配置文件如果有冲突的地方,需要作出修改。

(1)名字
(2)disk(修改)
(3)UUID(删除)
(4)mac地址(删除)

7.修改配置文件(自带语法检查)
需求:把test02虚拟机域改名字为test03。

[root@kvm qemu]# virsh edit test02(虚拟机名)

8.虚拟机的重命名(7.2以上)

[root@kvm ~]# virsh domrename test02 test03

9.查看虚拟机对应的VNC端口

[root@kvm ~]# virsh vncdisplay test01
:0  #默认不加端口,指定的也是:0,也就是5900
:0==== 5900
:1==== 5901  #以此类推

注意

(1)注意虚拟机的防火墙对应端口是否开启;
(2)如果虚拟机使用qemu连接进去的话,那么vnc就不可用;

10.挂起虚拟机

[root@kvm ~]# virsh suspend test01
[root@kvm ~]# virsh resume test01

11.开机自启

[root@kvm ~]# virsh autostart test01

取消开机自启
[root@kvm autostart]# virsh autostart --disable test01

12.console登录KVM虚拟机域
在KVM域里添加

[root@kvm ~]# grubby --update-kernel=ALL --args="console=ttyS0"

注意
上边的ttyS0是ttyS零

[root@kvm ~]# virsh reboot test01

就可以在虚拟机直接使用console命令登录kvm虚拟机域

[root@kvm ~]# virsh console test01

virsh console命令虽然可以在终端直接登录kvm虚拟机域,但在xshell终端里,如果使用console编辑配置文件,会出现显示错乱的情况。

五、kvm磁盘格式

1.磁盘格式比较

(1)RAW:(裸格式)
占用空间较大,性能较好,但不支持虚拟机快照功能;

(2)QCOW2:(copy on write)写时复制
占用空间较小,支持快照,性能比RAW稍差一些;

2.创建磁盘(默认是裸格式)

[root@kvm kvm-vm]# qemu-img create snow.raw 5G

3.查看磁盘信息

[root@kvm kvm-vm]# qemu-img info snow.raw

4.创建指定格式磁盘

[root@kvm kvm-vm]# qemu-img create -f qcow2  zj.qcow2 5G

5.转换磁盘格式

qemu-img:转换磁盘格式语法

convert [-f fmt] [-O output_fmt] filename output_filename
[root@kvm kvm-vm]# qemu-img convert -f raw -O qcow2 test01.raw test01.qcow2

转换后,原磁盘文件也会保留,如果要使用新格式的磁盘,需要去修改xml文件,修改磁盘名称和类型。
6.拍摄快照

[root@kvm kvm-vm]# virsh snapshot-create test01

7.查看快照信息

[root@kvm kvm-vm]# virsh snapshot-list test01

8.根据快照恢复系统

[root@kvm kvm-vm]# virsh snapshot-revert test01 1575255308

9.删除快照

[root@kvm kvm-vm]# virsh snapshot-delete test01 1575255308
六、虚拟机域的克隆

1.手动克隆(完全克隆)

test01 ----------------> test02

(1)复制xml配置文件

[root@kvm qemu]# cp test01.xml test02.xml

或者

[root@kvm qemu]# virsh dumpxml test01 > test02.xml

(2)复制磁盘文件

[root@kvm kvm-vm]# cp test01.raw test02.raw

(3)修改配置文件并重新生成一个虚拟机
修改

a:name字段
b:删除UUID
c:删除mac address
d:修改磁盘路径以及名称类型
[root@kvm qemu]# virsh define test02.xml

2.链接克隆
做一个链接的磁盘,然后第二个新的虚拟机更改xml配置文件,磁盘信息指定新的链接磁盘。

qemu-img create -f qcow2 -b centos.raw test02.qcow2

3.自动克隆(完全克隆)

[root@kvm ~]# virt-clone --auto-clone -o test02 -n test03
七、kvm虚拟机网络配置

1.NAT模式
在这里插入图片描述
注意

[root@kvm ~]# yum info firewalld

不同版本的firewalld工具,对iptables规则的影响不一样,如果使用的是centos7.7之前的版本,防火墙必须是打开的状态才可以看到路由转发规则。
KVM默认的网络方式,如果想要使用这种模式,防火墙需要打开,因为需要用到iptables规则。而到了centos7.8版本的时候,firewalld防火墙版本已经更新,现在firewalld工具必须是关闭状态,才可以看到路由转发规则。
(1)查看路由转发规则

[root@kvm ~]# iptables -t nat -L
或者
[root@kvm ~]# iptables-save

(2)防火墙添加规则,打开5900端口

[root@kvm ~]# firewall-cmd --add-port=5900/tcp --permanent
success
[root@kvm ~]# firewall-cmd --reload
success
[root@kvm ~]# firewall-cmd --list-all

(3)添加路由转发

[root@kvm ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@kvm ~]# sysctl -p
net.ipv4.ip_forward = 1

2.NAT模式自定义网段
(1)直接修改使用的default网络的信息

[root@kvm ~]# virsh net-edit default
<mac address='52:54:00:00:7d:2e'/>
<ip address='192.168.120.1' netmask='255.255.255.0'>
  <dhcp>
    <range start='192.168.120.2' end='192.168.120.254'/>
      </dhcp>
[root@kvm ~]# virsh net-destroy --network default
[root@kvm ~]# virsh net-start --network default
[root@kvm ~]# virsh net-dumpxml default
<network>
  <name>default</name>
  <uuid>2340afa5-ac6c-46d3-92ad-bce600236cc3</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:00:7d:2e'/>
  <ip address='192.168.120.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.120.2' end='192.168.120.254'/>
    </dhcp>
  </ip>
</network>

此时kvm虚拟机的virbr0网卡的IP地址就改变了。

[root@kvm ~]# ip a

此时,打开虚拟机test01,仍然用dhcp的方式获取IP地址,就会看到kvm
虚拟机域获取到的IP地址已经变了。
(2)可以自定义一个网段

[root@kvm ~]# virsh net-dumpxml default > test.xml
[root@kvm ~]# vim test.xml
<network>
  <name>test</name>
  <uuid>2340afa5-ac6c-46d3-92ad-bce600236cc3</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr1' stp='on' delay='0'/>
  <mac address='52:54:00:00:7d:2e'/>
  <ip address='192.168.110.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.110.2' end='192.168.110.254'/>
    </dhcp>
  </ip>
</network>
[root@kvm ~]# virsh net-create test.xml
[root@kvm ~]# virsh net-list
[root@kvm ~]# virsh net-dumpxml test
<network>
  <name>test</name>
  <uuid>2340afa5-ac6c-46d3-92ad-bce600236cc3</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr1' stp='on' delay='0'/>
  <mac address='52:54:00:00:7d:2e'/>
  <ip address='192.168.110.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.110.2' end='192.168.110.254'/>
    </dhcp>
  </ip>
</network>
[root@kvm ~]# ip a

修改想要使用此网络的虚拟机域,这里我们使用test02虚拟机域。

[root@kvm ~]# virsh edit test02
<interface type='network'>
mac地址这里直接删除即可。
<source network='test'/>
[root@kvm ~]# virsh start test02

PS:虚拟机域的IP获取方式改为dhcp,直接启用即可看到分配到的IP地址,当然是和test网络同一个网段。
(4)总结
nat模式支持主机与虚拟机的互访,也支持虚拟机访问互联网,但不支持外网访问虚拟机域。
2.桥接网络
在这里插入图片描述
(1)创建虚拟桥接网卡br0

[root@kvm ~]# systemctl stop NetworkManager
[root@kvm ~]# virsh iface-bridge ens33 br0

查看配置文件会看到,ens33桥接到了br0上

[root@kvm network-scripts]# cat ifcfg-br0
[root@kvm network-scripts]# brctl show

(2)修改kvm虚拟机域的xml配置文件

[root@kvm network-scripts]# virsh edit test02
<interface type='bridge'>
  <mac address='52:54:00:61:f5:16'/>
  <source bridge='br0'/>

(3)开启虚拟机域,配置ip,验证是否能够连通外网.
PS:这时候需要注意,往往到这一步,可能都会出现报错,说要开启虚拟网卡的混杂模式,出于安全考虑是不允许的,然后就会出现,dhcp模式获取不到IP,即使手动设置好IP之后,仍然ping不通外网。
因为要开启网卡的混杂模式,需要我们对VMware的vmnet0网卡有权限进行操作,如果用的是Windows操作系统装的VMware,只要使用管理员运行VMware就可以了,如果是Linux操作系统上安装的VMware,需要更改一下/dev/vmnet0网卡的权限,当然如果想要使用nat网络,更改/dev/vmnet8就可以了。

八、虚拟机域的迁移

1.冷迁移(静态迁移)
环境准备

kvm01:192.168.229.10
kvm02:192.168.229.30
关闭防火墙、禁用selinux。

其实冷迁移和克隆差不多,都是需要对磁盘文件和xml配置文件进行操作。

[root@kvm ~]# scp -rp /etc/libvirt/qemu/test01.xml root@192.168.229.30:/etc/libvirt/qemu
[root@kvm ~]# scp -rp /kvm-vm/test01.raw root@192.168.229.30:/kvm-vm

在kvm02上进行操作

[root@kvm02 ~]# cd /etc/libvirt/qemu/
[root@kvm02 qemu]# ls
networks  test01.xml
[root@kvm02 qemu]# virsh define test01.xml

2.热迁移(动态迁移)
环境准备

kvm01:192.168.229.10
kvm02:192.168.229.30
nfs:192.168.229.156
关闭防火墙、禁用selinux。

(1)在nfs服务器上操作

[root@nfs ~]# yum -y install nfs-utils
[root@nfs ~]# mkdir /kvmshare
[root@nfs ~]# vim /etc/exports
/kvmshare *(rw,sync,no_root_squash)
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server
[root@nfs ~]# showmount -e
Export list for nfs:
/kvmshare *

(2)在kvm01上基于nfs服务创建存储池

[root@kvm kvm-vm]# showmount -e 192.168.229.156
Export list for 192.168.229.156:
/kvmshare *
[root@kvm kvm-vm]# mkdir /kvm-share
[root@kvm kvm-vm]# virt-manager

存储池和存储卷完成之后,直接创建虚拟机。配置虚拟机使用bridge桥接网路,使其能够ping的通外网。并且在这里我们执行一个ping百度的命令,并让他保持一直是ping着的状态,用来模拟迁移到kvm02上服务不中断。
(3)在kvm02上操作,创建存储池

[root@kvm02 kvm-vm]# showmount -e 192.168.229.156
Export list for 192.168.229.156:
/kvmshare *
[root@kvm02 kvm-vm]# mkdir /kvm-share
[root@kvm02 kvm-vm]# virt-manager

这里创建完成之后,会看到之前在kvm01上创建的test文件和centos.qcow2的存储卷。
(4)在kvm01上创建虚拟机域
创建一个新的虚拟机域,存储池要使用nfs-share(挂载到NFS服务器上),保证虚拟机域安装成功(最小化安装)。
(5)设置虚拟机网络
虚拟机完成之后,要求虚拟机域服务不中断,这时,我们将虚拟机域的网络模式设置为桥接模式,当然如果虚拟机域迁移到第二台虚拟机仍想保持可用,第二台虚拟机也得支持桥接模式。

[root@kvm01 ~]# systemctl stop NetworkManager
[root@kvm01 ~]# virsh iface-bridge ens33 br0
[root@kvm01 ~]# virsh destroy test8
[root@kvm01 ~]# virsh edit test8
    <interface type='bridge'>
      <mac address='52:54:00:8a:d4:5d'/>
      <source bridge='br0'/>

然后进入虚拟机域进行网络IP地址设置。同理第二台虚拟机也需要设置桥接网络。
(6)动态迁移
在这里插入图片描述
在这里插入图片描述
需要下载openssh-askpass

[root@kvm01 ~]# yum -y install openssh-askpass

迁移虚拟机之前,把我们在kvm01和kvm02上挂载的目录给一个777的权限,保证双方root用户都有权限去调用目录。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值