手动编译 QEMU 源码,开启对 Ceph RBD 的支持。QEMU 版本 4.0.50
1. 问题描述
最近尝试使用 Ceph 作为 KVM 虚拟机的镜像存储方案,已经搭建好了三节点的 Ceph 集群。
先是在本地使用virsh
定义了名为rbd
的 Ceph 存储池:
注意:为了简便起见,暂时关闭了
cephx
认证。生产环境请务必启用
> virsh pool-dumpxml rbd
<pool type='rbd'>
<name>rbd</name>
<uuid>908261b9-942e-4d7d-9fb5-66a170a27afb</uuid>
<capacity unit='bytes'>1607391510528</capacity>
<allocation unit='bytes'>9669956428</allocation>
<available unit='bytes'>1575195836416</available>
<source>
<host name='ceph-master' port='6789'/>
<name>rbd</name>
</source>
</pool>
> virsh vol-list rbd
Name Path
------------------------------------------------------------------------------
centos7 rbd/centos7
win10-base rbd/win10-base
win7 rbd/win7
使用virt-install
生成虚拟机的 XML 配置文件:
> virt-install --name ceph-test \
--machine pc --cpu host-model,disable=vmx \
--vcpus 2 --memory 2048 \
--disk vol=rbd/win10-base \
--disk device=cdrom,bus=ide,path=/mnt/kvm-idv/iso/win10-1809-x64.iso \
--boot cdrom --print-xml > ceph-test.xml
ceph-test.xml
内容如下:
<domain type="kvm">
<name>ceph-test</name>
<uuid>238bd909-04da-42cc-9e0c-11841b58d470</uuid>
<memory>2097152</memory>
<currentMemory>2097152</currentMemory>
<vcpu>2</vcpu>
<os>
<type arch="x86_64" machine="pc">hvm</type>
<boot dev="cdrom"/>
</os>
<features>
<acpi/>
<apic/>
<vmport state="off"/>
</features>
<cpu mode="host-model">
<feature policy="disable" name="vmx"/>
</cpu>
<clock offset="utc">
<timer name="rtc" tickpolicy="catchup"/>
<timer name="pit" tickpolicy="delay"/>
<timer name="hpet" present="no"/>
</clock>
<pm>
<suspend-to-mem enabled="no"/>
<suspend-to-disk enabled="no"/>
</pm>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disk type="network" device="disk">
<driver name="qemu" type="raw"/>
<source protocol="rbd" name="rbd/win10-base">
<host name="ceph-master" port="6789"/>
</source>
<target dev="hda" bus="ide"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<source file="/mnt/kvm-idv/iso/win10-1809-x64.iso"/>
<target dev="hdb" bus="ide"/>
<readonly/>
</disk>
<controller type="usb" index="0" model="ich9-ehci1"/>
<controller type="usb" index="0" model="ich9-uhci1">
<master startport="0"/>
</controller>
<controller type="usb" index="0" model="ich9-uhci2">
<master startport="2"/>
</controller>
<controller type="usb" index="0" model="ich9-uhci3">
<master startport="4"/>
</controller>
<interface type="network">
<source network="default"/>
<mac address="52:54:00:c0:63:ee"/>
</interface>
<graphics type="spice" port="-1" tlsPort="-1" autoport="yes">
<image compression="off"/>
</graphics>
<console type="pty"/>
<channel type="spicevmc">
<target type="virtio" name="com.redhat.spice.0"/>
</channel>
<sound model="ich6"/>
<video>
<model type="qxl"/>
</video>
<redirdev bus="usb" type="spicevmc"/>
<redirdev bus="usb" type="spicevmc"/>
</devices>
</domain>
然而在启动虚拟机时出现了问题:
> virsh define ./ceph-test.xml
Domain ceph-test defined from ./ceph-test.xml
> virsh start ceph-test
error: Failed to start domain ceph-test
error: internal error: process exited while connecting to monitor: 2020-01-02T06:58:54.789212Z qemu-system-x86_64: -drive file=rbd:rbd/win10-base:auth_supported=none:mon_host=ceph-master\:6
789,format=raw,if=none,id=drive-ide0-0-0: Unknown protocol 'rbd'
报错信息提示 QEMU 不支持rbd
协议,突然想起来这台机器上的 QEMU 是自己手动编译的,推测是编译的时候并未开启对 Ceph RBD 的支持。检查一下果然:
> qemu-system-x86_64 --version
QEMU emulator version 4.0.50 (v4.0.0-142-ge0fb2c3d89-dirty)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
> qemu-img -h | grep 'Supported formats'
Supported formats: blkdebug blklogwrites blkreplay blkverify bochs cloop copy-on-read dmg file ftp ftps host_cdrom host_device http https luks nbd null-aio null-co nvme parallels qcow qcow2 qed quorum raw replication sheepdog throttle vdi vhdx vmdk vpc vvfat
并没有rbd
的身影。没办法,只好重新编译一下了。
2. 配置时启用 RBD
注意:
- 关于如何从源码编译安装 QEMU,请参考之前的文章:编译和安装 QEMU
- 本文仅添加对 Ceph RBD 的支持
进入 QEMU 源码目录(此处版本为4.0.50
):
> ./configure --help | grep rbd
rbd rados block device (rbd)
上次配置时使用的参数如下:
> ./configure --prefix=/usr \
--enable-kvm \
--enable-libusb \
--enable-usb-redir \
--enable-debug \
--enable-debug-info \
--enable-curl \
--enable-sdl \
--enable-vhost-net \
--enable-spice \
--enable-vnc \
--enable-opengl \
--enable-gtk \
--target-list=x86_64-softmmu
只需添加--enable-rbd
,即:
> ./configure --prefix=/usr \
--enable-kvm \
--enable-libusb \
--enable-usb-redir \
--enable-debug \
--enable-debug-info \
--enable-curl \
--enable-sdl \
--enable-vhost-net \
--enable-spice \
--enable-vnc \
--enable-opengl \
--enable-gtk \
--enable-rbd \
--target-list=x86_64-softmmu
配置前还需安装一些依赖包,可根据错误提示自行搜索安装。例如 Ubuntu 需要安装下面三个包:
> apt install libcephfs-dev librados-dev librbd-dev
配置完成后检查一下:
> cat ./config-host.mak | grep -i rbd
CONFIG_RBD=m
RBD_CFLAGS=
RBD_LIBS=-lrbd -lrados
可以看到已经开启了对 Ceph RBD 的支持。
3. 编译安装 QEMU
# 编译 QEMU
# 本机共 8 核,故开启 16 线程
> make -j 16
# 验证此时 qemu-img 是否支持 rbd
> ./qemu-img -h | grep rbd
# 安装 QEMU
> make install
之后即可正常启动使用 Ceph RBD 的虚拟机,问题解决。
参考资料
相关文章
- 通过 libvirt 使用 Ceph RBD | Ceph Documentation
- QEMU 与块设备 | Ceph Documentation
- 使用 Ceph 作为 QEMU KVM 虚拟机的存储 - 冬日の草原
- OpenStack 使用 Ceph 存储后端创建虚拟机快照原理剖析 | int32bit’s Blog
- OpenStack 使用 Ceph 存储,Ceph 到底做了什么? | int32bit’s Blog
- libvirt 使用多个 Ceph 集群 | 李睿的博客
- CentOS KVM + Ceph | 李小波
- 初始 Ceph | jeremy 的技术点滴
- virt-install 工具安装基于 rbd 磁盘的虚拟机 | opengers
- QEMU3 - 使用 Ceph 来存储 QEMU 镜像 | 三木的博客
- 使用 Ceph 来存储 QEMU 镜像 | 腾讯云+社区
- Ceph 常用命令 | CSDN
- Ceph 运维常用指令 | 51CTO
- OpenStack 对接 Ceph 时的错误 | Linux 公社
- KVM + Ceph RBD 快照创建问题 | 51CTO
- SOSP19’ Ceph 的十年经验总结:文件系统是否适合做分布式文件系统的后端 | Ceph 开源社区
- 通过 libvirt 使用 Ceph 块设备 | 51CTO
- Ceph 基础知识和基础架构认识 | 博客园
- 验证 RBD 的缓存是否开启 | 磨渣
- 管理 Ceph 缓存池 | 博客园
- Ceph 的正确玩法之 SSD 作为 HDD 的缓存池 | 华云数据