虚拟化技术(KVM)

虚拟化

一、虚拟化技术概述

目标

  • 能够了解虚拟化技术分类方法
  • 能够了解虚拟化技术实现目的
  • 能够了解虚拟化产品有哪些
  • 能够了解QEMU功能
  • 能够掌握KVM功能
  • 能够掌握libvirt功能

1.虚拟化技术即是对资源的抽象

虚拟化入门指南

云计算定义:云计算是一种通过因特网以服务的方式提供动态可伸缩的虚拟化的资源的计算模式。

2.从资源提供角度分类

2.1 平台虚拟化

  1. 如果把X86平台的CPU,内存和外设做为资源,那对应的虚拟化技术就是平台虚拟化,在同一个X86平台上面,可以虚拟多个X86平台,每个平台可以运行自己独立完整的操作系统。<br />例如:**QEMU,KVM,XEN Server,EXSi(vmware 公司用来做云计算的虚拟机),Hyper-V(微软)等所管理的虚拟机**

2.2 操作系统虚拟化

如果把操作系统及其提供的系统调用作为资源,那虚拟化就表现为操作系统虚拟化,例如Linux容器虚拟化技术就是在同一个Linux操作系统之上,虚拟出多个同样的操作系统,每个应用程序认为自己运行在一个独立的OS。
例如:LXC或Docker等所管理的容器

3.从虚拟化实现方式分类

虚拟环境包括:硬件、VMM和虚拟机
虚拟机监视器VMM也叫Hypervisor,真实物理机叫宿主机,虚拟机叫客户机
VMM或者说Hypervisor对物理资源的虚拟归纳为三个部分:CPU虚拟化、内存虚拟化、IO虚拟化。

3.1 什么是虚拟化管理程序 Hypervisor(VMM)

  • 一种运行在物理机和虚拟机操作系统之间的中间软件层,可以允许多个操作系统和应用共享硬件,即虚拟机监视器,也可称之为VMM。
  • Hypervisors是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。
  • Hypervisors不但协调着这些硬件资源的访问,而且在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。
    如下图所示:

kvm 虚拟化上 - 图1

3.1.1 Hypervisors作用

Hypervisor是所有虚拟化技术的核心。 非中断地支持多工作负载迁移的能力是Hypervisor的基本功能。

3.1.2 Hypervisors分类

目前市场上各种x86 管理程序(hypervisor)的架构存在差异,三个最主要的架构类别包括:

I型:

虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”型。 裸机型在虚拟化中Hypervisor直接管理调用硬件资源,不需要底层操作系统,也可以将Hypervisor看作一个很薄的操作系统。这种方案的性能处于主机虚拟化与操作系统虚拟化之间。

3.2小节示图

II型:

虚拟机运行在传统操作系统(HOST OS)上,同样创建的是硬件全仿真实例,被称为==“托管(宿主)”型==。托管型/主机型Hypervisor运行在基础操作系统上,构建出一整套虚拟硬件平台(CPU/Memory/Storage/Adapter),使用者根据需要安装新的操作系统和应用软件,底层和上层的操作系统可以完全无关化,如Windows运行Linux操作系统。主机虚拟化中VM的应用程序调用硬件资源时需要经过:VM内核->Hypervisor->主机内核,因此相对来说,性能是三种虚拟化技术中最差的。

3.3小节示图

Ⅲ型:

虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),指向底层托管操作系统,被称为“操作系统虚拟化”。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最 少。但是缺点是底层和上层必须使用同一种操作系统,如底层操作系统运行的是Windows系统,则
VPS/VE就必须运行Windows?

参考3.4及3.5小节示图

虚拟化实现方式, 基于hypervisor分类
主要有三类架构

  • type I:半虚拟化
    虚拟机直接运行在物理硬件上,不需要底层操作系统,hypervisor充当了 操作系统,需要修改客户机的操作系统
    虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”型
  • type II:硬件辅助虚拟化
    虚拟机运行在传统的操作系统之上。硬件全仿真,称为宿主机型,htpervisor提供硬件仿真,虚拟机操作系统与主机操作系统无关化应用程序向虚拟机内核发起请求,虚拟机内核向hypervisor发起请求,hypervisor向主机操作系统内核发起请求
  • type III:操作系统虚拟化
    虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),把系统调用指向底层托管操作系统,被称为“操作系统虚拟化”。
    使用虚拟化的目的就是在一台物理机能够隔离出来更多的空间用于运行应用程序
    传统虚拟化过度到轻量级虚拟化

3.2 Hypervisor type 1:半虚拟化(Para-virtualization)

对客户操作系统(VM)的内核进行修改,将运行在Ring 0上的指令转为调用Hypervisor,例如:XEN

kvm 虚拟化上 - 图2

kvm 虚拟化上 - 图3

虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”型。 裸机型在虚拟化中Hypervisor直接管理调用硬件资源,不需要底层操作系统,也可以将Hypervisor看作一个很薄的操作系统。这种方案的性能处于主机虚拟化与操作系统虚拟化之间。

3.3 Hypervisor type 2:硬件辅助全虚拟化(Hardware-Assisted Full Virtualzation)

  • 对CUP指令集进行改造,例如:Inter VT-x / AMD-V
  • 客户操作系统可以直接使用Ring 0而无需要修改,例如:KVM

kvm 虚拟化上 - 图4

kvm 虚拟化上 - 图5

  • 虚拟机运行在传统操作系统(HOST OS)上,同样创建的是硬件全仿真实例,被称为“托管(宿主)”型
  • 托管型/主机型Hypervisor运行在基础操作系统上,构建出一整套虚拟硬件平台(CPU/Memory/Storage/Adapter),使用者根据需要安装新的操作系统和应用软件,底层和上层的操作系统可以完全无关化,如Windows运行Linux操作系统。
  • 主机虚拟化中VM的应用程序调用硬件资源时需要经过:VM内核->Hypervisor->主机内核,因此相对来说,性能是三种虚拟化技术中最差的。

3.4 Hypervisor type 3:软件全虚拟化

所谓的软件全虚拟化,即非硬件辅助全虚拟化,模拟CPU让VM使用,效率低,例如:QEMU

3.5 操作系统虚拟化(Hypervisor type 3)

称为轻量级虚拟化,允许操作系统内核拥有彼此隔离和分割的多用户空间实例(instance),这些实例也被称之为容器。其是基于Linux内核中的namespace,cgroup实现
例如:LXC,Docker

虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),指向底层托管操作系统,被称为“操作系统虚拟化”。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最 少。但是缺点是底层和上层必须使用同一种操作系统,如底层操作系统运行的是Windows系统,则VPS/VE就必须运行Windows?

kvm 虚拟化上 - 图6

总结:
typeI 半虚拟化
typeII 硬件辅助全虚拟化
typeIII 软件全虚拟化或者叫操作系统虚拟化

虚拟化实现方式, 基于hypervisor分类
主要有三类架构

  • type I:半虚拟化
    虚拟机直接运行在物理硬件上,不需要底层操作系统,hypervisor充当了 操作系统,需要修改客户机的操作系统
    虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”型
  • type II:硬件辅助虚拟化
    虚拟机运行在传统的操作系统之上。硬件全仿真,称为宿主机型,htpervisor提供硬件仿真,虚拟机操作系统与主机操作系统无关化应用程序向虚拟机内核发起请求,虚拟机内核向hypervisor发起请求,hypervisor向主机操作系统内核发起请求
  • type III:操作系统虚拟化
    虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),把系统调用指向底层托管操作系统,被称为“操作系统虚拟化”。

