第34讲:KVM虚拟化与Ceph集群的RBD块存储对接

KVM虚拟化与Ceph集群的RBD块存储对接

Ceph与KVM对接的官方文档:https://docs.ceph.com/en/quincy/rbd/rbd-integrations/

1.搭建KVM虚拟化平台

1.1.虚拟机开启虚拟化功能

搭建KVM虚拟化平台的前提:机器必须支持硬件虚拟机,Intel VT,ADM-v技术,物理机器确保宿主机开启VT等硬件虚拟化,虚拟机开启嵌套功能。

主要是将KVM的Qemu和Libvirt与Ceph集群进行对接,将数据持久化到Ceph集群中。

部署KVM之前,首先查看处理器有没有开启虚拟化功能,如下图所示,能搜索出vmx就表示可以开始部署KVM了。

image-20220420155646614

VMware虚拟机开启虚拟化。

image-20220420160638198

1.2.部署KVM虚拟化平台

1)安装虚拟化平台

[root@kvm ~]# yum -y install qemu-kvm libvirt-daemon libvirt-client virt-install qemu-img-ev virt-manager
[root@kvm ~]# yum groupinstall "Virtualization Host" -y

2)查看虚拟机列表

执行以下命令不报错就说明KVM搭建完成了。

[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------

2.在KVM虚拟化平台中创建一个虚拟机

2.1.创建一个虚拟机的存储盘

[root@kvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/vs-centos-1.img 10G
Formatting '/var/lib/libvirt/images/vs-centos-1.img', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off 

[root@kvm ~]# ll /var/lib/libvirt/images/
总用量 196
-rw-r--r--. 1 qemu qemu 197120 420 17:11 vs-centos-1.img

2.2.创建虚拟机

内存低于1024会报错。

1.创建虚拟机
[root@kvm ~]# virt-install --name vs-centos-1 --memory 1024 --vcpus 1 --disk /var/lib/libvirt/images/vs-centos-1.img --network default --graphics vnc,password=123456,listen=0.0.0.0,port=5900 --cdrom /home/CentOS-7-x86_64-DVD-1804.iso --noautoconsole

开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。

2.查看创建的虚拟机列表
[root@kvm ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 3     vs-centos-1                    running

参数解释:

--name:指定虚拟机的名称。
--memory:虚拟机的内存,单位为MB。
--vcpus:处理器数量。
--disk:存储盘路径。
--network:使用的网络。
--graphics vnc,password=123456,listen=0.0.0.0,port=5900:指定VNC的密码以及监听地址和端口,不同的虚拟机用不同的端口声明。
--cdrom:镜像路径。

2.3.打开虚拟机安装操作系统

两种方式:

  • 通过VNC连接到虚拟机进行安装。
  • 通过KVM管理工具安装虚拟机。

1)查看VNC的监听地址

[root@kvm ~]# virsh vncdisplay vs-centos-1
:0

2)通过工具以VNC的方式远程连接到虚拟机

填写VNC信息,使用的端口号是5900,点击连接,弹出后输入VNC的密码即可。

image-20220420173220183

3)使用virt-manager管理虚拟机

通过MobaxTerm终端执行virt-manager命令,直接就可以打开KVM的管理界面,使用图形化界面管理虚拟机

image-20220420205915889

2.4.安装虚拟机

1)点击打开虚拟机—>输入VNC的密码即可登录虚拟机。

image-20220420213149978

2)一步步完成安装即可。

image-20220420214228012

创建完成。

image-20220420224710917

3.KVM与Ceph集群对接方案

KVM与Ceph集群对接有两种方案:

  • 由Ceph集群的RBD提供块存储,从块存储中创建裸磁盘为虚拟机挂载使用。
  • 由Ceph集群的RBD提供一个块存储,在KVM服务器中挂载块存储映射的硬盘,最后将整个KVM虚拟化数据拷贝到块存储中,至此以后创建的任何虚拟化数据都会保存在这个块存储上。

在实际生产环境中,应用最多还是第一种方案,由Ceph集群的RBD块存储为整个虚拟化平台提供存储资源池,不同的虚拟机可以在RBD存储资源池中创建块设备,分配独立的裸磁盘进行挂载使用。

KVM与Ceph集群对接,主要是Qemu和Libvirt与Ceph集群对接,Qemu负责在RBD中为虚拟机创建块设备,Libvirt负责将创建的块设备挂载到虚拟机中进行使用。

