Nova snapshot 目前只提供一种创造系统盘镜像的方法,不支持内存快照,不支持回滚至快照点,只能采用该快照镜像创建一个新的虚拟机。
也就是对当前的系统盘做一个快照生成 qcow2 格式的文件,然后上传到 glance 里面,其作用也往往是方便使用快照生成的镜像来部署新的虚机。
而Live Snapshot 则允许用户在虚机处于运行状态时不停机做快照。
下面我们通过pdb调试工具,剖析一下nova创建虚机热快照的具体过程:
工欲善其事必先利其器,在阅读源码的过程中如果能够有效的结合gdb/pdb等调试工具, 能够让你的学习事倍功半。
- 首先通过命令行创建一个虚机
# nova boot zhuozh-2 --image bcec-bclinux-7.1-amd64-server-10G-2015.08.15 --flavor 2 --nic net-id=00ea69c0-fa14-4311-be4d-bf07a73b3568 --availability-zone nova:node-35.domain.bcec
# nova show zhuozh-2并确认虚机正常启动,处于ACTIVE状态
...
| OS-EXT-SRV-ATTR:instance_name | instance-000084ea
| OS-EXT-STS:vm_state | active
...
在计算节点上查看虚机的ID号:
# virsh list
Id Name State
----------------------------------------------------
7 instance-000084ea running
在计算节点上查看盘,有两块盘,一块系统盘,一块CDROM
# virsh domblklist 7
Target Source
------------------------------------------------
vda /var/lib/nova/instances/50aa05e6-04e8-4807-9c9f-59d477b66b0c/disk
vdz /var/lib/nova/instances/50aa05e6-04e8-4807-9c9f-59d477b66b0c/disk.config
- 首先停掉计算节点的nova-compute服务:
# service openstack-nova-compute stop
在调试之前,在快照创建的必经之路上上加入调试断点:
import pdb
pdb.set_trace()
如下:
# vim /usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py
def snapshot(self, context, instance, image_href, update_task_state):
"""Create snapshot from a running VM instance.
This command only works with qemu 0.14+
"""
import pdb
pdb.set_trace()
手动启动nova-compute服务:
# usr/bin/nova-compute --config-file=/etc/nova/nova.conf --log-file=/var/log/nova/compute.log
这样创建快照的时候,就会在 snapshot()入口函数这里停住,接下来,可以像gdb一样进行调试(l查看源码,s下一句,n下一函数, p打印)
- 接下来利用nova image-create对系统盘创建快照,并添加--debug查看快照的创建过程:
# nova --debug image-create 2e096559-6187-45a8-b3d8-b787e3da2e2a "zhuozh-1-ss" --show
...
REQ: curl -i 'http://10.133.1.2:8774/v2/1f6364c9386b4cc687a659a466339cb8/servers/6efd608b-2ed0-477d-b770-7e05eb71fd04/action' -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "User-Agent: python-novaclient" -H "X-Auth-Project-Id: admin" -H "X-Auth-Token: {SHA1}9f718579f6e5045fbd533eea58e1f3d497fb183f" -d '{"createImage": {"name": "zhuozh-1-ss", "metadata": {}}}'
...
可以看到调用的API为/usr/lib/python2.7/dist-packages/nova/api/openstack/compute/servers.py中的
def _action_create_image(self, req, id, body)
nova调用栈大致如下(|-->):
# compute/servers.py
def _action_create_image(self, req, id, body)
#如果是volume则调用volum