使用虚拟化的目的就是在一台物理机能够隔离出来更多的空间用于运行应用程序
传统虚拟化过度到轻量级虚拟化

3.6 虚拟机与容器对比

为云主机准备操作系统,了解云主机怎么工作的

传统虚拟化过度到轻量级虚拟化

kvm 虚拟化上 - 图7

虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

Linux® 容器是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由另一个镜像提供。是一个相对独立的应用程序的隔离运行环境。

容器与传统虚拟机比较

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

kvm 虚拟化上 - 图8

3.7 Hypervisor管理工具的对比

kvm 虚拟化上 - 图9

vmware workstation (Vmware) 和 virtualbox(Oracle)

vSphere Hypervisor 是一种可将服务器虚拟化的裸机 Hypervisor

ESXi, vSphere client 和 vCeneter 都是 vSphere 的组件。

总结:
KVM linux
vmware esxi

3.8 QEMU

kvm 虚拟化上 - 图10

        软件模拟虚拟化、可以模拟多种硬件,可以做模拟所有硬件的全仿真。包括X86架构处理器、AMD64架构处理器、ARM、SPARC 与 PowerPC ,AIX架构等。效率低,一般用于研究测试场景。<br />            此处使用QEMU的主要目的是为了方便管理KVM虚拟机镜像文件 ?<br />注:<br />            QEMU由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。QEMU有两种工作模式:系统模式,可以模拟出整个电脑系统,另一种是用户模式,可以运行不同与当前硬件平台的其他平台上的程序(比如在x86平台上运行跑在ARM平台上的程序);其代码地址 [http://git.qem](http://git.qem)<br />u.org/qemu.git,1.0以后版本就只能使用qemu-kvm(只支持Linux)进行加速了,1.3版本后QEMU和QEMU-KVM合二为一了。

        **从本质上看,虚拟出的每个虚拟机对应 host 上的一个 Qemu 进程,而虚拟机的执行线程(如 CPU 线程、I/O 线程等)对应 Qemu 进程的一个线程。**

3.9 KVM

http://www.linux-kvm.org/page/Documents

  • KVM kernel-based virtual machine 基于内核的虚拟机 是x86架构下硬件辅助的全虚拟化的首选解决方案
  • KVM需要经过修改的QEMU软件(qemu-kvm)来实现虚拟机的管理 ,KVM本身不能管理虚拟机
  • KVM就是内核的一个模块,用户空间通过QEMU模拟硬件包括CPU,内存,IO设备来提供给虚拟机使用,一台虚拟机就是一个普通的Linux进程,虚拟机中的VCPU就是该进程中的线程。

kvm 虚拟化上 - 图11

内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别,不同的级别具有不同的功能,在较低的级别中将禁止某些操作。Linux系统设计时利用了这种硬件特性,使用了两个级别,最高级别和最低级别,内核运行在最高级别(内核态),这个级别可以进行所有操作,而应用程序运行在较低级别(用户态),在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。
正是有了不同运行状态的划分,才有了上下文的概念。用户空间的应用程序,如果想要请求系统服务,比如操作一个物理设备,或者映射一段设备空间的地址到用户空间,就必须通过系统调用来(操作系统提供给用户空间的接口函数)实现。

内核空间:内核功能模块运行在内核空间
用户空间:应用程序运行在用户空间

在内核空间可以进行所有操作,在用户空间处理器控制着对硬件的直接访问以及对内存的非授权访问

在硬件之上,内核空间中的代码控制了硬件资源的使用权,用户空间中的代码只有通过内核暴露的系统调用接口(System Call Interface)才能使用到系统中的硬件资源。

用户空间的应用程序,如果想要请求系统服务,比如操作一个物理设备,或者映射一段设备空间的地址到用户空间,就必须通过系统调用来(操作系统提供给用户空间的接口函数)实现。

kvm 虚拟化上 - 图12

注:
不同的基于KVM的虚拟化平台,可能会采用不同的虚拟化组件,目前主流的采用QEMU-KVM组件,但在不同的产品里版本有所不同,功能也有差异。
KVM通过调用Linux本身内核功能,实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构支持虚拟化功能的硬件支持(比如Intel-VT,AMD-V),是一种全虚拟化架构。
KVM在2007年2月被导入Linux 2.6.20内核中。

  • 从存在形式来看,它包括两个内核模块:kvm.kokvm_intel.ko(或kvm_amd.ko)
  • 本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备/dev/kvm(由KVM本身创建)作为管理接口,主要负责vCPU的创建,虚拟内存的分配,vCPU寄存器的读写以及vCPU的运行。
  • KVM是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再经过Qemu转译,直接运行,大大提高了速度,
  • KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问这个接口。

kvm 虚拟化上 - 图13

应用程序是通过接口来使用操作系统的,操作系统是通过接口来调用硬件的

总结:

  • 是基于内核的虚拟机
  • 是内核的一个模块
  • KVM本质是管理虚拟硬件设备的驱动
  • 在硬件辅助全虚拟化下虚拟出CPU,MEM
  • 暴露接口/dev/kvm使用kvm 模块

3.10 QEMU-KVM

从前面对KVM内核模块的介绍知道,它只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),但仅有KVM还是不够的,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配vCPU等并不在它上面进行),还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,并对其进行了修改,最后形成了QEMU-KVM。

  • 在QEMU-KVM中,KVM运行在内核空间,实现CPU和内存的虚拟化,QEMU运行在用户空间,实际模拟创建其他硬件设备,管理各种虚拟硬件,
  • QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。
  • 当然,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。

kvm 虚拟化上 - 图14

QEMU-KVM作用:

1.提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟

2.对各种虚拟设备的创建,调用进行管理(QEMU负责)

qumu-kvm

  1. 使用用户空间的虚拟化管理工具
  2. qemu提供IO设备,磁盘,网卡,显卡虚拟化及管理
  3. kvm提供CPU和内存

区分Qemu、Qemu-KVM、Linux kernel KVM

* Qemu1.3之后默认包含KVM源码。编译的时候 ./configure --enable-kvm 即可
* Qemu-kvm是修改了Qemu部分源码适配KVM,本质Qemu-kvm就是Qemu
* 本质:Qemu-kvm是针对KVM专门做了修改和优化的Qemu分支
* Linux 2.6.20之后均包含KVM源码,但不包括Qemu
* 本质:KVM = Linux内核2.6.20之后版本,包括Kernel和KVM驱动

3.11 libvirt

libvirt是一套免费、开源的支持Linux下主流虚拟化管理程序的C函数库,其旨在为包括KVM在内的各种虚拟化管理程序提供一套方便、可靠的编程接口

当前主流Linux平台上默认的虚拟化管理工具virt-manager,virsh等都是基于libvirt开发。

kvm 虚拟化上 - 图15

oVirt是基于KVM虚拟化组建私有云平台的企业级管理工具。oVirt以web界面的方式管理KVM虚拟化环境,主要由Engine和Node两部分组成,Engine是oVirt中的管理节点,提供web界面与用户交互,使Node节点管理可视化。 OVIRT 管理系统可以管理成千上万的资源,比如几百个主机,几千个虚拟机等等。

注:
一个针对各种虚拟化平台的虚拟机管理的API库,一些常用的虚拟机管理工具如virsh(类似vim编辑器),virt-install,virt-manager等和云计算框架平台(如OpenStack,OpenNebula,Eucalyptus等)都在底层使用libvirt提供的应用程序接口。

libvirt主要由三个部分组成:API库,一个守护进程 libvirtd 和一个默认命令行管理工具 virsh。

kvm 虚拟化上 - 图16

QEMU,KVM,Libvirt三者关系总结:

virt-manger 通过Libvirt虚拟化管理程序的C函数库来提供的接口来管理qemu-kvm虚拟机

  • QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它本身自己可以做CPU和内存的模拟,只不过效率较低),
  • 而KVM是另一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),
  • 但本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,
  • 所以KVM方案一定要依赖QEMU 即使后来RedHat后来开发了libvirt,也只能简单的认为是个虚拟机管理工具,仍然需要通过用户空间QEMU来与KVM进行交互。

二、KVM虚拟机管理工具部署

目标

  • 能够为KVM虚拟机管理工具部署准备环境
  • 能够部署KVM虚拟机管理工具

1 KVM系统需求

Host system requirements  主机系统要求
1.1核心 
2.2G内存
3.6G硬盘
KVM 虚拟机环境检查
KVM hypervisor requirements
[root@localhost ~]# uname -r
①检查是否支持硬件辅助全虚拟化
Intel CPU: VT-x 
AMD CPU: AMD -V
[root@localhost ~]# lscpu
虚拟化:      VT-x    #intel虚拟技术

②CPU 有无相关特性(vmx|svm)
检查CPU flags是否包含vmx/smx
[root@localhost ~]# egrep 'svm|vmx' /proc/cpuinfo
[root@localhost ~]# egrep -o 'vmx|svm' /proc/cpuinfo
vmx
vmx
vmx
vmx

③有无KVM 内核模块(如果没有升级Linux内核)
[root@localhost ~]# lsmod | grep kvm   系统当中虚拟化支持的所有模块
kvm_intel             188688  0
kvm                   636969  1 kvm_intel
irqbypass              13503  1 kvm
已经加载,如果没有加载则执行以下命令加载KVM
[root@localhost ~]# modprobe kvm
BIOS Enable Virtualization    BIOS启用虚拟化

总结:
物理机BIOS开启虚拟化支持

启动BIOS的虚拟化设置 | 开启CPU虚拟化支持 目前Inter和AMD生产的主流CPU都支持虚拟化技术,但很多电脑或主板BIOS出厂时默认禁用虚拟化技术。则使用此教程进行启动BIOS的虚拟化设置。 http://xinzhi.wenda.so.com/a/1521941607208720

如果需要在vmware workstation 测试环境上安装kvm:

kvm 虚拟化上 - 图17

2 虚拟化主机部署

KVM管理工具—-WebVirtMgr && Cockpit

WebVirtMgr

https://www.cnblogs.com/dengcongcong/p/8066925.html

Cockpit:是一个免费且开源的基于web的管理工具

https://www.cnblogs.com/sanduzxcvbnm/p/13705509.html

WebVirtMgr + KVM 环境中的Linux虚拟机部署

KVM虚拟化

https://www.cnblogs.com/kevingrace/p/8377645.html

CentOS7 部署 KVM 虚拟机管理

https://blog.csdn.net/weixin_46902396/article/details/108791287

https://blog.csdn.net/qq_39452428/article/details/80781403

①查看环境分组和安装环境分组

已经安装的和能安装的软件套件
[root@localhost ~]# yum grouplist
可用环境组:
最小安装
计算节点
基础结构服务器
文件和打印服务器
基本Web服务器
虚拟化主机  = Virtualization Host    注意这行
带GUI的服务器
GNOME桌面
KDE Plasma工作区
开发创意工作站

可用组:
兼容性库
控制台Internet工具
开发工具
图形化管理工具
旧版UNIX兼容性
科学支持
安全工具
智能卡支持
系统管理工具
系统管理


安装KVM组件
[root@localhost ~]# yum -y groupinstall "虚拟化*"
[root@localhost ~]# yum -y groupinstall "Virtualization Host"
已安装:
  libguestfs.x86_64 1:1.40.2-10.el7        libvirt.x86_64 0:4.5.0-36.el7_9.3        libvirt-client.x86_64 0:4.5.0-36.el7_9.3
  virt-install.noarch 0:1.5.0-7.el7        virt-manager.noarch 0:1.5.0-7.el7        virt-top.x86_64 0:1.0.8-24.el7
  virt-viewer.x86_64 0:5.0-18.el7          virt-who.noarch 0:0.28.10-1.el7_9

如果具备CentOS7,可以按上述进行部署。
最小化安装完操作系统是没有gnome的。可是当我们突然又需要图形界面的时候

直接使用yum grouplist

命令执行成功之后,将会列出一大堆你已经安装的和能安装的软件套件。

[root@CentOS6 ~]# yum grouplist
Loaded plugins: fastestmirror
Setting up Group Process
Loading mirror speeds from cached hostfile
 * c6-media:
Installed Groups:
   图形管理工具
   字体
   电子邮件服务器
   继承 X Windows 系统的兼容性
   输入法
   通用桌面
Installed Language Groups:
   中文支持 [zh]
Available Groups:
   ......
   桌面
   桌面平台
   桌面平台开发
   桌面调试和运行工具
   目录客户端
   ......
