以下分析基于 xen4.2.3, 虚拟机都是hvm模式

使用libxl库有两种方式启动一个虚拟机,一种是 xl create xx.conf , 这种方式从一个配置文件开始启动一个虚拟机,速度相对较慢。另一种是xl restore checkpointfile , 这种从一个checkpoint文件启动(恢复)虚拟机,速度非常快。 checkpointfile 可以认为是一个虚拟机快照,保存了虚拟机某一时刻的内存和设备状态,这里的‘某一时刻’其实就是执行保存快照  xl save domainname checkpointfile 的时刻。

一. xl  save 流程

假设一开始是从xl create的方式启动的虚拟机 domtest, 执行到某一时刻相要通过xl save保存快照,xl save 执行的时候涉及多个进程,如下:

进程1: xl create domtest.conf

进程2: qemu-dm

进程3: xl save

进程4: libxl_save_helper (xen4.2 引入的)

一般xl create虚拟机后会发生多次fork和daemon调用,但完全启动之后主要的应用层进程就是 xl create 和 Qemu-dm 两个精灵进程。xl save执行时候还涉及两个文件,如下:

文件1: /var/lib/xen/userdata-d.domid.domuuid 文件

文件2:/var/lib/xen/qemu-resume.domid 文件

xl create过程中,虚拟机的配置会被保留一份在上述文件1里,而文件2是在xl save执行过程中由qemu-dm进程产生的。

下面是 "xl save checkpointfile "  命令执行的基本过程:

1. xl save 进程将文件1拷贝到checkpointfile文件开头

2. xl save 进程调用fork, 子进程调用 execvp 载入可执行程序 libxl-save-helper 变成进程4, 这个helper进程通过 libxc 库将虚拟机的整个内存状态保存在一个虚拟地址开始的内存空间里,这个虚拟地址是启动 libxl-save-helper时由 xl save 进程传进去的

3. 在子进程执行libxl-save-helper时,父进程执行下述步骤

3.1 调用 xc_domain_shutdown 关闭虚拟机,并进入一个循环,循环内调用 xc_domain_getinfolist 查看虚拟机是否关闭,如果关闭退出循环进入3.2. 这一步执行完之后,xl create进程就死掉了

3.2 调用xenstore接口往  /local/domain/0/device-model/%d/command 键写入 'save' , 这会导致进程进程3 qemu-dm 将设备状态保存到文件 /var/lib/xen/qemu-save.xx,保存好之后,qemu-dm会进入状态paused

3.3 进入一个循环,循环内检测/local/domain/0/device-model/1/state 的值是否为 paused ,如果不是等待超时

3.4 如果在3.3超时退出,则save失败。如果没有超时,则开始等待 libxl-save-helper 进程,如果后者执行完成,则执行3.5

3.5 将 /var/lib/xen/qemu-save.xx文件的内容拷贝到checkpointfile文件,至此,虚拟机的配置、内存、设备模型都已经保存到了checkpointfile文件

3.6 杀死 qemu-dm 进程并调用 libxc 接口删除虚拟机(内核部分的清理)

二 restore 流程

restore流程跟save流程基本相反, xl restore checkpointfile

1. 从checkpointfile里读取第一部分的配置部分,根据配置分配结构启动内核进程等等

2. 调用 libxl-save-helper , 恢复内存状态

3. 将checkpointfile 的最后设备模型那部分拷贝到 /var/lib/xen/qemu-save.xx文件, 并启动 Qemu-dm 进程, qemu-save.xx 文件作为 qemu-dm 的 loadvm 参数传进去

参考:

2010 的文章,比较老了,流程跟4.2 的也有些不一样:Fast, Lightweight Virtual Machine Checkpointing

