qcow2 的基本原理
qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:
- 更小的空间占用,即使文件系统不支持空洞(holes);
- 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
- 支持快照(snapshot),镜像文件能够包含多个快照的历史;
- 可选择基于 zlib 的压缩方式
- 可以选择 AES 加密
Copy-on-Write 镜像文件
qcow2 镜像可以用来保存另一个镜像文件的变化,它并不去修改原始镜像文件,只记录与原始镜像文件的不同即可,这种镜像文件就叫做 copy-on-write 镜像。虽然是一个单独的文件,但它的大部分的数据都来自原始镜像,只有跟原始镜像文件相比有变化的 cluster 才会被记录下来。
这很容易去实现,在头部信息中记录原始文件路径即可。当需要从一个 copy-on-write 镜像文件中读取一个 cluster 的时候,首先检查这块区域是否已经在该镜像文件中被分配,如果没有就从原始文件读取。
快照
快照有些类似 Copy-On-Write 文件,但区别是快照是一个可写的。快照就是原始文件本身(内部快照)。它既包含做快照之前的原始文件部分,它本身也包含可写的部分。
创建 qcow2 和 raw 文件以及两种镜像的对比
使用 QEMU 软件包自带的 qemu-img 软件创建 qcow2 文件。
$ qemu-img create -f qcow2 test.qcow2 10G Formatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off $ qemu-img create -f raw test.raw 10G Formatting 'test.raw', fmt=raw size=10737418240
对比两种格式的文件的实际大小以及占用空间大小如下:
$ls -hl -rw-r--r-- 1 root root 193K 10月 13 11:13 test.qcow2 -rw-r--r-- 1 root root 10G 10月 13 11:14 test.raw
$ stat test.raw 文件:"test.raw" 大小:10737418240 块:0 IO 块:4096 普通文件 设备:fd00h/64768d Inode:1517926 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)...
$ stat test.qcow2 文件:"test.qcow2" 大小:197120 块:392 IO 块:4096 普通文件 设备:fd00h/64768d Inode:2567962 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) ...
从对比中可以看出 qcow 格式的镜像文件大小位 197120 字节,占用空间为 200K,占用了 200 块磁盘空间。而 raw 格式的文件则没有占用磁盘空间,它是一个空洞文件。
Raw 格式与 qcow2 转化
将 raw 格式转化为 qcow2 格式的文件命令如下:
$qemu-img convert -f raw -O qcow2 test.raw test.raw.qcow2