ceph中librbd模式下的qemu+librbd

https://docs.ceph.com/en/latest/rbd/qemu-rbd/

下面我把我们前面讨论的关键点串起来,给你一份"从概念到可执行命令"的完整说明,帮助你在已有 rbdpool/image 的前提下,正确使用 qemu + librbd 来启动虚拟机、进入虚拟机、验证磁盘、以及测试结束后的清理。


1. 你目前上下文的核心结论

1) RBD 多客户端映射与一致性

  • 同一个 RBD 镜像可以被多个客户端"打开/映射",但默认不允许多个写者同时写
  • Ceph 通过 exclusive-lock(独占锁) 来保护镜像,避免多个客户端不协调写导致文件系统/数据损坏。
  • 如果强行做多写(禁用锁或绕过协调),Ceph 不会替你做写同步/缓存一致性,高概率出现数据损坏。

2) "客户端"到底是谁

在 qemu+librbd 方案里:

  • Ceph 的客户端是 QEMU 进程(准确说是 QEMU 通过 librbd 发 I/O)
  • 虚拟机(Guest OS)只看到一块"虚拟磁盘"(如 /dev/vda),它不知道 Ceph/RBD 的存在。

3) qemu + librbd 的真实作用

QEMU 负责"虚拟机(CPU/内存/设备)",librbd 负责把 "Ceph RBD 镜像"作为"虚拟机磁盘后端"。

  • 你不需要 rbd map(不会出现 /dev/rbdX
  • 虚拟机里会出现标准块设备(/dev/vda 等)
  • Ceph 侧锁/缓存/高级特性主要由 librbd 路径支撑,适合虚拟化工作负载

2. qemu + librbd 的 I/O 关系图(便于对号入座)

text 复制代码
虚拟机内:/dev/vda 读写
   ↓(virtio)
宿主机:QEMU 进程
   ↓(librbd)
Ceph:RBD(rbdpool/image)→ OSD

3. 开始前的准备(宿主机侧)

3.1 宿主机需要能访问 Ceph

通常需要:

  • /etc/ceph/ceph.conf
  • 一个具备 rbd 权限的 keyring(建议专用用户,如 client.qemu

验证宿主机能访问镜像(这一步很关键):

bash 复制代码
rbd -p rbdpool info image

3.2 建议创建最小权限用户(推荐做法)

在任意有 ceph 命令权限的机器上:

bash 复制代码
ceph auth get-or-create client.qemu \
  mon 'profile rbd' \
  osd 'profile rbd pool=rbdpool' \
  -o /etc/ceph/ceph.client.qemu.keyring

然后把 keyring 放到你的宿主机 /etc/ceph/,并验证:

bash 复制代码
rbd --id qemu -p rbdpool info image

4. 使用 qemu + librbd 启动虚拟机(核心命令)

4.1 最直观的启动命令(virtio 磁盘,串口模式)

bash 复制代码
sudo qemu-system-x86_64 \
  -enable-kvm \
  -m 4096 -smp 2 \
  -drive file=rbd:rbdpool/image:conf=/etc/ceph/ceph.conf:id=qemu:keyring=/etc/ceph/ceph.client.qemu.keyring,format=raw,if=virtio,cache=none \
  -nographic

你需要理解的点:

  • file=rbd:rbdpool/image:...:QEMU 直接用 librbd 打开 RBD 作为磁盘
  • if=virtio:虚拟机里通常显示为 /dev/vda
  • -nographic:把虚拟机控制台绑定到当前终端(适合服务器无桌面环境)

5. 运行后如何"进入虚拟机"

5.1 你用的是 -nographic

  • 当前运行 QEMU 的终端就是虚拟机控制台
  • 如果镜像里已经安装了可启动系统,你会看到启动日志,最终出现 login: 提示

5.2 如何退出(结束本次 VM 运行)

在该终端输入 QEMU 的退出组合键:

  • Ctrl + A,然后按 X

退出后:

  • 虚拟机立刻停止(QEMU 进程结束)
  • 但 RBD 镜像里的数据仍然保留(下次启动还能继续用)

6. 如果你"什么都看不到",通常是这两类原因

6.1 镜像是空盘(没有 OS)

这是最常见情况:你启动的只是一个空块设备,没有可引导系统。

解决:挂载 ISO 安装系统到这个 RBD 镜像。

6.2 系统没有串口输出

有些系统默认只输出到 VGA,不输出到串口,-nographic 看起来就像"黑屏"。

解决:用 VNC 方式启动更直观。


7. 安装系统的推荐做法(挂 ISO + VNC 最稳)

如果 rbdpool/image 还没装系统,建议这样做:

7.1 用 VNC 启动并挂载 ISO

bash 复制代码
sudo qemu-system-x86_64 \
  -enable-kvm \
  -m 4096 -smp 2 \
  -drive file=rbd:rbdpool/image:conf=/etc/ceph/ceph.conf:id=qemu:keyring=/etc/ceph/ceph.client.qemu.keyring,format=raw,if=virtio,cache=none \
  -cdrom ubuntu-22.04-live-server-amd64.iso \
  -boot d \
  -vnc :0

然后用 VNC 客户端连接:

  • 宿主机IP:0

安装完成后,下次不挂 ISO,直接启动即可。


8. 启动后在虚拟机里验证"磁盘确实存在"

在虚拟机里执行:

bash 复制代码
lsblk

你应该看到类似:

text 复制代码
vda   50G  disk
└─vda1 ... part /

这说明:

  • 虚拟机看到了一块磁盘(虚拟磁盘)
  • 这块虚拟磁盘的后端就是 rbdpool/image

9. 测试结束后如何删除/清理环境(按你做过的步骤删)

9.1 关闭虚拟机

-nographicCtrl + AX

或在宿主机 kill QEMU 进程。

9.2 如果你创建了 client.qemu(可选清理)

bash 复制代码
ceph auth del client.qemu
sudo rm -f /etc/ceph/ceph.client.qemu.keyring

9.3 如果镜像是测试镜像并希望删除

先确认没有 watcher:

bash 复制代码
rbd status rbdpool/image

然后删除:

bash 复制代码
rbd rm rbdpool/image

qemu+librbd 本身不会在宿主机创建 /dev/rbdX,所以通常不会遗留块设备映射需要清理。


10. 使用上的关键注意事项(避免踩坑)

  1. 同一个 RBD 镜像建议单写者(单 VM / 单 QEMU 进程 RW)

  2. 如果你发现无法启动或报 "resource busy",要考虑:

    • 另一个客户端还在打开该镜像
    • exclusive-lock 正在被其他写者持有
  3. 若你的目标是"多节点共享读写同一份数据",通常应该选 CephFS,不是多写 RBD


如果你愿意把下面三条信息告诉我,我可以把命令进一步"按你环境定制到一次成功":

  1. 你的 rbdpool/image 目前是空盘还是已经装了系统
  2. 宿主机发行版与 QEMU 版本(以及是否有桌面/VNC 条件)
  3. 你希望用串口登录(-nographic)还是更直观的 VNC/SSH 方式

你这个问题非常关键,而且确实是我前面漏掉的一步 。下面我把 QEMU 是什么、为什么要装、以及在常见系统上如何安装 一次性讲清楚,并且和 qemu + librbd 强关联起来。


一、先说结论:QEMU 不是下载一个文件,而是安装软件包

QEMU 是一个虚拟化程序(用户态进程),
通常通过操作系统的软件包管理器安装,而不是手动下载源码。

安装完成后,你才能使用:

bash 复制代码
qemu-system-x86_64

二、为什么一定要装 QEMU(结合你的上下文)

qemu + librbd 方案中:

  • QEMU = 虚拟机本身
  • librbd = QEMU 访问 Ceph RBD 的方式

没有 QEMU:

  • 就没有虚拟机
  • 也就谈不上 "qemu + librbd"

三、不同系统上如何安装 QEMU(最重要部分)

下面我按你最可能用的几种环境来讲。


1️⃣ Ubuntu / Debian 系(最常见)

1. 安装基础包(推荐)

bash 复制代码
sudo apt update
sudo apt install -y qemu-kvm qemu-system-x86 qemu-utils

说明:

  • qemu-system-x86
    → 提供 qemu-system-x86_64
  • qemu-kvm
    → 启用 KVM 加速(必须)
  • qemu-utils
    → 包含 qemu-img 等工具

2. 安装 Ceph 用户态库(librbd)

bash 复制代码
sudo apt install -y ceph-common

这一步非常关键:

  • 提供 librbd
  • 提供 librados
  • QEMU 才能支持 rbd: 后端

3. 验证是否安装成功

bash 复制代码
qemu-system-x86_64 --version

再验证 QEMU 是否支持 RBD:

bash 复制代码
qemu-img --help | grep rbd

如果能看到 rbd,说明 qemu + librbd 条件满足


2️⃣ CentOS / Rocky / Alma / RHEL 系

1. 安装 QEMU + KVM

bash 复制代码
sudo dnf install -y qemu-kvm qemu-img qemu-system-x86

2. 安装 Ceph 客户端库

bash 复制代码
sudo dnf install -y ceph-common

3️⃣ openEuler(你前面提到过这个环境,我单独说)

1. 安装 QEMU

bash 复制代码
sudo dnf install -y qemu qemu-kvm

2. 安装 Ceph 客户端

bash 复制代码
sudo dnf install -y ceph-common

3. 验证

bash 复制代码
qemu-system-x86_64 --version
qemu-img --help | grep rbd

4️⃣ 验证 KVM 是否可用(强烈建议)

QEMU 能跑 ≠ 有硬件加速。

1. CPU 是否支持虚拟化

bash 复制代码
egrep -c '(vmx|svm)' /proc/cpuinfo

输出 > 0 即支持

2. KVM 设备是否存在

bash 复制代码
ls /dev/kvm

如果不存在:

  • BIOS 可能没开虚拟化
  • 或内核没加载 KVM 模块

四、QEMU 安装后,你"到底得到了什么"

安装完成后,你会得到:

命令 作用
qemu-system-x86_64 启动虚拟机
qemu-img 管理磁盘镜像
librbd 让 QEMU 能访问 Ceph RBD
/dev/kvm 硬件加速(如果支持)

五、和你前面完整流程的对应关系(串起来)

1️⃣ 安装 QEMU

2️⃣ 安装 ceph-common(librbd)

3️⃣ 准备 rbdpool/image

4️⃣ 执行:

bash 复制代码
qemu-system-x86_64 ... file=rbd:rbdpool/image ...

5️⃣ 虚拟机启动,虚拟机里看到磁盘 /dev/vda


六、常见"坑"提前提醒(很重要)

1️⃣ QEMU 装了,但不支持 rbd

  • 原因:没装 ceph-common
  • 表现:启动时报 unknown protocol 'rbd'

2️⃣ QEMU 能跑,但非常慢

  • 原因:没启用 KVM
  • 解决:确认 /dev/kvm 存在 + -enable-kvm

七、一句话终极总结(你可以直接记)

QEMU 是虚拟机本身,通过系统包管理器安装;
安装 ceph-common 后,QEMU 才能通过 librbd 使用 Ceph RBD;
qemu + librbd = 用 Ceph RBD 作为虚拟机磁盘后端。


如果你愿意,下一步我可以帮你:

  • 一步一步从"空服务器"到"跑起来一台 Ceph-backed VM"
  • 或把你现在的环境(发行版 + 版本)告诉我,我给你精确到一条命令的安装清单

这个官方文档页面 "QEMU and Block Devices" (对应 Ceph 文档的 qemu-rbd 部分)讲解了 如何用 QEMU(虚拟机管理器)与 Ceph RBD(RADOS Block Device)结合使用块设备镜像 ,主要内容包括用途、基本使用方式和相关操作细节。以下是提炼后的结构化总结: (docs.ceph.com)


1. 目的和使用场景

这个页面说明了 Ceph RBD 与 QEMU/KVM 的典型使用场景:

  • 最常见的是 将 Ceph RBD 镜像作为虚拟机的块设备后端 ,可以高效地为虚拟机提供磁盘。 (docs.ceph.com)
  • 用户可以先创建一个包含操作系统、应用等内容的"金盘镜像",对其做快照,再克隆给多个虚拟机使用。这样即可快速部署多个虚拟机实例,而不用每次都完整复制整个磁盘镜像。 (docs.ceph.com)

2. 准备条件

为了在 QEMU 中使用 Ceph RBD:

  • 必须有一个 正在运行的 Ceph 集群 。 (docs.ceph.com)
  • QEMU 需要能够访问 Ceph 配置(如 ceph.conf )和相应的 keyring,以获取监视器和 OSD 服务的访问权限。默认情况下,QEMU 会假定配置文件在 /etc/ceph/$cluster.conf,并默认使用 client.admin,除非指定其他用户。 (docs.ceph.com)
  • 在命令或配置中指定用户时,应使用 用户 ID 而不是完整的 client.<id> 形式 。 (docs.ceph.com)

3. 基本操作与命令

3.1 QEMU-img 操作 RBD 镜像

文档列举了如何使用 qemu-img 操作 RBD 镜像的基本方法: (docs.ceph.com)

  • 创建 一个 RBD 镜像(block 设备):

    bash 复制代码
    qemu-img create -f raw rbd:{pool-name}/{image-name} {size}

    建议使用 raw 格式,因为其他格式可能带来性能开销或影响 live migration 等功能。 (docs.ceph.com)

  • 调整大小(resize):

    bash 复制代码
    qemu-img resize rbd:{pool-name}/{image-name} {size}

    用于在线或离线调整 RBD 镜像容量。 (docs.ceph.com)

  • 查看信息

    bash 复制代码
    qemu-img info rbd:{pool-name}/{image-name}

    显示镜像的基本属性、大小等信息。 (docs.ceph.com)


4. 在 QEMU 中使用 RBD 镜像

文档说明了如何在 QEMU 命令行中使用 RBD 镜像作为虚拟机的磁盘后端:

  • QEMU 自 0.15 版本起,无需先在宿主机内核做 rbd map,可以直接用 librbd 在用户态把 RBD 镜像当作块设备传递给虚拟机。这样的好处是:

    • 避免额外的上下文切换
    • 能利用 RBD 缓存机制提升性能

    示例说明:可以将一个 RBD 镜像转换成 QEMU 支持的虚拟磁盘镜像,然后直接在 QEMU 启动命令中引用,例如: (docs.ceph.com)

    bash 复制代码
    qemu -m 1024 -drive format=raw,file=rbd:data/squeeze

    这表示直接在 QEMU 中挂载名为 data/squeeze 的 RBD 镜像作为虚拟机磁盘。 (docs.ceph.com)


5. 性能与缓存

文档还提到:

  • QEMU 的缓存选项可以与 RBD 缓存一起工作,用于优化性能。默认情况下,RBD 的缓存策略可以被 QEMU 的 cache 设置覆盖(例如使用 writeback 模式等)。 (docs.ceph.com)
  • 需要注意,在某些组合配置下,不正确的缓存设置可能导致数据不一致或在 QEMU 异常退出时造成文件系统损坏,因此必须在使用时谨慎选择 cache 参数。 (docs.ceph.com)

6. 支持的高级功能

该节还提及 RBD 与 QEMU 集成支持的一些高级功能配置:

  • 支持 TRIM/Discard 操作,让虚拟机内的文件系统在删除数据后能通知底层 RBD 镜像回收空间,这需要在 QEMU 命令或 libvirt 配置中显式启用。 (docs.ceph.com)

简要总结

这个页面主要讲解了:

  • 如何在 QEMU 环境下使用 Ceph RBD 作为虚拟机块设备
  • 如何通过 qemu-img 创建、调整和查看 RBD 镜像
  • 如何在 QEMU 启动命令中直接引用 RBD 镜像,并利用 librbd 做用户态访问,从而提升效率
  • cache 与高级 I/O 配置注意事项

整体核心是:

Ceph RBD 与 QEMU/KVM 的集成提供了高效、灵活的虚拟机块存储方案,通过 librbd 可以在用户态直接向 Ceph 读取/写入块数据,从而实现可扩展、可缓存的 VM 存储后端。 (docs.ceph.com)


如你需要,我也可以把这个页的内容整理成命令示例 + 参数解释版本(便于实验/实践使用)。

相关推荐
wniuniu_4 小时前
一些问题ceph
ceph
wniuniu_7 小时前
ceph内核模式 和 librbd 模式
运维·服务器·ceph
wniuniu_2 天前
RBD 客户端挂载操作指南
网络·ceph
wniuniu_2 天前
ceph一些细节处理
开发语言·ceph
wniuniu_2 天前
rbd快照
ceph
wniuniu_2 天前
RBD 常用命令速查表
ceph
程序员小董4 天前
ceph ceph-kvstore-tool compact 使用的一些坑
ceph
ShiLiu_mtx4 天前
Ceph - 1
ceph
珂玥c4 天前
Rook部署——k8s集群中使用ceph
运维·ceph·kubernetes