xen save/restore 过程的更多相关文章

  1. android学习6——canvas的save,restore作用

    先看如下代码 public class SaveRestoreActivity extends Activity { @Override public void onCreate(Bundle sav ...

  2. 莫烦tensorflow(9)-Save&Restore

    import tensorflow as tfimport numpy as np ##save to file#rember to define the same dtype and shape w ...

  3. 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)

    1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...

  4. HTM5 之 Canvas save 、restore 恢复画布状态的理解

    save是用来保存canvas状态,这句话很关键,意思是指后续对canvas的操作:平移.放缩.旋转.错切.裁剪等可以恢复. 我之前一直没能理解,认为对画布的画线等操作也可以恢复,其实不是这样子的,只 ...

  5. 实验五:分析system_call中断处理过程

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

  6. Xen安装部署和基本原理

    Refer to : http://www.178linux.com/14764 目录:   1. Xen的简介   1.1  Xen的大体结构   1.2 Xen对VM的称呼   1.3 Xen对C ...

  7. Xen虚拟化

    Xen虚拟化基础 Xen虚拟化类型 hypervisor Xen组件 Xen hypervisor Colletion CPU.Memory.Interrupter Domain0 ---> D ...

  8. O060、Restore Volume 操作

    参考https://www.cnblogs.com/CloudMan6/p/5668872.html   前面我们学习了backup操作,现在我们来学习如何使用backup进行restore.   r ...

  9. Tensorflow 保存和载入训练过程

    本节涉及点: 保存训练过程 载入保存的训练过程并继续训练 通过命令行参数控制是否强制重新开始训练 训练过程中的手动保存 保存训练过程前,程序征得同意 一.保存训练过程 以下方代码为例: import ...

随机推荐

  1. 007---Django的视图层

    视图函数 一个视图函数,简称视图,是一个简单的python函数.它接收web请求并且返回web响应. 1.一张网页的HTML内容 2.一个重定向 3.一个404错误 4.一个xml文档 5.一个字符串 ...

  2. Hadoop环境搭建 (伪分布式搭建)

    一,Hadoop版本下载 建议下载:Hadoop2.5.0 (虽然是老版本,但是在企业级别中运用非常稳定,新版本虽然添加了些小功能但是版本稳定性有带与考核) 1.下载地址: hadoop.apache ...

  3. 理解线程3 c语言示例线程基本操作

    Table of Contents 1. 基本线程的动作 1.1. 设置线程属性 1.1.1. 设置脱离状态 1.1.2. 设置调度属性 1.2. 取消线程 1.3. 主线程创建多个线程示例 2. 了 ...

  4. build dynamic libraries for iOS and load them at runtime

    编译了libmt.dylib, 和 test 程序调用,均正常.在xcode中显示调用正常,隐式调用则出现问题. 提示 dyld: Library not loaded. 即使存在在/usr/lib/ ...

  5. ACE handle_timeout 事件重入

    当多线程运行反应器事件时, 注意handle_timeout会重入,单独线程不存在下列问题! 1. 一个timer事件 // test_ace_timer.cpp : Defines the entr ...

  6. Android保持屏幕常亮唤醒状态

    第一步:  首先添加权限: <uses-permission android:name="android.permission.WAKE_LOCK"></uses ...

  7. 《Cracking the Coding Interview》——第4章:树和图——题目4

    2014-03-19 03:40 题目:给定一棵二叉树,把每一层的节点串成一个链表,最终返回一个链表数组. 解法:前序遍历,遍历的同时向各个链表里添加节点.水平遍历好像还不如前序遍历来得方便. 代码: ...

  8. 《Cracking the Coding Interview》——第3章:栈和队列——题目2

    2014-03-18 05:08 题目:实现一个栈,除了能进行push和pop之外,还能在O(1)时间内返回栈中最小的元素. 解法:用另一个“最小栈”存放最小的元素,每当有不小于当前最小值的元素进栈时 ...

  9. CocosCreator设置模拟器默认横竖屏以及机型

    之前好好的横屏,今天不知道为毛突然变成竖屏了,虽然可以在点击模拟器左上角进行设置,   但是 每次启动模拟器又变成竖屏了,折腾了很久,终于找到了设置的地方,记录下:        

  10. web前端开发总结(未完)

    由于我也是接触前端开发不久,所以呢,自己也会做点小功课,于是,我把前端能够用到的知识稍稍做了下总结,总结的不全面,以后会慢慢完善的! 移动前端开发基础 (总结----待完善)1.移动前端开发:简而言之 ...