最近研究了以下qemu最简单的read on direct 镜像格式cow,在稀疏文件的模式下,这种方式还是比较简单,而且有优势的。其优势主要体现在云计算环境中,不需要用到qcow2的那些诸如内部快照,加密,压缩的功能。同时,我觉得作为中间一层的磁盘镜像,要尽可能的利用文件系统的功能而不是像qcow2一样的另立门户,搞一套索引表和块映射表。因为在云计算环境下,一般都是使用主镜像+增量镜像的方式,这种方式最重要的就是要能够加速磁盘的访问,减少内存的开销。所以重新研究一下cow镜像。
1. cow的头部和bitmap表
对于cow镜像而言,没有qcow的cluster分区,完全模拟磁盘的格式,每512B为一个磁盘扇区,我觉得这也是cow在现在的文件系统中没有优势的原因,因为一般的文件系统块大小都超过了512B,如果host的文件系统超过512B,那么也就是说对于一个512B的读写将会很低效。另外,其头部很简单:
struct cow_header_v2 {
uint32_t magic;
uint32_t version;
char backing_file[1024]; //增量镜像的主镜像
int32_t mtime;
uint64_t size; //虚拟磁盘的大小
uint32_t sectorsize;//扇区数目
};
在头部之后紧接着就是bitmap表,bitmap表的1bit代表一个扇区。
2. cow的创建
cow的创建过程主要分为几步
- 解析参数,
- 通过block.c中bdrv_create_file创建一个文件,这是qemu中虚拟磁盘驱动的标准库函数
- 通过bdrv_file_open打开文件,在编辑磁盘驱动时,尽量使用qemu自身的函数
- 填充头部,写入磁盘,调用bdrv_pwrite
- 通过bdrv_truncate扩充文件大小,使其大到能够放置bitmap表。