admin 发表于 2024-8-19 17:00:04

kvm虚机使用ceph rbd块设备作为后端存储

1.KVM的Qemu与Ceph RBD块存储进行对接
1.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/

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

1.安装ceph相关命令
# yum -y install ceph-common

2.拷贝ceph的配置文件
# scp -rp root@ip:/etc/ceph /etc/

3.查看集群的状态
# ceph -s
    cluster 70d27aec-742e-4a95-b000-cf37ebba35d0
   health HEALTH_OK
   monmap e3: 3 mons at {compute1=17.24.14.5:6789/0,compute2=17.24.14.6:6789/0,compute3=17.24.14.7:6789/0}
            election epoch 352, quorum 0,1,2 compute1,compute2,compute3
   osdmap e29566: 131 osds: 128 up, 128 in
            flags sortbitwise,require_jewel_osds
      pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects
            291 TB used, 174 TB / 465 TB avail
               10234 active+clean
                   5 active+clean+scrubbing+deep
                   1 active+clean+scrubbing

1.3.在Ceph集群中为KVM创建一个资源池
# ceph osd pool create kvm_rbd 32 32
pool 'kvm_rbd' created

1.4.使用Qemu在RBD块存储中创建卷
1)在RBD中创建卷

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

# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G
Formatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0


2)查看创建的Qemu卷

# qemu-img info rbd:kvm_rbd/vs-centos7.img
image: rbd:kvm_rbd/vs-centos7.img
file format: raw
virtual size: 500.0G (536870912000 bytes)
disk size: unavailable

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

# rbd -p kvm_rbd ls
vs-centos7.img

# rbd info kvm_rbd/vs-centos7.img
rbd image 'vs-centos7.img':
        size 500 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

1.5.扩容卷的空间
# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G
Image resized

2.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的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。

2.1.在Ceph集群中创建资源池
1.创建资源池
# ceph osd pool create kvm-libvirt-pool 16 16
pool 'kvm-libvirt-pool' created

2.将资源池初始化成RBD类型
# rbd pool init kvm-libvirt-pool

2.2.创建用于KVM访问RBD块存储的用户
# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'

        key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==

2.3.创建Qemu卷
# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G
Formatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0

# 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: 500.0G (536870912000 bytes)
disk size: unavailable

2.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
# cat secret.xml
<secret ephemeral='no' private='no'>
      <usage type='ceph'>
                <name>client.kvm-libvirt secret</name>
      </usage>
</secret>
#name中就是认证用户的名称

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

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

4.查看生成的Secret信息
# virsh secret-list
UUID                                  用量
--------------------------------------------------------------------------------
66d9bec3-cbd7-4161-9614-1d0bc81c5e82ceph client.kvm-libvirt secret
# 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>

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

1)先停止运行虚拟机

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

# virsh destroy vs-centos-1
域 vs-centos-1 被删除

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

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

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

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

# 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.18.0.20' port='6789'/>
         <host name='192.18.0.21' port='6789'/>
         <host name='192.18.0.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)启动虚拟机观察硬盘是否添加成功

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

# 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

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

2.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块存储为虚拟机提供硬盘存储数据。



2.7.RBD提供给KVM虚拟机的硬盘扩容方法
1)扩容RBD块存储中块设备的空间

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

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

2)重启虚拟机

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

# virsh destroy vs-centos-1
域 vs-centos-1 被删除

# virsh start vs-centos-1
域 vs-centos-1 已开始


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

磁盘空间已生效。



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

3.1.将本地的系统盘导入到Ceph集群的RBD中
命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}

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

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

# rbd -p kvm-libvirt-pool ls
vs-centos-1-data.img
vs-centos-1-sys.img

# 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

3.2.修改虚拟机的配置文件调整系统盘的路径
直接将现有系统盘的配置信息修改成下面的内容。

# 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>



3.3.重启虚拟机
# virsh destroy vs-centos-1
域 vs-centos-1 被删除

# virsh start vs-centos-1
域 vs-centos-1 已开始

3.4.验证虚拟机是否可用
安全没问题。



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

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

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

4.1.将现有虚拟机的系统镜像块设备创建一个快照
将系统盘对应的块设备创建一个快照并设置成保护模式。

# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template

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

# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img
# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img


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

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

# cd /etc/libvirt/qemu/
# cp vs-centos-1.xml clone-vm-1.xml
# cp vs-centos-1.xml clone-vm-2.xml


4.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'/>

4.4.1.vs-centos-1虚拟机的配置文件
# 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>

4.4.1.vs-centos-2虚拟机的配置文件
# 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>


4.5.将虚拟机配置文件导入到虚拟化平台
# virsh define clone-vm-1.xml
定义域 clone-vm-1(从 clone-vm-1.xml)

# virsh define clone-vm-2.xml
定义域 clone-vm-2(从 clone-vm-2.xml)


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

# virsh list--all
Id    名称                         状态
----------------------------------------------------
7   vs-centos-1                  running
-   clone-vm-1                     关闭
-   clone-vm-2                     关闭

4.6.启动虚拟机验证是否能够秒级使用
# virsh startclone-vm-1
域 clone-vm-1 已开始

# virsh startclone-vm-2
域 clone-vm-2 已开始


待后期更新。


admin 发表于 2024-8-19 17:00:05

一、将客户端(宿主机或kvm虚拟机)和ceph存储进行连通

1.客户端安装ceph包:yum install ceph或 yum install ceph-common.x86_64(yum search ceph查询包名)

2.将ceph存储节点/etc/ceph目录下ceph.conf和ceph.client.admin.keyring拷贝到客户端的/etc/ceph目录下

3.检查连通性:在客户端执行ceph命令,如ceph -s,能看到ceph集群信息,说明客户端和ceph存储已连通

二、创建rbd盘并挂载给虚拟机

1、创建一个ceph user,下面的例子中使用client.libvirt用户和libvirt-pool池

ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'

验证有效:ceph auth ls|grep client.libvirt



备注:以上命令,如果宿主机和ceph存储已连通,以上命令可在宿主机上执行,否则需在ceph存储上执行

2.创建secret.xml

cat > secret.xml <<EOF

<secret ephemeral='no' private='no'>

      <usage type='ceph'>

                <name>client.libvirt secret</name>

      </usage>

</secret>

EOF

备注:以上命令在宿主机上全部复制并粘贴,最后回车

3.生成uuid

sudo virsh secret-define --file secret.xml

{uuid of secret}

4.获取client.libvirt的key并保存到文件

ceph auth get-key client.libvirt | sudo tee client.libvirt.key

5、设置secret的uuid

sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml

将变量替换成实际的uuid和key

6、创建池libvirt-pool

ceph osd pool create libvirt-pool 64 64

7、创建rbd盘

rbd create --size 10G libvirt-pool/test1 --image-feature layering

查询存储池中的块:rbd ls libvirt-pool

8、关闭虚拟机,编辑虚拟机配置文件,并添加磁盘信息

关闭虚拟机:virsh shutdown vm

编辑虚拟机:virsh edit vm

在disk标签下增加如下信息:

<disk type='network' device='disk'>

      <driver name='qemu' type='raw'/>

      <auth username='libvirt'>

      <secret type='ceph' uuid='{uuid of secret}'/>

      </auth>

      <source protocol='rbd' name='libvirt-pool/rbd_name'>

      <host name='10.25.72.142' port='6789'/>

      <host name='10.25.72.143' port='6789'/>

      <host name='10.25.72.144' port='6789'/>

      </source>

      <target dev='vde' bus='virtio'/>

    </disk>

备注:

需要修改上面5个参数:

1)username是建好的用户名:libvirt

2)uuid替换成第3步生成的uuid

3)host name后的ip为mon的ip和端口

mon的ip和端口,可以在/etc/ceph/ceph.conf中查看,可添加多个mon的ip



4)target dev为挂载后显示的盘符,例子中是vde,挂载后显示的盘符是/dev/vde

5)libvirt-pool/rbd_name是创建的rbd盘

9、查看虚拟机挂载的磁盘

virsh domblklist {vm-domain-name} --details

10、虚机开机,即可使用挂载的rbd盘

virsh start vm
页: [1]
查看完整版本: kvm虚机使用ceph rbd块设备作为后端存储