##kvm虚拟化

1.1 kvm 虚拟化介绍

什么是虚拟化

​ 在计算机技术中,虚拟化技术或虚拟技术(virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU,内存,磁盘空间,网络适配器等),予以抽象,转换后程序出来并可共分区,组合未严格或多个电脑配置环境。
​ 由此打破实际结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。
一般所指的虚拟化资源包括计算机能力和数据存储。
​ 简而言之,虚拟化就是通过模拟计算机硬件(CPU,内存,硬盘,网卡等)来实现在一台物理机上运行多个操作系统,且使得每个操作系统之间都是隔离的。

为什么使用虚拟化

同一台物理机运行多个不同版本用于软件
硬件依赖性较低和便于数据迁移

虚拟化技术的优势

1.降低运营成本
服务器虚拟化降低了IT基础设施的运营成本,令系统管理员摆脱了繁重的物理服务器、OS、 中间件及兼容性的管理工作,减少人工干预频率,使管理更加强大、便捷
2.提高应用兼容
服务器虚拟化提供的封装和隔离性是大量应用独立运行于各种环境中,管理人员不需要频繁根据底层环境调整应用,只需构建一个应用版本并将其发布到虚拟化后的不同类型平台上即可。
3.加速应用避暑
采用服务器虚拟化技术只需输入激活配置参数,拷贝虚拟机,启动虚拟机,激活虚拟机即可完成部署,大大缩短了部署时间,免除了人工干预,降低了部署成本
4.提高服务可用性
用户可以方便第备份虚拟机,在虚拟机动态迁移后,可以方便的恢复备份,或在其他物理机上运行备份,大大提高了服务的可用性
5.提升资源利用率
通过服务器虚拟化的整合,提高了CPU,内存,存储,网络等设备的利用率,同时保证原有服务器的可用性,使其安全性及性能不受影响。
6.动态调度资源
在服务器虚拟化技术中,数据中心从传统的单一服务器变成了统一的资源池,用户可以即时地调整虚拟机资源,同时数据中心管理程序和数据中心管理员可以灵活更加虚拟机内部资源使用情况,灵活分配调整虚拟机的资源。
7.降低能源消耗
通过减少运行的物理服务器数量,减少CPU以为个单元的耗电量,达到节能减排的目的。

KVM内核级的虚拟机

使用内核级虚拟化,而不是使用管理程序,您可以运行单独版本的Linux内核。这使得使用用于在主要Linux内核和虚拟机之间进行通信的设备驱动程序轻松在单个主机上运行多个虚拟机。最后,通过系统级或OS虚拟化,您可以在操作系统内核的单个实例上运行多个但逻辑上不同的环境。使用系统级虚拟化,所有VM必须共享操作系统的同一副本,而服务器虚拟化允许不同的VM具有不同的操作系统。若是用的VMware虚拟机,则显示的是VMware;公有云的服务器,基本上都是KVM了。目前国内的公有云底层采用的都是kvm虚拟化,经过多年的发展,kvm计算已经非常成熟,kvm已经是内核虚拟化的标配。

KVM简介

​ KVM,基于内核的虚拟机(英语:kernel-based Virtual Machine,缩写KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor管理程序。
​ KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。KVM目前由Red Hat等厂商开发,对CentOS/Fedora/RHEL等Red Hat系发行版支持极佳。

关于KVM

1.KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)
2.是X86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟机解决方案
3.它包含一个为处理器提高底层虚拟化可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)
image-202101241534119684.KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面
5.KVM能在不改变Linux或Windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并未每一个虚拟机配置个性化的硬件环境(网卡,磁盘,图像适配器…)同时KVM还能使用KSM技术帮助宿主服务器节约内存。

1.2 安装KVM

系统环境说明

1.主机名 192.168.178.50 4G 50G
2.主要开启VMware里面的cup设置,开启虚拟化Inter VT-x,无论是mac,还是Windows
3.主要使用KVM的机器,不用使用LVM分区,否则会特别卡,使用标准分区,且不需要swap分区
4.硬盘给大点,为后面创建虚拟机做准备
5.云服务器都没用使用LVM
6.系统初始化,关闭防火墙等

安装kvm管理工具

在电脑运算中,红帽公司的virtual machine manage是应该虚拟机管理员,可以用用户管理多个虚拟机。
基于内核的虚拟机libvirt与Virtual Machine Manager

Virtual Machine Manager可以让用户:

  • 创建,编辑,引导或停止虚拟机

  • 查看并控制每个虚拟机的控制台

  • 查看每部虚拟机的性能及使用率

  • 查看每部正常运行中的虚拟机及主控端的即时性能及使用率信息

  • 不论是在本机或远程,皆可使用KVM,Xen,qumu。

其他虚拟化软件
  • kvm只需要CPU支持虚拟化,不需要使用专门的修改内核,兼容性好,性能好
  • xen性能特别好,但是需要使用专门修改之后的内核,兼容性查
  • qemu 软件纯模式全虚拟化,特别慢
安装命令
1.为了加速下载,可以挂载本地光盘镜像,主要先连接dvd  (注:虚拟机的DVD必须是连接状态)
[root@kvm01 ~]# mount /dev/cdrom /mnt
mount: /dev/sr0 is write-protected, mounting read-only
[root@kvm01 ~]# ls /mnt
CentOS_BuildTag  EULA  images    LiveOS    repodata              RPM-GPG-KEY-CentOS-Testing-7
EFI              GPL   isolinux  Packages  RPM-GPG-KEY-CentOS-7  TRANS.TBL
2.编写应该本地镜像文件仓库repo文件
[root@kvm01 ~]# cd /etc/yum.repos.d/
[root@kvm01 yum.repos.d]# cat local.repo 
[local]
name=local repo
baseurl=file:///mnt
gpgcheck=0
3.系统环境初始化安装
yum install gcc gcc-c++ autoconf automake make zlib zlib-devel openssl openssl-devel pcre pcre-devel wget http-tools vim net-tools -y
4.安装kvm工具
yum install libvirt virt-install qemu-kvm -y 
libvirt   管理kvm虚拟机的生命周期
virt-install  创建虚拟机
qemu-kvm	使用qemu-img为虚拟机提高硬盘的工具
5.启动libvirtd
[root@kvm01 opt]#  systemctl start  libvirtd.service
6.启动日志
[root@kvm01 ~]# systemctl status libvirtd.service
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-01-25 21:15:42 CST; 1min 3s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 19118 (libvirtd)
    Tasks: 19 (limit: 32768)
   CGroup: /system.slice/libvirtd.service
           ├─19118 /usr/sbin/libvirtd
           ├─19196 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro ...
           └─19197 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro ...

