基于qcow2文件实现对指定数据版本管理

一、功能介绍

qcow2文件中创建文件系统,并通过guestmount挂载来读写数据。在指定时间点创建外部快照,可保留历史数据。对历史时间点创建并挂载快照,可读写此时间点数据。

二、使用流程

1、创建初始环境

a、创建初始qcow2文件
qemu-img create -f qcow2 test.qcow2 10G
b、在qcow2文件中,创建文件系统
[root@localhost ~]# guestfish -a test.qcow2 <<EOF
run
mkfs ext4 /dev/sda
exit
EOF
[root@localhost ~]# virt-filesystems -a test.qcow2
/dev/sda
[root@localhost ~]# virt-filesystems -a test.qcow2 -l
Name Type VFS Label Size Parent
/dev/sda filesystem ext4 – 10737418240

2、更新数据流程

a、挂载qcow2文件
guestmount -a test.qcow2 -m /dev/sda mount_point
[root@localhost ~]# df -h |grep mount_point
/dev/fuse 9.8G 37M 9.3G 1% /root/mount_point
b、更新数据
echo aaa > mount_point/aaa
c、卸载qcow2文件
umount mount_point
d、创建快照
[root@localhost ~]# qemu-img create -f qcow2 -b test.qcow2 -F qcow2 test_sn1.qcow2
Formatting ‘test_sn1.qcow2’, fmt=qcow2 size=10737418240 backing_file=test.qcow2 backing_fmt=qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16
e、每次更新数据,执行上述流程,注意挂载的是最新的快照文件
guestmount -a test_sn1.qcow2 -m /dev/sda mount_point

3、挂载查看执行时间点数据

a、按上述流程,第一次生成aaa文件,第二次生成bbb文件。此时查看第一次时间点的数据。
b、基于第一次更新数据的挂载的qcow2文件,新建一个快照
qemu-img create -f qcow2 -b test.qcow2 -F qcow2 test_tmp.qcow2
c、挂载快照文件到一临时目录
[root@localhost ~]# guestmount -a test_tmp.qcow2 -m /dev/sda -o allow_other tmp_point
[root@localhost ~]# ls tmp_point/
aaa lost+found
[root@localhost ~]# cat tmp_point/aaa
aaa
d、使用完后,卸载文件系统,删除快照文件
[root@localhost ~]# umount tmp_point
[root@localhost ~]# rm -rf test_tmp.qcow2

三、常见问题

1、报错权限不够
[root@localhost ~]# virt-filesystems -a test.qcow2
libguestfs: error: could not create appliance through libvirt.
Try running qemu directly without libvirt using this environment variable:
export LIBGUESTFS_BACKEND=direct
Original error from libvirt: Cannot access backing file ‘/root/test.qcow2’ of storage file ‘/tmp/libguestfstpPt22/overlay1.qcow2’ (as uid:107, gid:107): 权限不够 [code=38 int1=13]
先执行export LIBGUESTFS_BACKEND=direct,再执行相关命令。不放心的话可以再运行包含相关命令脚本中先export一下。