事件监听
# 始终监听事件 virsh qemu-monitor-event DOMAIN --timestamp --loop # 当收到特定事件后停止监听 virsh qemu-monitor-event DOMAIN --event BLOCK_JOB_COMPLETED备份任务管理
# 通过qmp查看运行中的任务 virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block-jobs" }' # 通过hmp查看运行中的任务 virsh qemu-monitor-command DOMAIN --hmp 'info block-jobs' # 停止备份任务 virsh qemu-monitor-command DOMAIN '{ "execute": "block-job-cancel", "arguments": { "device": "drive-virtio-disk0", "force": true } }' # 暂停备份任务 virsh qemu-monitor-command DOMAIN '{ "execute" : "block-job-pause", "arguments" : { "device" : "drive-virtio-disk0" } }' # 恢复已暂停的备份任务 virsh qemu-monitor-command DOMAIN '{ "execute" : "block-job-resume", "arguments" : { "device" : "drive-virtio-disk0" } }' 5. 磁盘在线备份的4种方式▷ full:完整备份,会将指定磁盘及其链上的所有母盘(backing file),合并输出到本地
▷ top:仅备份当前磁盘,而不包含backing file。此项仅对本地盘有效,对于ceph rbd,top和full的效果一样都是完整备份
▷ none:new I/O,即从执行备份命令起,一旦有IO变化,就会实时导出有变化的数据,直到虚拟机关机或者手工停止job才会停止。仅支持qcow2格式的块设备,不支持raw格式(注意,这里指的是qcow2格式,而并非要求qcow2本地盘)
▷ incremental:指定dirty bitmap进行备份,目前qemu的增量备份就是指基于dirty bitmap的备份
上述4种备份是互斥的:任意一种备份job运行中,都无法执行其他类型的备份,也无法再开启同种备份的新job
full、top、none这三种备份的操作方法非常简单,在前面“常用命令一览”中已经提到,不再赘述,而增量备份会稍微复杂点,本文的重点将放在增量备份上
6. 查询磁盘对应的设备名由于qemu不支持一键备份所有磁盘,因此无论有几块盘,必须先找到要备份的磁盘设备名
可通过qmp或者hmp查找设备名,qmp是qemu原生方法,hmp是为了简化qmp的使用而增加的一层翻译器(其中的h就是human,表示友好可读),hmp虽然好用,但不确定其能否支持所有qmp功能,因此这里只是简单演示下hmp的使用,之后主要还是通过qmp进行操作
# 通过qmp查看 virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }' # 通过hmp查看 virsh qemu-monitor-command DOMAIN --hmp 'info block'输出中的drive-virtio-disk0、drive-virtio-disk1就是设备名
关于qmp和hmp的详细使用,详见笔者的另一篇文章《基于QMP实现对qemu虚拟机进行交互》
https://mp.weixin.qq.com/s/HUo0HO6Sl9xn5-FWiexXoA 7. 什么是bitmap本文将重点讲解bitmap备份
在qemu里,“增量备份”指的就是基于dirty bitmap的incremental备份方式。请注意,这里提到了2个词,dirty bitmap和incremental,接下来,要详细讲解:什么是bitmap、bitmap怎么用、有哪些特性与注意事项,只有了解清楚bitmap,才能做好增量备份
什么是bitmap
通过dirty bitmap可以实现qemu磁盘的在线增量备份,而无需创建一长串的快照
qemu的增量备份通常来说就是指通过dirty bitmap实现的备份
dirty bitmap是qemu实现的,跟踪需要在下次进行增量备份的数据
▷ v2.4开始,支持dirty bitmap,但这时的bitmap只是记录在qemu的仿真器内存中,并没有记录在底层块设备中(底层块设备指ceph rbd、本地盘qcow2等),这种bitmap称为in-memory bitmap,笔者习惯叫做非持久bitmap
▷ v2.10开始,qemu开始支持persistent dirty bitmap,笔者习惯叫做持久bitmap
bitmap、dirty bitmap、persistent dirty bitmap区别
▷ bitmap:是qemu支持的一个高级功能,直到本文编写完成时(v3.1.0),bitmap只有一种类型,就是dirty bitmap
▷ dirty bitmap:是bitmap的一种类型,也是唯一的类型,因此dirty bitmap和bitmap是一回事。由于dirty bitmap是记录在内存中而非磁盘上,因此可以支持任意类型的底层磁盘,比如本地盘、ceph rbd,也支持任意格式的磁盘格式,比如qcow2、raw等等。
▷ persistent dirty bitmap:是dirty bitmap的改进版,因为dirty bitmap是记录在内存中的,当qemu虚拟机关机后,dirty bitmap就消失了,就会导致需要重新做一次完整备份。persistent dirty bitmap是v2.10开始才支持
持久bitmap仅支持qcow2,不支持raw格式(例如本地盘raw文件或者ceph-rbd)
bitmap的名称