Jan 25 21:15:42 kvm01 dnsmasq[19190]: listening on virbr0(#3): 192.168.122.1
Jan 25 21:15:42 kvm01 dnsmasq[19196]: started, version 2.76 cachesize 150
Jan 25 21:15:42 kvm01 dnsmasq[19196]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP ...tify
Jan 25 21:15:42 kvm01 dnsmasq-dhcp[19196]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
Jan 25 21:15:42 kvm01 dnsmasq-dhcp[19196]: DHCP, sockets bound exclusively to interface virbr0
Jan 25 21:15:42 kvm01 dnsmasq[19196]: reading /etc/resolv.conf
Jan 25 21:15:42 kvm01 dnsmasq[19196]: using nameserver 119.29.29.29#53
Jan 25 21:15:42 kvm01 dnsmasq[19196]: read /etc/hosts - 2 addresses
Jan 25 21:15:42 kvm01 dnsmasq[19196]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
Jan 25 21:15:42 kvm01 dnsmasq-dhcp[19196]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Hint: Some lines were ellipsized, use -l to show in full.
##libvirt还启动了dhcp,用于给kvm虚拟机分配ip.
安装VNC工具

下载vnc软件方法,tightvnc官网:http://www.tightvnc.com
VNC软件,用于VNC(Virtual Network Computing),为一种使用RFB协议的显示屏画面分析及远程操作软件。此软件借由网络,可发送键盘与鼠标的动作和即时的显示屏画面。VNC与操作系统无关,因此可跨平台使用,例如可用Windows连接到某Linux的电脑,反之亦可。深圳在没用安装客户端程序的电脑中,只要有支持Java的浏览器,也可以使用。安装VNC是,使用默认安装即可,无需安装server端。

创建第一个KVM虚拟机
1.用xftp先把镜像文件,拷贝到/opt目录下
[root@kvm01 opt]# ls
CentOS-7-x86_64-DVD-1804.iso
2.创建虚拟机命令
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1804.iso --network network=default --graphics vnc,listen=0.0.0.0,port=5900 --noautoconsole
3.出现如下则是正常
[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1804.iso --network network=default --graphics vnc,listen=0.0.0.0,port=5900 --noautoconsole

Starting install...
Allocating 'centos2.raw'                                                                                   |  10 GB  00:00:00     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.
**注意:开启后,有60S的时间,提前开启VNC准备连接,连接的方式:IP+port(默认5900)

--virt-type :要使用的关了程序名称(kvm,qemu,xen...)
--os-type :系统类型
--os-variant:在客户端上安装的操作系统,例如:'fedora18','rhel6','winxp'等。
--name:客户端实例名称
--memory:配置客户机虚拟内存大小
--vcpus:配置客户机虚拟CPU(vcpu)数量
--disk:指定存储的各种选项,此处是指定硬盘存储路径在/opt下名字叫/opt/centos2.raw
format=raw:  格式raw
size=10:大小 10G,给这个硬盘10个G空间
--cdrom:光驱安装介质,
--network:配置客户机网络接口,默认是net
--graphics:配置客户机显示设置,linu默认是命tuxingh令行,指定用VNC输出图形化
listen:监听地址。
port:监听端口
--noautoconsole:安装完成后不启动客户机

参数解释:

参数参数说明
–virt-type HV_TYPE要使用的管理程序名称 (kvm, qemu, xen, …)
–os-type系统类型
–os-variant DISTRO_VARIANT在客户机上安装的操作系统,例如:‘fedora18’、‘rhel6’、‘winxp’ 等。
-n NAME, --name NAME客户机实例名称
–memory MEMORY配置客户机虚拟内存大小
–vcpus VCPUS配置客户机虚拟 CPU(vcpu) 数量。
–disk DISK指定存储的各种选项。
-cdrom CDROM光驱安装介质
-w NETWORK, --network NETWORK配置客户机网络接口。
–graphics GRAPHICS配置客户机显示设置,linux默认黑屏,指定用vnc输出图形化

虚拟化平台选项:

-v, --hvm这个客户机应该是一个全虚拟化客户机
-p, --paravirt这个客户机应该是一个半虚拟化客户机
–container这个客户机应该是一个容器客户机
–virt-type HV_TYPE要使用的管理程序名称 (kvm, qemu, xen, …)
–arch ARCH模拟 CPU 架构
–machine MACHINE机器类型为仿真类型
其它选项:
–noautoconsole不要自动尝试连接到客户端控制台
–autostart主机启动时自动启动域。
–noreboot安装完成后不启动客户机。

以上信息通过"virt-install --help"获取

连接VNV后,进入后可以看见如下界面:
image-20210124230140623

进入安装系统时,区别在于分区,kvm的虚拟机不需要swap分区,记得网卡开启。直接所有的容量都给根目录即可。
等待安装完毕后会自动重启,重新开机即可vnc远程连接使用。

1.重启后需重新开机
[root@kvm01 ~]# virsh start centos7
Domain centos7 started
2.端口默认从5900开始,以此类推5900,5901...
[root@kvm01 ~]# virsh vncdisplay centos7
:0
3.安装好的KVM虚拟机,VNC远程连接,你用或不用,它不关机就都在那。
[root@kvm01 ~]# lscpu

1.3 kvm虚拟机日常管理

virsh命令常用参数总结
参数参数说明
list查看虚拟机列表,列出域
start启动虚拟机,开始一个(以前定义的)非常活跃的域
shutdown关闭虚拟机,关闭一个域
destroy(危险!)强制关闭虚拟机,销毁(停止)域
vncdisplay查询虚拟机vnc端口
配置关了操作
dumpxml导出主机配置信息
undefine删除主机
define导入主机配置
domrename对虚拟机进行重命名
挂起与恢复
suspend挂起虚拟机
resume恢复虚拟机
自启动管理
autostart虚拟机开机启动
autostart --disble取消虚拟机开机启动
以上参数通过virsh --help获得
KVM虚拟机操作过程

kvm虚拟机配置文件位置

[root@kvm01 ~]# ll /etc/libvirt/qemu/centos7.xml
-rw------- 1 root root 4117 Jan 25 23:00 /etc/libvirt/qemu/centos7.xml

修改虚拟机配置命令

[root@kvm01 ~]# virsh edit centos7
Domain centos7 XML configuration not changed.
使用该命令可以对文件进行语法校验,改错了会自动提示
备份与恢复虚拟机
1.关机虚拟机
[root@kvm01 ~]# virsh shutdown centos7 
Domain centos7 is being shutdown

2.备份虚拟机配置,注意关机时备份,不使用重定向符合会输出到屏幕
[root@kvm01 ~]# virsh dumpxml centos7 > back_centos.7xml
[root@kvm01 ~]# ls
anaconda-ks.cfg  back_centos.7xml

3.列出所有虚拟机状态,
[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos7                        shut off
 
4.删除虚拟机配置,注意删除命令,做好备份在执行
[root@kvm01 ~]# virsh undefine centos7 
Domain centos7 has been undefined
查看已经删除
[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------

5.导入虚拟机,从xml配置,再次导入
[root@kvm01 ~]# virsh define back_centos.7xml 
Domain centos7 defined from back_centos.7xml
再次查看你
[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos7                        shut off
 
6.给虚拟机重命名
[root@kvm01 ~]# virsh domrename centos7 cckvm7
Domain successfully renamed

[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     cckvm7                         shut off

7.虚拟机开机和关机
[root@kvm01 ~]# virsh start cckvm7
Domain cckvm7 started

[root@kvm01 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 4     cckvm7                         running
开机可以远程VNC连接
#关机
[root@kvm01 ~]# virsh shutdown cckvm7
#危险命令,强制关闭虚拟机且摧毁,直接拔电源
[root@kvm01 ~]# virsh destroy cckvm7 
Domain cckvm7 destroyed
#得在开机状态下执行此命令
#若是该虚拟机不在使用了,可以删除,轻易不要随便删除,否则还得安装
[root@kvm01 ~]# virsh destroy cckvm7 
Domain cckvm7 destroyed
#再次导入,开机
[root@kvm01 ~]# virsh define back_centos.7xml 
Domain centos7 defined from back_centos.7xml
[root@kvm01 ~]# virsh start centos7 
Domain centos7 started

8.虚拟机的挂起和恢复
[root@kvm01 ~]# virsh suspend centos7
Domain centos7 suspended

[root@kvm01 ~]# virsh list 
 Id    Name                           State
----------------------------------------------------
 6     centos7                        paused      #此时是暂停状态了
 #重新恢复虚拟机
 [root@kvm01 ~]# virsh resume centos7
Domain centos7 resumed

[root@kvm01 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 6     centos7                        running

9.查询虚拟机端口
[root@kvm01 ~]# virsh vncdisplay centos7
:0
#   :0及为5900端口,以此类推,:1为5901。在vnc连接时也可以输:0,
[root@kvm01 ~]# netstat -tunlp | grep 5900
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      3367/qemu-kvm    

10.设置KVM开机自启
[root@kvm01 ~]# systemctl  enable libvirtd
[root@kvm01 ~]# systemctl  is-enabled libvirtd
enabled

11.设置虚拟机开机自启
[root@kvm01 ~]# virsh autostart centos7 
Domain centos7 marked as autostarted
# 其实这条命令是设置了了软连接
[root@kvm01 ~]# ll /etc/libvirt/qemu/autostart/centos7.xml 
lrwxrwxrwx 1 root root 29 Jan 26 21:39 /etc/libvirt/qemu/autostart/centos7.xml -> /etc/libvirt/qemu/centos7.xml
#取消开机自启,软连接也就删除了
[root@kvm01 ~]# virsh autostart --disable centos7 
Domain centos7 unmarked as autostarted

[root@kvm01 ~]# ll /etc/libvirt/qemu/autostart/centos7.xml 
ls: cannot access /etc/libvirt/qemu/autostart/centos7.xml: No such file or directory

1.4 KVM虚拟机censole登录

1.常规情况下,安装完KVM之后,可能都会通过VNC连接到KVM虚拟机去修改IP等信息,但是一旦虚拟机笔记多的换,打开过多的端口会造成安全问题。

2.很多时候,我们是通过跳板机连接的宿主机,你的window和kvm宿主机没有直达的路由,这是vnc都用不了,如何快速进入到KVM 虚拟机里面去排查问题呢?
答案是:可以使用console功能登录KVM虚拟机。

terminal和console的区别

terminal(终端)是支持色彩显示,将主机的程序输出在屏幕上的一个设备,但是在系统正确启动之前,terminal是无法连接到主机的,为了记录出主机开机过程,便于调试维护,也就多列一个控制台的功能,一台计算机只要一个控制台,也就是console功能了。默认console功能是无法使用的,需要修改服务器配置文件。

centos配置console登录
1.进入kvm虚拟机内,执行如下命令,先vnc登录虚拟机查看IP地址 ip addr
[root@kvm01 ~]# ssh root@192.168.122.148
The authenticity of host '192.168.122.148 (192.168.122.148)' can't be established.
ECDSA key fingerprint is SHA256:bUqte20bejuJiPlhq3WrqyI0JNMkdhEuJo2lebVPnPk.
ECDSA key fingerprint is MD5:79:25:07:c4:ef:9f:36:8d:1b:1a:24:13:7d:f0:bd:60.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.122.148' (ECDSA) to the list of known hosts.
root@192.168.122.148's password: 
Last login: Tue Jan 26 21:58:29 2021
[root@localhost ~]# 

2.登录进来之后,执行如下命令,能复制尽量不手动,避免不必要的错误
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@localhost ~]# reboot
Connection to 192.168.122.148 closed by remote host.
Connection to 192.168.122.148 closed.
进入kvm的console界面
[root@kvm01 ~]# virsh console centos7 
Connected to domain centos7
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-862.el7.x86_64 on an x86_64
							#需要按一次回车
localhost login: root
Password: 123456
Last login: Tue Jan 26 22:17:18 on tty1
[root@localhost ~]# 
此时已经登录进来了,若是想要退出console,需要执行组合键 ctrl+]

1.5 kvm虚拟机磁盘格式转换

刚才我们发现,kvm创建的虚拟机文件,如下格式:

[root@kvm01 ~]# ls /opt/
centos2.raw  CentOS-7-x86_64-DVD-1804.iso

这个raw就是我们的虚拟机文件,有关虚拟机文件的其他格式还有:
raw
官方解释:(默认)原始格式是光盘映像的纯二进制映像,并且非常便于移植。在支持稀疏文件的文件系统上,这种格式的图像仅使用记录在其中的数据时间使用空间。raw格式的镜像文件,特点就是赤裸裸,占用空间较大,不适合远程传输,不支持快照snapshot功能,但性能较好。kvm和xen默认的镜像格式就是raw,好处在于例如需要转换其他格式的虚拟机镜像是很简单的。从空间上来看,raw镜像很像磁盘,使用多少即是多少,例如:

[root@kvm01 ~]# du -h /opt/centos2.raw 
1.8G	/opt/centos2.raw

但是如果要把真快磁盘都拿走的话,就得全盘操作,例如copy镜像,就是拷贝10G大小,非常消耗网络带宽和I/O。还有一个特点就是,如果raw格式的虚拟机磁盘不够用了,可以在原有磁盘上直接追加空间,比较犀利。

注解:稀疏文档又称稀疏文件(英语:sparse file),是一种计算机文件,它能尝试在文件内容大多为空时更有效率地使用文件系统的空间。它的原理是以简短的信息(元数据)表示空数据块,而不是在在磁盘上占用实际空间来存储空数据块。只有真实(非空)的数据块会按原样写入磁盘。

cow
官方解释:写入时复制格式,仅处于历史原有受支持,并且不适用Windows的qemu,该格式被遗弃,后来被qcow格式取代。

qcow
copy on write ,写入时复制,占用空间小,适合传输,支持快照,但性能比raw差一点。

qcow2
目前比较主流的虚拟化镜像格式,性能接近raw的格式,有如下特点:

  • 更小的存储空间

  • 支持snapshot,快照,且可以管理历史快照

  • 支持zlib磁盘压缩

  • 支持AES加密

vmdk
这是VMware创建的虚拟机镜像文件格式,我们可以点卡自己的虚拟机目录查看,vmdk格式无论是从性能,还是功能,快照等都算非常出色的。

####练习磁盘管理映像文件

#创建qcow2格式磁盘文件  -f 指定镜像格式  指定磁盘大小是2G
[root@kvm01 opt]# qemu-img create -f qcow2 dave.qcow2 2G
Formatting 'dave.qcow2', fmt=qcow2 size=2147483648 encryption=off cluster_size=65536 lazy_refcounts=off 

#查看当前虚拟机信息 info 
[root@kvm01 opt]# qemu-img info centos2.raw 
image: centos2.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.7G

#查看自己创建的qcow2磁盘文件信息
[root@kvm01 opt]# qemu-img info dave.qcow2 
image: dave.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
 
 #调整磁盘映像文件大小   # resize  调整大小
[root@kvm01 opt]# qemu-img resize dave.qcow2 +5G
Image resized.

#磁盘映像格式转换
-f 指定源格式, -O  指定输出格式
[root@kvm01 opt]# qemu-img convert -f qcow2 -O raw dave.qcow2 dave.raw

转换现有虚拟机磁盘格式
# 现有虚拟机磁盘文件
[root@kvm01 opt]# ll
total 6186148
-rw------- 1 qemu qemu 10737418240 Jan 27 14:01 centos2.raw
-rw-r--r-- 1 qemu qemu  4470079488 Jan 25 21:41 CentOS-7-x86_64-DVD-1804.iso
-rw-r--r-- 1 root root      262656 Jan 26 23:41 dave.qcow2
-rw-r--r-- 1 root root  7516192768 Jan 26 23:42 dave.raw

# 关闭虚拟机
[root@kvm01 opt]# virsh shutdown centos7
Domain centos7 is being shutdown

#查看虚拟机配置信息,用的磁盘文件是哪一个,
[root@kvm01 opt]# virsh edit centos7
Domain centos7 XML configuration not changed.
找到此行配置       <source file='/opt/centos2.raw'/>

# 转换磁盘格式,注意区别,源格式是raw,看下容量是
[root@kvm01 opt]# ll |grep centos2
-rw------- 1 root root 10737418240 Jan 27 14:02 centos2.raw

#转换格式命令   #convert 转换
[root@kvm01 opt]# qemu-img convert -f raw -O qcow2 centos2.raw centos7.qcow2

# 转换后的容量
[root@kvm01 opt]# ll -h |grep centos7
-rw-r--r-- 1 root root 1.8G Jan 27 14:07 centos7.qcow2

#转换后得修改虚拟机配置文件,让其读取新的磁盘映像文件
[root@kvm01 opt]# virsh edit centos7 
Domain centos7 XML configuration edited.
将这两行参数:
      <driver name='qemu' type='raw'/>
      <source file='/opt/centos2.raw'/>
修改为:
      <driver name='qemu' type='qcow2'/>
      <source file='/opt/centos7.qcow2'/>

# 可以删除就的raw磁盘文件,查看是否会读取新的qcow2格式磁盘,正确启动虚拟机[root@kvm01 opt]# rm -rf centos2.raw
[root@kvm01 opt]# virsh start centos7
Domain centos7 started

#此时我们用vnc或者ssh或者console登录kvm虚拟机都可以,然后写入文件,查看磁盘镜像大小
[root@localhost ~]# dd if=/dev/zero of=/tmp/test.raw bs=500M count=1
1+0 records in
1+0 records out
524288000 bytes (524 MB) copied, 1.49696 s, 350 MB/s
参数解释:
	if 代表输入文件,如果不指定if,默认会从stdin种读取输入。
	of 代表输出文件,如果不知道of,默认会将stdout作为默认输出。
	bs 代表字节为单位的块大小
	count 代表被辅助的块数
	/dev/zero 是一种字符设备,会不断返回0值字节(\0)。

#刷新磁盘容量
[root@localhost ~]# sync    # 用于强制被改变的内容立刻写入磁盘
buffer:为了解决写磁盘的效率
cache:为了解决读磁盘的效率

#退出虚拟机后,再次查看磁盘镜像空间大小,qcow2格式就是用多少空间,占多少空间,写入时复制
[root@localhost ~]# exit
[root@kvm01 opt]# ll -h | grep centos7
-rw-r--r-- 1 qemu qemu 2.2G Jan 27 14:18 centos7.qcow2

KVM虚拟机添加硬盘
1.进入磁盘目录,创建一个新的硬盘
[root@kvm01 opt]# qemu-img create -f qcow2 dave-add01.qcow2 3G
Formatting 'dave-add01.qcow2', fmt=qcow2 size=3221225472 encryption=off cluster_size=65536 lazy_refcounts=off 

2.查看创建的磁盘信息
[root@kvm01 opt]# qemu-img info dave-add01.qcow2
image: dave-add01.qcow2
file format: qcow2
virtual size: 3.0G (3221225472 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

3.为虚拟机添加硬盘,无需关机   # attach-disk  附加磁盘设备
[root@kvm01 opt]# virsh attach-disk centos7 /opt/dave-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
Disk attached successfully

4.进入虚拟机内,查看磁盘信息,发现多了一块vdb磁盘,3G大小
[root@kvm01 opt]# ssh root@192.168.122.148
[root@localhost ~]# fdisk -l

Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a618b

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    20971519    10484736   83  Linux

Disk /dev/vdb: 3221 MB, 3221225472 bytes, 6291456 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

5.若磁盘空间不足,需调整磁盘大小,可以卸载,重新调整磁盘大小 # detach-disk 分离磁盘设备
[root@localhost ~]# exit
[root@kvm01 opt]# virsh detach-disk centos7 vdb
Disk detached successfully
 #卸载后,虚拟机内的磁盘也就消失了

6.增加从旁容量,刚才是3G,再增加两G
[root@kvm01 opt]# qemu-img resize dave-add01.qcow2  +2G
Image resized.

7.重新添加磁盘给KVM虚拟机
[root@kvm01 opt]# virsh attach-disk centos7 /opt/dave-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
Disk attached successfully
# 可以再次进入kvm查看虚拟机磁盘 #fdisk命令,查看磁盘使用情况和磁盘分区
[root@kvm01 opt]# !ssh
[root@localhost ~]# fdisk -l |grep vdb 
Disk /dev/vdb: 5368 MB, 5368709120 bytes, 10485760 sectors

8.在虚拟机内,可以对磁盘进行格式化使用 #mkfs用于在设备上创建Linux文件系统
[root@localhost ~]# mkfs.xfs /dev/vdb
meta-data=/dev/vdb               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=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 log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

9.挂载磁盘使用
[root@localhost ~]# mount /dev/vdb /mnt
[root@localhost ~]# mount -l |grep vdb
/dev/vdb on /mnt type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

10.刷新centos7磁盘信息 #xfs_growfs
[root@localhost ~]# xfs_growfs /mnt
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
参数参数说明
vdb第二块硬盘
–live热添加
subdrive驱动类型
KVM快照管理

注意:raw格式的磁盘无法创建快照,不支持,想要使用快照功能,次哦格式必须下qcow2。功能就好比我们使用VMware的快照功能,现在转化为命令行了。
kvm快照命令参数
使用virsh进行kvm虚拟机快照相关命令:

命令说明
iface-begin创建一个当前网卡的快照,他可以用来稍后提交或恢复
snapshot-create创建一个快照
snapshot-create-as使用一组参数创建一个快照
snapshot-current取消当前快照集合
snapshot-delete删除一个快照
snapshot-dumpxml从虚拟机的快照导出xml文件
snapshot-edit编辑一个快照的文件
snapshot-info快照信息
snapshot-list列出虚拟机的快照列表
snapshot-parent获取一个快照的父快照名称
snapshot-revert将虚拟机恢复到一个快照

实践

1.创建快照
[root@kvm01 ~]# virsh snapshot-create centos7
Domain snapshot 1611731172 created

2.查看快照列表
[root@kvm01 ~]# virsh snapshot-list centos7 
 Name                 Creation Time             State
------------------------------------------------------------
 1611731172           2021-01-27 15:06:12 +0800 running

3.查看快照信息
[root@kvm01 ~]# virsh snapshot-info centos7 --snapshotname  1611731172 
Name:           1611731172		
Domain:         centos7				#域名
Current:        yes					#当前的
State:          running				#状态
Location:       internal			#位置        #内置的
Parent:         -					#父快照名称
Children:       0					#子快照
Descendants:    0					#子节点
Metadata:       yes					# 元数据

4.登录虚拟机,进行删除,修改操作,让可以用快照还原
[root@kvm01 ~]# ssh root@192.168.122.148
[root@localhost ~]# touch {a..z}.txt
[root@localhost ~]# ls
anaconda-ks.cfg  c.txt  f.txt  i.txt  l.txt  o.txt  r.txt  u.txt  x.txt
a.txt            d.txt  g.txt  j.txt  m.txt  p.txt  s.txt  v.txt  y.txt
b.txt            e.txt  h.txt  k.txt  n.txt  q.txt  t.txt  w.txt  z.txt

5.还原快照
[root@localhost ~]# exit
[root@kvm01 ~]# virsh snapshot-revert centos7 --snapshotname 1611731172

6.再次登录虚拟机,查看文件内容,已经还原
[root@kvm01 ~]# ssh root@192.168.122.148
[root@localhost ~]# ls
anaconda-ks.cfg

7.快照管理
[root@localhost ~]# exit
[root@kvm01 ~]# ll /var/lib/libvirt/qemu/snapshot/centos7/
total 8
-rw------- 1 root root 5382 Jan 27 15:44 1611731172.xml
#查看大小为2.3G
[root@kvm01 opt]# ll -h
total 8.2G
-rw-r--r-- 1 qemu qemu 2.3G Jan 27 11:21 centos7.qcow2
-rw-r--r-- 1 qemu qemu 4.2G Jan 27 10:39 CentOS-7-x86_64-DVD-1804.iso
#创建快照后大小为2.5G
[root@kvm01 opt]# virsh snapshot-create centos7
Domain snapshot 1611717921 created
[root@kvm01 opt]# ll -h
total 8.2G
-rw-r--r-- 1 qemu qemu 2.5G Jan 27 11:25 centos7.qcow2
-rw-r--r-- 1 qemu qemu 4.2G Jan 27 10:39 CentOS-7-x86_64-DVD-1804.iso
#删除快照,大小依然为2.5G
[root@kvm01 opt]#  virsh snapshot-delete centos7 --snapshotname  1611717707 
Domain snapshot 1611717707 deleted
[root@kvm01 opt]# ll -h
total 6.4G
-rw-r--r-- 1 qemu qemu 2.5G Jan 27 11:26 centos7.qcow2
-rw-r--r-- 1 qemu qemu 4.2G Jan 27 10:39 CentOS-7-x86_64-DVD-1804.iso
#总结:写时复制,只管分配,不管回收

8.删除快照
[root@kvm01 ~]# virsh snapshot-delete centos7 --snapshotname 1611731172
Domain snapshot 1611731172 deleted
# 再次查看
[root@kvm01 ~]# ll /var/lib/libvirt/qemu/snapshot/centos7/
total 0

1.6 KVM虚拟机克隆

复制一个虚拟机,需要修改MAC地址,名称等所有主机端唯一的配置。
虚拟机的内容并没有改变:virt-clone不修改客户机系统内部的配置,它只复制磁盘和主机端的修改。所以修改密码,修改静态IP地址等操作都在本工具复制范围内。如何修改此类型的配置,请参考virt-sysprep。(译文:系统准备工具)

克隆命令:

1.克隆时,虚拟机必须关闭
[root@kvm01 ~]# virt-clone  --auto-clone -o centos7
ERROR    Domain with devices to clone must be paused or shutoff.
[root@kvm01 ~]# virsh shutdown centos7 
Domain centos7 is being shutdown

2.开始克隆
[root@kvm01 ~]# virt-clone --auto-clone -o centos7
WARNING  Setting the graphics device port to autoport, in order to avoid conflicting.
Allocating 'centos7-clone.qcow2'                                                 |  10 GB  00:00:04     
Allocating 'dave-add01-clone.qcow2'                                              | 5.0 GB  00:00:00     

Clone 'centos7-clone' created successfully.

3.克隆后,会生成新的磁盘文件
[root@kvm01 ~]# ll /opt/ |grep clone
-rw------- 1 root root 1836646400 Jan 27 15:56 centos7-clone.qcow2
-rw------- 1 root root    2883584 Jan 27 15:56 dave-add01-clone.qcow2

4.启动克隆后的虚拟机
[root@kvm01 ~]# virsh start centos7-clone
Domain centos7-clone started
#查看
[root@kvm01 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 3     centos7-clone                  running
 [root@kvm01 ~]# virsh vncdisplay cc-centos7   #查看端口
:1

5.修改克隆的虚拟机名称,可以当做第二个虚拟机使用,注意得关机后改名
[root@kvm01 ~]# virsh shutdown centos7-clone 
Domain centos7-clone is being shutdown

[root@kvm01 ~]# virsh domrename centos7-clone cc-centos7
Domain successfully renamed

6.对比虚拟机配置文件差异
###配置目录
[root@kvm01 ~]# ll /etc/libvirt/qemu
total 24
drwxr-xr-x 2 root root    6 Jan 26 21:40 autostart
-rw------- 1 root root 4653 Jan 27 16:02 cc-centos7.xml
-rw------- 1 root root 4664 Jan 27 15:57 centos7-clone1.xml
-rw------- 1 root root 4636 Jan 27 15:44 centos7.xml
drwx------ 3 root root   42 Jan 25 21:15 networks
# 导出配置文件,对比配置信息
[root@kvm01 ~]# virsh dumpxml centos7 > centos7.xml.dump
[root@kvm01 ~]# virsh dumpxml cc-centos7  > cc.xml.dump 
[root@kvm01 ~]# vimdiff centos7.xml.dump cc.xml.dump 
2 files to edit
主要注意uuid和MAC地址不一样,其他还有磁盘文件地址,端口等不同
 <uuid>b1779d06-9e3a-4b92-b4f8-c2294889dcbc</uuid|  
 <uuid>cf4ad5e6-4e6e-489c-aeb2-4d3d90ce1390</uuid>  
      <mac address='52:54:00:1c:12:6b'/>        
      <mac address='52:54:00:f0:cb:bb'/> 
参数参数说明
–auto-clone从原始客户机配置种自动生成克隆名称和存储路径
-o ORIGINAL_GUEST,–original ORIGINAL_GUEST**原始客户机名称;必须为关闭或者暂停状态
手动克隆

手动实现克隆,一共可以修改四个地方,拷贝磁盘文件,name ,UUID,mac地址,(UUID,mac可以删除会自动生成)磁盘文件路径。

1.克隆虚拟磁盘文件
[root@kvm01 opt] cp centos7.qcow2  lb01.qcow2
2.生成新的虚拟机配置文件
[root@kvm01 opt] virsh dumpxml centos7  > lb01.xml
[root@kvm01 opt] vim lb.xml
name修改,
uuid删除
disk路径  <source file='/opt/lb01.qcow2'/>
macd地址删除
3.启动测试
virsh define lb01.xml  
4.启动
[root@kvm01 opt]# virsh start lb01
Domain lb01 started
5.检查启动情况
[root@kvm01 opt]# virsh list
 Id    Name                           State
----------------------------------------------------
 8     lb01                           running
 发现手动克隆之后,原理复制过来的机器和现在克隆的机器不能同时启动了,
 [root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     lb01                           running
 -     cc-centos7                     shut off
 -     centos7                        shut off
 -     centos7-clone1                 shut off
 -     web01                          shut off

[root@kvm01 ~]# virsh start centos7
error: Failed to start domain centos7
error: internal error: Failed to reserve port 5900
修改了lb01.xml文件中lb01的端口,也没效果
<graphics type='vnc' port='5904' autoport='no' listen='0.0.0.0'>
原因使用virsh edit lb01修改此参数才能生效:
<graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'>
还得修改此端口参数:
[root@kvm01 opt]# virsh edit  lb01 
Domain lb01 XML configuration edited.
此时可以同时启动
[root@kvm01 opt]# virsh start centos7
Domain centos7 started

[root@kvm01 opt]# virsh start lb01
Domain lb01 started
此时可以通过vnc连接进入此克隆机器查看ip地址,知道IP地址后就可以做很多操作了。
克隆连接实战
1.创建回写文件,也叫链接磁盘
[root@kvm01 opt]# qemu-img create -f qcow2  -b centos7.qcow2 web01.qcow2
Formatting 'web01.qcow2', fmt=qcow2 size=10737418240 backing_file='centos7.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 
[root@kvm01 opt]# qemu-img info web01.qcow2 
image: web01.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: centos7.qcow2
Format specific information:
    compat: 1.1
    lazy refcounts: false

2.开始克隆
[root@kvm01 opt]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web01 --memory 1024 --vcpus 1 --disk /opt/web01.qcow2,format=raw,size=10 --boot hd --network network=default --graphics vnc,listen=0.0.0.0  --noautoconsole

Starting install...
Domain creation completed.

写时复制:(Linux写时拷贝技术(copy-on-write)
在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

扩展:

[root@kvm01 ~]# virsh 
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # 
Display all 243 possibilities? (y or n)
#virsh 有个这命令窗口模式,约243条命令

1.7 kvm桥接

我们运行虚拟机的目的是,在虚拟机中运行我们的业务,现在业务所需要的服务都已经运行了,可是除了在宿主机上能访问,其他人都访问不了!!!我们会利用kvm,创建虚拟机,运行业务服务,如tomcat,lnmp,mysql等等

[root@kvm01 ~]# virsh start centos7
Domain centos7 started
[root@kvm01 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 1     centos7                        running
 
[root@kvm01 ~]# ping 192.168.122.148 -c 2
PING 192.168.122.148 (192.168.122.148) 56(84) bytes of data.
64 bytes from 192.168.122.148: icmp_seq=1 ttl=64 time=0.259 ms
64 bytes from 192.168.122.148: icmp_seq=2 ttl=64 time=0.732 ms

--- 192.168.122.148 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.259/0.495/0.732/0.237 ms

[D:\~]$ ping 192.168.122.148

正在 Ping 192.168.122.148 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。

192.168.122.148 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失)##离开了宿主机,便无法访问kvm虚拟机了,因此我们得配置虚拟机网络,否则虚拟机就没有存在意义了。

模拟dhcp动态分配,遇见一个坑,折腾了大半天,原宿主机的dhcp服务没开启,切记!

在这里插入图片描述

注意网络环境:需要注意的是,在kvm虚拟机默认网络情况下,是dhcp动态分配的192.168网段地址,那么现在,我们配置kvm虚拟机和宿主机进行网络桥接,处于同一个网段。如果宿主机是动态分配ip,那么虚拟机会自动分配ip,切记原宿主机dhcp服务必须开启。如果宿主机是分配静态IP地址,kvm虚拟机也得配置静态IP。

此处网络环境是自定义nat,设置静态ip,配置过程如下:
配置KVM桥接
桥接网络,大家应该都还记得,也就是和宿主机处于同一个网络环境。我们vmware里是常用桥接的.

1.关闭防火墙
[root@kvm01 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 3     centos7                        running
[root@kvm01 ~]# ssh root@192.168.122.148
root@192.168.122.148's password: 
Last login: Wed Jan 27 20:13:01 2021 from gateway
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# systemctl disable  NetworkManager
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
[root@localhost ~]# iptables -F
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable  firewalld   
[root@localhost ~]# getenforce 
Disabled

2.创建桥接网络,在宿主机上执行,注意这个ens33,是根据宿主机的网卡名字来写的,然后创建br0网络
[root@kvm01 ~]#systemctl stop NetworkManager
[root@kvm01 ~]# systemctl disable NetworkManager
#不关闭此服务会断开连接。大坑!!!
[root@kvm01 ~]# virsh iface-bridge ens33  br0
Created bridge br0 with attached device ens33
Bridge interface br0 started

3.执行后网络会自动重启,网卡配置文件会自动被修改
[root@kvm01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
DEVICE=ens33
ONBOOT=yes
BRIDGE="br0"

[root@kvm01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"  #以前是以太网,现在是桥接模式
BOOTPROTO="none"
IPADDR="192.168.178.50"
NETMASK="255.255.255.0"
GATEWAY="192.168.178.254"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"

4.查看宿主机网桥信息
[root@kvm01 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29f78596	yes		ens33
virbr0		8000.52540097ae62	yes		virbr0-nic
							vnet0
5.修改虚拟机配置(不要关机修改,直接改就行)
[root@kvm01 ~]# virsh edit centos7 
Domain centos7 XML configuration edited.
#注意:语法不能错误,否则无法保存
#修改前配置:
    <interface type='network'>
      <mac address='52:54:00:e3:99:5b'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
#修改后配置
    <interface type='bridge'>
      <mac address='52:54:00:e3:99:5b'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

6.如果宿主机是分配静态IP地址,kvm虚拟机也得配置静态IP
# 修改虚拟机网络配置文件
#修改前:
[root@localhost ~]#  cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="f06d3454-ce68-4fb2-9599-0735a76e91a5"
DEVICE="eth0"
ONBOOT="yes"
#修改后:
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="f06d3454-ce68-4fb2-9599-0735a76e91a5"
DEVICE="eth0"
ONBOOT="yes"
IPADDR=192.168.178.111
NETMASK=255.255.255.0
GATEWAY=192.168.178.254
DNS1=119.29.29.29
#注意修改的地方,dhcp改为了static,新增了最后四行

7.重启网络即可
[root@localhost ~]# systemctl restart network
#改了ip地址需要重新连接测试:
不通的话重启下kvm虚拟机,以及libvirtd.service 就ok了。测试结果如下:
[root@kvm01 ~]# ping 192.168.178.111
PING 192.168.178.111 (192.168.178.111) 56(84) bytes of data.
64 bytes from 192.168.178.111: icmp_seq=1 ttl=64 time=0.799 ms
64 bytes from 192.168.178.111: icmp_seq=2 ttl=64 time=0.666 ms
^C
--- 192.168.178.111 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.666/0.732/0.799/0.071 ms
##windows端
[D:\~]$ ping 192.168.178.111

正在 Ping 192.168.178.111 具有 32 字节的数据:
来自 192.168.178.111 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.178.111 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.178.111 的回复: 字节=32 时间<1ms TTL=64

192.168.178.111 的 Ping 统计信息:
    数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 1ms,平均 = 0ms
#至此成功桥接kvm虚拟机。

1.8 KVM虚拟机的热添加技术

热添加技术就是不停机的情况下,在线热添加硬盘,内存,cpu,网卡等设备,热添加技术一般都是在虚拟机资源不够了,又不能停机的情况下使用的,热添加技术是虚拟机相对物理机的一个很大的优势,它让资源分配变得更灵活。

添加硬盘
1.创建硬盘
[root@kvm01 ~]# cd /opt/
[root@kvm01 opt]# qemu-img create -f qcow2 centos7-add01.qcow2 4G
Formatting 'centos7-add01.qcow2', fmt=qcow2 size=4294967296 encryption=off cluster_size=65536 lazy_refcounts=off

2.查看新硬盘信息
[root@kvm01 opt]#  qemu-img info centos7-add01.qcow2 
image: centos7-add01.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

3.检查虚拟机内硬盘信息
[root@kvm01 opt]# ssh root@192.168.122.148
[root@localhost ~]#  fdisk -l

Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a732f

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    20971519    10484736   83  Linux

4.发现虚拟机已经是2块硬盘了,注意硬盘的名字
#新添加硬盘,名字是vdc,热添加(开机时添加),驱动名字是qcow2
[root@kvm01 ~]#  virsh attach-disk centos7 /opt/centos7-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
Disk attached successfully
#这里有个坑,命名写道vdc,下一步去看的时候也变成vdb了
5.再去看虚拟机内查看信息
[root@localhost ~]#  fdisk -l |grep "/dev/vd*"
Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
/dev/vda1   *        2048    20971519    10484736   83  Linux
Disk /dev/vdb: 4294 MB, 4294967296 bytes, 8388608 sectors

6.可以给硬盘进行分区,格式化文件系统,挂载使用
也可以不分区,直接格式化使用,查看是否可以使用硬盘即可
#分区使用
[root@localhost ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x36c42a9e.

Command (m for help): n  #创建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)	#主分区
   e   extended								#扩展分区
Select (default p): p			#选择主分区
Partition number (1-4, default 1): 
First sector (2048-8388607, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-8388607, default 8388607): 
Using default value 8388607
Partition 1 of type Linux and of size 4 GiB is set

Command (m for help): p #打印

Disk /dev/vdb: 4294 MB, 4294967296 bytes, 8388608 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x36c42a9e

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048     8388607     4193280   83  Linux

Command (m for help): w  #保存退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
#格式化分区
[root@localhost ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=327616 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310464, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
#挂载使用
[root@localhost ~]# mount /dev/vdb1 /mnt
[root@localhost ~]#  df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        10G  1.5G  8.6G  15% /
devtmpfs        486M     0  486M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M  6.8M  490M   2% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       4.0G   33M  4.0G   1% /mnt

#已经可以使用
[root@localhost ~]# cp  /etc/services  /mnt
[root@localhost ~]#  ll /mnt/
total 656
-rw-r--r--. 1 root root 670293 Jan 27 11:42 services
#扩展:扩容
1.卸载
[root@localhost ~]# umount /mnt
2.剥离
[root@kvm01 opt]# virsh --help |grep disk   #不记得命令,查询帮助
    attach-disk                    attach disk device
    blockpull                      Populate a disk from its backing image.
    detach-disk                    detach disk device
[root@kvm01 opt]# virsh detach-disk centos7 vdb
Disk detached successfully
3.再kvm虚拟机查看已经没有vdb分区了
[root@localhost ~]# fdisk -l

Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a732f

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    20971519    10484736   83  Linux

4.重置硬盘大小
[root@kvm01 opt]# qemu-img resize centos7-add01.qcow2 +2G
Image resized.
5.查看已经成了6G
[root@kvm01 opt]# qemu-img resize centos7-add01.qcow2 +2G
Image resized.
[root@kvm01 opt]# qemu-img info centos7-add01.qcow2 
image: centos7-add01.qcow2
file format: qcow2
virtual size: 6.0G (6442450944 bytes)
disk size: 28M
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
 
6.再次附加的centos7虚拟机上
[root@kvm01 opt]# virsh attach-disk centos7 /opt/centos7-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
Disk attached successfully

7.在kvm虚拟机上查看,此时大小已经是6G
[root@localhost ~]# fdisk -l

Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a732f

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    20971519    10484736   83  Linux

Disk /dev/vdb: 6442 MB, 6442450944 bytes, 12582912 sectors    #此时已经是6G了
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x36c42a9e

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048     8388607     4193280   83  Linux

8.再次挂载,发现只要4G,明明已经增加了2G,这是因为分区表里起始位置只到了4G,必须删除原有分区,再重新分区
[root@localhost ~]# mount /dev/vdb1 /mnt
[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        10G  1.5G  8.6G  15% /
devtmpfs        486M     0  486M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M  6.7M  490M   2% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       4.0G   33M  4.0G   1% /mnt
#删除原有分区,重新分区
[root@localhost ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d   #删除分区,内置命令d
Selected partition 1
Partition 1 is deleted

Command (m for help): n  #创建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p  #选择创建主分区
Partition number (1-4, default 1): 
First sector (2048-12582911, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-12582911, default 12582911): 
Using default value 12582911
Partition 1 of type Linux and of size 6 GiB is set   #其实已经能看到是6G 大小了

Command (m for help): w  # 保存退出
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.   
#提示内核仍然使用旧表,新表格将用于下次重新启动或运行partprobe(8)或kpartx(8)之后
[root@localhost ~]# partprobe 
10.再次查看发现空间大小还是没有变化,还得执行一步
[root@localhost ~]# partprobe 
[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        10G  1.5G  8.6G  15% /
devtmpfs        486M     0  486M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M  6.7M  490M   2% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       4.0G   33M  4.0G   1% /mnt
#同步文件系统
 #由于类型是xfx,所以使用xfs_growfs ;如果是Ext4,则使用resize2fs /mnt
[root@localhost ~]# xfs_growfs /mnt/          
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=262080 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1048320, 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 1048320 to 1572608
#再次查看
[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        10G  1.5G  8.6G  15% /
devtmpfs        486M     0  486M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M  6.7M  490M   2% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       6.0G   33M  6.0G   1% /mnt            #此时已经升到6G了
#惊喜的发现数并据没有丢失
[root@localhost ~]# ls /mnt/
services
永久添加硬盘
###重启后,硬盘失效,永久添加硬盘还得修改配置参数(关机状态下)
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/opt/centos7.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
在以上参数的  </disk> 添加如下参数:6yy  p 复制6行 ;打印
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/opt/centos7-add01.qcow2'/>  #磁盘文件地址
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>  
      			#若出现报错,删除此行参数,让系统自动生成即可
    </disk>
关机重启后已经永久生效。
热添加网卡

如上操作,都是纯命令操作,若是VMware这样的软件,提高了图形化点击,就比较简单。

1.添加网卡,注意命令的正确
[root@kvm01 ~]# virsh start centos7 
Domain centos7 started

[root@kvm01 ~]# virsh attach-interface centos7 --type bridge --model virtio  --source br0
Interface attached successfully
如果不加virtio参数的话,性能低,网卡名称不是标准的eth0。

2.添加完成后,ssh远程检查虚拟机内配置
[root@kvm01 ~]# ssh root@192.168.178.111 "ip addr show"
The authenticity of host '192.168.178.111 (192.168.178.111)' can't be established.
ECDSA key fingerprint is SHA256:UjCTeyx55H40Ppf9b9mTjRMm+og0Q4iVvUJH0SQayFg.
ECDSA key fingerprint is MD5:93:f1:5f:a3:3a:d1:f2:5d:86:ac:6a:cb:76:bc:34:ed.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.178.111' (ECDSA) to the list of known hosts.
root@192.168.178.111's password: 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:e3:99:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.178.111/24 brd 192.168.178.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fee3:995b/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 52:54:00:4d:c7:8d brd ff:ff:ff:ff:ff:ff           #此时已经多了一个eth1网卡
    
3.要注意命令添加的网卡,都是临时生效,想要永久,还得修改配置文件
[root@kvm01 ~]# virsh edit centos7 
Domain centos7 XML configuration edited.
#复制以下6行6yy;打印p,删除mac地址行与pci行,让系统自动生成即可
     67     <interface type='bridge'>
     68       <mac address='52:54:00:e3:99:5b'/>
     69       <source bridge='br0'/>
     70       <model type='virtio'/>
     71       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
     72     </interface>          #</interface>  添加如下几行即可,
     73     <interface type='bridge'>
     74       <source bridge='br0'/>
     75       <model type='virtio'/>
     76     </interface>

4.重启kvm虚拟机,查看是否还有网卡eth1
[root@kvm01 ~]# virsh shutdown centos7 
Domain centos7 is being shutdown

[root@kvm01 ~]# virsh start centos7 
Domain centos7 started
#即使重启后,kvm的网卡也依然存在
[root@kvm01 ~]# !ssh
ssh root@192.168.178.111 "ip addr show"
root@192.168.178.111's password: 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:e3:99:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.178.111/24 brd 192.168.178.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fee3:995b/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 52:54:00:a5:7a:69 brd ff:ff:ff:ff:ff:ff

5.只需要给网卡添加配置参数,即可使用
#生成uuid
[root@kvm01 ~]# ssh root@192.168.178.111
root@192.168.178.111's password: 
Last login: Thu Jan 28 10:14:12 2021
[root@localhost ~]#  uuidgen eth1
fd53e095-8c85-4e9a-b27d-61a6932e4f21
#添加网卡配置参数如下:
[root@localhost ~]# vi  /etc/sysconfig/network-scripts/ifcfg-eth1
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth1"
UUID="fd53e095-8c85-4e9a-b27d-61a6932e4f21"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="192.168.178.112"
NETMASK=255.255.255.0
GATEWAY=192.168.178.254
DNS1=119.29.29.29
[root@localhost ~]# systemctl restart network
#测试
[D:\~]$ ping 192.168.178.112

正在 Ping 192.168.178.112 具有 32 字节的数据:
来自 192.168.178.112 的回复: 字节=32 时间=1ms TTL=6
热添加CPU
1.默认创建的虚拟机,最大cpu核数是1,得提前指定最大核数
2.注意这里的操作,先彻底删除旧虚拟机,留下磁盘文件即可,然后新的虚拟机启动时,用该磁盘启动,即可快速开机
#强制销毁
[root@kvm01 ~]# virsh destroy centos7 
Domain centos7 destroyed
#删除
[root@kvm01 ~]#  virsh undefine centos7 
error: Failed to undefine domain centos7
error: Requested operation is not valid: cannot delete inactive domain with 1 snapshots
#报错,提示不可删除有快照的域,先删除快照即可
[root@kvm01 ~]# virsh snapshot-list centos7 
 Name                 Creation Time             State
------------------------------------------------------------
 1611716415           2021-01-27 11:00:15 +0800 running
[root@kvm01 ~]# virsh snapshot-delete centos7 --snapshotname  1611716415 
Domain snapshot 1611716415 deleted
[root@kvm01 ~]# virsh undefine centos7 
Domain centos7 has been undefined
3.重新指定cpu数量,用旧虚拟机磁盘快速生成新的虚拟机web01
[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web01 --memory 1024 --vcpus 1,maxvcpus=4 --disk /opt/centos7.qcow2,format=qcow2,size=10 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

Starting install...
Domain creation completed.

4.检查当前cpu数量
[root@kvm01 ~]# ssh root@192.168.178.111 "lscpu | grep CPU"
root@192.168.178.111's password: 
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                1                         #此时只有一个CPU
On-line CPU(s) list:   0
CPU family:            15
CPU MHz:               1796.626
NUMA node0 CPU(s):     0

5.热添加CPU命令
[root@kvm01 ~]# virsh setvcpus web01 --count=2
#热添加完毕后,再次检查,已经有了两块CPU,当然也是可以在新建虚拟机的时候指定,和VMware差不多
[root@kvm01 ~]# ssh root@192.168.178.111  lscpu | grep "^CPU(s)"
root@192.168.178.111's password: 
CPU(s):                2

热添加内存
1.先查看当前虚拟机的内存情况
[root@kvm01 ~]# ssh root@192.168.178.111 free -m
root@192.168.178.111's password: 
              total        used        free      shared  buff/cache   available
Mem:            991          64         830           6          96         799
Swap:             0           0           0

2.想要能够修改内存,还得在创建的时候,指定好最大内存参数
  #基于虚拟机的磁盘,取消当前虚拟机,然后再重新创建
[root@kvm01 ~]# virsh destroy web01
Domain web01 destroyed

[root@kvm01 ~]# virsh undefine web01
Domain web01 has been undefined

3.重新创建,注意参数
[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web01 --memory 512,maxmemory=2048 --vcpus=1,maxvcpus=2 --disk /opt/centos7.qcow2,format=qcow2,size=10 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0  --noautoconsole

Starting install...
Domain creation completed.

4.热添加内存
[root@kvm01 ~]# ssh root@192.168.178.111 free -m
root@192.168.178.111's password: 
              total        used        free      shared  buff/cache   available
Mem:            463          67         305           8          90         268
Swap:             0           0           0
[root@kvm01 ~]# 
[root@kvm01 ~]# ssh root@192.168.178.111 free -m
root@192.168.178.111's password: 
              total        used        free      shared  buff/cache   available
Mem:           1999          67        1841           8          90        1804
Swap:             0           0           0

1.9 kvm虚拟机冷热迁移

冷迁移实践

准备一台和kvm01配置相同的机器,配置好kvm环境。直接克隆了一台kvm01的初始化状态的机器,为kvm02。

1.kvm02环境准备
[root@kvm02 ~]# hostname
kvm02
[root@kvm02 ~]# ifconfig |awk 'NR==2{print $2}'
192.168.178.51
[root@kvm02 ~]# systemctl disable NetworkManager
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
[root@kvm02 ~]# systemctl stop  NetworkManager
[root@kvm02 ~]# iptables -F
[root@kvm02 ~]# getenforce 
Disabled
[root@kvm02 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

2.安装kvm组件
[root@kvm02 ~]# yum install libvirt virt-install qemu-kvm -y

3.启动服务
[root@kvm02 ~]# systemctl start libvirtd
[root@kvm02 ~]# systemctl enable libvirtd
[root@kvm02 ~]# systemctl is-enabled libvirtd
enabled

4.配置桥接网络
[root@kvm02 ~]# virsh iface-bridge ens33 br0
Created bridge br0 with attached device ens33
Bridge interface br0 started

5.导出kvm01的配置文件
[root@kvm01 opt]# ls
centos7.qcow2  CentOS-7-x86_64-DVD-1804.iso
[root@kvm01 opt]# virsh dumpxml web01 > web01.xml
[root@kvm01 opt]# ls
centos7.qcow2  CentOS-7-x86_64-DVD-1804.iso  web01.xml

6.发送虚拟机配置文件,以及磁盘文件,发送给kvm02机器
[root@kvm01 opt]# scp -rp web01.xml centos7.qcow2 192.168.178.51:/opt/
The authenticity of host '192.168.178.51 (192.168.178.51)' can't be established.
ECDSA key fingerprint is SHA256:4imP13lMQGooWGjdRyR0Fo6Q7ImWaEzTNuczogpiGBI.
ECDSA key fingerprint is MD5:89:55:1e:bc:e8:41:d0:cd:b6:2a:7c:78:67:0a:ce:ee.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.178.51' (ECDSA) to the list of known hosts.
root@192.168.178.51's password: 
web01.xml                                                               100% 3545     1.5MB/s   00:00    
centos7.qcow2                                                           100% 2557MB  88.5MB/s   00:28  

8.在kvm02上操作
[root@kvm02 opt]# ls
centos7.qcow2  web01.xml

9.导入配置文件
[root@kvm02 opt]# virsh define web01.xml
Domain web01 defined from web01.xml

[root@kvm02 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     web01                          shut off
#开机
[root@kvm02 opt]# virsh start web01
Domain web01 started
#若出现以下报错,说明你这台unij,没有开启cpu虚拟化,开启来重试
[root@kvm02 data]# virsh start web01
error: Failed to start domain web01
error: unsupported configuration: Domain requires KVM, but it is not available. Check that virtualization is enabled in the host BIOS, and host configuration is setup to load the kvm modules.

#此时已经可以用vnc连接虚拟机
[root@kvm02 opt]# virsh list 
 Id    Name                           State
----------------------------------------------------
 1     web01                          running

至此kvm的冷迁移旧完成了。

kvm热迁移实践

热迁移相比kvm虚拟机冷迁移无需拷贝虚拟磁盘文件,但是需要迁移到的宿主机之间,有相同的目录结构,虚拟机磁盘文件,也就是共享存储,可以使用nfs来实现,也可以采用Glusterfs等分布式文件系统来实现。
假设我初级只有一台16G内存的物理机,为了充分利用资源,我可能运行了8台2G内存的虚拟机,然后访问量增加,虚拟机的2G内存不够用了,需要扩容,扩容之前我们就需要先迁移一部分虚拟机到其他宿主机上了,否则会因为资源不够造成宕机或其他错误。有的业务特别核心,暂停的时间不能太长,这时候就要用到我们的热迁移了。

假设我们有2台宿主机kvm01和kvm02,在kvm01上挂起虚拟机web01,发送vm的虚拟机配置文件和运行时内存中的数据到kvm02, 接受完毕,kvm02恢复vm01,热迁移完成。
环境准备:

主机名IP内存网络软件需求虚拟化
kvm01192.168.178.502G创建br0桥接网卡kvm和nfs开启虚拟化
kvm02192.168.178.512G创建br0桥接网卡kvm和nfs开启虚拟化

配置hosts解析:

[root@kvm01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.178.51  kvm02
[root@kvm02 ~]#  cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.178.50  kvm01

#####具体操作流程:

一,在kvm01和kvm02上安装kvm和nfs,配置桥接网卡
二,kvm01和kvm02挂载共享目录/opt
三,安装一台基于桥接模式的虚拟机
四,在kvm01上安装图形化界面(在一台安装即可,否则容易卡顿),vnc服务端和virt-manager
五,启动vnc服务端
六,使用vnc连接宿主机,使用virt-manager进行迁移
实践步骤
#实现kvm虚拟机热迁移核心:共享存储。在这里使用NFS共享存储。

1.安装virt-manager所需桌面及vnc-server
#用本地光盘镜像,加速安装,否则太大,很难安装
[root@kvm01 opt]# cat /etc/yum.repos.d/local.repo 
[local]
name=local repo
baseurl=file:///mnt
gpgcheck=0
[root@kvm01 ~]# mount /dev/cdrom /mnt
mount: /dev/sr0 is write-protected, mounting read-only
[root@kvm01 ~]# ls /mnt
CentOS_BuildTag  EULA  images    LiveOS    repodata              RPM-GPG-KEY-CentOS-Testing-7
EFI              GPL   isolinux  Packages  RPM-GPG-KEY-CentOS-7  TRANS.TBL
[root@kvm01 opt]# yum groupinstall "GNOME Desktop" -y    #有空格,用双引号引起来,
Total                                                                    15 MB/s | 822 MB  00:00:53     
Running transaction check
Running transaction test


Transaction check error:
  file /boot/efi/EFI/centos from install of fwupdate-efi-12-6.el7.centos.x86_64 conflicts with file from package grub2-common-1:2.02-0.65.el7.centos.2.noarch

Error Summary
-------------

# 报错了:Error Summary(导致最后结果进去桌面看不到任何图像),更新一下以下安装包:
  165  yum install -y grub2-efi fwupdate
#再次安装
...
  systemd-sysv.x86_64 0:219-78.el7_9.2                                                                  

Complete!
[root@kvm01 ~]# 
#正常了

2.安装vnc-server端
[root@kvm01 opt]# yum install tigervnc-server -y

3.安装virt-manager所需软件
[root@kvm01 opt]# yum install openssh-askpass virt-manager -y  

配置vnc服务

1.复制vnc配置文件
[root@kvm01 opt]# \cp /usr/lib/systemd/system/vncserver@.service  /usr/lib/systemd/system/vncserver@\:1.service

2.修改配置文件
[root@kvm01 opt]# vim /usr/lib/systemd/system/vncserver@\:1.service
[root@kvm01 opt]#  egrep -v "^#|^$" /usr/lib/systemd/system/vncserver@\:1.service
#修改前(直接复制即可)
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver_wrapper <USER> %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

#修改后:
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=root
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i -geometry 1280x720"
PIDFile=/root/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

3.修改后重读配置文件
[root@kvm01 opt]# systemctl  daemon-reload 

4.设置vnc连接密码
[root@kvm01 opt]# vncpasswd 
Password:123456
Verify:123456  #验证核实
Would you like to enter a view-only password (y/n)? n #n为非只读用户
A view-only password is not used

5.启动vnc,设置开机自启
[root@kvm01 ~]# systemctl start   vncserver@\:1.service
[root@kvm01 ~]# systemctl enable  vncserver@\:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /usr/lib/systemd/system/vncserver@:1.service.
#关闭vnc的命令是:vncserver -kill :1

6.查看密码文件
[root@kvm01 opt]# ll ~/.vnc
total 20
-rw-r--r-- 1 root root 332 Jan 28 16:09 config
-rw-r--r-- 1 root root 422 Jan 28 16:09 kvm01:1.log
-rw-r--r-- 1 root root   5 Jan 28 16:09 kvm01:1.pid
-rw------- 1 root root   8 Jan 28 16:07 passwd
-rwxr-xr-x 1 root root 540 Jan 28 16:09 xstartup

7.查看vnc服务端口
[root@kvm01 opt]# netstat -tunlp | grep 5901
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      3242/Xvnc           
tcp6       0      0 :::5901                 :::*                    LISTEN      3242/Xvnc 
#第一次是因为图形化没启动成功,所以vnc启动了,能检测到端口。
#第二次起不来是因为图形化界面还是失败的,排错见下文,在安装vnc前先进行排错上的操作即可正常启动

图形化启动失败截图如下:
image-20210131161614021

排错过程如下:
1.原来是图形化安装失败了,新更新一下如下两个安装包
yum install -y grub2-efi fwupdate
2.重新下载图形化完毕后,发现vnc怎么读起不来,第一次起来是因为图形化每安装成功。具体操作详情见vnc配置
[root@kvm01 opt]# netstat -tunlp | grep 5901
#怎么读起不来端口,只好去重启虚拟机,发现还是图形化起不来,所有导致vnc运行不了,提示如上图:
3.同样在root用户权限下,设置centos系统默认的启动方式,输入命令如下:
#命令如下:
[root@kvm01 ~]# systemctl  get-default 
multi-user.target  #命令模式启动
systemctl set-default multi-user.target //设置成命令模式
systemctl set-default graphical.target //设置成图形模式
[root@kvm01 ~]# systemctl set-default graphical.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
#再获取当前状态
[root@localhost ~]# systemctl  get-default 
graphical.target
#结果发现还是起不来,猜测可能和笔记本集成显卡有关系,在独立显卡的笔记本一下成功了,于是操作了如下命令,结果好了
[root@kvm01 ~]# yum update -y
#重启后去安装vnc服务
[root@kvm01 ~]# reboot
#热迁移,先启动web01
[root@kvm01 ~]# virsh start web01 
Domain web01 started
4.正常启动vnc后,继续下面操作
[root@kvm01 ~]# netstat -tunlp | grep 5901
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      2472/Xvnc           
tcp6       0      0 :::5901                 :::*                    LISTEN      2472/Xvnc      
配置NFS存储
1.安装配置nfs
[root@kvm01 opt]#  yum install nfs-utils rpcbind -y


2.修改配置文件
[root@kvm01 opt]# cat /etc/exports
[root@kvm01 opt]# vim /etc/exports
[root@kvm01 opt]# cat /etc/exports
/opt 192.168.178.0/24(rw,sync,all_squash,anonuid=0,anongid=0)

3.启动nfs服务
[root@kvm01 opt]# systemctl restart rpcbind
[root@kvm01 opt]# systemctl restart nfs
[root@kvm01 opt]# 
[root@kvm01 opt]# systemctl enable rpcbind
[root@kvm01 opt]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

KVM02上操作

1.安装nfs
[root@kvm02 opt]#  yum install nfs-utils rpcbind -y

2.查看共享信息
[root@kvm02 opt]# showmount -e 192.168.178.50
Export list for 192.168.178.50:
/opt 192.168.178.0/24

3.挂载目录
[root@kvm02 opt]# ls /opt
centos7.qcow2  web01.xml
这里已经有两个文件,上一节冷迁移的时候留下的,上一节已经部署好了br0,此处不做复述。
先清除掉冷迁移留下的web01
[root@kvm02 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     web01                          running

[root@kvm02 opt]# virsh destroy web01 
Domain web01 destroyed

[root@kvm02 opt]# virsh undefine web01 
Domain web01 has been undefined

[root@kvm02 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------

[root@kvm02 opt]# rm ./* -rf
[root@kvm02 opt]# ls
#挂载目录
[root@kvm02 opt]# mount.nfs 192.168.178.50:/opt /opt
[root@kvm02 opt]# ls /opt/
centos1.qcow2  centos7.qcow2  CentOS-7-x86_64-DVD-1804.iso  web01.xml

4.加入开机启动  
#linux会在开机之后自动source执行/etc/rc.local 
[root@kvm02 opt]# echo 'mount.nfs 192.168.178.50:/opt /opt' >> /etc/rc.local 
[root@kvm02 opt]# chmod +x /etc/rc.local 
实现热迁移

1.vnc连接kvm
image-20210128163216933

2.输入之前设置好的密码:123456
3.进入linux服务器;使用vmm虚拟系统管理器
image-20210131165555104

创建连接

image-20210131175902273

迁移前:
image-20210131180614181

使用window运行ping:
image-20210131182758681

迁移:
image-20210131181117140

迁移后:
image-20210131182303652

1.命令行查看
#kvm01
[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
#kvm02
[root@kvm02 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     web01                          running
##总结:
1.必须图形化安装成功,vnc才能成功启动
2.必须hosts文件解析才能迁移成功
3.迁移时必须勾选允许不安全参数。
advanced options 高级选项
allow  unsafe  允许不安全的
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