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 关闭虚拟机
-nographic:Ctrl + A 再 X
或在宿主机 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. 使用上的关键注意事项(避免踩坑)
-
同一个 RBD 镜像建议单写者(单 VM / 单 QEMU 进程 RW)
-
如果你发现无法启动或报 "resource busy",要考虑:
- 另一个客户端还在打开该镜像
- exclusive-lock 正在被其他写者持有
-
若你的目标是"多节点共享读写同一份数据",通常应该选 CephFS,不是多写 RBD
如果你愿意把下面三条信息告诉我,我可以把命令进一步"按你环境定制到一次成功":
- 你的
rbdpool/image目前是空盘还是已经装了系统 - 宿主机发行版与 QEMU 版本(以及是否有桌面/VNC 条件)
- 你希望用串口登录(-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_64qemu-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 设备):
bashqemu-img create -f raw rbd:{pool-name}/{image-name} {size}建议使用
raw格式,因为其他格式可能带来性能开销或影响 live migration 等功能。 (docs.ceph.com) -
调整大小(resize):
bashqemu-img resize rbd:{pool-name}/{image-name} {size}用于在线或离线调整 RBD 镜像容量。 (docs.ceph.com)
-
查看信息:
bashqemu-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)
bashqemu -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)
如你需要,我也可以把这个页的内容整理成命令示例 + 参数解释版本(便于实验/实践使用)。