qemu-kvm savevm/loadvm 流程

1. 流程:

1)测试设备是否支持snapshot保存

2)停止虚拟机

3)保存虚拟机状态

4)创建快照

5)恢复虚拟机

2. 函数调用:

1) 入口函数

do_savevm()

2) 函数调用:

1) bdrv_snapshots()

2) vm_stop()

3) qemu_savevm_state()

4) bdrv_snapshot_create()

5) vm_start()

3. 保存状态关键函数qemu_savevm_state()调用

1) qemu_savevm_state_begin()

2) qemu_savevm_state_iterate()

3) qemu_savevm_state_complete()

4. 关键结构体

1)savevm_handlers 设备状态保存函数链表头

通过QTAILQ_FOREACH(se, &savevm_handlers, entry){}遍历保存所有设备状态;

2)QEMUFile

struct QEMUFile {
    QEMUFilePutBufferFunc *put_buffer;
    QEMUFileGetBufferFunc *get_buffer;
    QEMUFileCloseFunc *close; 
    QEMUFileRateLimit *rate_limit; 
    QEMUFileSetRateLimit *set_rate_limit;
    QEMUFileGetRateLimit *get_rate_limit;
    void *opaque;
    int is_write;

int64_t buf_offset; /* start of buffer when writing, end of buffer
                           when reading */
    int buf_index;            
    int buf_size; /* 0 when writing */ 
    int buf_max_size;
    uint8_t *buf;             
    
    int has_error;            
};

其中put_buffer/get_buffer为关键函数,用来保存/获取设备状态

通过qemu_fopen_ops()函数注册该结构体

QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,                                                                                    
                         QEMUFileGetBufferFunc *get_buffer,
                         QEMUFileCloseFunc *close,
                         QEMUFileRateLimit *rate_limit,
                         QEMUFileSetRateLimit *set_rate_limit,
                         QEMUFileGetRateLimit *get_rate_limit)
{   
    QEMUFile *f;
    
    f = qemu_mallocz(sizeof(QEMUFile));
    
    f->opaque = opaque;
    f->put_buffer = put_buffer;
    f->get_buffer = get_buffer;
    f->close = close;
    f->rate_limit = rate_limit;
    f->set_rate_limit = set_rate_limit;
    f->get_rate_limit = get_rate_limit;
    f->is_write = 0;
    
    f->buf_max_size = IO_BUF_SIZE;
    f->buf = qemu_malloc(sizeof(uint8_t) * f->buf_max_size);
                             
    return f;
}

3)SaveStateEntry

typedef struct SaveStateEntry {                                                                                                                              
    QTAILQ_ENTRY(SaveStateEntry) entry;
    char idstr[256];
    int instance_id;
    int alias_id;
    int version_id;
    int section_id;
    SaveSetParamsHandler *set_params;
    SaveLiveStateHandler *save_live_state;
    SaveStateHandler *save_state;
    LoadStateHandler *load_state;
    const VMStateDescription *vmsd;
    void *opaque;
    CompatEntry *compat;
    int no_migrate;
} SaveStateEntry;

4) register_savevm_live()

注册保存设备状态函数,填充了结构体SaveStateEntry,并把函数加入到队列中:

QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);

如果该设备支持动态迁移和状态保存,必须注册调用改函数注册信息。

qemu-kvm savevm/loadvm 流程相关推荐

  1. 【KVM系列08】使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机

    第八章 使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 1. QEMU/KVM 迁移的概念 1.1 迁移效率的衡量 1.2 KVM 迁移的原理 1.3 使用命令行的方式做动态迁移 ...

  2. KVM之使用libvirt迁移QEMU/KVM、Nova虚机

    学习 KVM 的系列文章:  (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接 ...

  3. KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机

    1. QEMU/KVM 迁移的概念 迁移(migration)包括系统整体的迁移和某个工作负载的迁移.系统整理迁移,是将系统上所有软件包括操作系统完全复制到另一个物理机硬件机器上.虚拟化环境中的迁移, ...

  4. 8.使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]

    1. QEMU/KVM 迁移的概念 迁移(migration)包括系统整体的迁移和某个工作负载的迁移.系统整理迁移,是将系统上所有软件包括操作系统完全复制到另一个物理机硬件机器上.虚拟化环境中的迁移, ...

  5. KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]...

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  6. QEMU KVM libvirt手册(4) – images

    RAW raw是默认的格式,格式简单,容易转换为其他的格式.需要文件系统的支持才能支持sparse file 创建image # qemu-img create -f raw flat.img 10G ...

  7. 理解 QEMU/KVM 和 Ceph(2):QEMU 的 RBD 块驱动(block driver)

    本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...

  8. KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)...

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  9. 【KVM系列07】使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照

    第七章 使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 1. QEMU/KVM 快照 1.1 概念 1.2 使用 virsh 实验 1.3 外部快照的删除 2. OpenSt ...

最新文章

  1. Linux下查找、删除、替换命令
  2. centos7 shell脚本自动优化yum firewalld xelinux
  3. 使用ImageMagick 的提示与技巧
  4. Python CNN风格迁移
  5. struts2常用标签
  6. Angular 应用 bootstrapModule 映射的 app Component 的初始化逻辑
  7. 线性代数 向量长度_用户定义长度的向量| 使用Python的线性代数
  8. 大规模分布式系统资源管理(一)
  9. 第2章 DOS循环:for命令详解
  10. Properties文件操作
  11. 电脑管家下载|腾讯电脑管家下载
  12. Joiner.on和stream().map联合使用技巧
  13. 微商分销系统哪家好,要怎么做?
  14. html做键盘,用html+js+css做一个模拟键盘
  15. 查看Mac本机路由器IP地址
  16. C1认证学习三(数据校验)
  17. 每日一课 | 如何用Python编写一个Lisp解释器
  18. win11修改中文用户名为英文(解决重启vivado设置初始化问题)
  19. 函数式编程[Lambda 表达式,Optional,Stream流]从入门到精通(一)
  20. 计算机视觉入门之图像处理<六>:图像锐化处理

热门文章

  1. 性格与中医养生7--平和体质
  2. 1404472-50-9,1,3,4,6-Tetra-O-acetyl-2-[(azidoacetyl)amino]-2-deoxy-β-D-galactopyranose,吡喃半乳糖的纯度是98%
  3. 52730-14-0,4-Methylphenyl Tetra-O-acetyl-α-D-galactopyranoside,4-甲基苯基 四-O-乙酰基-α-D-吡喃半乳糖苷
  4. python中image什么意思_浅谈python图片处理Image和skimage的区别
  5. html之code标签和pre标签
  6. 活用WinCE注册表
  7. 有限元在游乐设施中的应用-焊缝计算
  8. 别让自证清白成为扶人者的梦魇
  9. skype注册outlook.com邮箱账号和【删除】的方法
  10. 视频教程-虚幻4 VR开发指南-其他