手动编译 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

注意

  1. 关于如何从源码编译安装 QEMU,请参考之前的文章:编译和安装 QEMU
  2. 本文仅添加对 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 的虚拟机,问题解决。

参考资料

相关文章

  1. 通过 libvirt 使用 Ceph RBD | Ceph Documentation
  2. QEMU 与块设备 | Ceph Documentation
  3. 使用 Ceph 作为 QEMU KVM 虚拟机的存储 - 冬日の草原
  4. OpenStack 使用 Ceph 存储后端创建虚拟机快照原理剖析 | int32bit’s Blog
  5. OpenStack 使用 Ceph 存储,Ceph 到底做了什么? | int32bit’s Blog
  6. libvirt 使用多个 Ceph 集群 | 李睿的博客
  7. CentOS KVM + Ceph | 李小波
  8. 初始 Ceph | jeremy 的技术点滴
  9. virt-install 工具安装基于 rbd 磁盘的虚拟机 | opengers
  10. QEMU3 - 使用 Ceph 来存储 QEMU 镜像 | 三木的博客
  11. 使用 Ceph 来存储 QEMU 镜像 | 腾讯云+社区
  12. Ceph 常用命令 | CSDN
  13. Ceph 运维常用指令 | 51CTO
  14. OpenStack 对接 Ceph 时的错误 | Linux 公社
  15. KVM + Ceph RBD 快照创建问题 | 51CTO
  16. SOSP19’ Ceph 的十年经验总结:文件系统是否适合做分布式文件系统的后端 | Ceph 开源社区
  17. 通过 libvirt 使用 Ceph 块设备 | 51CTO
  18. Ceph 基础知识和基础架构认识 | 博客园
  19. 验证 RBD 的缓存是否开启 | 磨渣
  20. 管理 Ceph 缓存池 | 博客园
  21. Ceph 的正确玩法之 SSD 作为 HDD 的缓存池 | 华云数据

学习资源

  1. Ceph 运维手册 by 李海静 | Github
  2. Ceph 运维手册 by 李海静 | GitBook!
  3. 文章清单 by 徐小胖’s Blog | 虚拟机搭建部署 Ceph、大话 Ceph 之 PG/RBD/CRUSH
  4. Ceph 常用表格汇总 | 徐小胖’s Blog
  5. Introducing Ceph to OpenStack | Sébastien Han