其实,我只是想实现虚拟机的增量备份而已。这里已经有这个Feature了,有但是你知道怎么使用吗?
大概浏览了一下,发现这几个关键词:
dirty bitmap,QMP。
大概意思是,用户可以通过QMP(QEMU Machine Protocol)的机制,给虚拟机的某个,或某几个Block Driver绑定一个Dirty Bitmap,这样就能实时获取这个Block Device的增量改变(Incremental Backup)。
怎么搞定这个问题?QMP介绍,QMP命令是怎么和具体函数绑定的?
添加一个QMP命令,需要做两个修改:1 修改qapi-schema.json,在里面添加QMP的命令。2 在代码源文件中添加相应的处理函数,这个处理函数的名字有讲究:qmp_[命令名],这样QMP命令就和相应的处理函数绑定到一起了。
增量备份相关的QMP的命令对应的处理函数在源文件:blockdev.c,的函数:qmp_transaction。顺着源码读下去,会发现最终就是在结构体:BlockDriverState的一个成员:dirty_bitmaps中添加一个BdrvDirtyBitmap。
文件docs/bitmaps.md中的例子:
{ "execute": "transaction",
"arguments": {
"actions": [
{"type": "block-dirty-bitmap-clear",
"data": {"node": "drive0", "name": "bitmap0"} },
{"type": "drive-backup",
"data": {"device": "drive0", "target": "/path/to/new_full_backup.img",
"sync": "full", "format": "qcow2"} }
]
}
}
现在可以很清晰的知道源码中的运行流程了。(简书真的不是用来写技术博客的!)