在改章节中,我们主要分析宋体、快照-的内容,自我感觉有个不错的建议和大家分享下
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态状,首先通过如下命令来使其行运
- (qemu) cont
(2)为了Guest数据的一致性,通过如下命令来冻结Guest的filesystem
- (agent) guest-fsfreeze-freeze
(3)对每个block device做snapshot,<blockx>示表某一个块设备,如hda; <snapshot-file>示表生成的snapshot的name,<format>示表snapshot的式格,如qcow2,qed
- (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
该命令是个同步命令,当该命令执行现实现实后,QEMU将会恢复Guest。
(4) 在第(2)中冻结了Guest的filesystem,所以要需将其恢复
- (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、不怕病毒,但是很害怕自己的程序;