nova boot 的工作流
- 为虚拟机分配网络,由nova.compute.manager处理。
- 创建磁盘文件并映射块设备,在这个过程中,首先从glance服务下载对应的image到instance_dir/_base, 将下载下来的镜像转换成RAW格式。创建磁盘文件instance_dir/uuid/{disk, disk.local, disk.swap}。
- 生成libvirt xml文件,拷贝一份/var/lib/nova/instance/uuid/libvirt.xml。
- 建立与磁盘卷的连接(这个主要用于boot-from-volume这种方式),具体执行什么样的操作取决于所使用volume的driver,iSCSI是通过tgt或者iscsiadm来建立连接,RBD主要由qemu处理。
- 建立必要的network stack,如创建bridges,为虚拟机创建安全组等。
- 通过libvirt用生成的xml文件定义一台虚拟机,等价于virsh define /var/lib/instance/uuid/libvirt.xml。
- 启动实例,virsh start uuid。
hard reboot 的工作流
- destroy the domain 执行libvirt操作virsh destroy instance-id,执行当前操作不会损坏虚拟机的任何数据, 仅做kill -9 qemu-system-x86_64进程。
- 重新建立与磁盘卷的连接。
- 为虚拟机重新生成libvirt XML文件。
- 检查并且重新下载丢失的备份文件(instance_dir/_base)。
- 重新创建网桥,Vlan接口。
- 重新生成iptables规则并作用于虚拟机。
suspend 的工作流
- 相当于执行virsh managed-save操作,行为类似于hiberate操作。
- 保存内存里面的数据到磁盘。
- 恢复虚拟机,virsh resume instance-id。