RBD可以为虚拟机提供数据盘和系统盘,在创建虚拟机之前,就将两种类型的硬盘在块存储资源池中完成创建,创建虚拟机时直接挂载这两块RBD块设备作为硬盘,数据最终都会写入到Ceph集群,只是虚拟机的一些文件会落在KVM的服务器中。

后期KVM对接Ceph集群时,迁移数据也非常方便,通过KVM自带的工具就可以将本地的数据文件导入到Ceph集群的RBD存储资源池中,最后修改虚拟机的配置文件,指定新硬盘的路径即可完成数据迁移。

下面会来讲解KVM的Qemu和Libvirt与Ceph集群对接,首先由Qemu在块存储资源池汇总创建块设备硬盘,然后通过Libvirt将块设备硬盘添加到现有的虚拟机中使用。

数据迁移这块,会演示如何将虚拟机本地的数据盘迁移到Ceph集群进行存储,以系统盘为例,数据盘相同操作。

xxxxxxxxxxxxxxxxxxxxxxxxx

全新的KVM对接Ceph集群RBD块存储后,要形成一个规范,先在RBD存储资源池中创建块设备,然后创建虚拟机时挂载这些硬盘,实现虚拟机数据落盘在Ceph集群。

这里就不再讲解如何一步步先在Ceph创建好块设备硬盘,然后再来创建虚拟机了,因为步骤和我们要讲解的几乎一样,只是先后顺序问题而已。

4.KVM的Qemu与Ceph RBD块存储进行对接

4.1.Qemu与RBD块存储对接的架构图

Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。

Qemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。

Qemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。

Qemu与RBD对接架构图

Qemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。

官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/

4.2.配置KVM服务器连接Ceph集群

Qemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。

1.安装ceph相关命令
[root@kvm ~]# yum -y install ceph-common

2.拷贝ceph的配置文件
[root@kvm ~]# scp -rp root@192.168.20.20:/etc/ceph /etc/

3.查看集群的状态
[root@kvm ~]# ceph -s
  cluster:
    id:     a5ec192a-8d13-4624-b253-5b350a616041
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node-1,ceph-node-2,ceph-node-3 (age 2d)
    mgr: ceph-node-1(active, since 2d), standbys: ceph-node-2, ceph-node-3
    mds: cephfs-storage:1 kubernetes_cephfs:1 {cephfs-storage:0=ceph-node-3=up:active,kubernetes_cephfs:0=ceph-node-2=up:active} 1 up:standby
    osd: 8 osds: 8 up (since 2d), 8 in (since 9d)
    rgw: 3 daemons active (ceph-node-1, ceph-node-2, ceph-node-3)
 
  task status:
 
  data:
    pools:   11 pools, 272 pgs
    objects: 488 objects, 423 MiB
    usage:   9.9 GiB used, 70 GiB / 80 GiB avail
    pgs:     272 active+clean

4.3.在Ceph集群中为KVM创建一个资源池

[root@kvm ~]# ceph osd pool create kvm_rbd 16 16
pool 'kvm_rbd' created

4.4.使用Qemu在RBD块存储中创建卷

1)在RBD中创建卷

命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小

[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 5G
Formatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120 cluster_size=0 

2)查看创建的Qemu卷

