1. 背景:
一直以为OpenStack的创建快照的操作是在线创建快照(live snapshot), 并且应该是增量的快照,即利用virsh或者qemu的live snapshot来实现的:
virsh snapshot-create-as --live ....
后来发现快照和原始镜像之间并没有依赖关系,感觉OpenStack还做的挺好的,自动解决了增量快照和原始镜像之间的依赖关系;
但是后来又发现做快照的时候虚拟机竟然会shutoff, 就感觉不对了,于是分析了下源码。
2. 结论:目前OpenStack默认的快照方式都是cold snapshot, 首先先关机,其次执行如下命令生成一个镜像文件,再次开机,最后再调用glance api将镜像上传。
qemu-img convert -f qcow2 -O qcow2 <disk_path> <out_path>
所以目前并不是真正意义的快照,其实和关闭虚拟机,拷贝一份,再上传没有本质区别。
一直以为OpenStack的创建快照的操作是在线创建快照(live snapshot), 并且应该是增量的快照,即利用virsh或者qemu的live snapshot来实现的:
virsh snapshot-create-as --live ....
后来发现快照和原始镜像之间并没有依赖关系,感觉OpenStack还做的挺好的,自动解决了增量快照和原始镜像之间的依赖关系;
但是后来又发现做快照的时候虚拟机竟然会shutoff, 就感觉不对了,于是分析了下源码。
2. 结论:目前OpenStack默认的快照方式都是cold snapshot, 首先先关机,其次执行如下命令生成一个镜像文件,再次开机,最后再调用glance api将镜像上传。
qemu-img convert -f qcow2 -O qcow2 <disk_path> <out_path>
所以目前并不是真正意义的快照,其实和关闭虚拟机,拷贝一份,再上传没有本质区别。
3. 源代码流程分析
3.1 nova/compute/api.py
# NOTE(melwitt): We don't check instance lock for snapshot because lock is
# intended to prevent accidental change/delete of instances
@wrap_check_policy
@check_instance_cell
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,
vm_states.PAUSED, vm_states.SUSPENDED])
def snapshot(self, context, instance, name, extra_properties=None):
"""Snapshot the given instance.
:param instance: nova.db.sqlalchemy.models.Instance
:param name: name of the snapshot
:param extra_properties: dict of extra image properties to include
when creating the image.
:returns: A dict containing image metadata
"""
#调用glance api创建image entry,为后将snapshot上传为镜像做准备,虽然镜像和snapshot在可以上传到glance作为镜像启动虚拟机,
#但是为了区分二者的不同,glance将镜像和snapshot标记卫不同的类型:type=image 和 type=snapshot
image_meta = self._create_image(context, instance, name,
'snapshot',
extra_properties=extra_properties)
# NOTE(comstud): Any changes to this method should also be made
# to the snapshot_instance() method in nova/cells/messaging.py
# 将任务状态(task state) 设置为:image_snapshot_pending
instance.task_state = task_states.IMAGE_SNAPSHOT_PENDING
instance.save(expected_ta