目录
前言
1 qemu部分
1.1 磁盘格式驱动创建
1.2 json文件创建数据结构对象:
2 libvirt部分:
2.1 对应关系设置
2.2参设向指令格式转换
前言
qemu中有很多虚拟机磁盘格式,比如较为熟悉的qcow2,luks,raw等。每种磁盘有各自的数据组织模式以及相应实现的独特功能,比如qcow2虚拟磁盘个格式可以实现快照功能,luks实现的是对数据的加密功能。这些独特功能是对应数据管理与存储模式的外在表现,换言之为了实现相应独特功能,需要合理设置一种数据管理存储模式,并把这种模式加入到qemu的磁盘格式驱动中。
1 qemu部分
1.1 磁盘格式驱动创建
以raw磁盘格式为例来说明一个磁盘格式注册模板:
首先需要初始化类型为BlockDriver类型的对象,在raw磁盘格式中初始化name为“raw“,如果是自定义的则初始化为自定义的磁盘格式名字即可。初始化的对象包含了该磁盘格式所有操作调用函数,比如打开操作(bdrv_open)写入操作(bdrv_co_pwritev)等,磁盘操作函数的具体逻辑依据具体的数据管理模式而定。
完成对BlockDriver类型对象初始化后,通过bdrv_register注册到全局变量bdrv_drivers中,该变量是BlockDriver类型的列表。
1.2 json文件创建数据结构对象:
1: 在block-core.json文件中添加用到的数据结构,以raw类型举例:
2:然后把该数据类型插入到BlockdevOptions中
3:把该对应的驱动名称添加到BlockdevDriver中
2 libvirt部分:
2.1 对应关系设置
在libvirt的解析代码逻辑中,首先我们需要创建磁盘类型字符串与enum之间的对应关系,目的是通过字符串解析找到回应的enum序号,进而做相应的switch处理。
2.2参设向指令格式转换
libvirt需要根据对应的enum需要把字符串转化为props对象,进而用来创建qemu-kvm启动指令,比如这里的VIR_STORAGE_FILE_RAW通过qemuBlockStorageSourceGetFormatRawProps函数把字符串转化为相应的qemu-kvm指令格式。