• 宋体、快照Qemu快照(snapshot)机制原理及关键技术理解by小雨


    在改章节中,我们主要分析宋体、快照-的内容,自我感觉有个不错的建议和大家分享下

        1. snapshot 念概

        

           当要做snapshot时,可以通过qemu的monitor terminal 或是QMP(Qemu Monitor Protocol)向QEMU发送命令,命令执行的结果是将原始的像镜(original image)成变备份像镜(bacup image),同时,生成一个snapshot(又称为活动像镜, active image),与原始像镜比相,有所新的变更都将记录在活动像镜里,另外,还将原始像镜(即备份像镜)以只读的限权载挂。

        

          任何式格的原始像镜(也可所以raw式格)都可以做snapshot,但生成的snapshot必须是qcow2或QED式格的。

        

        

    • 内置快照(Internal Snapshots):单个qcow2像镜文件存储了括包数据以及快照的态状息信,

                  内置快照又可以细分一下:

        

                 (1)内置磁盘快照(Internal disk snapshot),也可以成为内置磁盘快照

        

                        快照点的磁盘态状,数据和快照保存在单个qcow2文件中,虚拟机行运态状和闭关态状都可以创立.

        

                 (2)内置系统还原点(Internal system checkpoint),也可能成为内置存内快照

        

                        存内态状,处置器态状,设备态状和磁盘态状,可认为行运中的虚拟机创立,有所息信都存储在同一个qcow2文件中,只有在行运态状才能创立内置系统还原点.

        

        

    • 外置快照(External Snapshots):当一个快照被创立时,创立时前当的态状保存在前当用使的磁盘文件中,即成为一个backing file

        

              外置快照也可以分细分为:
              (1)外置磁盘快照(External disk snapshot),也可以成为外置磁盘快照:
                    磁盘的快照被保存在一个文件中,创立时光点后以的数据被记录到一个新的qcow2或QED文件中,一样可以在行运和闭关态状创立.
             (2)外置系统还原点(External system checkpoint),也可以成为外置存内快照:

                         存内态状,处置器态状,设备态状和磁盘态状将被保存到一个文件中,存内和设备的态状将被保存到另外一个新的文件qcow2或QED中.

        

        

        2.生成snapshot的命令流

        

          在了解了snapshot的基本念概后,来具体分析下从发触snapshot的命令发出到snapshot现实中程过,QEMU具体阅历的哪些骤步以及执行了哪些命令。

        

         其实,在QEMU部内有一个GuestAgent Daemon(qemu-guest-agent

        ),用来收接QEMU monitor发来的命令,并执行对应的处置函数,关于GuestAgent会在后续具体分析,这里不做具体分析,只要需知道它是是一个处置QEMU Monitor发来的命令的模块以可就了。

        

        (1)如果Guest处于非running态状,首先通过如下命令来使其行运 

        

        

    1. (qemu) cont

        (2)为了Guest数据的一致性,通过如下命令来冻结Guest的filesystem

        

        

    1. (agent) guest-fsfreeze-freeze

        (3)对每个block device做snapshot,<blockx>示表某一个块设备,如hda; <snapshot-file>示表生成的snapshot的name,<format>示表snapshot的式格,如qcow2,qed

        

        

    1. (qemu) snapshot_blkdev <blockX> <snapshot-file> <format>

            During snapshot creation the guest will momentarily be halted by QEMU. Pending I/Os will be flushed to disk

        

        

    在这个中程过,Guest被QEMU置于halted的态状,之前pending的io将会被刷新到disk中,qemu将会主动将对本来设备(original file/devices)的io路径替换为新生成的snapshot。
    该命令是个同步命令,当该命令执行现实现实后,QEMU将会恢复Guest。

        (4) 在第(2)中冻结了Guest的filesystem,所以要需将其恢复

        

        

    1. (agent) guest-fsfreeze-thaw

          结总一下上述程过如下图所示:

        

        

        

        3. 多设备的子原快照(atomic snapshot)

        

          在qemu-1.0版本(新版本可能有变更)中snapshot_blkdev/blockdev-snapshot-sync每次只能作用于一个设备,因此,如果Guest有多个设备的话,要需多次循环调用此命令才能现实多个设备的快照。这就可能在做某个设备snapshot时候失败了,在qemu退出之前,它仅仅能回滚失败的设备的作操,但是此时,有些设备的snapshot已现实了,所以就造成了前当Guest的态状与做快照之前的态状不一致性了

        

          基于事务的块设备命令可以助帮决解这个问题。qemu-1.1中现实基于事务的QMP命令,它可以子原性的作操Guest的有所的设备,具体见参如下解释(对于子原性的QMP命令将在后续文章中具体分析):

        

        QEMU 1.1 implements a "transaction" QMP command that operates on multiple block devices atomically. The transaction command receives one or more "transactionable" QMP commands and their arguments; the only transactionable command for now is blockdev-snapshot-sync. Execution of the commands is then split into two phases, a prepare phase and a commit/rollback phase. Should any command fail the prepare phase, the transaction immediately proceeds to roll back the completed prepare phases. If all commands are prepared successfully they are committed; the commit phase cannot fail, so that atomicity is achieved. 

        

        

            后续文章将会具体分析快照的合并,快照的管理以及如何通过libvirt来停止快照的相干试验!

        

    文章结束给大家分享下程序员的一些笑话语录: 系统程序员
      1、头皮经常发麻,在看见一个蓝色屏幕的时候比较明显,在屏幕上什幺都看不见的时候尤其明显;
      2、乘电梯的时候总担心死机,并且在墙上找reset键;
      3、指甲特别长,因为按F7到F12比较省力;
      4、只要手里有东西,就不停地按,以为是Alt-F、S;
      5、机箱从来不上盖子,以便判断硬盘是否在转;
      6、经常莫名其妙地跟踪别人,手里不停按F10;
      7、所有的接口都插上了硬盘,因此觉得26个字母不够;
      8、一有空就念叨“下辈子不做程序员了”;
      9、总是觉得9号以后是a号;
      10、不怕病毒,但是很害怕自己的程序;

  • 相关阅读:
    tp5 宝塔open_basedir restriction in effect 错误; IIS open_basedir restriction in effect
    如何封装一个自己的win7系统并安装到电脑做成双系统
    推荐7个模板代码和其他游戏源码下载的网址
    PHP简单实现异步多文件上传并使用Postman测试提交图片
    PHP公众号开发给用户发微信消息提醒功能
    解决在页面中无法获取qrcode.js生成的base64的图片
    如何使用GUID硬盘分区格式安装新windows系统
    超详细的纯净windows系统重装示例
    Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
    Spark中groupByKey、reduceByKey与sortByKey
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3025972.html
Copyright © 2020-2023  润新知