# 虚拟化

## 一、虚拟化技术概述学习目标

能够了解虚拟化技术分类方法

能够了解虚拟化技术实现目的

能够了解虚拟化产品有哪些

能够了解QEMU功能

能够掌握KVM功能

能够掌握libvirt功能

### 1.虚拟化技术即是对资源的抽象概念

### 2.从资源提供角度分类

2.1平台虚拟化

如果把X86平台的CPU，内存和外设做为资源，那对应的虚拟化技术就是平台虚拟化，在同一个X86平台上面，

可以虚拟多个X86平台，每个平台可以运行自己独立完整的操作系统。

例如：QEMU，KVM，XEN Server，vmware ESXI，Hyper-V等所管理的虚拟机

2.2操作系统虚拟化

如果把操作系统及其提供的系统调用作为资源，那虚拟化就表现为操作系统虚拟化，例如Liux容器虚拟化技术就是在同一个Liux操作系统之上，虚拟出多个同样的操作系统，每个应用程序认为自己运行在一个独立的OS。

例如：LXC或Docker等所管理的容器





### 3.从虚拟化实现方式分类

3.1什么是虚拟化管理程序Hypervisor(VMM)

一种运行在物理机和虚拟机操作系统之间的中间软件层，可以允许多个操作系统和应用共享硬件，即虚拟机监视

器，也可称之为VMM。

Hypervis0rs是一种在虚拟环境中的＂元＂操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisors不但协调着这些硬件资源的访问，而且在各个虚拟机之间施加防护。当服务器启动并执行

Hypervisor时，它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存，CPU，网络和磁盘。

如下图所示：

![image-20221123013617779](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015941.png)





3.1.1 Hypervisor作用

Hypervisor是所有虚拟化技术的核心。非中断地支持多工作负载迁移的能力是Hypervisor的基本功能。

3.1.2 Hypervisor分类

目前市场上各种x86管理程序(hypervisor)的架构存在差异，三个最主要的架构类别包括：

I型：虚拟机直接运行在系统硬件上，创建硬件全仿真实例，被称为"  裸机＂型。（半虚拟化：一半硬件，一半软件虚拟化）

棵机型在虚拟化中Hypervisor直接管理调用硬件资源，不需要底层操作系统，也可以将Hypervisor看作一个很薄的操作系统。这种方案的性能处于主机虚拟化与操作系统虚拟化之间。

![image-20221123014227606](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015934.png)

II型：虚拟机运行在传统操作系统上，同样创建的是硬件全仿真实例，被称为＂托管（宿主）“型。托管型主机型（全虚拟化）

Hypervisori运行在基础操作系统上，构建出一整套虚拟硬件平台(CPU/Memory/Storage/Adapter)，使用者根据需要安装新的操作系统和应用软件，底层和上层的操作系统可以完全无关化，如Windows运行Liunx操作系统。主机虚拟化中VM的应用程序调用硬件资源时需要经过：VM内核＞Hypervisor-＞主机内核，因此相对来说，性能是三种虚拟化技术中最差的。

![image-20221123014354912](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015028.png)

Ⅲ型：虚拟机运行在传统操作系统上，创建一个独立的虚拟化实例（容器），指向底层托管操作系统，被称为“＂操作系统虚拟化”。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器，所有虚拟机共享内核空间，性能最好，耗费资源最少。但是缺点是底层和上层必须使用同一种操作系统，如底层操作系统运行的是Windows系统，则VPS/VE就必须运行Windows?



![image-20221123014603185](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015006.png)



总结：

·虚拟化实现的方式基于hypervisor分类

主要有三类架构

 typer I

虚拟机直接运行在物理硬件之上，不需要底层操作系统，hypervisor充当了操作系统，需要修改客户机操作系统。例：xen

 typer ll

虚拟机运行在传统操作系统之上，硬件全仿真，称为“宿主型”，hypervisor提供硬件模拟，虚拟机操作系统与主机操作系统无关化

应用程序向虚拟机内核发起请求；虚拟机内核向hypervisor发起请求；hypervisor向宿主机操作系统内核发起请求

例：qemu

typer Ill

“虚拟机运行在传统主机操作系统之上，运行一个实例，把系统调用指向传统主机操作系统。例：lxc，docker



### 4.hypervisor管理工具

![image-20221123015107656](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015967.png)



#### 4.1 QEMU

软件模拟虚拟化、可以模拟多种硬件，包括X86架构处理器、AMD64架构处理器、ARM、SPARC与PowerPC

，AIX架构等。效率低，一般用于研究测试场景。

此处使用QEMU的主要目的是为了方便管理KVM虚拟机镜像文件？

注：

QEMU由Fabrice Bellard编写的模拟处理器的自由软件，<font color='red'>它是一个完整的可以单独运行的软件，可以独立模拟出</font>

<font color='red'>整台计算机，包括CPU，内存，IO设备</font>，通过一个特殊的＂重编译器＂对特定的处理器的二进制代码进行翻译，从而具有了跨平台的通用性。

QEMU有两种工作模式：系统模式，可以模拟出整个电脑系统，

另一种是用户模式，可以运行不同与当前硬件平台的其他平台上的程序（比如在x86平台上运行跑在ARM平台上的程序）；1.0以后版本就只能使用qemu-kwm(只支持inux)进行加速了，1.3版本后QMU

和QEMU-KVM合二为一了。





#### 4.2 KVM

KVM kernel-based-virtual-machine基于内核的虚拟机模块

是×86架构下硬件辅助的全虚拟化的首选解决方案

KVM需要经过修改的QEMU软件(qemu-kvm)来实现虚拟机的管理

KVM就是内核的一个模块，用户空间通过QEMU模拟硬件提供给虚拟机使用，一台虚拟机就是一个普通的Lux进

程，虚拟机中的VCPU就是该进程中的线程。

![image-20221123015812756](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015881.png)

注：

不同的基于KVM的虚拟化平台，可能会采用不同的虚拟化组件，目前主流的采用QEMU-KVM组件，但在不同的

产品里版本有所不同，功能也有差异。

KVM通过调用Liux本身内核功能，实现对CPU的底层虚拟化和内存的虚拟化，使Liux内核成为虚拟化层，需要x86架构支持虚拟化功能的硬件支持（比如Intel-VT，AMD-V)，是一种全虚拟化架构。

KVM在2007年2月被导入Liux2.6.20内核中。

