QEMU与块设备详解


Ceph 块设备最常见的用法之一是作为虚拟机的块设备映像。

例如,用户可创建一个安装、配置好了操作系统和相关软件的“黄金标准”映像,然后对此映像做快照,最后再克隆此快照(通常很多次)。

能够实现快照的写时复制克隆意味着 Ceph 可以快速地为虚拟机提供块设备映像,因为客户端每次启动一个新虚拟机时不必下载整个映像。即:

基础镜像 ---> 快照 ---> 克隆(多次)

用法说明

QEMU 命令行要求你指定存储池名和映像名,还可以指定快照名。

QEMU 会假设 Ceph 配置文件位于默认位置(如 /etc/ceph/$cluster.conf ),并且你是以默认的 client.admin 用户执行命令,除非你另外指定了其它 Ceph 配置文件路径或用户。

例如,应该这样指定 id 和 conf 选项:

qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf

Tip:配置中的值如果包含这些字符: : 、 @ 、 = ,可在此符号前加反斜线 \ 转义。

用 QEMU 创建映像

你可以用 QEMU 创建块设备映像。必须指定 rbd 、存储池名、要创建的映像名以及映像尺寸。

qemu-img create -f raw rbd:{pool-name}/{image-name} {size}

例如:

qemu-img create -f raw rbd:data/foo 10G

Important:raw 数据格式是使用 RBD 时的唯一可用 format 选项。从技术上讲,你可以使用 QEMU 支持的其他格式(例如 qcow2 或 vmdk),但是这样做可能会带来额外开销,而且在开启缓存(见下)模式下进行虚拟机的热迁移时会导致卷的不安全性。

用 QEMU 更改映像尺寸

你可以通过 QEMU 调整块设备大小。必须指定 rbd 、存储池名、要调整的映像名,还有映像尺寸。

qemu-img resize rbd:{pool-name}/{image-name} {size}

例如:

qemu-img resize rbd:data/foo 20G

虚拟机磁盘扩容注意事项:

  • 在host主机中添加了磁盘空间后,需要在虚拟管理器中手动添加刷新才能检测到添加的空间;
  • kvm中qcow2格式的镜像只支持加空间不支持减少;
  • 一定要先关闭虚拟机再扩容,否则虚拟机容易崩溃或者会导致扩容失败;
  • 创建好分区后要重启,才能识别到新分区;
  • 在创建主分区的时候,如果使用默认的起始扇区,有可能分配到很小的一块,这是磁盘剩余空间的不连续造成的。可以先fdisk -l查看磁盘分区情况,根据每个分区使用的扇区和磁盘所有的扇区号,可以推算出剩余空闲连续扇区的区号;
  • 在虚拟机开机状态下,在宿主机上为虚拟机磁盘镜像添加容量容易导致虚拟机崩溃,或者不能继续扩容,删除虚拟机之后,要检查虚拟机挂载的磁盘目录下镜像是否删除,没有的话手动删除。

用 QEMU 检索映像信息

你可以用 QEMU 检索块设备映像信息。必须指定 rbd 、存储池名和映像名。

qemu-img info rbd:{pool-name}/{image-name}

例如:

qemu-img info rbd:data/foo

通过 RBD 运行 QEMU

QEMU 能把一主机上的块设备传递给客户机,但从 QEMU 0.15 起,不需要在主机上把映像映射为块设备了。 QEMU 现在能通过 librbd 直接把映像作为虚拟块设备访问。这样性能更好,因为它避免了额外的上下文切换,而且能利用开启 RBD 缓存带来的好处。

你可以用 qemu-img 把已有的虚拟机映像转换为 Ceph 块设备映像。比如你有一个 qcow2 映像,可以这样转换:

qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze

要从那个映像启动虚拟机,执行:

qemu -m 1024 -drive format=raw,file=rbd:data/squeeze

启用 RBD 缓存可显著提升性能。从 QEMU 1.2 起, QEMU 的缓存选项可控制 librbd 缓存:

qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback

如果你的 QEMU 版本较老,你可以用 ‘file’ 参数更改 librbd 缓存配置(就像其它 Ceph 配置选项一样):

qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback

Important:如果你设置了 rbd_cache=true ,那就必须设置 cache=writeback, 否则有可能丢失数据。不设置 cache=writeback , QEMU 就不会向 librbd 发送回写请求。如果 QEMU 退出时未清理干净, rbd 之上的文件系统就有可能崩溃。

QEMU 缓存选项

QEMU 的缓存选项对应下列的 Ceph RBD 缓存选项。

  • 回写:librbd 默认不会进行任何缓存。写和读都直接到达存储集群,而且只有当数据的所有副本都写入磁盘后写操作才会返回。启用缓存后,写操作会立即返回,除非未刷写的字节数大于 rbd cache max dirty 。这种情况下,写动作会触发回写机制并一直阻塞,直到足够多的字节数被刷写。
rbd_cache = true
  • 透写:只有当数据的所有副本都写入磁盘后写操作才会返回,但可能会直接从缓存中读取数据。缓存信息保存在客户端的内存中,每个 RBD 映像有其自己的缓存。对客户端来说缓存位于本地,所以如果有其他用户访问某个映像,不会存在缓存一致性的问题。打开缓存时,在 RBD 之上不能运行 GFS 或 OCFS 。
rbd_cache = true
rbd_cache_max_dirty = 0
  • 无缓存:
rbd_cache = false

注意:QEMU 的缓存选项会覆盖 Ceph 的默认选项(就是那些 Ceph 配置文件里没有的选项)。如果你在 Ceph 配置文件内设置了 RBD 缓存选项,那么它们会覆盖 QEMU 缓存选项。如果你在 QEMU 命令行中设置了缓存选项,它们则会覆盖 Ceph 配置文件里的选项。即优先级为:QEMU命令行缓存选项 > Ceph配置选项 > QEMU缓存选项 > Ceph默认选项。

  • rbd cache writethrough until flush
描述:开始进入透写模式,并且在收到首个 flush 请求后切换到回写模式。启用该项保守但安全,以防 rbd 之上的虚拟机内核太老而不能发送 flush ,例如 Linux 2.6.32 之前的 virtio 驱动。
类型:Boolean
是否必需:No
默认值:true


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM