QEMU源码全解析 —— 块设备虚拟化(17)

接前一篇文章: QEMU源码全解析 —— 块设备虚拟化(16)

本文内容参考:

《趣谈 Linux操作系统 》 —— 刘超, 极客时间

QEMU /KVM源码解析与应用》 —— 李强,机械工业出版社

《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社

qemu-system-x86_64命令_牛客网

特此致谢!

QEMU启动过程中的块设备虚拟化

上一回开始讲解QEMU启动过程中的块设备虚拟化。先从QEMU的启动命令行讲起,讲解了启动命令行中存储相关的基本配置选项,本回继续讲解更多配置选项。

详细配置存储驱动器的-drive参数

除了上一回讲解的存储的基本配置选项,QEMU还提供了一个“-driver”参数来详细定义一个存储驱动器。该参数的具体形式如下:

-drive option [, option [, option [,...]]]

为客户机定义一个新的驱动器,其有如下一些选项(option):

(1)file=<file>

使用file文件作为镜像文件,加载到客户机的驱动器中。

(2)if=<interface>

指定驱动器的接口类型。可用的类型有:ide、scsi、sd、mtd、floppy、pflash、virtio等。

(3)bus=<bus>

设置驱动器在客户机中的总线编号和单元编号。

(4)index=<index>

设置在同一种接口的驱动器中的索引编号。

(5)media=<media>

设置驱动器中媒介的类型,其可选值为“disk”或“cdrom”。

(6)snapshot=<snapshot>

设置是否启用“-snapshot”选项,其可选值为“on”或“off”。当snapshot启用时,QEMU不会将磁盘数据的更改写回镜像文件中,而是写入临时文件中。

(7)cache=<cache>

设置宿主机对块设备数据访问中的cache情况,可以设置为“none”(或“off”)、“writeback”、“writethrough”等。其默认值是“writethrough”,即“直写模式”。

“writethrough”(即“直写模式”)是在调用write写入数据的同时,将数据写入磁盘缓存(disk cache)和后端块设备(block device)中。其优点是操作简单,缺点是写入数据速度较慢。

而“writeback”(即“回写模式”)是在调用write写入数据时,只将数据写入磁盘缓存中即返回,只有在数据被换出缓存时才将修改的数据写入到后端块设备中。其优点是写入速度较快,缺点是一旦更新数据、在写入后端存储之前遇到系统掉电,数据无法恢复。

“writethrough”和“writeback”在读取数据时都尽量使用缓存,若设置了“cache=none”,即关闭缓存的方式,则QEMU将在调用open系统调用打开镜像文件时使用“O_DIRECT”标识,所以其读写数据都是绕过缓存、直接从块设备中读写的。一些块设备文件(如qcow2格式文件)在“writethrough”模式下性能表现很差,如果这时对性能要求比正确性更高,则建议使用“writeback”模式。

(8)aio=<aio>

选择异步IO(Asynchronous IO)的方式,有“threads”和“native”两个值可选。其默认值为“threads”,即让一个线程池处理异步IO。而“native”只适用于“cache=none”的情况,就是使用Linux原生的AIO。

(9)format=<format>

指定使用的磁盘格式。默认情况下,QEMU自动检测磁盘格式。

(10)serial=<serial>

指定分配给设备的序列号。

(11)addr=<addr>

分配给驱动器控制器的PCI地址,该选项只有在使用virtio接口时才适用。

(12)id=<name>

设置该驱动器的ID,这个ID可以在QEMU monitor中使用“info block”命令查看到。

(13)readonly=on|off

设置该驱动器是否只读。

更多内容请看下回。