Available Language Groups:
   上索布语支持 [hsb]
   不丹语支持 [dz]
   世界语支持 [eo
   ......

4、接着安装咱们的图形界面

从可安装软件列表里咱们可以看到图形界面相关条目,直接使用如下命令安装:


yum groupinstall "桌面"

yum grouplist 命令解释:

Available Environment Groups:    可用环境组:
   Minimal Install        最小安装
   Compute Node            计算节点
   Infrastructure Server    基础结构服务器
   File and Print Server    文件和打印服务器
   Basic Web Server        基本Web服务器
   Virtualization Host        虚拟化主机
   Server with GUI        GUI服务器
   GNOME Desktop        桌面桌面
   KDE Plasma Workspaces    KDE等离子工作区
   Development and Creative Workstation    开发创意工作站
Available Groups:        可用组    (表示还未安装的)
   Compatibility Libraries    兼容性库
   Console Internet Tools    控制台Internet工具
   Development Tools        开发工具
   Graphical Administration Tools    图形管理工具
   Legacy UNIX Compatibility    传统的Unix兼容性
   Scientific Support        科学支持
   Security Tools        安全工具
   Smart Card Support        智能卡支持
   System Administration Tools    系统管理工具
   System Management        系统管理
Done

kvm 虚拟化上 - 图18

3 虚拟化主机验证

安装完会自动启动(centos7.5如果启动不了升级内核)
[root@localhost ~]# systemctl status libvirtd
[root@localhost ~]# systemctl start libvirtd
[root@localhost ~]# systemctl enable libvirtd

检查kvm模块是否加载
[root@localhost ~]#lsmod | grep kvm
kvm_intel             188688  0
kvm                   636969  1 kvm_intel
irqbypass              13503  1 kvm
[root@localhost ~]#modprobe kvm  当没有加载时,可以使用此命令加载完成

4 虚拟机网络连接状态

关闭防火墙与selinux
# systemctl stop firewalld
# systemctl disable firewalld

# setenforce 0
# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
【firewalld】
为了保证虚拟机可以上网必须开启防火墙,主要的目的是为了导流
[root@localhost ~]# firewall-cmd --permanent --zone=external --list-all
==external==
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes  #为了保证虚拟机可以上网必须开启防火墙,主要的目的是为了导流
forward-ports:
source-ports:
icmp-blocks:
rich rules:
或
[root@localhost ~]# firewall-cmd --zone=public --permanent --add-masquerade
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# firewall-cmd --list-all


【iptables】
关闭firewalld及设置firewalld开机禁用
# yum list |grep iptable
# yum -y install iptables-services
# systemctl enable iptables;systemctl start iptables
# iptables -F;iptables -t nat -F;iptables -t mangle -F;iptables -t raw -F;
# iptables -t secure -F;
# iptables save


[root@localhost ~]# systemctl restart libvirtd

5 查看虚拟机列表

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

kvm 虚拟化上 - 图19

kvm 虚拟化上 - 图20

kvm 虚拟化上 - 图21

kvm 虚拟化上 - 图22

kvm 虚拟化上 - 图23

kvm 虚拟化上 - 图24

kvm 虚拟化上 - 图25

三、KVM虚拟机安装

目标
能够使用Virt-manager安装虚拟机
能够使用virt-install安装虚拟机

1 virt-manager

  • 准备iso镜像文件
  • 准备一套系统预备工具 PXE&kickstart cobbler
  • 磁盘镜像文件 /var/lib/libvirt/images
  • 配置文件 /etc/libvirt/qemu/

1.1 Linux主机安装

kvm 虚拟化上 - 图26

kvm 虚拟化上 - 图27

kvm 虚拟化上 - 图28

kvm 虚拟化上 - 图29

kvm 虚拟化上 - 图30

kvm 虚拟化上 - 图31

kvm 虚拟化上 - 图32

kvm 虚拟化上 - 图33

kvm 虚拟化上 - 图34

kvm 虚拟化上 - 图35

kvm 虚拟化上 - 图36

kvm 虚拟化上 - 图37

kvm 虚拟化上 - 图38

由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。

kvm 虚拟化上 - 图39

kvm 虚拟化上 - 图40

kvm 虚拟化上 - 图41

kvm 虚拟化上 - 图42

            VNC : 端口 默认5900  从5900开始分配

kvm 虚拟化上 - 图43

kvm 虚拟化上 - 图44

kvm 虚拟化上 - 图45

1.2 windows server 2008 r2主机安装

下载地址:https://www.msdn.hk/6/227/

kvm安装windows虚拟机

https://blog.51cto.com/koumm/1288795

kvm 虚拟化上 - 图46

kvm 虚拟化上 - 图47

kvm 虚拟化上 - 图48

新建一个存储池(不创建也可以,这样会安装到默认的位置,我这里的默认位置磁盘空间不够,因此新建一个存放位置)

kvm 虚拟化上 - 图49

kvm 虚拟化上 - 图50

创建存储池,名称随便起

kvm 虚拟化上 - 图51

目标路径就是前面创建的目录

kvm 虚拟化上 - 图52

kvm 虚拟化上 - 图53

创建好后,会出现在上面,点击它,然后点击加号,在win-imagesDir存储池里创建一个存储卷

kvm 虚拟化上 - 图54

kvm 虚拟化上 - 图55

点击选择卷

kvm 虚拟化上 - 图56

找到/root/windowsImage目录下的iso文件

kvm 虚拟化上 - 图57

kvm 虚拟化上 - 图58

kvm 虚拟化上 - 图59

kvm 虚拟化上 - 图60

kvm 虚拟化上 - 图61

kvm 虚拟化上 - 图62

kvm 虚拟化上 - 图63

kvm 虚拟化上 - 图64

kvm 虚拟化上 - 图65

kvm 虚拟化上 - 图66

kvm 虚拟化上 - 图67

kvm 虚拟化上 - 图68

安装windows 虚拟主机半虚拟化驱动

准备:

  • 半虚拟化驱动的iso 文件
  • 磁盘接口总线 virtio
  • 网卡接口 virtio
  • pci 总线驱动 virtio

半虚拟化驱动下载地址:

https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers

https://github.com/virtio-win/kvm-guest-drivers-windows

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

kvm 虚拟化上 - 图69

kvm 虚拟化上 - 图70

kvm 虚拟化上 - 图71

kvm 虚拟化上 - 图72

kvm 虚拟化上 - 图73

kvm 虚拟化上 - 图74

kvm 虚拟化上 - 图75

kvm 虚拟化上 - 图76

kvm 虚拟化上 - 图77

kvm 虚拟化上 - 图78

kvm 虚拟化上 - 图79

kvm 虚拟化上 - 图80

kvm 虚拟化上 - 图81

kvm 虚拟化上 - 图82

kvm 虚拟化上 - 图83

kvm 虚拟化上 - 图84

kvm 虚拟化上 - 图85

kvm 虚拟化上 - 图86

安装存储驱动

kvm 虚拟化上 - 图87

kvm 虚拟化上 - 图88

kvm 虚拟化上 - 图89

kvm 虚拟化上 - 图90

kvm 虚拟化上 - 图91

kvm 虚拟化上 - 图92

安装网络驱动

kvm 虚拟化上 - 图93

kvm 虚拟化上 - 图94

kvm 虚拟化上 - 图95

kvm 虚拟化上 - 图96

kvm 虚拟化上 - 图97

重启libvirt
[root@localhost ~]# systemctl restart libvirtd
[root@localhost ~]# systemctl status libvirtd

kvm 虚拟化上 - 图98

kvm 虚拟化上 - 图99

kvm 虚拟化上 - 图100

kvm 虚拟化上 - 图101

kvm 虚拟化上 - 图102

安装内存驱动

上面发现内存不能内存气球

kvm 虚拟化上 - 图103

kvm 虚拟化上 - 图104

kvm 虚拟化上 - 图105

kvm 虚拟化上 - 图106

kvm 虚拟化上 - 图107

kvm 虚拟化上 - 图108

kvm 虚拟化上 - 图109

kvm 虚拟化上 - 图110

kvm 虚拟化上 - 图111

kvm 虚拟化上 - 图112

2 virt-install

kvm虚拟机日常操作命令梳理

案例1

[root@localhost ~]# virt-install \
    --name=smartgo1 \
    --graphics vnc,listen=0.0.0.0,port=5920,keymap=en-us \  vnc
    --ram=512 \   内存
    --vcpus=1 \     CPU
    --arch=x86_64 \    架构
    --os-type=linux \   操作系统类型
    --os-variant=rhel7 \  变体
    --disk path=/var/lib/libvirt/images/smartgo1.img,size=8,format=qcow2 \
    --bridge=virbr0 \  联网的桥
    --cdrom=/root/CentOS-7-x86_64-DVD-1804.iso 光盘镜像

—location=ftp://{IP}/rhel7.5 网络安装的方式 —location LOCATION 安装源 (例如:nfs:host:/path, http://host/path, ftp://host/path) —extra-args=”ks=ftp://{IP}/rhel7.5.ks” 额外参数(自动安装的脚本)

案例2

[root@localhost ~]# virt-install \
    --name=smartgo2 \
    --graphics vnc,listen=0.0.0.0,port=5930,keymap=en-us \
    --noautoconsole \
    --ram=512 \
    --vcpus=1 \
    --arch=x86_64 \
    --os-type=linux \
    --os-variant=rhel7 \
    --disk path=/var/lib/libvirt/images/smartgo2.img,size=8,format=qcow2 \
    --bridge=virbr0 \
    --cdrom=/root/CentOS-7-x86_64-DVD-1804.iso

案例3

[root@localhost ~]# virt-install \
    --nographics \   无视图
    --name=smartgo3 \
    --ram=512 \
    --vcpus=1 \
    --arch=x86_64 \
    --os-type=linux \
    --os-variant=rhel7 \
    --disk path=/var/lib/libvirt/images/smartgo3.img,size=8,format=qcow2 \
    --bridge=virbr0 \
    --cdrom=/root/CentOS-7-x86_64-DVD-1804.iso

 列出启动的虚拟机   
[root@localhost ~]# virt-view   不用配VNC 就可以连接了

案例4

[root@localhost ~]# virt-install \
    --name=windows2k8 \
    --graphics vnc,listen=0.0.0.0,port=5940,keymap=en_us \
    --ram=1024 \
    --vcpus=1 \
    --disk path=/guests_images/windows2k8.img,size=50,format=qcow2 \
    --bridge=virbr0 \
    --cdrom=/root/Windows_Server_2008_R2_VL_x64_CN_2018.04.iso

案例5

[root@localhost ~]# virt-install \
    --name=centos7 \
    --memory 512,maxmemory=1024 \
    --vcpus 1,maxvcpus=4 \
    --os-type=linux \
    --cdrom=/root/CentOS-7-x86_64-DVD-1804.iso \
    --disk path=/var/lib/libvirt/images/centos7u2.img,size=50,format=qcow2 \
    --network bridge=virbr0 \
    --vnc \
    --vncport=5950 \
    --vnclisten=0.0.0.0 \
    --autostart    虚拟机开机自启动(物理机启动之后)

案例6

[root@localhost ~]# virt-install \
    --name=windows2008 \
    --memory 1024,maxmemory=4096 \
    --vcpus 1,maxvcpus=4 \
    --os-type=windows \
    --cdrom=/root/Windows_Server_2008_R2_VL_x64_CN_2018.04.iso \
    --disk path=/usr/share/virtio-win/virtio-win_amd64.vfd,device=floppy \
    --disk path=/home/images2/windows2008.img,format=qcow2,size=40,bus=virtio \
    --network bridge=virbr0,model=virtio \
    --vnc \
    --vncport=5950 \
    --vnclisten=0.0.0.0 \
    --autostart


驱动下载:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/

四、KVM虚拟机组成文件

目标

  • 能够使用virsh命令查看虚拟机
  • 能够找到虚拟机配置文件所在位置:/var/lib/libvirt/images
  • 能够找到虚拟机磁盘文件所在位置:/etc/libvirt/qemu/
虚拟机(guest,vm,domain,instance) = 磁盘文件image(Linux or Windows) + 配置文件(虚拟机名,2VCPU,512M...)

磁盘镜像文件 /var/lib/libvirt/images
配置文件 /etc/libvirt/qemu/

kvm虚拟机日常操作命令梳理

(指定 help <group> 获取组中命令的详情)
(使用 --help <command> 来获得这个命令的详细信息)


help keyword volume|virsh|pool|snapshot|domain|network|filter|interface|host|

[root@localhost qemu]# virsh help volume

[root@localhost qemu]# virsh -h |grep start


[root@localhost qemu]# virsh dumpxml --help
  NAME
    dumpxml - XML 中的域信息

  SYNOPSIS
    dumpxml <domain> [--inactive] [--security-info] [--update-cpu] [--migratable]

  DESCRIPTION
    把域信息作为一个 XML 输出到 stdout。

  OPTIONS
    [--domain] <string>  domain name, id or uuid
    --inactive       显示不活跃定义的 XML
    --security-info  包括 XML 转储中与安全性相关的信息
    --update-cpu     根据主机 CPU 更新虚拟机 CPU
    --migratable     为迁移提供 XML 可用性


virsh命令
[root@kvm-server ~]# virsh --help    #查看命令帮忙

[root@kvm-server ~]# virsh list     #显示正在运行的虚拟机

[root@kvm-server ~]# virsh list --all     #显示所有的虚拟机

[root@kvm-server ~]# virt-top    #查看各个虚拟机负载

[root@kvm-server ~]# virsh reboot vm-node   重新启动一个域

[root@kvm-server ~]# virsh start vm-node1       #启动vm-node1虚拟机

[root@kvm-server ~]# virsh shutdown vm-node1     #关闭vm-node1虚拟机

[root@kvm-server ~]# virsh destroy vm-node1    #虚拟机vm-node1强制断电

[root@kvm-server ~]# virsh suspend vm-node1     #挂起vm-node1虚拟机

[root@kvm-server ~]# virsh resume vm-node1        #恢复挂起的虚拟机

[root@kvm-server ~]# virsh undefine vm-node1       #删除虚拟机,慎用

[root@kvm-server ~]# virsh dominfo vm-node1       #查看虚拟机的配置信息

[root@kvm-server ~]# virsh domiflist             #查看网卡配置信息

[root@kvm-server ~]# virsh domblklist vm-node1      #查看该虚拟机的磁盘位置

[root@kvm-server ~]# virsh edit vm-node1             #修改vm-node1的xml配置文件

[root@kvm-server ~]# virsh dumpxml vm-node1     #查看KVM虚拟机当前配置

[root@kvm-server ~]# virsh vcpucount vm-node1

[root@kvm-server ~]# virsh dumpxml vm-node1 > vm-node1.bak.xml        #备份vm-node1虚拟机的xml文件,原文件默认路径/etc/libvirt/qemu/vm-node1.xml

[root@kvm-server ~]# virsh autostart vm-node1                         #KVM物理机开机自启动虚拟机,配置后会在此目录生成配置文件/etc/libvirt/qemu/autostart/vm-node1.xml

[root@kvm-server ~]# virsh autostart --disable vm-node1       #取消开机自启动
[root@localhost qemu]# virsh -h

virsh [options]... [<command_string>]
virsh [options]... <command> [args...]

  options:
    -c | --connect=URI      hypervisor connection URI
    -d | --debug=NUM        debug level [0-4]
    -e | --escape <char>    set escape sequence for console
    -h | --help             this help
    -k | --keepalive-interval=NUM
                            keepalive interval in seconds, 0 for disable
    -K | --keepalive-count=NUM
                            number of possible missed keepalive messages
    -l | --log=FILE         output logging to file
    -q | --quiet            quiet mode
    -r | --readonly         connect readonly
    -t | --timing           print timing information
    -v                      short version
    -V                      long version
         --version[=TYPE]   version, TYPE is short or long (default short)
  commands (non interactive mode):

 Domain Management (help keyword 'domain')
    attach-device                  从一个XML文件附加装置
    attach-disk                    附加磁盘设备
    attach-interface               获得网络界面
    autostart                      自动开始一个域
    blkdeviotune                   设定或者查询块设备 I/O 调节参数。
    blkiotune                      获取或者数值 blkio 参数
    blockcommit                    启动块提交操作。
    blockcopy                      启动块复制操作。
    blockjob                       管理活跃块操作
    blockpull                      使用其后端映像填充磁盘。
    blockresize                    创新定义域块设备大小
    change-media                   更改 CD 介质或者软盘驱动器
    console                        连接到客户会话
    cpu-stats                      显示域 cpu 统计数据
    create                         从一个 XML 文件创建一个域
    define                         从一个 XML 文件定义(但不开始)一个域
    desc                           显示或者设定域描述或者标题
    destroy                        销毁(停止)域
    detach-device                  从一个 XML 文件分离设备
    detach-device-alias            detach device from an alias
    detach-disk                    分离磁盘设备
    detach-interface               分离网络界面
    domdisplay                     域显示连接 URI
    domfsfreeze                    Freeze domain's mounted filesystems.
    domfsthaw                      Thaw domain's mounted filesystems.
    domfsinfo                      Get information of domain's mounted filesystems.
    domfstrim                      在域挂载的文件系统中调用 fstrim。
    domhostname                    输出域主机名
    domid                          把一个域名或 UUID 转换为域 id
    domif-setlink                  设定虚拟接口的链接状态
    domiftune                      获取/设定虚拟接口参数
    domjobabort                    忽略活跃域任务
    domjobinfo                     域任务信息
    domname                        将域 id 或 UUID 转换为域名
    domrename                      rename a domain
    dompmsuspend                   使用电源管理功能挂起域
    dompmwakeup                    从 pmsuspended 状态唤醒域
    domuuid                        把一个域名或 id 转换为域 UUID
    domxml-from-native             将原始配置转换为域 XML
    domxml-to-native               将域 XML 转换为原始配置
    dump                           把一个域的内核 dump 到一个文件中以方便分析
    dumpxml                        XML 中的域信息
    edit                           编辑某个域的 XML 配置
    event                          Domain Events
    inject-nmi                     在虚拟机中输入 NMI
    iothreadinfo                   view domain IOThreads
    iothreadpin                    control domain IOThread affinity
    iothreadadd                    add an IOThread to the guest domain
    iothreaddel                    delete an IOThread from the guest domain
    send-key                       向虚拟机发送序列号
    send-process-signal            向进程发送信号
    lxc-enter-namespace            LXC 虚拟机进入名称空间
    managedsave                    管理域状态的保存
    managedsave-remove             删除域的管理保存
    managedsave-edit               edit XML for a domain's managed save state file
    managedsave-dumpxml            Domain information of managed save state file in XML
    managedsave-define             redefine the XML for a domain's managed save state file
    memtune                        获取或者数值内存参数
    perf                           Get or set perf event
    metadata                       show or set domain's custom XML metadata
    migrate                        将域迁移到另一个主机中
    migrate-setmaxdowntime         设定最大可耐受故障时间
    migrate-getmaxdowntime         get maximum tolerable downtime
    migrate-compcache              获取/设定压缩缓存大小
    migrate-setspeed               设定迁移带宽的最大值
    migrate-getspeed               获取最长迁移带宽
    migrate-postcopy               Switch running migration from pre-copy to post-copy
    numatune                       获取或者数值 numa 参数
    qemu-attach                    QEMU 附加
    qemu-monitor-command           QEMU 监控程序命令
    qemu-monitor-event             QEMU Monitor Events
    qemu-agent-command             QEMU 虚拟机代理命令
    reboot                         重新启动一个域
    reset                          重新设定域
    restore                        从一个存在一个文件中的状态恢复一个域
    resume                         重新恢复一个域
    save                           把一个域的状态保存到一个文件
    save-image-define              为域的保存状态文件重新定义 XML
    save-image-dumpxml             在 XML 中保存状态域信息
    save-image-edit                为域保存状态文件编辑 XML
    schedinfo                      显示/设置日程安排变量
    screenshot                     提取当前域控制台快照并保存到文件中
    set-lifecycle-action           change lifecycle actions
    set-user-password              set the user password inside the domain
    setmaxmem                      改变最大内存限制值
    setmem                         改变内存的分配
    setvcpus                       改变虚拟 CPU 的号
    shutdown                       关闭一个域
    start                          开始一个(以前定义的)非活跃的域
    suspend                        挂起一个域
    ttyconsole                     tty 控制台
    undefine                       取消定义一个域
    update-device                  从 XML 文件中关系设备
    vcpucount                      域 vcpu 计数
    vcpuinfo                       详细的域 vcpu 信息
    vcpupin                        控制或者查询域 vcpu 亲和性
    emulatorpin                    控制火车查询域模拟器亲和性
    vncdisplay                     vnc 显示
    guestvcpus                     query or modify state of vcpu in the guest (via agent)
    setvcpu                        attach/detach vcpu or groups of threads
    domblkthreshold                set the threshold for block-threshold event for a given block device or it's backing chain element

 Domain Monitoring (help keyword 'monitor')
    domblkerror                    在块设备中显示错误
    domblkinfo                     域块设备大小信息
    domblklist                     列出所有域块
    domblkstat                     获得域设备块状态
    domcontrol                     域控制接口状态
    domif-getlink                  获取虚拟接口链接状态
    domifaddr                      Get network interfaces' addresses for a running domain
    domiflist                      列出所有域虚拟接口
    domifstat                      获得域网络接口状态
    dominfo                        域信息
    dommemstat                     获取域的内存统计
    domstate                       域状态
    domstats                       get statistics about one or multiple domains
    domtime                        domain time
    list                           列出域

 Host and Hypervisor (help keyword 'host')
    allocpages                     Manipulate pages pool size
    capabilities                   性能
    cpu-baseline                   计算基线 CPU
    cpu-compare                    使用 XML 文件中描述的 CPU 与主机 CPU 进行对比
    cpu-models                     CPU models
    domcapabilities                domain capabilities
    freecell                       NUMA可用内存
    freepages                      NUMA free pages
    hostname                       打印管理程序主机名
    hypervisor-cpu-baseline        compute baseline CPU usable by a specific hypervisor
    hypervisor-cpu-compare         compare a CPU with the CPU created by a hypervisor on the host
    maxvcpus                       连接 vcpu 最大值
    node-memory-tune               获取或者设定节点内存参数
    nodecpumap                     节点 cpu 映射
    nodecpustats                   输出节点的 cpu 状统计数据。
    nodeinfo                       节点信息
    nodememstats                   输出节点的内存状统计数据。
    nodesuspend                    在给定时间段挂起主机节点
    sysinfo                        输出 hypervisor sysinfo
    uri                            打印管理程序典型的URI
    version                        显示版本

 Interface (help keyword 'interface')
    iface-begin                    生成当前接口设置快照,可在今后用于提交 (iface-commit) 或者恢复 (iface-rollback)
    iface-bridge                   生成桥接设备并为其附加一个现有网络设备
    iface-commit                   提交 iface-begin 后的更改并释放恢复点
    iface-define                   define an inactive persistent physical host interface or modify an existing persistent one from an XML file
    iface-destroy                  删除物理主机接口(启用它请执行 "if-down")
    iface-dumpxml                  XML 中的接口信息
    iface-edit                     为物理主机界面编辑 XML 配置
    iface-list                     物理主机接口列表
    iface-mac                      将接口名称转换为接口 MAC 地址
    iface-name                     将接口 MAC 地址转换为接口名称
    iface-rollback                 恢复到之前保存的使用 iface-begin 生成的更改
    iface-start                    启动物理主机接口(启用它请执行 "if-up")
    iface-unbridge                 分离其辅助设备后取消定义桥接设备
    iface-undefine                 取消定义物理主机接口(从配置中删除)

 Network Filter (help keyword 'filter')
    nwfilter-define                使用 XML 文件定义或者更新网络过滤器
    nwfilter-dumpxml               XML 中的网络过滤器信息
    nwfilter-edit                  为网络过滤器编辑 XML 配置
    nwfilter-list                  列出网络过滤器
    nwfilter-undefine              取消定义网络过滤器
    nwfilter-binding-create        create a network filter binding from an XML file
    nwfilter-binding-delete        delete a network filter binding
    nwfilter-binding-dumpxml       XML 中的网络过滤器信息
    nwfilter-binding-list          list network filter bindings

 Networking (help keyword 'network')
    net-autostart                  自动开始网络
    net-create                     从一个 XML 文件创建一个网络
    net-define                     define an inactive persistent virtual network or modify an existing persistent one from an XML file
    net-destroy                    销毁(停止)网络
    net-dhcp-leases                print lease info for a given network
    net-dumpxml                    XML 中的网络信息
    net-edit                       为网络编辑 XML 配置
    net-event                      Network Events
    net-info                       网络信息
    net-list                       列出网络
    net-name                       把一个网络UUID 转换为网络名
    net-start                      开始一个(以前定义的)不活跃的网络
    net-undefine                   undefine a persistent network
    net-update                     更新现有网络配置的部分
    net-uuid                       把一个网络名转换为网络UUID

 Node Device (help keyword 'nodedev')
    nodedev-create                 根据节点中的 XML 文件定义生成设备
    nodedev-destroy                销毁(停止)节点中的设备
    nodedev-detach                 将节点设备与其设备驱动程序分离
    nodedev-dumpxml                XML 中的节点设备详情
    nodedev-list                   这台主机中中的枚举设备
    nodedev-reattach               重新将节点设备附加到他的设备驱动程序中
    nodedev-reset                  重置节点设备
    nodedev-event                  Node Device Events

 Secret (help keyword 'secret')
    secret-define                  定义或者修改 XML 中的 secret
    secret-dumpxml                 XML 中的 secret 属性
    secret-event                   Secret Events
    secret-get-value               secret 值输出
    secret-list                    列出 secret
    secret-set-value               设定 secret 值
    secret-undefine                取消定义 secret

 Snapshot (help keyword 'snapshot')
    snapshot-create                使用 XML 生成快照
    snapshot-create-as             使用一组参数生成快照
    snapshot-current               获取或者设定当前快照
    snapshot-delete                删除域快照
    snapshot-dumpxml               为域快照转储 XML
    snapshot-edit                  编辑快照 XML
    snapshot-info                  快照信息
    snapshot-list                  为域列出快照
    snapshot-parent                获取快照的上级快照名称
    snapshot-revert                将域转换为快照

 Storage Pool (help keyword 'pool')
    find-storage-pool-sources-as   找到潜在存储池源
    find-storage-pool-sources      发现潜在存储池源
    pool-autostart                 自动启动某个池
    pool-build                     建立池
    pool-create-as                 从一组变量中创建一个池
    pool-create                    从一个 XML 文件中创建一个池
    pool-define-as                 在一组变量中定义池
    pool-define                    define an inactive persistent storage pool or modify an existing persistent one from an XML file
    pool-delete                    删除池
    pool-destroy                   销毁(删除)池
    pool-dumpxml                   XML 中的池信息
    pool-edit                      为存储池编辑 XML 配置
    pool-info                      存储池信息
    pool-list                      列出池
    pool-name                      将池 UUID 转换为池名称
    pool-refresh                   刷新池
    pool-start                     启动一个(以前定义的)非活跃的池
    pool-undefine                  取消定义一个不活跃的池
    pool-uuid                      把一个池名称转换为池 UUID
    pool-event                     Storage Pool Events

 Storage Volume (help keyword 'volume')
    vol-clone                      克隆卷。
    vol-create-as                  从一组变量中创建卷
    vol-create                     从一个 XML 文件创建一个卷
    vol-create-from                生成卷,使用另一个卷作为输入。
    vol-delete                     删除卷
    vol-download                   将卷内容下载到文件中
    vol-dumpxml                    XML 中的卷信息
    vol-info                       存储卷信息
    vol-key                        为给定密钥或者路径返回卷密钥
    vol-list                       列出卷
    vol-name                       为给定密钥或者路径返回卷名
    vol-path                       为给定密钥或者路径返回卷路径
    vol-pool                       为给定密钥或者路径返回存储池
    vol-resize                     创新定义卷大小
    vol-upload                     将文件内容上传到卷中
    vol-wipe                       擦除卷

 Virsh itself (help keyword 'virsh')
    cd                             更改当前目录
    echo                           echo 参数
    exit                           退出这个非交互式终端
    help                           打印帮助
    pwd                            输出当前目录
    quit                           退出这个非交互式终端
    connect                        连接(重新连接)到 hypervisor


  (指定 help <group> 获取组中命令的详情)

  (使用 --help <command> 来获得这个命令的详细信息)

1.KVM虚拟机查看方法

[root@localhost ~]# virsh --help
[root@localhost ~]# virsh list --help

  OPTIONS
    --inactive       列出不活跃的域
    --all            不活跃和活跃的域列表
    --transient      列出临时域
    --persistent     列出持久域
    --with-snapshot  列出现有快照的域
    --without-snapshot  列出没有快照的域
    --state-running  运行状态的域列表
    --state-paused   列出暂停状态的域
    --state-shutoff  列出关闭状态的域
    --state-other    列出其他状态的域
    --autostart      列出启用 autostart 的域
    --no-autostart   列出禁用 autostart 的域
    --with-managed-save  列出有管理的保存状态的域
    --without-managed-save  列出没有管理的保存状态的域
    --uuid           只列出 uuid
    --name           只列出域名
    --table          列出表格(默认)
    --managed-save   标记有管理的保存状态的域
    --title          show domain title

[root@localhost ~]# virsh list 正在运行的虚拟机
[root@localhost ~]# virsh list --all   全部虚拟机
[root@localhost ~]# virsh list --inactive

2.虚拟机配置文件XML

[root@localhost ~]# ls /etc/libvirt/qemu
autostart  centos7.6-vm1.xml  networks  win2k8r2-2.xml  win2k8r2.xml

[root@localhost ~]# virsh edit centos7.6-vm1 #编辑
[root@localhost ~]# virsh dumpxml centos7.6-vm1 > new_smartgo_01 #备份

虚拟机磁盘文件所在位置

[root@localhost qemu]# ls /var/lib/libvirt/
boot  dnsmasq  filesystems  images  lxc  network  qemu  swtpm

[root@localhost qemu]# ls /var/lib/libvirt/images
centos7.6-vm1.qcow2

3.设定vm自动运行

交互式

[root@localhost qemu]# virsh
欢迎使用 virsh,虚拟化的交互式终端。

输入:'help' 来获得命令的帮助信息
       'quit' 退出

virsh # list
 Id    名称                         状态
----------------------------------------------------
 2     centos7.6-vm1                  running

[root@localhost qemu]# virsh domdisplay centos7.6-vm1
vnc://127.0.0.1:0    域显示连接的URI

虚拟机开机自启动

[root@localhost qemu]# virsh dominfo centos7.6-vm1
Id:             2
名称:       centos7.6-vm1
UUID:           112455e5-4d9f-4c1f-9656-a2ce79cb6834
OS 类型:    hvm
状态:       running
CPU:          1
CPU 时间:   160.6s
最大内存: 1048576 KiB
使用的内存: 1048576 KiB
持久:       是
自动启动: 禁用            自动启动
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0


[root@localhost qemu]# virsh autostart centos7.6-vm1
域 centos7.6-vm1标记为自动开始

[root@localhost qemu]# virsh dominfo centos7.6-vm1
Id:             2
名称:       centos7.6-vm1
UUID:           112455e5-4d9f-4c1f-9656-a2ce79cb6834
OS 类型:    hvm
状态:       running
CPU:          1
CPU 时间:   161.9s
最大内存: 1048576 KiB
使用的内存: 1048576 KiB
持久:       是
自动启动: 启用            自动启动 开启
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c343,c697 (enforcing)


开机自启的原理只是centos7.6-vm1.xml -> /etc/libvirt/qemu/centos7.6-vm1.xml 做了个软连接
[root@localhost qemu]# cd /etc/libvirt/qemu/
[root@localhost qemu]# ls
autostart  centos7.6-vm1.xml  networks  win2k8r2-2.xml  win2k8r2.xml
[root@localhost qemu]# ls autostart/
centos7.6-vm1.xml
[root@localhost qemu]# ll
总用量 24
drwxr-xr-x. 2 root root   31 4月  13 21:16 autostart
-rw-------. 1 root root 4497 4月  13 13:22 centos7.6-vm1.xml
drwx------. 3 root root   42 11月 17 00:30 networks
-rw-------. 1 root root 4884 4月  13 19:04 win2k8r2-2.xml
-rw-------. 1 root root 4586 4月  13 15:08 win2k8r2.xml
[root@localhost qemu]# ll autostart/
总用量 0
lrwxrwxrwx. 1 root root 35 4月  13 21:16 centos7.6-vm1.xml -> /etc/libvirt/qemu/centos7.6-vm1.xml

[root@localhost ~]# ls /etc/libvirt/qemu/autostart/
[root@localhost ~]# ll /etc/libvirt/qemu/autostart/smartgo_01.xml

4.网络配置文件XML

kvm 虚拟化上 - 图113

kvm 虚拟化上 - 图114

kvm 虚拟化上 - 图115

[root@localhost ~]# ls /etc/libvirt/qemu/networks/
[root@localhost networks]# ls
autostart  default.xml
[root@localhost networks]# cat default.xml

<network>
  <name>default</name>
  <uuid>76005c5b-18e0-407f-b79b-fb0118ab72c3</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:86:fe:67'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

[root@localhost ~]#ls /etc/libvirt/qemu/networks/autostart/

 [root@localhost ~]# virsh net-edit default  修改网络

5.存储池配置文件XML

存储池是用来存虚拟机的磁盘镜像

kvm 虚拟化上 - 图116

kvm 虚拟化上 - 图117

kvm 虚拟化上 - 图118

kvm 虚拟化上 - 图119

kvm 虚拟化上 - 图120

[root@localhost ~]#ls /etc/libvirt/storage/
[root@localhost ~]#ls /etc/libvirt/storage/autostart/

[root@localhost networks]# cd /etc/libvirt/
[root@localhost libvirt]# ls
libvirt-admin.conf  libvirtd.conf  nwfilter  qemu.conf        secrets  virtlockd.conf
libvirt.conf        lxc.conf       qemu      qemu-lockd.conf  storage  virtlogd.conf

[root@localhost libvirt]# cd storage/
[root@localhost storage]# ls
autostart  default.xml  root.xml  win-ImagesDir.xml storpool.xml
[root@localhost storage]# cat storpool.xml

<pool type='dir'>
  <name>storpool</name>
  <uuid>a2e2354b-d9b1-47f5-8631-a5913c6deb5c</uuid>
  <capacity unit='bytes'>0</capacity>
  <allocation unit='bytes'>0</allocation>
  <available unit='bytes'>0</available>
  <source>
  </source>
  <target>
    <path>/home/storpool</path>
  </target>
</pool>
编辑存储池配置文件
[root@localhost storage]# virsh pool-edit default

6.镜像文件(磁盘文件)

[root@localhost ~]#ls /var/lib/libvirt/images/

五、KVM虚拟机CPU热添加

目标

  • 能够了解虚拟机添加CPU的作用及预准备

能够通过virt-manager为虚拟机添加CPU

是永久添加 会修改配置文件的

kvm 虚拟化上 - 图121

kvm 虚拟化上 - 图122

[root@localhost ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                3    
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             3

kvm 虚拟化上 - 图123

[root@localhost qemu]# virsh list
 Id    名称                         状态
----------------------------------------------------
 6     centos7.6-vm1                  running

[root@localhost qemu]# virsh dominfo centos7.6-vm1
Id:             6
名称:       centos7.6-vm1
UUID:           112455e5-4d9f-4c1f-9656-a2ce79cb6834
OS 类型:    hvm
状态:       running
CPU:          3          跟着变化
CPU 时间:   94.7s
最大内存: 2072576 KiB
使用的内存: 1933312 KiB
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c741,c916 (enforcing)

②能够通过virsh命令为虚拟机添加CPU

cpu只能在线添加不能在线减少(虚拟机关机只有可以改小)


[root@localhost images]# virsh list
 Id    名称                         状态
----------------------------------------------------
 2     centos7.6-vm1                  running

[root@localhost qemu]# virsh dominfo centos7.6-vm1
Id:             7
名称:       centos7.6-vm1
UUID:           112455e5-4d9f-4c1f-9656-a2ce79cb6834
OS 类型:    hvm
状态:       running
CPU:          3
CPU 时间:   39.5s
最大内存: 2072576 KiB



[root@centos7.6-vm1 ~]# lscpu

在线临时添加
[root@localhost ~]# virsh setvcpus centos7.6-vm1 4 --live     临时添加
[root@localhost ~]# virsh dominfo centos7.6-vm1
Id:             2
名称:       centos7.6-vm1
UUID:           112455e5-4d9f-4c1f-9656-a2ce79cb6834
OS 类型:    hvm
状态:       running
CPU:          4          4颗CPU
CPU 时间:   202.1s
[root@centos7.6-vm1 ~]#lscpu  也是4颗

配置文件没改还是三颗
[root@localhost qemu]# virsh dumpxml centos7.6-vm1 |grep vcpu
  <vcpu placement='static' current='3'>4</vcpu>

[root@centos7.6-vm1 ~]#lscpu

windows server 2008 r2添加CPU方法与上述方法一致

六、KVM虚拟机内存气球应用

目标

  • 能够了解虚拟机添加内存的作用及预准备
  • 能够通过virt-manager为虚拟机添加内存
  • 能够通过virsh命令为虚拟机添加内存

KVM内存气球技术可以对虚拟机使用的内存按需调节,从而提高内存的利用率。

linux默认就支持内存气球

1.宿主机内存气球配置

[root@localhost ~]# virsh dumpxml centos7.6-vm1 |less #虚拟机的配置文件写到屏幕上来
[root@localhost ~]# virsh dumpxml centos7.6-vm1 | grep -n memballoon -C2
# memballon开始和结束标签

      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='selinux' relabel='yes'>

2.虚拟机内存气球配置

虚拟机需要安装virtio balloon驱动,内核开启CONFIG_VIRTIO_BALLOON。CentOS6/7默认已安装驱动并开启

①通过virt-manager为虚拟机调节 内存

内存可在线增加可减少

kvm 虚拟化上 - 图124


[root@localhost qemu]# virsh dominfo centos7.6-vm1
Id:             6
名称:       centos7.6-vm1
UUID:           112455e5-4d9f-4c1f-9656-a2ce79cb6834
OS 类型:    hvm
状态:       running
CPU:          2
CPU 时间:   89.1s
最大内存: 2072576 KiB
使用的内存: 1933312 KiB   随着变化
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c741,c916 (enforcing)

[root@centos7.6-vm1 ~]# free -m

②通过virsh命令为虚拟机添加内存

[root@centos7.6-vm1 ~]# lspci 

[root@localhost ~]#virsh qemu-monitor-command --help
  NAME
    qemu-monitor-command - QEMU 监控程序命令

  SYNOPSIS
    qemu-monitor-command <domain> [--hmp] [--pretty] {[--cmd] <string>}...

  DESCRIPTION
    QEMU 监控程序命令

  OPTIONS
    [--domain] <string>  domain name, id or uuid
    --hmp            采用认同监控协议的命令
    --pretty         以美化格式输出任意 qemu 监视器协议输出结果
    [--cmd] <string>  命令


[root@localhost ~]# virsh qemu-monitor-command centos7.6-vm1 --hmp --cmd info balloon #查看
内存信息
[root@localhost ~]# virsh qemu-monitor-command centos7.6-vm1 --hmp --cmd balloon 1024  内存调节到1024

[root@localhost ~]# virsh qemu-monitor-command centos7.6-vm1 --hmp --cmd info balloon


[root@centos7.6-vm1 ~]# free -m

kvm 虚拟化上 - 图125