[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img
image: rbd:kvm_rbd/vs-centos7.img
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: unavailable

这个卷其实就是资源池中创建的一个块设备。

[root@kvm ~]# rbd -p kvm_rbd ls
vs-centos7.img

[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img
rbd image 'vs-centos7.img':
	size 5 GiB in 1280 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 19a9415778427
	block_name_prefix: rbd_data.19a9415778427
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Wed Apr 20 22:14:33 2022
	access_timestamp: Wed Apr 20 22:16:43 2022
	modify_timestamp: Wed Apr 20 22:14:33 2022

4.5.扩容卷的空间

[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G
Image resized

5.Libvirt使用Qemu为KVM虚拟机提供存储

Qemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。

官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/

Libvirt对接KVM

KVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。

大致实现步骤:

1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。

2)创建一个用户用于Libvirt访问Ceph集群的块设备。

3)创建一个Qemu存储卷。

4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。

5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。

其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。

5.1.在Ceph集群中创建资源池

1.创建资源池
[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 16
pool 'kvm-libvirt-pool' created

2.将资源池初始化成RBD类型
[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool

5.2.创建用于KVM访问RBD块存储的用户

[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'
[client.kvm-libvirt]
	key = AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==

5.3.创建Qemu卷

[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 5G
Formatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=5368709120 cluster_size=0 

[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img
image: rbd:kvm-libvirt-pool/vs-centos-1-data.img
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: unavailable

5.4.将Ceph的认证用户写入到KVM的Secret中

首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。

用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。

1.编写带有认证用户名称的xml
[root@kvm ~]# cat secret.xml
<secret ephemeral='no' private='no'>
        <usage type='ceph'>
                <name>client.kvm-libvirt secret</name>
        </usage>
</secret>
#name中就是认证用户的名称

2.将认证用户的xml文件导入到KVM中生成一个Secret
[root@kvm ~]# virsh secret-define --file secret.xml 
生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82

3.将认证用户的Key写入到Secret中
[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==
secret 值设定
#--secret:secret的uuid
#--base64:用户的key

4.查看生成的Secret信息
[root@kvm ~]# virsh secret-list 
 UUID                                  用量
--------------------------------------------------------------------------------
 66d9bec3-cbd7-4161-9614-1d0bc81c5e82  ceph client.kvm-libvirt secret
[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
<secret ephemeral='no' private='no'>
  <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>
  <usage type='ceph'>
    <name>client.kvm-libvirt secret</name>
  </usage>
</secret>

5.5.在虚拟机中应用RBD块存储中创建的块设备

需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。

1)先停止运行虚拟机

虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。

[root@kvm ~]# virsh destroy vs-centos-1 
域 vs-centos-1 被删除

2)调整虚拟机的配置文件增加硬盘

<devices>模块中添加一组<disk><disk>就是用来配置硬盘的信息。

<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。

<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。

[root@kvm ~]# virsh edit vs-centos-1 
    <disk type='network' device='disk'>
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>
           <host name='192.168.20.20' port='6789'/>
           <host name='192.168.20.21' port='6789'/>
           <host name='192.168.20.22' port='6789'/>
      </source>
      <auth username='kvm-libvirt'>
           <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
      </auth>
      <target dev='vdb' bus='virtio'/>
    </disk>

image-20220421163801714

3)启动虚拟机观察硬盘是否添加成功

两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。

[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'
drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/vs-centos-1.img ro=0 drv=qcow2 encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
drive-virtio-disk1: removable=0 io-status=ok file=rbd:kvm-libvirt-pool/vs-centos-1-data.img:id=kvm-libvirt:key=AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==:auth_supported=cephx\\;none:mon_host=192.168.20.20\\:6789\\;192.168.20.21\\:6789\\;192.168.20.22\\:6789 ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
drive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]

[root@kvm ~]# virsh domblklist vs-centos-1 
目标     源
------------------------------------------------
vda        /var/lib/libvirt/images/vs-centos-1.img
vdb        kvm-libvirt-pool/vs-centos-1-data.img
hda        -

5.6.虚拟机使用RBD块存储提供的硬盘

RBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。

由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。

lsblk
mkfs.xfs /dev/vdb
mkdir /data
mount /dev/vdb /data
df -hT
cd /data
touch file{1..5}.txt
ll

此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。

image-20220421111902523

5.7.RBD提供给KVM虚拟机的硬盘扩容方法

1)扩容RBD块存储中块设备的空间

将原来的5G扩容到7G。

[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G
Image resized.

2)重启虚拟机

KVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。

[root@kvm ~]# virsh destroy vs-centos-1
域 vs-centos-1 被删除

[root@kvm ~]# virsh start vs-centos-1
域 vs-centos-1 已开始

3)查看硬盘空间是否生效

磁盘空间已生效。

image-20220421112636837

6.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储

首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。

6.1.将本地的系统盘导入到Ceph集群的RBD中

命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}

[root@kvm ~]# qemu-img convert -f qcow2 /var/lib/libvirt/images/virtual-host.img -O raw rbd:kvm-libvirt-pool/vs-centos-1-sys.img

查看导入到RBD块存储的系统盘。

[root@kvm ~]# rbd -p kvm-libvirt-pool ls
vs-centos-1-data.img
vs-centos-1-sys.img

[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img
rbd image 'vs-centos-1-sys.img':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 19a5d559f577b
	block_name_prefix: rbd_data.19a5d559f577b
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Thu Apr 21 13:06:56 2022
	access_timestamp: Thu Apr 21 13:06:56 2022
	modify_timestamp: Thu Apr 21 13:08:58 2022

6.2.修改虚拟机的配置文件调整系统盘的路径

直接将现有系统盘的配置信息修改成下面的内容。

[root@kvm ~]# virsh edit vs-centos-1 
    <disk type='network' device='disk'>
      <driver name='qemu'/>
      <auth username='kvm-libvirt'>
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
      </auth>
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>
        <host name='192.168.20.20' port='6789'/>
        <host name='192.168.20.21' port='6789'/>
        <host name='192.168.20.22' port='6789'/>
      </source>
      <target dev='vda' bus='virtio'/>
    </disk>

image-20220421163924797

6.3.重启虚拟机

[root@kvm ~]# virsh destroy vs-centos-1
域 vs-centos-1 被删除

[root@kvm ~]# virsh start vs-centos-1
域 vs-centos-1 已开始

6.4.验证虚拟机是否可用

安全没问题。

image-20220421164741716

7.实现类似云平台秒级部署虚拟机

在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。

秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。

如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。

7.1.将现有虚拟机的系统镜像块设备创建一个快照

将系统盘对应的块设备创建一个快照并设置成保护模式。

[root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template

7.2.为新虚拟机提供克隆镜像

为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。

[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img

7.3.通过虚拟机文件准备多个虚拟机

KVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。

进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。

[root@kvm qemu]# cd /etc/libvirt/qemu/
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml 
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml

7.4.编辑虚拟机的配置文件

在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。

<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>

<mac address='52:54:00:eb:f6:97'/>

<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>

7.4.1.vs-centos-1虚拟机的配置文件
[root@kvm qemu]# vim clone-vm-1.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 edit vs-centos-1
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>clone-vm-1</name>									<!--虚拟机的名称-->
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Nehalem-IBRS</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='network' device='disk'>
      <driver name='qemu'/>
      <auth username='kvm-libvirt'>
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
      </auth>
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'>			<!--填写克隆的系统镜像块存储路径-->
        <host name='192.168.20.20' port='6789'/>
        <host name='192.168.20.21' port='6789'/>
        <host name='192.168.20.22' port='6789'/>
      </source>
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>		<!--修改VNC的端口号-->
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>
7.4.1.vs-centos-2虚拟机的配置文件
[root@kvm qemu]# vim clone-vm-2.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 edit vs-centos-1
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>clone-vm-2</name>									<!--虚拟机的名称-->
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Nehalem-IBRS</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='network' device='disk'>
      <driver name='qemu'/>
      <auth username='kvm-libvirt'>
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
      </auth>
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'>			<!--填写克隆的系统镜像块存储路径-->
        <host name='192.168.20.20' port='6789'/>
        <host name='192.168.20.21' port='6789'/>
        <host name='192.168.20.22' port='6789'/>
      </source>
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'>		<!--修改VNC的端口号-->
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>

7.5.将虚拟机配置文件导入到虚拟化平台

[root@kvm qemu]# virsh define clone-vm-1.xml 
定义域 clone-vm-1(从 clone-vm-1.xml)

[root@kvm qemu]# virsh define clone-vm-2.xml 
定义域 clone-vm-2(从 clone-vm-2.xml)

导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。

[root@kvm qemu]# virsh list  --all
 Id    名称                         状态
----------------------------------------------------
 7     vs-centos-1                    running
 -     clone-vm-1                     关闭
 -     clone-vm-2                     关闭

7.6.启动虚拟机验证是否能够秒级使用

[root@kvm qemu]# virsh start  clone-vm-1
域 clone-vm-1 已开始

[root@kvm qemu]# virsh start  clone-vm-2
域 clone-vm-2 已开始

image-20220421231734922

秒级克隆出来的虚拟机全部可以正常使用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.7.总结

在实际的云平台中秒级启动虚拟机的背后,就是以上所演示的步骤,只不过通过人家的云平台,将这些操作全都封装起来,通过程序来自动实现,首先自动在块存储资源池中创建出克隆的镜像,然后生成虚拟机的配置文件,最后在配置文件中调整系统盘的路径,最终将虚拟机导入到虚拟化平台,做到开箱即用。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiangxl~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值