从存在形式来看，它包括两个内核模块：kvm.ko和kvm_intel.ko(或kvm_amd.ko)，本质上，KVM是管理虚拟硬件设备的驱动，该驱动使用字符设备/dev/kvm(由KVM本身创建)作为管理接口，主要负责vCPU的创建，虚拟内存的分配，VCPU寄存器的读写以及VCPU的运行。

KVM是linux内核的模块，它需要CPU的支持，采用硬件辅助虚拟化技术lnte-VT，AMD-V，内存的相关如Intel的EPT和AMD的RVl技术，Guest OS的CPU指令不用再经过Qemu转译，直接运行，大大提高了速度，KVM通过/dev/kvm暴露接口，用户态程序可以通过ioct函数来访问这个接口。



总结

KVM

·是基于内核的虚拟机

·是内核的一个模块

·为虚拟机提供cpu和内存

·通过/dev/kvm接口使用kvm模块



#### 4.3  QEMU-KVM

从前面对KM内核模块的介绍知道，它只负责CPU和内存的虚拟化，加载了它以后，用户就可以进一步通过工

具创建虚拟机(KVM提供接口)，但仅有KVM还是不够的，用户无法直接控制内核去做事情(KVM只提供接口，

怎么创建虚拟机，分配CPU等并不在它上面进行)，还必须有个运行在用户空间的工具才行，KVM的开发者选择

了比较成熟的开源虚拟化软件QEMU来作为这个工具，并对其进行了修改，最后形成了QEMU-KVM.

在QEMU-KVM中，KVM运行在内核空间，QEMU运行在用户空间，实际模拟创建，管理各种虚拟硬件，QEMU

将KVM整合了进来，通过/ioctl调用/dev/kvm，从而将CPU指令的部分交给内核模块来做，KVM实现了CPU和内存的虚拟化，但kvm不能虚拟其他硬件设备，因此qemu还有模拟IO设备（磁盘，网卡，显卡等）的作用，KVM加上QEMU后就是完整意义上的服务器虚拟化。当然，由于qeu模拟io设备效率不高的原因，现在常常采用半虚拟化的virtio，方式来虚拟IO设备。



![image-20221123020117903](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015646.png)



QEMU-KVM作用：

1提供对cpu，内存(KVM负责)，IO设备(QEMU负责)的虚拟

2对各种虚拟设备的创建，调用进行管理(QEMU负责)



#### 4.4  libvirt

libvirt是一套免费、开源的支持Linux下主流虚拟化管理程序的C函数库，其旨在为包括KVM在内的各种虚拟化管理程序提供一套方便、可靠的编程接口。

当前主流Linux平台上默认的虚拟化管理工具virt-manager，virsh等都是基于libvirt开发。

注：

libvirt是一个针对各种虚拟化平台的虚拟机管理的API库，一些常用的虚拟机管理工具如virsh(类似vim编辑器)，vtinstall，virt-manager等和云计算框架平台（如OpenStack，OpenNebula，Eucalyptus等）都在底层使用libvirt提供的应用程序接口。libvirt主要由三个部分组成：API库，一个守护进程libvirtd和一个默认命令行管理工具virsh

QEMU，KVM，Libvirt三者关系总结：

virtsh通过libvirt管理qemu-kvm虚拟机



![image-20221123013506690](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211231015028.png)



### SaaS PaaS IaaS的区别：

![image-20221122145622665](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211221456712.png)

![image-20221122145525213](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211221455303.png)



### 实验环境

| 主机名 |       IP       |                             备注                             |
| :----: | :------------: | :----------------------------------------------------------: |
|  kvm   | 192.168.188.15 | 纯净的系统CentOS-7、在处理器设置中勾选 虚拟化 Intel VT-x...、新加一块磁盘30GB |

 ![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205102208155.png)



### kvm虚拟化管理软件的安装

```shell
# 检查CPU是否开启虚拟化支持
# vmx指当前CPU支持intel虚拟化，svm指支持AMD
[root@kvm ~]# lscpu |grep vmx

[root@kvm ~]# cat /proc/cpuinfo | grep -E 'vmx|svm'

```

**若之前安装过需清理掉之前的环境**

```shell
# 清理环境:卸载KVM
[root@kvm ~]# yum remove `rpm -qa | egrep 'qemu|virt|KVM'` -y
# 存储磁盘镜像目录 /var/lib/libvirt 
[root@kvm ~]# rm -rf /var/1ib/libvirt /etc/1ibvirt/
[root@kvm ~]# yum clean all && yum makecache   # 建议使用光盘安装，会特别快：1、挂载光盘，2、yum源指定光盘.3、安装
```

```shell
[root@kvm ~]# yum install libvirt virt-install qemu-kvm -y
[root@kvm ~]# systemctl start libvirtd.service   # 启动libvirtd
[root@kvm ~]# systemctl status libvirtd.service   # 查看状态
[root@kvm ~]# systemctl enable libvirtd.service   # 开机自启
```

### 关闭防火墙和selinux

略

第一种：linux是图形化界面

