[转] External(and Live) snapshots with libvirt
Raw image is a blob of data exposed directly in VM as block device, it can't snapshot. qemu-img is able to import data from raw image into qcow2 image, and save it as snapshot
Previously, I posted about snapshots here , which briefly discussed different types of snapshots. In this post, let’s explore how external snapshots work. Just to quickly rehash, external snapshots are a type of snapshots where, there’s a base image(which is the original disk image), and then its difference/delta (aka, the snapshot image) is stored in a new QCOW2 file. Once the snapshot is taken, the original disk image will be in a ‘read-only’ state, which can be used as backing file for other guests.
It’s worth mentioning here that:
- The original disk image can be either in RAW format or QCOW2 format. When a snapshot is taken, ‘the difference’ will be stored in a different QCOW2 file
- The virtual machine has to be running, live. Also with Live snapshots, no guest downtime is experienced when a snapshot is taken.
- At this moment, external(Live) snapshots work for ‘disk-only’ snapshots(and not VM state). Work for both disk and VM state(and also, reverting to external disk snapshot state) is in-progress upstream(slated for libvirt-0.10.2).
Before we go ahead, here’s some version info, I’m testing on Fedora-17(host), and the guest(named ‘daisy’) is running Fedora-18(Test Compose):
[root@moon ~]# rpm -q libvirt qemu-kvm ; uname -r libvirt-0.10.1-3.fc17.x86_64 qemu-kvm-1.2-0.2.20120806git3e430569.fc17.x86_64 3.5.2-3.fc17.x86_64 [root@moon ~]#
External disk-snapshots(live) using QCOW2 as original image:
Let’s see an illustration of external(live) disk-only snapshots. First, let’s ensure the guest is running:
[root@moon qemu]# virsh list Id Name State ---------------------------------------------------- 3 daisy running [root@moon qemu]#
Then, list all the block devices associated with the guest:
[root@moon ~]# virsh domblklist daisy --details Type Device Target Source ------------------------------------------------ file disk vda /export/vmimgs/daisy.qcow2 [root@moon ~]#
Next, let’s create a snapshot(disk-only) of the guest this way, while the guest is running:
[root@moon ~]# virsh snapshot-create-as daisy snap1-daisy "snap1 description" \ --diskspec vda,file=/export/vmimgs/snap1-daisy.qcow2 --disk-only --atomic
Some details of the flags used:
- Passing a ‘–diskspec’ parameter adds the ‘disk’ elements to the Snapshot XML file
- ‘–disk-only’ parameter, takes the snapshot of only the disk
- ‘–atomic’ just ensures either the snapshot is run completely or fails w/o making any changes
Let’s check the information about the just taken snapshot by running qemu-img:
[root@moon ~]# qemu-img info /export/vmimgs/snap1-daisy.qcow2 image: /export/vmimgs/snap1-daisy.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.5M cluster_size: 65536 backing file: /export/vmimgs/daisy.qcow2 [root@moon qemu]#
Apart from the above, I created 2 more snapshots(just the same syntax as above) for illustration purpose. Now, the snapshot-tree looks like this:
[root@moon ~]# virsh snapshot-list daisy --tree snap1-daisy | +- snap2-daisy | +- snap3-daisy [root@moon ~]#
For the above example image file chain[ base<-snap1<-snap2<-snap3 ], it has to be read as – snap3 has snap2 as its backing file, snap2 has snap1 as its backing file, and snap1 has the base image as its backing file. We can see the backing file info from qemu-img:
#--------------------------------------------# [root@moon ~]# qemu-img info /export/vmimgs/snap3-daisy.qcow2 image: /export/vmimgs/snap3-daisy.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 129M cluster_size: 65536 backing file: /export/vmimgs/snap2-daisy.qcow2 #--------------------------------------------# [root@moon ~]# qemu-img info /export/vmimgs/snap2-daisy.qcow2 image: /export/vmimgs/snap2-daisy.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 3.6M cluster_size: 65536 backing file: /export/vmimgs/snap1-daisy.qcow2 #--------------------------------------------# [root@moon ~]# qemu-img info /export/vmimgs/snap1-daisy.qcow2 image: /export/vmimgs/snap1-daisy.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.5M cluster_size: 65536 backing file: /export/vmimgs/daisy.qcow2 [root@moon ~]# #--------------------------------------------#
Now, if we do not need snap2 any more, and want to pull all the data from snap1 into snap3, making snap1 as snap3′s backing file, we can do a virsh blockpull operation as below:
#--------------------------------------------# [root@moon ~]# virsh blockpull --domain daisy --path /export/vmimgs/snap3-daisy.qcow2 \ --base /export/vmimgs/snap1-daisy.qcow2 --wait --verbose Block Pull: [100 %] Pull complete #--------------------------------------------#
Where, –path = path to the snapshot file, and –base = path to a backing file from which the data to be pulled. So from above example, it’s evident that we’re pulling the data from snap1 into snap3, and thus flattening the backing file chain resulting in snap1 as snap3′s backing file, which can be noticed by running qemu-img again.
Thing to note here,
[root@moon ~]# qemu-img info /export/vmimgs/snap3-daisy.qcow2 image: /export/vmimgs/snap3-daisy.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 145M cluster_size: 65536 backing file: /export/vmimgs/snap1-daisy.qcow2 [root@moon ~]#
A couple of things to note here, after discussion with Eric Blake(thank you):
- If we do a listing of the snapshot tree again(now that ‘snap2-daisy.qcow2′ backing file is no more in use),
[root@moon ~]# virsh snapshot-list daisy --tree snap1-daisy | +- snap2-daisy | +- snap3-daisy [root@moon ~]#
one might wonder, why is snap3 still pointing to snap2? Thing to note here is, the above is the snapshot chain, which is independent from each virtual disk’s backing file chain. So, the ‘virsh snapshot-list’ is still listing the information accurately at the time of snapshot creation(and not what we’ve done after creating the snapshot). So, from the above snapshot tree, if we were to revert to snap1 or snap2 (when revert-to-disk-snapshots is available), it’d still be possible to do that, meaning:
It’s possible to go from this state:
base <- snap123 (data from snap1, snap2 pulled into snap3)
we can still revert to:
base<-snap1 (thus undoing the changes in snap2 & snap3)
External disk-snapshots(live) using RAW as original image:
With external disk-snapshots, the backing file can be RAW as well (unlike with ‘internal snapshots’ which only work with QCOW2 files, where the snapshots and delta are all stored in a single QCOW2 file)
A quick illustration below. The commands are self-explanatory. It can be noted the change(from RAW to QCOW2) in the block disk associated with the guest, before & after taking the disk-snapshot (when virsh domblklist command was executed)
#-------------------------------------------------# [root@moon ~]# virsh list | grep f17btrfs2 7 f17btrfs2 running [root@moon ~]# #-------------------------------------------------# [root@moon ~]# qemu-img info /export/vmimgs/f17btrfs2.img image: /export/vmimgs/f17btrfs2.img file format: raw virtual size: 20G (21474836480 bytes) disk size: 1.5G [root@moon ~]# #-------------------------------------------------# [root@moon qemu]# virsh domblklist f17btrfs2 --details Type Device Target Source ------------------------------------------------ file disk hda /export/vmimgs/f17btrfs2.img [root@moon qemu]# #-------------------------------------------------# [root@moon qemu]# virsh snapshot-create-as f17btrfs2 snap1-f17btrfs2 "snap1-f17btrfs2-description" \ --diskspec hda,file=/export/vmimgs/snap1-f17btrfs2.qcow2 --disk-only --atomic Domain snapshot snap1-f17btrfs2 created [root@moon qemu]# #-------------------------------------------------# [root@moon qemu]# qemu-img info /export/vmimgs/snap1-f17btrfs2.qcow2 image: /export/vmimgs/snap1-f17btrfs2.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 196K cluster_size: 65536 backing file: /export/vmimgs/f17btrfs2.img [root@moon qemu]# #-------------------------------------------------# [root@moon qemu]# virsh domblklist f17btrfs2 --details Type Device Target Source ------------------------------------------------ file disk hda /export/vmimgs/snap1-f17btrfs2.qcow2 [root@moon qemu]# #-------------------------------------------------#
Also note: All snapshot XML files, where libvirt tracks the metadata of snapshots are are located under /var/lib/libvirt/qemu/snapshots/$guestname (and the original libvirt xml file is located under /etc/libvirt/qemu/$guestname.xml)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现