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了。
VMware虚拟机开启虚拟化。
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 4月 20 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的密码即可。
3)使用virt-manager管理虚拟机
通过MobaxTerm终端执行virt-manager命令,直接就可以打开KVM的管理界面,使用图形化界面管理虚拟机
2.4.安装虚拟机
1)点击打开虚拟机—>输入VNC的密码即可登录虚拟机。
2)一步步完成安装即可。
创建完成。
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与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/
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>
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块存储为虚拟机提供硬盘存储数据。
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)查看硬盘空间是否生效
磁盘空间已生效。
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>
6.3.重启虚拟机
[root@kvm ~]# virsh destroy vs-centos-1
域 vs-centos-1 被删除
[root@kvm ~]# virsh start vs-centos-1
域 vs-centos-1 已开始
6.4.验证虚拟机是否可用
安全没问题。
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 已开始
秒级克隆出来的虚拟机全部可以正常使用。
7.7.总结
在实际的云平台中秒级启动虚拟机的背后,就是以上所演示的步骤,只不过通过人家的云平台,将这些操作全都封装起来,通过程序来自动实现,首先自动在块存储资源池中创建出克隆的镜像,然后生成虚拟机的配置文件,最后在配置文件中调整系统盘的路径,最终将虚拟机导入到虚拟化平台,做到开箱即用。