[图形化界面使用KVM](https://www.cnblogs.com/infodriven/p/16502650.html)

第二种：linux是最小化

### 命令行安装centos7


```shell
# 上传镜像包到指定目录准备开始kvm创建虚拟机
[root@kvm ~]# cd /opt/
[root@kvm opt]# ll -h
总用量 4.3G
-rw-r--r--  1 root root 4.3G 5月  10 18:59 CentOS-7-x86_64-DVD-1708.iso
drwxr-xr-x. 4 root root   36 3月   3 20:25 yum
```



```shell
# 建议虚拟机内存不要低于1024M，否则安装系统特别慢!

[root@kvm opt]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos7.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

开始安装......
正在分配 'centos7.raw'                                                                   |  10 GB  00:00:00     
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。

# 默认分配端口是5900，可以netstat验证
# raw: 10G 不支持快照，性能好，立刻使用内存 裸格式，不适合远程传输
# qcow2: cow(copy on write)占用空间小，适合传输，支持快照，性能比raw差一点点

[root@kvm opt]# ll -h
总用量 5.7G
-rw-------  1 root root  10G 5月  10 19:07 centos7.raw   # 磁盘文件
-rw-r--r--  1 qemu qemu 4.3G 5月  10 18:59 CentOS-7-x86_64-DVD-1708.iso
drwxr-xr-x. 4 root root   36 3月   3 20:25 yum
```

```shell
virt-install --virt-type kvm  # 虚拟化的类型(qemu)
--os-type=linux               # 系统类型
--os-variant rhel7            # 系统版本
--name centos7                # 虚拟机的名字
--memory 1024                 # 虚拟机的内存
--vcpus 1                     # 虚拟cpu的核数
--disk /opt/centos7.raw,format=raw,size=10 # 指定虚拟硬盘所存放的路径及名称，size则是指定该硬盘的可用大小(默认为G)，单位是G磁盘格式raw
--cdrom /opt/CentOS-7-x86_64-DVD-1708.iso   # 利用的镜像目录地址
--network network=default                   # 使用默认NAT的网络
--graphics vnc,listen=0.0.0.0               # 图形化界面 工具vnc 监听任意网段
--noautoconsole                             # 不自动运行控制台
```

vnc:远程的桌面管理工具



#### vnc连接kvm虚拟机闪退的解决方法

1，vnc view的option里 expert 选择Color level->full(或者0)，否则一闪就没了 

2，最后inputs里的enable 3-button mouse emulation选上

 ![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205101902473.png)



 ![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205101904508.png)



安装完后点击重启，vnc会退出无法连上



### kvm虚拟机的virsh日常管理和配置

```shell
列表list（--all）
开机start
关机shutdown
拔电源关机destroy

导出配置dumpxml  例子：virsh dumpxml centos7 > centos7-off.xml
删除undefine  推荐：先destroy，在undefine
导入配置define   
修改配置edit(自带语法检查)
 
重命名domrename （低版本不支持）
挂起suspend
恢复resume
查询vnc端口号vncdisplay
磁盘压缩命令：
qemu-img convert -c -O qcow2
qemu-img convert -c centos2.raw -O qcow2 web.qcow2
```



#### 列表与开机

```shell
[root@kvm opt]# virsh list   # 显示running中的
 Id    名称                         状态
----------------------------------------------------

[root@kvm opt]# virsh list --all   # 显示所有的
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭


# 启动
[root@kvm opt]# virsh start centos7
域 centos7 已开始

[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 2     centos7                        running
 

# 重新vnc连接会发现默认分配1G swap
# 网络是套用了两层 NAT 套 NAT , 这里也是能通外网的 
```

![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205101919799.png)



![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205101922967.png)



![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205101924356.png)



#### 关机

```shell
[root@kvm opt]# virsh destroy centos7
域 centos7 被删除   # 不是删除，是翻译的原因，list --all可以看到
```

#### 导出导入配置

```shell
# 导出配置dumpxml
# 　　默认是输出到屏幕virsh dumpxml 虚拟机名字 >centos7.xml
# 　　配置文件位于/etc/libvirt/qemu/centos7.xml
#　　/opt/下的raw文件是模板文件，只要这两个文件在，就可以任意迁移虚拟机
```

```shell
[root@kvm opt]# virsh dumpxml centos7 > centos7_bak.xml   # 先关机再导配置

[root@kvm opt]# ll -h
总用量 5.9G
-rw-r--r--  1 root root 4.0K 5月  10 19:27 centos7_bak.xml
-rw-------  1 root root  10G 5月  10 19:24 centos7.raw
-rw-r--r--  1 qemu qemu 4.3G 5月  10 18:59 CentOS-7-x86_64-DVD-1708.iso
drwxr-xr-x. 4 root root   36 3月   3 20:25 yum

[root@kvm opt]# vim centos7_bak.xml   # 不建议使用vim修改配置，可能会出现错误，有专门的的编辑命令edit
```



```shell
# 当kvm创建的虚拟机还在跑的时候，删除这台机子还是会继续跑的，一当退出再次登陆就会发现问题
[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 3     centos7                        running

[root@kvm opt]# virsh undefine centos7     # 删除虚拟机配置文件
域 centos7 已经被取消定义

[root@kvm qemu]# ll /etc/libvirt/qemu		#发现配置文件已删除
总用量 0
drwx------ 3 root root 42 11月 23 09:06 networks


[root@kvm opt]# virsh list   # list发现还在running的，vnc也还是可以连接的；因为删的是虚拟机，磁盘还没有删(raw)
 Id    名称                         状态
----------------------------------------------------
 3     centos7                        running


[root@kvm opt]# virsh shutdown centos7   # 关机
域 centos7 被关闭

[root@kvm opt]# virsh list --all   # 查看已经没有这个虚拟机
 Id    名称                         状态
----------------------------------------------------


# 导入配置恢复虚拟机
[root@kvm opt]# virsh define centos7_bak.xml 
定义域 centos7（从 centos7_bak.xml）

# 验证
[root@kvm opt]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭

[root@kvm opt]# virsh start centos7
域 centos7 已开始

[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 4     centos7                        running
```

#### 修改主机名

```shell
# edit修改主机名
[root@kvm opt]# virsh edit centos7
2   <name>centos7</name>
2   <name>class2-01</name>
uuid删掉，因为唯一性需要删掉uuid后面重新生成


[root@kvm opt]# virsh destroy centos7
域 centos7 被删除

[root@kvm opt]# virsh start class2-01
域 class2-01 已开始

[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 5     class2-01                          running
```



```shell
# 重命名domrename （低版本不支持）
[root@kvm opt]# virsh destroy class2-01
域 class2-01 被删除

[root@kvm opt]# virsh domrename --domain class2-01 --new-name web-01
Domain successfully renamed

[root@kvm opt]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭
 -     web-01                         关闭
 
或者

[root@kvm opt]# virsh domrename web-01 class2-01
Domain successfully renamed

[root@kvm opt]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭
 -     class2-01                          关闭
```

#### 挂起与恢复

```shell
# 挂起
[root@kvm opt]# virsh start class2-01
域 class2-01 已开始

[root@kvm opt]# virsh suspend class2-01
域 class2-01 被挂起

# 恢复
[root@kvm opt]# virsh resume class2-01
域 class2-01 被重新恢复
```

#### 查询vnc端口号

```shell
[root@kvm opt]# virsh vncdisplay class2-01
:0   # vnc可以IP地址:0，以此类推
```

#### 磁盘压缩

```shell
# 磁盘压缩命令
# 相当于压缩不要在生产上随便压缩
qemu-img convert -c -O qcow2

# raw: 10G 不支持快照，性能好，立刻使用内存 裸格式，不适合远程传输
# qcow2: cow(copy on write)占用空间小，适合传输，支持快照，性能比raw差一点点

[root@kvm opt]# qemu-img convert -c centos7.raw -O qcow2 web.qcow2   # 吃CPU资源挺重，格式转换
[root@kvm opt]# ll -h
总用量 6.5G
-rw-r--r--  1 root root 5.2K 5月  10 19:39 bak.xml
-rw-r--r--  1 root root 4.0K 5月  10 19:27 centos7_bak.xml
-rw-------  1 qemu qemu  10G 5月  10 20:07 centos7.raw
-rw-r--r--  1 qemu qemu 4.3G 5月  10 18:59 CentOS-7-x86_64-DVD-1708.iso
-rw-r--r--  1 root root 703M 5月  10 20:08 web.qcow2
drwxr-xr-x. 4 root root   36 3月   3 20:25 yum
```

#### 压缩启动

```shell
[root@kvm opt]# virsh destroy class2-01
域 class2-01 被删除

[root@kvm opt]# virsh edit class2-01
#改：
36       <driver name='qemu' type='raw'/>
37       <source file='/opt/centos7.raw'/>
#为：
36       <driver name='qemu' type='qcow2'/>
37       <source file='/opt/web.qcow2'/>

[root@kvm opt]# virsh start class2-01
域 class2-01 已开始
# vnc连接发现ip还是原来的证明操作成功
```

#### 开机自启

```shell
# 开机启动autostart，前提：systemctl enable libvirtd；
# 取消开机启动autostart --disable

[root@kvm opt]# systemctl enable libvirtd
[root@kvm opt]# systemctl status libvirtd
[root@kvm opt]# virsh autostart class2-01
域 class2-01标记为自动开始

[root@kvm opt]# ll /etc/libvirt/qemu/autostart/
总用量 0  
lrwxrwxrwx 1 root root 27 5月  10 20:22 class2-01.xml -> /etc/libvirt/qemu/class2-01.xml   # 会发现是创建一个软链接
```



```shell
[root@kvm opt]# vim centos7_bak.xml
#改：2   <name>centos7</name>
#为：2   <name>class2-02</name>
# uuid删除掉

[root@kvm opt]# virsh define centos7_bak.xml 
定义域 class2-02（从 centos7_bak.xml）

# 自行创建软链接加入自启动
[root@kvm opt]# ln -s /etc/libvirt/qemu/class2-02.xml /etc/libvirt/qemu/autostart/class2-02.xml
[root@kvm opt]# ll /etc/libvirt/qemu/autostart/
总用量 0
lrwxrwxrwx 1 root root 27 5月  10 20:22 class2-01.xml -> /etc/libvirt/qemu/class2-01.xml
lrwxrwxrwx 1 root root 27 5月  10 20:30 class2-02.xml -> /etc/libvirt/qemu/class2-02.xml

# 验证
[root@kvm opt]# systemctl stop libvirtd
[root@kvm opt]# systemctl start libvirtd
[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 8     class2-01                          running
 9     class2-02                          running
```



### KVM虚拟机的console登陆

1：常规情况下，安装完 KVM 之后，可能都会通过 VNC 连接到 KVM 虚拟机里面去修改 IP 等信息。
但是一旦虚拟机比较多的话，打开过多的端口会造成安全问题
2：很多时候，我们是通过跳板机连接的宿主机，你的window和kvm宿主机没有直达的路由，
这时候vnc都用不了，如何快速进入到 KVM 虚拟机里面去排查问题呢？--使用console链接

```shell
# console
[root@kvm opt]# virsh console class2-01   # 与telnet一样，但是这里会卡在这里不动，因为没有tty终端
连接到域 class2-01
换码符为 ^]

# 解决方案
[root@kvm opt]# ssh -o ServerAliveInterval=360 root@192.168.122.253

[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@localhost ~]# vim /boot/grub2/grub.cfg
# 成功后会在第100行这个LANG=zh_CN.UTF-8后面出现console=ttyS0,115200n8


# 断开重启
[root@kvm opt]# virsh destroy class2-01
域 class2-01 被删除

[root@kvm opt]# virsh start class2-01
域 class2-01 已开始

# vnc验证是否连接成功
# 再执行console
[root@kvm opt]# virsh console class2-01
连接到域 class2-01
换码符为 ^]


CentOS Linux 7 (Core)   # 如果还是卡顿的话摁几次回车键
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login:

# 登陆退出后只会停留在CentOS Linux 7 (Core)  这个提示需要另开一个终端kill
[root@kvm opt]# ps -ef | grep console
root       3931   1286  0 20:47 pts/0    00:00:00 virsh console class2-01
root       3983   3953  0 20:48 pts/3    00:00:00 grep --color=auto console
[root@kvm opt]# kill -9 3931
```



### kvm虚拟机虚拟磁盘格式转换和快照管理

```shell
[root@kvm opt]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name db01 --memory 1024 --vcpus 1 --disk /opt/data/class2-01.qcow2,format=qcow2,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

开始安装......
正在分配 'class2-01.qcow2'                                                                                                              |  10 GB  00:00:00     
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。

[root@kvm opt]# ll -h /opt/data/
总用量 2.2M
-rw------- 1 qemu qemu 11G 5月  10 21:06 class2-01.qcow2

# vnc连接装系统
[root@kvm opt]# virsh vncdisplay db01
```

#### 格式转换

```shell
# raw：  裸格式，占用空间比较大，不支持快照功能，性能较好，不方便传输           总50G 占用2G
# qcow2：cow  （copy on write）占用空间小，支持快照，性能比raw差一点，方便传输  总50G 占用2G  牺牲一定性能保证安全性
# qcow
# 磁盘格式转换，转换前关机
qemu-img convert -f <原格式> -O <目标格式> <原文件路径> <目标文件路径> 
这里 -f <原格式>可以忽略。qemu-img会自动识别
转换完成后，修改配置文件（两个地方，类型和路径）


[root@kvm opt]# qemu-img convert -c /opt/data/class2-01.qcow2 -O qcow2 /opt/data/class2-012.qcow2  # 不建议缩容
[root@kvm opt]# ll -h /opt/data/
总用量 2.1G
-rw-r--r-- 1 root root 634M 5月  10 21:16 class2-012.qcow2
-rw------- 1 root root  11G 5月  10 21:14 class2-01.qcow2
```



```shell
# 创建一块qcow2格式的虚拟硬盘
[root@kvm opt]# qemu-img create -f qcow2 /opt/data/test.qcow2 2G
Formatting '/opt/data/test.qcow2', fmt=qcow2 size=2147483648 encryption=off cluster_size=65536 lazy_refcounts=off 
[root@kvm opt]# ll -h /opt/data/
总用量 2.1G
-rw-r--r-- 1 root root 634M 5月  10 21:16 class2-012.qcow2
-rw------- 1 root root  11G 5月  10 21:14 class2-01.qcow2
-rw-r--r-- 1 root root 193K 5月  10 21:17 test.qcow2


# 增加10GB
[root@kvm opt]# qemu-img resize /opt/data/test.qcow2 +10G
Image resized.
[root@kvm opt]# ll -h /opt/data/   # 查看不出结果
总用量 2.1G
-rw-r--r-- 1 root root 634M 5月  10 21:16 class2-012.qcow2
-rw------- 1 root root  11G 5月  10 21:14 class2-01.qcow2
-rw-r--r-- 1 root root 257K 5月  10 21:18 test.qcow2
[root@kvm opt]# qemu-img info /opt/data/test.qcow2   # 使用这条命令可以查看
image: /opt/data/test.qcow2
file format: qcow2
virtual size: 12G (12884901888 bytes)
disk size: 260K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

# 增加到20GB
[root@kvm opt]# qemu-img resize /opt/data/test.qcow2 20G
Image resized.
[root@kvm opt]# qemu-img info /opt/data/test.qcow2 
image: /opt/data/test.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 260K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
```



```shell
[root@kvm opt]# virsh start db01
域 db01 已开始

[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 4     db01                           running
 
[root@kvm opt]# virsh edit db01   # 查看一下配置
```

#### 快照

```shell
# 快照
# 创建快照virsh snapshot-create(-as --name) centos7
# 查看快照virsh snapshot-list centos7

# 还原快照virsh snapshot-revert centos7 --snapshotname 1516574134
# 删除快照virsh snapshot-delete centos7 --snapshotname 1516636570

# raw不支持做快照，qcow2支持快照，并且快照就保存在qcow2的磁盘文件中


[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 4     db01                           running
 5     class2-02                          running

[root@kvm opt]# virsh snapshot-create db01
已生成域快照 1652189141   # 1970年到现在的时间戳或者可以说是格林尼治时间
[root@kvm opt]# virsh snapshot-create class2-02
错误：不支持的配置：存储类型 vda 不支持磁盘 raw 的内部快照

[root@kvm opt]# virsh snapshot-list db01
 名称               生成时间              状态
------------------------------------------------------------
 1652189141           2022-05-10 21:25:41 +0800 running
 
 
[root@kvm opt]# virsh snapshot-create-as --name first db01   # 命名快照
已生成域快照 first
[root@kvm opt]# virsh snapshot-list db01
 名称               生成时间              状态
------------------------------------------------------------
 1652189141           2022-05-10 21:25:41 +0800 running
 first                2022-05-10 21:27:46 +0800 running

# 删除快照
[root@kvm opt]# virsh snapshot-delete db01 --snapshotname 1652189141
已删除域快照 1652189141

[root@kvm opt]# virsh snapshot-list db01
 名称               生成时间              状态
------------------------------------------------------------
 first                2022-05-10 21:27:46 +0800 running

# 模拟故障
[root@kvm opt]# virsh vncdisplay db01
:0

# vnc连接db01
rm -rf /*

# 使用快照还原
[root@kvm opt]# virsh snapshot-revert db01 --snapshotname first   # 没有输出，连接vnc发现恢复正常
```



### kvm虚拟机克隆

#### 完整克隆

```shell
# 完整克隆
#     实现方法：
#    virt-clone -o class2-01 --auto-clone
　　如果没有指定名字，克隆后，新的虚拟机后面多了-lone
　　查看以下两者的配置文件的不同
　　virsh dumpxml class2-01 > class2-01.xml
　　virsh dumpxml class2-01-clone > class2-01-clone.xml
　　vimdiff class2-01.xml class2-01-clone.xml
　　　　名字
　　　　uuid
　　　　磁盘文件
　　　　mac地址
```

```shell
# kvm虚拟机克隆
# 完整克隆
# virt-clone --auto-clone -o 源目标 -n 目的目标
[root@kvm opt]# virt-clone --auto-clone -o db01 -n db02   
ERROR    必须暂停或者关闭有要克隆设备的域。
[root@kvm opt]# virsh destroy db01
域 db01 被删除

[root@kvm opt]# virt-clone --auto-clone -o db01 -n db02
正在分配 'class2-01-clone.qcow2'                                                                                                        |  10 GB  00:00:08     

成功克隆 'db02'。


[root@kvm opt]# ll -h /opt/data/
总用量 4.3G
-rw-r--r-- 1 root root 634M 5月  10 21:16 class2-012.qcow2
-rw------- 1 root root 1.4G 5月  10 21:38 class2-01-clone.qcow2
-rw------- 1 root root  11G 5月  10 21:38 class2-01.qcow2
-rw-r--r-- 1 root root 257K 5月  10 21:19 test.qcow2


[root@kvm opt]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 5     class2-02                          running
 -     centos7                        关闭
 -     db01                           关闭
 -     db02                           关闭
 -     class2-01                          关闭
```

#### 链接克隆

```shell
# 链接克隆
#链接克隆：
#a：生成虚拟机磁盘文件
#qemu-img create -f qcow2 class2-03.qcow2

#b：生成虚拟机的配置文件
#  <name>class2-03</name>
#  <uuid>8e505e25-5175-46ab-a9f6-feaa096daaa4</uuid>
#  <source file='/opt/class2-03.qcow2'/>
#  <mac address='52:54:00:4e:5b:89'/>
#c：导入虚拟机并进行启动测试



[root@kvm opt]# qemu-img create -f qcow2 -b /opt/data/class2-01.qcow2 /opt/data/class2-03.qcow2 #前面是生成的文件，后面是链接点
Formatting '/opt/data/class2-03.qcow2', fmt=qcow2 size=10737418240 backing_file='/opt/data/class2-01.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
[root@kvm opt]# qemu-img info /opt/data/class2-03.qcow2
image: /opt/data/class2-03.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: /opt/data/class2-01.qcow2   # 来源于哪个
Format specific information:
    compat: 1.1
    lazy refcounts: false
    
# 启动
[root@kvm opt]# vim centos7_bak.xml
2   <name>class2-02</name>
35       <driver name='qemu' type='raw'/>
36       <source file='/opt/centos7.raw'/>

2   <name>class2-03</name>
35       <driver name='qemu' type='qcow2'/>
36       <source file='/opt/data/class2-03.qcow2'/>

删除uuid

[root@kvm opt]# virsh define centos7_bak.xml
定义域 class2-03（从 centos7_bak.xml）

[root@kvm opt]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 5     class2-02                          running
 -     centos7                        关闭
 -     db01                           关闭
 -     db02                           关闭
 -     class2-01                          关闭
 -     class2-03                          关闭
 
[root@kvm opt]# virsh start class2-03
域 class2-03 已开始

[root@kvm opt]# virsh list
 Id    名称                         状态
----------------------------------------------------
 5     class2-02                          running
 6     class2-03                          running

[root@kvm opt]# ll -h /opt/data/
总用量 2.3G
-rw-r--r-- 1 root root 634M 5月  10 21:16 class2-012.qcow2
-rw------- 1 root root 193K 5月  10 21:56 class2-01-clone.qcow2
-rw------- 1 qemu qemu  11G 5月  10 21:38 class2-01.qcow2
-rw-r--r-- 1 root root 193K 5月  10 21:49 test.qcow2
-rw-r--r-- 1 qemu qemu 6.5M 5月  10 22:17 class2-03.qcow2   # 链接克隆占比不大

# vnc验证
[root@kvm opt]# virsh vncdisplay class2-03
:0
```



总结：

1.完整克隆，需要克隆新的磁盘文件与配置文件

2.链接克隆，需要用class2-01的磁盘文件链接克隆出新的磁盘文件class2-03（往class2-03时，数据会写入class2-01），用class2-01的配置文件导出，修改为class2-03的配置文件（修改虚拟机名称，删除uuid，修改磁盘文件路径）





### kvm虚拟机的桥接网络

**为什么要使用桥接网络**

```
我们运行虚拟机的目的是，在虚拟机中运行我们的业务，现在业务所需要的服务都已经运行了，
可是除了在宿主机上能访问，其他人都访问不了！！！
```



#### 关闭NetworkManager

```shell
[root@kvm ~]# systemctl stop NetworkManager
[root@kvm ~]# systemctl status NetworkManager
[root@kvm ~]# systemctl disable NetworkManager
```



```shell
#默认的虚拟机网络是NAT模式，网段192.168.122.0/24
#举例

#默认NAT模式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 1024 --vcpus 1 --disk /opt/web04.qcow2 --boot hd --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
#桥接模式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 1024 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
```



#### 创建桥接网卡

```shell
[root@kvm ~]# virsh iface-bridge ens33 br0
使用附加设备 br0 生成桥接 ens33 失败
已启动桥接接口 br0

[root@kvm ~]# 

# 如果报错，无法成功修改，可以自己手工创建br和修改ens33
# 看配置文件，可以像这样手动创建桥接网卡
[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="192.168.188.15"
NETMASK="255.255.255.0"
GATEWAY="192.168.188.2"
STP="on"
DELAY="0"
[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
DEVICE="ens33"
ONBOOT="yes"
BRIDGE="br0"
```

#### 取消桥接网卡

```shell
virsh iface-unbridge br0
```

#### 将已有的虚拟机改为桥接网络

```shell
# 应该先关机再修改启动
[root@kvm ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 1     class2-01                          running
 2     class2-02                          running

[root@kvm ~]# virsh edit class2-01
#改：
69     <interface type='network'>
70       <mac address='52:54:00:8b:61:e5'/>
71       <source network='default'/>
72       <model type='virtio'/>
73       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
74     </interface>

#为：
69     <interface type='bridge'>
70       <mac address='52:54:00:8b:61:e5'/>
71       <source bridge='br0'/>
72       <model type='virtio'/>
73       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
74     </interface>

# 在宿主机上，重启虚拟机生效
[root@kvm ~]# virsh destroy class2-01
域 class2-01 被删除

[root@kvm ~]# virsh start class2-01
域 class2-01 已开始

# xshell测试连接
[root@kvm ~]# virsh vncdisplay class2-01   # 通过端口连接vnc查看ip
:0
```

```shell
[root@kvm ~]# cd /opt/data/
[root@kvm opt/data]# qemu-img create -f qcow2 -b class2-012.qcow2 db03.qcow2   # 被链接点在前面 需要生成的文件在后面
Formatting 'db03.qcow2', fmt=qcow2 size=10737418240 backing_file='class2-012.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off

[root@kvm opt/data]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name db03 --memory 1024 --vcpus 1 --disk /opt/data/db03.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

开始安装......
域创建完成。
[root@kvm opt/data]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 2     class2-02                          running
 3     class2-01                          running
 4     db03                           running
 -     centos7                        关闭
 -     db01                           关闭
 -     db02                           关闭
 -     class2-03                          关闭

# xshell验证
[root@kvm opt/data]# virsh vncdisplay db03   # 通过端口连接vnc查看ip
:2
```



### 热添加技术

```shell
热添加技术就是不停机的情况下，在线热添加硬盘，内存，cpu，网卡等设备，
热添加技术一般都是在虚拟机资源不够了，又不能停机的情况下使用的，
热添加技术是虚拟机相对于物理机的一个很大的优势，它让资源分配变得更灵活！

# 临时生效不需要加--config
# 永久生效需要加--config，如virsh  attach-disk web04 /opt/oldboy.qcow2 vdb --subdriver qcow2 --config
```

#### 热添加硬盘

```shell
# 流程
#1.创建硬盘
qemu-img create -f qcow2 centos7-add01.qcow2 5G

#2.热添加硬盘
virsh attach-disk class2-01 /opt/centos7-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
vdb：指定硬盘的名字，因为已经有vba了
--live 热添加
cache=none 不分配缓存
要使用需要给分区
# 扩展：硬盘扩容
　　虚拟机卸载硬盘
　　宿主机剥离硬盘virsh detach-disk
　　重置之前的硬盘
　　挂载----看到容量没变---删除原分区---修改分区表，让使用所有的空间
　　---partprobe /dev/vdb(通知内核，调整）---查看还是没变
　　---xfs_growfs /mnt(因为用的是xfs，如果是 ft4 用resize2fs /mnt
　　---OK! 
```

```shell
# 本机操作
[root@kvm opt/data]# qemu-img create -f qcow2 test.qcow2 5G
Formatting 'test.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off 

[root@kvm opt/data]# ll -h
总用量 2.4G
-rw-r--r-- 1 qemu qemu  22M 5月  11 09:51 db03.qcow2
-rw-r--r-- 1 qemu qemu 634M 5月  10 21:16 class2-012.qcow2
-rw------- 1 root root 193K 5月  10 21:56 class2-01-clone.qcow2
-rw------- 1 qemu qemu  11G 5月  10 21:38 class2-01.qcow2
-rw-r--r-- 1 root root 193K 5月  11 09:51 test.qcow2
-rw-r--r-- 1 root root 7.5M 5月  10 22:18 class2-03.qcow2

[root@kvm opt/data]# virsh attach-disk db03 /opt/data/test.qcow2 vdb --subdriver qcow2
成功附加磁盘

# 在db03上验证
[root@localhost ~]# lsblk -l
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda         252:0    0  10G  0 disk 
vda1        252:1    0   1G  0 part /boot
vda2        252:2    0   9G  0 part 
centos-root 253:0    0   8G  0 lvm  /
centos-swap 253:1    0   1G  0 lvm  [SWAP]
vdb         252:16   0   5G  0 disk

[root@localhost ~]# mkfs.xfs /dev/vdb   # 先格式化才使用
[root@localhost ~]# mount /dev/vdb /mnt/
[root@localhost ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs       8.0G  1.1G  7.0G   14% /
devtmpfs                devtmpfs  486M     0  486M    0% /dev
tmpfs                   tmpfs     497M     0  497M    0% /dev/shm
tmpfs                   tmpfs     497M  6.7M  490M    2% /run
tmpfs                   tmpfs     497M     0  497M    0% /sys/fs/cgroup
/dev/vda1               xfs      1014M  127M  888M   13% /boot
tmpfs                   tmpfs     100M     0  100M    0% /run/user/0
/dev/vdb                xfs       5.0G   33M  5.0G    1% /mnt

# 扩容
# 现在db03上卸载
[root@localhost ~]# umount /mnt/

# 回到kvm服务器上
[root@kvm opt/data]# virsh detach-disk db03 vdb   # 卸载磁盘
成功分离磁盘

[root@kvm opt/data]# qemu-img resize /opt/data/test.qcow2 +20G
Image resized.

[root@kvm opt/data]# virsh attach-disk db03 /opt/data/test.qcow2 vdb --live --cache=none --subdriver qcow2
或
[root@kvm opt/data]# virsh attach-disk db03 /opt/data/test.qcow2 vdb  --subdriver qcow2

# 现在db03上操作
[root@localhost ~]# mount /dev/vdb /mnt/
[root@localhost ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs       8.0G  1.1G  7.0G   14% /
devtmpfs                devtmpfs  486M     0  486M    0% /dev
tmpfs                   tmpfs     497M     0  497M    0% /dev/shm
tmpfs                   tmpfs     497M  6.7M  490M    2% /run
tmpfs                   tmpfs     497M     0  497M    0% /sys/fs/cgroup
/dev/vda1               xfs      1014M  127M  888M   13% /boot
tmpfs                   tmpfs     100M     0  100M    0% /run/user/0
/dev/vdb                xfs       5.0G   33M  5.0G    1% /mnt
[root@localhost ~]# xfs_growfs /dev/vdb 
meta-data=/dev/vdb               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1310720 to 6553600
[root@localhost ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs       8.0G  1.1G  7.0G   14% /
devtmpfs                devtmpfs  486M     0  486M    0% /dev
tmpfs                   tmpfs     497M     0  497M    0% /dev/shm
tmpfs                   tmpfs     497M  6.7M  490M    2% /run
tmpfs                   tmpfs     497M     0  497M    0% /sys/fs/cgroup
/dev/vda1               xfs      1014M  127M  888M   13% /boot
tmpfs                   tmpfs     100M     0  100M    0% /run/user/0
/dev/vdb                xfs        25G   33M   25G    1% /mnt
```

#### 根分区扩容

```shell
1）在宿主机上关闭虚拟机并调整虚拟机磁盘大小
qemu-img resize oldboy.qcow2 +10G

2）虚拟机中fdisk重新分区
fdisk /dev/vda

3)重启之后，执行xfs_growfs /dev/vda1，
如果虚拟机磁盘文件系统是ext4：resize2fs /dev/vda1
可参考博客。
https://www.cnblogs.com/jingsshao/p/15066810.html

#针对kvm虚拟机的根目录非lvm的扩容
1.在宿主机上关闭虚拟机，并进行扩容
　　virsh shutdown vm1
　　qemu-img   resize vm1.img +10G
2.开启虚拟机，并登陆虚拟机查看磁盘容量
　　virsh start vm1
　　virsh console vm1
　　lsblk
　　fdisk -l
3.安装growpart工具
　　yum install -y cloud-utils-growpart
4.对根分区的磁盘进行容量扩展
　　growpart /dev/vda 3
　　报错：unexpected output in sfdisk --version [sfdisk，来自 util-linux 2.23.2]
　　解决办法：执行LANG=en_US.UTF-8　
5.重启，再次查看分区情况　
6.确认根目录的格式，并对其扩展分区
　　mount |grep /dev/vda3
　　xfs_growfs /dev/vda3 （xfs格式）
　　resize2fs /dev/vda3   （ext4格式）

#针对kvm虚拟机的根目录lvm的扩容
1.在宿主机上关闭虚拟机，并进行扩容
　　virsh shutdown vm2
　　qemu-img   resize vm2.img +20G
2.开启虚拟机，并登陆虚拟机查看磁盘容量
　　virsh start vm2
　　virsh console vm2
　　lsblk
　　fdisk -l
3.分区格式化后，重启
　　fdisk /dev/vda
4.创建物理卷，加入根目录的卷组centos，重新扩展
　　pvcreate /dev/vda3
　　vgextend centos /dev/vda3
　　lvextend -L +20476M /dev/mapper/centos-root /dev/vda3 （由于系统分配的少于20G，只能分配5119个块，1个块PE=4M）
　　注：XFS文件系统中，文件系统只能放大，不能缩小。只有EXT4系统能够放大和缩小
　　lsblk查看是否已经扩展了
5.查看根目录的格式，然后对根目录的容量进行扩展
　　mount |grep root
　　xfs_growfs /dev/mapper/centos-root
```

#### 热添加网卡

```shell
virsh attach-interface web04 --type bridge  --model  virtio --source br0
也可以指定network --source 就是default
　　一定要指定virtio 
　　永久修改，要修该配置文件
　　在复制一样的，删除MAC，修改类型
```

```shell
[root@kvm opt/data]# virsh attach-interface db03 --type bridge --source br0 --model virtio
成功附加接口

# 在db03上操作
[root@localhost ~]# ip a   # 我的情况是分配了一个eth1

# 卸载网卡 
# 需要mac地址
# 卸载刚添加的eth1
# kvm虚拟机上操作
[root@kvm opt/data]# virsh detach-interface db03 --type bridge --mac 52:54:00:b4:f9:bf # ip a or ip addres
成功分离接口

# db03验证已经没有了eth1
```

#### 热添加cpu

```shell
[root@kvm ~]# cd /opt/data/
[root@kvm opt/data]# qemu-img create -f qcow2 -b class2-03.qcow2 web04.qcow2
Formatting 'web04.qcow2', fmt=qcow2 size=10737418240 backing_file='class2-03.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 
[root@kvm opt/data]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=10 --disk /opt/data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

开始安装......
域创建完成。
[root@kvm opt/data]# virsh list
 Id    名称                         状态
----------------------------------------------------
 2     class2-02                          running
 3     class2-01                          running
 5     db03                           running
 6     web04                          running


[root@kvm opt/data]# virsh vncdisplay web04   # 通过端口连接vnc查看ip
:3

# web04使用lscpu查看

# 可以热添加不能热缩
[root@kvm opt/data]# virsh setvcpus web04 4 --live


--config时不会影响实时生效，想要生效要么重启虚拟机，要么再用--live热添加一次。

# 永久添加后想缩要先关机再edit
# 找到<vcpu placement='static' current='4'>10</vcpu>修改 current='范围内想要的核心数'
```

#### 热添加内存

```shell
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

临时热添加内存
setmem web04 1024M --live
永久增大内存
setmem web04 1024M --config
```



### 热迁移

>  **KVM虚拟机的迁移有两种方法：** **1、静态迁移（冷迁移）：**对于冷迁移，就是在虚拟机关闭状态下，将虚拟机的磁盘文件及.xml配置文件（这两个文件组成了一个虚拟机）复制到要迁移到的目标主机上，然后在目标主机上使用“virsh define *.xml”命令重新定义虚拟机即可。 **2、动态迁移（热迁移）：**对于热迁移，比较常用，通常是这台[服务器](https://cloud.tencent.com/product/cvm?from=10680)上正在跑着一些业务，而这些业务又不允许中断，那么就需要使用热迁移了，这篇博文将详细写出热迁移的步骤。 

**1、冷迁移** 通常我们存放虚拟机磁盘的目录都是挂在的一个nfs文件系统的磁盘，而这个磁盘通常是LVM文件系统。所以需要进行冷迁移时，只要在目标主机上挂载这个nfs文件系统，就可以看到要迁移的那个虚拟机的磁盘文件，通常以.qcow2或.raw结尾的，然后，只需将虚拟机的.xml配置文件发送到目标服务器上，然后重新定义一下即可通过“virsh list --all”命令查看到迁移过来的虚拟机。

```shell
#将虚拟机磁盘文件和配置文件都复制到一台新设备上
[root@kvm-test ~]# scp /kvm/disk/test1.raw root@192.168.171.10:/kvm/disk/              
[root@kvm-test ~]# scp /etc/libvirt/qemu/test1.xml root@192.168.171.10:/etc/libvirt/qemu/
#在新设备上可以将配置文件中的UUID上删除掉
#然后直接在新设备上定义配置文件
[root@kvm2 ~]# virsh define test1.xml
#之后就可以启动了
```

 **2、热迁移** 如果源[宿主机](https://cloud.tencent.com/product/cdh?from=10680)和目的宿主机共享存储系统，则只需要通过网络发送客户机的 vCPU 执行状 态、内存中的内容、虚机设备的状态到目的主机上。否则，还需要将客户机的磁盘存储发到目的主 机上。共享存储系统指的是源和目的虚机的镜像文件目录是在一个共享的存储上的。



### 

#### 什么是热迁移

```shell
相比KVM虚拟机冷迁移中需要拷贝虚拟机虚拟磁盘文件，kvm虚拟机热迁移无需拷贝虚拟磁盘文件，
但是需要迁移到的宿主机之间需要有相同的目录结构虚拟机磁盘文件，也就是共享存储，
这次通过大家熟悉的nfs来实现，当然也可以采用Glusterfs等分布式文件系统来实现.
```

#### 为什么要用热迁移

```shell
为了充分利用资源，我可能运行了8台2G内存的虚拟机，然后访问量增加，虚拟机的2G内存不够用了，
需要扩容，扩容之前我们就需要先迁移一部分虚拟机到其他宿主机上了，有的业务特别核心，
暂停的时间不能太长，这时候就要用到我们的热迁移了。
```

#### 热迁移的过程

```shell
假设我们有2台宿主机kvm01和kvm02,在kvm01上挂起虚拟机vm01，
发送vm的虚拟机配置文件和运行时内存中的数据到kvm02, 接受完毕，kvm02恢复vm01,热迁移完成。
```

#### 步骤

```
一：在kvm01和kvm02上安装kvm和nfs,配置桥接网卡
二：在nfs01上安装配置nfs
三：kvm01和kvm02挂载共享目录/opt
四：安装一台基于桥接模式的虚拟机　　 /data目录下上传准备好的磁盘和配置文件　　安装系统，指定我们自己的磁盘文件和配置
五：在kvm01上安装图形界面、vnc服务端和virt-manager
六：启动vnc服务端
七：使用vnc连接宿主机，使用virt-manager进行迁移
```

![image-20220518212757735](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205182128843.png)

| 主机名 |    ip     | 内存 |      网络       | 软件需求 |   虚拟化   |
| :----: | :-------: | :--: | :-------------: | :------: | :--------: |
| kvm01  | 10.0.0.11 |  2G  | 创建br0桥接网卡 | kvm和nfs | 开启虚拟化 |
| kvm02  | 10.0.0.12 |  2G  | 创建br0桥接网卡 | kvm和nfs | 开启虚拟化 |
| nfs01  | 10.0.0.31 |  1G  |       无        |   nfs    |     无     |

<font color='red'>**注意：需要互相做好host解析**</font>



##### 一：在kvm01和kvm02上安装kvm和nfs,配置桥接网卡

```shell
yum install libvirt* virt-* qemu-kvm* nfs-utils openssh-askpass -y

systemctl start libvirtd.service

virsh iface-bridge eth0 br0
```

##### 二：在nfs01上安装配置nfs

```shell
yum install nfs-utils -y

mkdir /data

vim /etc/exports

/data 10.0.0.0/24(rw,async,no_root_squash,no_all_squash)

systemctl restart rpcbind

systemctl restart nfs
```

##### 三：kvm01和kvm02挂载共享目录/opt

```shell
mount -t nfs 10.0.0.31:/data /opt
```

##### 四：安装一台基于桥接模式的虚拟机

```shell
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
# 热迁移命令：
virsh migrate --live --verbose web06 qemu+ssh://192.168.75.27/system tcp://192.168.75.27 --unsafe
# 备注：热迁移完成后，虚拟机的配置文件并没有同步，需要手动拷贝或者导出到/etc/libvirt/qemu下面
```



