KVM的高级进阶

1、虚拟机全虚拟化和半虚拟机化的区别

1)全虚拟化驱动

image-20221009150400255

2)半虚拟化驱动:通过驱动对操作系统进行修改,即减少中间层,使得VM可以直接和hypervisor进行沟通

image-20221009150801362

1.1 如何查看网卡是否支持半虚拟化驱动
[root@localhost ~]# ethtool -i eth0

2、虚拟机的网络管理

2.1 配置 KVM 网络桥接功能

网桥介绍: 我们经常所说的 Bridge 设备其实就是网桥设备,也就相当于现在的二层交换机,用于连接同一网段内的所有机器,所以我们的目的就是将网络设备 eth0 添加到 br0,此时 br0 就成为了所谓的交换机设备,我们物理机的 eth0 也是连接在上面的。

image-20220928084817317

2.1.1 查看网桥的信息

image-20220928085913061

2.1.2 关闭NetworkManager

注意,配置网桥之前请将NetworkManager功能暂时关闭,否则配置会失败

[root@localhost network-scripts]# systemctl stop NetworkManager

注意,请将原来的网卡先备份好,避免配置失败导致网卡配置丢失。

2.1.3、备份网卡配置
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33.bak
2.1.4、复制ens33网卡配置,别名成ifcfg-br0
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-br0
2.1.5 修改ens33配置和br0的内容
[root@localhost network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
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=ens33
UUID=6ad77fe0-4996-4262-ae91-0a8196bd8543
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.1.100
#NETMASK=255.255.255.0
#GATEWAY=192.168.1.2
#DNS1=223.5.5.5
BRIDGE="br0" #在文件最后插入这一行
生成桥设备的配置文件:
[root@localhost network-scripts]# vim ifcfg-br0 #创建 ifcfg-br0 文件,并写入以下内容
DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=none
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
DNS1=223.5.5.5
注: TYPE="Bridge" , B要大写
2.1.6 重启网卡测试
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe51:aa25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:51:aa:25  txqueuelen 1000  (Ethernet)
        RX packets 126  bytes 18003 (17.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 104  bytes 12985 (12.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::20c:29ff:fe51:aa25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:51:aa:25  txqueuelen 1000  (Ethernet)
        RX packets 7135969  bytes 6450627610 (6.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5902016  bytes 12427168541 (11.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
2.1.7 测试网卡是否联通
[root@localhost network-scripts]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=128 time=151 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=128 time=22.3 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=128 time=34.7 ms
2.1.8 查看br0这个网桥上的设备连接情况
[root@localhost network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c2951aa25	 no		        ens33
virbr0		8000.525400dc8466	yes		virbr0-nic
							vnet0
[root@localhost network-scripts]#

看到是其他的接口目前正连接在了br0这个网桥上了

2.1.9 添加新的接口

image-20220928092603322

image-20220928092918167

2.1.10 通过命令添加网卡接口
[root@localhost network-scripts]# brctl addif br0 vnet2   ##通过命令添加
[root@localhost network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c2951aa25	no		ens33
							vnet1
							vnet2
virbr0		8000.525400dc8466	yes		virbr0-nic
							vnet0

注意:新加的接口不能是已经被占用的了,例如:

[root@localhost network-scripts]# brctl addif br0 vnet2
device vnet2 is already a member of a bridge; can't enslave it to bridge br0.

提示vnet2已经添加到了其他的其他的网桥中了,因此只能先移除,在进行添加

[root@localhost network-scripts]# brctl delif virbr0 vnet2
2.1.11 删除网桥
[root@localhost network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.fe54002ebd28	no		vnet1
							vnet2
virbr0		8000.525400dc8466	yes		virbr0-nic
							vnet0
[root@localhost network-scripts]# brctl delif br0 vnet1    删除接口
[root@localhost network-scripts]# brctl delif br0 vnet2
[root@localhost network-scripts]# ifdown br0 down     停止br0网桥才能删除
[root@localhost network-scripts]# brctl delbr br0      删除网桥
[root@localhost network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.525400dc8466	yes		virbr0-nic
							vnet0
2.2 扩展: 通过virt-manager的方式添加网桥
2.2.1、打开virt-manager

image-20220928095321243

image-20220928095339041

image-20220928095409557

image-20220928095553759

image-20220928095635694

image-20220928095705276

注意,这个过程中就在生成配置文件的内容,因此网络会断开,重新连接测试。

image-20220928095819310

2.2.2、查看接口信息
[root@localhost ~]# ip add|grep -E 'br1|ens33'
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP group default qlen 1000
42: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 192.168.1.100/24 brd 192.168.1.255 scope global br1
[root@localhost ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br1		8000.000c2951aa25	yes		ens33
virbr0		8000.525400dc8466	yes		virbr0-nic
							vnet0
2.2.3、测试网络
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=128 time=20.9 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=128 time=21.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=128 time=21.3 ms
2.3 配置KVM网络之NAT功能

参考vmware workstation的网络设计,我们发现vmware有三种主要的网络模型,分别:桥接、仅主机和NAT模式,桥接的含义是虚拟机直接连接在物理网络中,IP地址、子网掩码和网关等信息都有物理网络中的DHCP服务器来进行分配,我们可以认为虚拟机就是一台和物理环境中的机器之间相连接的服务器;仅主机指的是虚拟机和虚拟机之间可以进行通信,但是无法和外部的物理机进行通信也叫隔离网络;NAT模式则是我们日常生活中使用的最多的一种网络环境,我们家庭中的上网的环境就是使用的NAT的方式上网的,NAT又分为SNAT和DNAT,分别叫源地址转换和目标地址转换,源地址转换类似我们直接访问外部的互联网环境时使用的,而DNAT则类似外部的用户访问公司网络时使用的。

在KVM中,我们可以看到仅有一个default网络,默认也是NAT环境,所以,我们可以手动来添加一个新的网络环境

2.3.1 添加网络有2种方式:

1、 通过virt-manager

image-20221009164857813

image-20221009164952077

image-20221009164416607

image-20221009164455017

image-20221009164700550

image-20221009165118892

2、 查看新的网桥信息

[root@localhost qemu]# ip add |grep virbr*
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
8: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000
10: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000
11: vnet3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000
16: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    inet 192.168.100.1/24 brd 192.168.100.255 scope global virbr1

3、通过virt-manager,打开虚拟机,手动修改虚拟机配置文件的网卡网络为“testnetwork1”

image-20221009170305083

2.3.2 通过网络xml配置文件
[root@localhost ~]# cd /etc/libvirt/qemu/networks//etc/libvirt/qemu/networks
[root@localhost networks]# cat default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh net-edit default
or other application using the libvirt API.
-->

<network>
  <name>default</name>
  <uuid>abac9fc5-a620-4731-9b87-80ed7038a84d</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:dc:84:66'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>
[root@localhost networks]#

1、生成新的网卡文件

[root@localhost networks]# virsh net-dumpxml default >/etc/libvirt/qemu/networks/testnetwork2.xml

2、编辑新网卡配置文件

UUID生成器
[root@localhost networks]# uuidgen

生成MAC地址语法
[root@localhost ~]# openssl rand -hex 6|sed -r 's/(..)/\1:/g;s/.$//'
[root@localhost networks]# cat testnetwork2.xml
<network connections='1'>
  <name>testnetwork2</name>
  <uuid>68b9951c-2d0d-4dee-a1ef-ddb98ec0c98f</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr2' stp='on' delay='0'/>
  <mac address='52:54:00:2c:16:c1'/>
  <ip address='192.168.120.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.120.2' end='192.168.120.254'/>
    </dhcp>
  </ip>
</network>

3、 激活网卡

[root@localhost networks]# virsh net-define testnetwork2.xml    定义网络
从 testnetwork2定义网络testnetwork2.xml


[root@localhost networks]# virsh net-autostart testnetwork2   设置自动启动
网络testnetwork2标记为自动启动

[root@localhost networks]# virsh net-start testnetwork2    激活网卡
网络 testnetwork2 已开始

[root@localhost networks]# brctl addif virbr2 vnet0       添加网络接口

4、查看新的网桥设备

[root@localhost networks]# ip add s|grep virbr2
22: virbr2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    inet 192.168.120.1/24 brd 192.168.120.255 scope global virbr2
23: virbr2-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr2 state DOWN group default qlen 1000

5、测试虚拟机网络

image-20221009172146545

2.4虚拟机添加和删除网卡
2.4.1 添加网卡
1、virt-manager	  
	  
2、virsh  
前提条件是虚拟机已经启动
	
[root@localhost ~]# virsh list
Id    名称                         状态
		----------------------------------------------------
 9     win2k8r2                       running

[root@localhost ~]# virsh domiflist win2k8r2
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:99:f2:85
vnet1      network    default    virtio      52:54:00:98:e9:bd

[root@localhost ~]# virsh attach-interface win2k8r2 --type network --source default --model virtio --config  成功附加接口
	
注意;完成后需要重启虚拟机,网卡无法热插拔。
2.4.2 删除网卡
删除网卡的方式
1)、virt-manager

2)、通过xml配置文件删除
[root@localhost qemu]# virsh edit centos7-1

注意:重启虚拟机生效。

image-20221009161341598

3、KVM管理

3.1 虚拟机的基本管理
[root@localhost data]# virsh start centos7.0   启动域名

[root@localhost data]# virsh autostart centos7.0   自动启动

[root@localhost data]# virsh autostart --disable centos7.0 取消自启动

[root@localhost data]# virsh suspend centos7.0  挂起虚拟机
 
[root@localhost data]# virsh resume centos7.0  恢复虚拟机

[root@localhost data]# virsh dominfo centos7.0 查看域名的信息

[root@localhost data]# virsh shutdown centos7.0  关闭域名

[root@localhost data]# virsh destroy centos7.0    强制关闭域名

[root@localhost data]# virsh domstats centos7.0-2 centos7.0  查看多个域名的状态信息

[root@localhost data]# virsh domstat centos7.0-2   查看单个域名状态

[root@localhost networks]# virsh domdisplay centos7-1 查看域名的VNC信息
vnc://127.0.0.1:0                    该地址可以在宿主机内的浏览器连接

[root@localhost ~]# virsh list   查看运行的虚拟机
 Id    名称                         状态
----------------------------------------------------
 45    centos7.0                      running
 
 
[root@localhost ~]# virsh list --all   查看所有的虚拟机
 Id    名称                         状态
----------------------------------------------------
 45    centos7.0                      running
 -     centos7-1                      关闭
 -     centos7.9-2                    关闭
 -     win2k8r2                       关闭
 -     win2k8r2-2                     关闭


[root@localhost ~]# virt-viewer  图形化查看运行的虚拟机

[root@localhost ~]# virt-top   查看虚拟机占用主机的资源使用
3.2 KVM 虚拟机组成

一台 KVM 虚拟机由两部分组成:虚拟机配置文件和镜像 img (windows or linux)

3.2.1 虚拟机的配置文件
[root@localhost qemu]# ll /etc/libvirt/qemu    配置文件路径
总用量 40
drwxr-xr-x  2 root root   27 9月  29 10:04 autostart
-rw-------  1 root root 4750 9月  28 15:45 centos7.0.xml
-rw-------  1 root root 4763 9月  28 15:27 centos7-1.xml
-rw-------  1 root root 4251 9月  26 22:23 centos7.9-2.xml
drwx------. 3 root root   81 9月  28 15:20 networks
-rw-------  1 root root 4836 9月  26 22:16 win2k8r2-2.xml
-rw-------  1 root root 4690 9月  26 16:45 win2k8r2.xml
3.2.2 查看虚拟机的配置文件
[root@localhost qemu]# virsh edit centos7.0      编辑配置文件
[root@localhost qemu]# virsh dumpxml centos7.0 > centos7.0_bak.xml 备份
3.3 虚拟机的存储配置文件

KVM虚拟机的存储配置文件所在位置/etc/libvirt/storage,保存了所有虚拟机的磁盘镜像文件

[root@localhost storage]# ll /etc/libvirt/storage/
总用量 20
drwxr-xr-x 2 root root 104 9月  28 15:42 autostart
-rw------- 1 root root 514 9月  26 22:23 data.xml
-rw------- 1 root root 538 9月  26 16:06 default.xml
-rw------- 1 root root 535 9月  28 15:42 linuximages.xml
-rw------- 1 root root 519 9月  26 16:08 soft.xml
-rw------- 1 root root 538 9月  26 16:35 windowsimage.xml
[root@localhost storage]#
3.3.1 演示通过virt-manager添加存储池
3.4 动态添加CPU
3.4.1 通过virsh调整CPU个数
[root@localhost storage]# virsh dominfo centos7-1

[root@localhost storage]# virsh setvcpus centos7-1 8 --live   临时添加,虚拟机重启失效,需要永久生效,加入到配置文件中

[root@localhost storage]# virsh dominfo centos7-1

[root@localhost qemu]#  virsh setvcpus centos7-1 6  --live  
错误:不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count

注意:CPU支持热添加,但是不支持热减少。
3.5 动态添加内存(内存气球)

注意:默认只有linux支持内存气球的配置,windows不支持,因此windows虚拟机需要通过安装驱动来支持

3.5.1 宿主机查看是否支持内存气球
[root@localhost ~]# virsh dumpxml centos7-1 |grep memballoon -C 2  
3.5.2 设置内存气球大小
##查看内存
[root@localhost networks]# virsh qemu-monitor-command centos7-1 --hmp --cmd info balloon
balloon: actual=2048   


##设置内存大小
[root@localhost networks]# virsh qemu-monitor-command centos7-1 --hmp --cmd balloon 1024 



[root@localhost networks]# virsh qemu-monitor-command centos7-1 --hmp --cmd info balloon
balloon: actual=1024

[root@localhost networks]#free -m  
3.6 KVM添加硬盘配置

KVM添加硬盘的方式有2种:

1、通过virt-manager添加
2、通过virsh命令添加
3.6.1 通过virt-manager添加(此方式添加属于热添加,不需要重启虚拟机)

image-20221010095116701

image-20221010095143338

image-20221010095404758

3.6.2 通过virsh命令添加
[root@localhost ~]# virsh domblklist centos7.0    查看域名块列表信息
目标     源
------------------------------------------------
vda        /data/images/centos7-model.qcow2
vdb        /var/lib/libvirt/images/centos7.0.qcow2
hda        -

   
[root@localhost ~]# qemu-img create -f qcow2 disk1.img 2G  创建大小为2G磁盘


[root@localhost /]# virsh attach-disk centos7.0 --source /disk1.img --target vdb --cache writeback --subdriver qcow2
成功附加磁盘
将磁盘附件在域名中,但是这种方式添加硬盘后,重启虚拟机后磁盘消失

[root@localhost /]# virsh detach-disk centos7.0 vdb  删除硬盘
成功分离磁盘


[root@localhost ~]# virsh attach-disk centos7.0 --source /disk1.img --target vdb --cache writeback --subdriver qcow2 --persistent   ##持久化附加到虚拟机中,如果删除后,再进行重启机器,也会被附加上来,因为配置文件中已经添加了。
3.7 存储池

存储池分为2种

1、本地存储池
     虚拟机---》编辑---》连接详情---》存储---》添加存储池
2、网络存储池
3.7.1 查看本地存储池
[root@localhost /]# virsh pool-list --all

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

3.7.2 添加本地存储池

image-20221010110317767

image-20221010105544815

image-20221010110400699

image-20221010110445687

image-20221010110540418

3.7.3 添加网络存储池

可以利用作为网络存储池的类型有很多,比如ceph,iscsi,NFS,LVM等,可以将本地的存储数据放置在远端,通过高速总线连接传输数据,避免了本地存储空间不足的问题,同时也可以避免虚拟机和数据放置在同一个地理位置上所带来的安全风险问题,我们这里以常见的NFS作为网络存储进行案例的演示

存储端:192.168.1.120

在NFS存储端安装NFS端口,并设置存储目录

[root@k8s-master01 ~]# yum -y install nfs-utils
[root@k8s-master01 ~]# mkdir /data/storage 
[root@k8s-master01 ~]# cat /etc/exports
/data/storage  192.168.1.0/24(rw,sync,no_root_squash)
[root@k8s-master01 ~]# systemctl start nfs
[root@k8s-master01 ~]# systemctl enable nfs

KVM虚拟机端:192.168.1.100

在KVM虚拟机端挂载NFS存储目录

[root@localhost /]# showmount -e 192.168.1.120
Export list for 192.168.1.120:
/data/storage 192.168.1.0/24

[root@localhost data]# mkdir netfs

[root@localhost ~]# mount -t nfs 192.168.1.120:/data/storage /data/netfs    测试挂载NFS
[root@localhost ~]# df -h
文件系统                     容量  已用  可用 已用% 挂载点
devtmpfs                     2.9G     0  2.9G    0% /dev
tmpfs                        2.9G   11M  2.9G    1% /dev/shm
tmpfs                        2.9G   13M  2.9G    1% /run
tmpfs                        2.9G     0  2.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root       36G   32G  4.1G   89% /
/dev/sdb1                    100G   21G   80G   21% /data
/dev/sda1                   1014M  186M  829M   19% /boot
/dev/mapper/centos-home       18G   37M   18G    1% /home
tmpfs                        585M   48K  585M    1% /run/user/0
/dev/sr0                     9.5G  9.5G     0  100% /run/media/root/CentOS 7 x86_64
192.168.1.120:/data/storage   36G  2.5G   34G    7% /data/netfs     ##确认可用
[root@localhost ~]#

image-20221010113014038

image-20221010113058816

image-20221010113359480

image-20221010113532031

接下来,可以将新建的硬盘或者虚拟机直接使用这个NFS的网络存储空间。

[root@localhost ~]# qemu-img create -f qcow2 /data/netfs/disk2.img 2G
3.8 KVM镜像管理
3.8.1 虚拟机常用镜像格式
[root@localhost ~]# qemu-img -h

目前主要虚拟机的镜像格式: raw, cow, qcow, qcow2, vmdk 。

3.8.2 镜像格式对比

| 格式 含义 | | | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | - | | raw 简单的二进制镜像文件,一次性占用分配的空间,支持稀疏文件 | | | | cow格式 还没有成熟,就被放弃了。 后来被 qcow 格式所取代。 | | | | vmdk VMware 的格式,整体性能最好,因为原本 VMware 就是做虚拟化起家。从性能和功能上来说,vmdk应该算最出色的,由于 vmdk 结合了 VMware 的很多能力,目前来看, KVM 和 XEN 使用这种格式的情况是不太多。但就 VMware 的企业级虚拟化 Esxi 来看,它的稳定性和各方面的能力都很好 | | | | qcow 刚刚出现的时候有比较好的特性,但其性能和 raw 格式对比还是有很大的差距,目前已经被新版本的 qcow2 取代。 | | | | qcow2 copy on write写时复制技术,是二代的QEMU推荐的格式,支持稀疏文件,支持AES加密,支持基于zlib的压缩,支持snapshot,支持后备镜像 | | | | raw 老牌的镜像格式,用一个字来说就是裸,也就是赤裸裸,你随便 dd 一个 file 就模拟了一个 raw格式的镜像。由于裸的彻底,性能上来说的话还是不错的。 centos6 上 KVM 和 XEN 默认的格式还是这个格式。 centos7 以上默认是qcow2 。裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像,对裸露的它来说还是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式),空间使用来看,这个很像磁盘,使用多少就是多少( du-h 看到的大小就是使用大小),缺点: 不支持 snapshot 快照 | | | | | | |

例: qcow2 转为 vmdk 方法是: qcow2 转为 raw ,然后把 raw 转为 vmdk 。也可以直接qcow2 转为 vmdk

扩展: 佳能相机上的高保真用的就是这种 raw 格式。 RAW 的原意就是“未经加工” 。可以理解为: RAW图像就是 CMOS或者 CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据。 RAW理解为“数字底片”

3.8.3 创建磁盘镜像
[root@localhost data]# qemu-img create /data/netfs/disk1.raw 2G     ##不指定格式默认是raw格式  
[root@localhost ~]# qemu-img create /data/netfs/disk3.img -f qcow2  2G
[root@localhost ~]# qemu-img create /data/netfs/disk4.img -f vmdk  2G
3.8.4 查看镜像格式信息
[root@localhost data]# qemu-img info disk2.qcow2
[root@localhost netfs]# ll -h *
-rw-r--r-- 1 root root 2.0G 10月 10 15:13 disk1.raw
-rw-r--r-- 1 root root 193K 10月 10 15:07 disk2.img
-rw-r--r-- 1 root root 320K 10月 10 15:08 disk3.img
3.8.5 镜像格式转换
[root@localhost data]# qemu-img convert -p -f raw -O qcow2 disk2.raw disk2new.qcow2
(100.00/100%)         将raw格式转换成qcow2格式

[root@localhost data]# qemu-img convert -p -f qcow2 -O raw  disk2new.qcow2 disk2new1.raw
 (100.00/100%)        将qcow2格式转换成raw格式

选项:
     -p,指的是显示转换过程,
     -f,表示指定转换的格式
3.9 基于后备镜像转换成差异(前端)镜像

后备镜像就是一个镜模板,通过这个模板来生成多个前置镜像,等于生成了多个虚拟机,后置镜像不会变动,默认的读取数据是从后备镜像,写数据则是从前置镜像,后备镜像可以是raw或qcow2,前置镜像只能是qcow2。 使用差量镜像的优势 1、节省磁盘空间 2、可以很快创建新的虚拟机

3.9.1 通过后备镜像创建前置镜像
1、准备模板镜像,这里以centos7.0虚拟机为模板
[root@localhost netfs]# cp -a /data/images/centos7-model.qcow2 .

2、检查模板镜像的格式是否是raw或者qcow2
[root@localhost netfs]# qemu-img info centos7-model.qcow2  
image: centos7-model.qcow2
file format: qcow2   
virtual size: 40G (42949672960 bytes)
disk size: 3.0G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
  
3、将后备镜像转换成差异差异镜像
[root@localhost netfs]# qemu-img create -f qcow2 -b centos7-model.qcow2 centos7-front.qcow2

4、查看镜像大小
[root@localhost netfs]# ll -h *
-rw-r--r-- 1 root root 193K 10月 10 15:50 centos7-front.qcow2   差异镜像
-rw------- 1 qemu qemu  41G 10月 10 15:47 centos7-model.qcow2   后置镜像
-rw-r--r-- 1 root root 2.0G 10月 10 15:46 disk1.raw
-rw-r--r-- 1 root root 193K 10月 10 15:46 disk2.qcow2
-rw-r--r-- 1 root root 320K 10月 10 15:45 disk3.vmdk
[root@localhost netfs]#
3.9.2 通过差异镜像可以生成新的虚拟机

image-20221010155847408

image-20221010155959061

image-20221010160031332

3.10、 guestfish磁盘镜像管理
可以在不开机的情况下管理磁盘镜像文件内容
[root@localhost ~]# yum -y install libguestfs-tools         ##linux
[root@localhost ~]#	yum -y install libguestfs-winsupport    ##windows
[root@localhost netfs]# virt-inspector centos7-front.qcow2   检测镜像格式

[root@localhost netfs]#virt-ls -a centos7-front.qcow2 /root    查看未开机的虚拟机/root目录下的文件
  
[root@localhost netfs]#virt-df  -a centos7-front.qcow2      查看未开机的虚拟机磁盘使用情况
  
[root@localhost netfs]#virt-cat -a centos7-front.qcow2/etc/hosts   查看未开机的虚拟机hosts文件

[root@localhost netfs]# virt-edit -a centos7-front.qcow2 /root/test.txt  编辑 test.txt文件

[root@localhost netfs]#virt-copy-in /etc/hosts -a centos7-front.qcow2 /root  将本地的hosts文件复制到虚拟机的/root目录下
[root@localhost netfs]# virt-copy-out -a centos7-front.qcow2 /root/hosts /root 将虚拟机内部的文件拷贝到本地/root目录下

3.11 KVM快照管理

KVM支持对虚拟机创建快照,但是前提是该虚拟机镜像不可以是raw格式,而应该是qcow2格式,KVM的虚拟机在创建快照后,就相当于对该虚拟机定位了一个状态,将来我们可以将该虚拟机恢复到该状态。下面,我们就来介绍一些KVM的快照创建、恢复和删除相关操作

KVM的快照创建命令格式如下:
virsh snapshot-create 【虚拟机名称】

例如,我们现在要给centos7.0创建快照

3.11.1 创建快照
[root@localhost ~]# virsh snapshot-create centos7.0
已生成域快照 1665449467
[root@localhost ~]#

快照配置文件在/var/lib/libvirt/qemu/snapshot/虚拟机名称下

[root@localhost centos7.0]# pwd
/var/lib/libvirt/qemu/snapshot/centos7.0
[root@localhost centos7.0]# ll
总用量 32
-rw------- 1 root root 6233 10月 11 08:53 1665449467.xml
-rw------- 1 root root 6286 10月 11 09:03 centos7.0_s1.xml
-rw------- 1 root root 6300 10月 11 09:02 centos7.0_s2.xml
-rw------- 1 root root 6300 10月 11 09:01 第二次创建的快照.xml

注:创建快照时不需要关闭虚拟机,关机创建快照比较快,开机创建快照需要把内存中的内容写到磁盘上,记录虚拟机这一时刻的状态

3.11.2 查看生成的快照
[root@localhost ~]# virsh snapshot-list centos7.0
 名称               生成时间              状态
------------------------------------------------------------
 1665449467           2022-10-11 08:51:07 +0800 running

可以看出,我们成功的为KVM虚拟机创建了快照。但是,在这种创建方式中,快照的名称由KVM随机指定分配。如果我们想自己指定虚拟机的快照名称,则可以执行命令:

virsh snapshot-create-as 【虚拟机名】 【快照名】
[root@localhost ~]# virsh snapshot-create-as centos7.0 centos7.0_s1
已生成域快照 centos7.0_s1

[root@localhost ~]# virsh snapshot-create-as centos7.0 第二次创建的快照   ##也支持创建中文名
3.11.3 回滚快照
[root@localhost ~]# virsh snapshot-revert centos7.0 centos7.0_s1  
3.11.4 查看当前虚拟机使用的快照
[root@localhost ~]# virsh snapshot-current centos7.0   
<domainsnapshot>
  <name>centos7.0_s1</name>    当前使用的快照是centos7.0_s1
  <state>running</state>
  <parent>
    <name>1665449467</name>
3.11.5 查看快照的详细信息
[root@localhost centos7.0]# qemu-img info /data/images/centos7-model.qcow2
image: /data/images/centos7-model.qcow2
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 3.7G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1665449467             368M 2022-10-11 08:51:07   06:38:15.701
3         第二次创建的快照   368M 2022-10-11 08:56:47   06:43:50.302
4         centos7.0_s2           370M 2022-10-11 09:01:56   06:48:56.932
Format specific information:
    compat: 1.1
    lazy refcounts: true
[root@localhost centos7.0]#
3.11.6 删除快照
KVM快照删除命令格式如下:

virsh snapshot-delet 【虚拟机名】 【快照名】
[root@localhost centos7.0]# virsh snapshot-delete centos7.0 centos7.0_s1
已删除域快照 centos7.0_s1

扩展:腾讯云,阿里云中快照功能收费吗? image-20221011091403274

3.12 KVM虚拟机克隆

克隆前, centos7.0 需要提前关机。

语法: virt-clone -o 原虚拟机 -n 新虚拟机 -f 新虚拟机镜像
选项: -o old
      -n new

虚拟机镜像: 就是整个虚拟机文件

3.12.1 完整克隆centos7.1虚拟机方式
[root@localhost centos7.0]# virt-clone -o centos7-1  -n centos7_new -f /data/netfs/centos_new.qcow2

[root@localhost centos7.0]# virt-manager
[root@localhost centos7.0]# ll -h /data/netfs/
总用量 4.6G
-rw-r--r-- 1 qemu qemu  17M 10月 10 16:37 centos7-front.qcow2
-rw------- 1 qemu qemu  41G 10月 10 15:47 centos7-model.qcow2
-rw------- 1 root root 1.6G 10月 11 09:51 centos_new.qcow2
-rw-r--r-- 1 root root 2.0G 10月 10 15:46 disk1.raw
-rw-r--r-- 1 root root 193K 10月 10 15:46 disk2.qcow2
-rw-r--r-- 1 root root 320K 10月
3.12.2 查看原虚拟机和新虚拟机对比
[root@localhost qemu]# vimdiff centos7-1.xml centos7_new.xml

image-20221011100311373

3.12.3 通过XML文件方式克隆

kvm虚拟机主要由两个文件组成,也就是我们通过XML克隆虚拟机,必须要准备这下面2个文件

xml文件:默认路径/etc/libvirt/qemu qcow2镜像文件:自定义路径

1. 复制xml文件到/etc/libvirt/qemu路径

[root@localhost qemu]# cp centos7-1.xml centos7u1_new.xml

2. 修改xml文件,设置对qcow2镜像文件的名字、路径、mac、uuid等关键数据,原始iso镜像路径
[root@localhost data]# cp centos7u9-1.img centos7u9-new.img

3. 复制 centos7-1虚拟机的qcow2文件
[root@localhost images]# cp centos7-1.qcow2 /data/netfs/centos7u1_new.qcow2


4. 通过新虚拟机的xml配置文件,定义新的虚拟机

[root@localhost qemu]# virsh define centos7u1_new1.xml

5. virt-manager启动kvm界面查看是否成功

image-20221011111318065

4、使用脚本创建虚拟机

4.1 创建全新模板虚拟机
4.1.1 安装新虚拟机

image-20221011114919370

4.1.2 更新系统内核和安装常用软件
[root@localhost ~]# yum -y install  wget lrzsz vim net-tools ntp tree unzip zip epel-release
[root@localhost ~]# yum -y update 
4.1.3 关闭防火墙和selinux
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#systemctl disable firewalld

[root@localhost ~]#sed -ir 's/^SELINUX=aa/SELINUX=disabled/g' /etc/sysconfig/selinux
4.1.4 设置定期更新时间
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
4.1.5 更新网卡的配置
[root@localhost network-scripts]# cat ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
[root@localhost network-scripts]#

注意:要将网卡中的UUID删除,后期批量生成新的虚拟机时,由系统再生成新的UUID
4.2 将主机的模板镜像文件备份
[root@localhost networks]# virsh domblklist centos7u9_module
目标     源
------------------------------------------------
vda        /var/lib/libvirt/images/centos7u9_module.qcow2
hda        -

[root@localhost ~]# mkdir /opt/vmm/centos7u9
root@localhost ~]# cp /var/lib/libvirt/images/centos7u9_module.qcow2 /opt/vmm/centos7u9/centos7-module.qcow2        ##镜像模板文件

注意:镜像模板文件不要随便修改。
4.3 生成新的xml模板文件
[root@localhost qemu]# virsh dumpxml centos7u9_module >centos7u9_module.xml

修改模板文件内容如下:
<domain type='kvm' id='44'>
  <name>vmname</name>             修改此处为vmname
  <uuid>vmuuid</uuid>               修改此处为vmuuid
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static' current='2'>4</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
  .......忽略......
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='vmdisk'/>      修改此处为vmdisk
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
 .......忽略......
    <controller type='virtio-serial' index='0'>
      <alias name='virtio-serial0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='vmmac'/>     修改此处为vmmac
      <source network='network1' bridge='virbr3'/>
      <target dev='vnet0'/>
    .......忽略......
  </seclabel>
</domain>


4.4 将镜像模板文件和配置文件复制到/opt/vmm/centos7u9目录中
[root@localhost centos7u9]# ll
总用量 3441684
-rw------- 1 qemu qemu 42956488704 9月  29 09:38 centos7-module.qcow2
-rw-r--r-- 1 root root        4453 9月  29 09:38 centos7-module.xml
4.5 参考脚本
[root@localhost ~]# cat vm.sh
#!/bin/bash
# KVM虚拟机管理工具

workdir=/opt
xml=/etc/libvirt/qemu
img=/var/lib/libvirt/images
vmxmlroot=$workdir/vmm
vmdiskroot=$workdir/vmm
menu(){
cat <<- EOF
A.部署Centos7u9系统
B.部署win2k8r2系统
EOF
}

menu

read -p "请选择需要安装的操作系統:" choose
case $choose in
   A|a)
read -p "请输入您想使用的域名称:" name

vmname=${name}
vmuuid=${uuidgen}
vmdisk=${name}.qcow2
vmmac="52:54:$(openssl rand -hex 4|sed -r 's/(..)/\1:/g;s/.$//')"
cp $vmxmlroot/centos7u9/centos7-module.xml $xml/${vmname}.xml
qemu-img create -f qcow2 -b $vmdiskroot/centos7u9/centos7-module.qcow2 $img/${vmdisk} &> /dev/null
sed -ri "s#vmname#${vmname}#" $xml/${vmname}.xml
sed -ri "s#vmuuid#${vmuuid}#" $xml/${vmname}.xml
sed -ri "s#vmdisk#$img/${vmdisk}#" $xml/${vmname}.xml
sed -ri "s#vmmac#$vmmac#" $xml/${vmname}.xml
   virsh define $xml/${vmname}.xml

  ;;
   B|b)
   echo  "win2k8r2已安装完成"
   ;;

   *)
      echo “请按菜单来选择(A|B or a|b)”
	  ;;

esac

4.6 使用脚本创建新的虚拟机
[root@localhost ~]# bash vm.sh
A.部署Centos7u9系统
B.部署win2k8r2系统
请选择需要安装的操作系統:A
请输入您想使用的域名称:centos7_new
定义域 centos7_new(从 /etc/libvirt/qemu/centos7_new.xml)

image-20221011153538941