qemu-img命令


qemu-img用于离线创建、转换和修改磁盘镜像文件。
警告:不要使用 qemu-img修改正在运行的虚拟机或任何其他进程使用的镜像,这可能会破坏镜像。

通用参数

FILENAME:镜像文件名。
OUTPUT_FILENAME:输出的目标镜像的文件名。
-f FMT:镜像格式,一般会自动推测。
-O OUTPUT_FMT:输出的目标镜像的格式。
SIZE:镜像大小。单位:b(默认)、k(kb,1024)、m(mb,1024k)、g(gb,1024M)、t(tb,1024G)。

通用选项

--object OBJECTDEF:用户创建的对象。最常见的对象类型是 secret,用于提供密码和/或加密密钥。有关对象属性的描述,请参阅 qemu (1)手册页。
--image-opts:指示将 FILENAME 参数解释为完整的选项字符串,而不是普通文件名。此参数与-f FMT互斥。
--force-share-U:指定 qemu-img 以共享模式打开镜像,即允许其他 QEMU 进程以写模式打开它。例如,当镜像被运行的客户机使用时,这可以用于获取镜像信息(使用qemu-img info命令)。请注意,由于并发的元数据更改等原因,这可能会产生不一致的结果。此选项仅在以只读模式打开镜像时才被允许。
-l SNAPSHOT_PARAM: SNAPSHOT_PARAM 是用于指定镜像内部快照的参数,格式为snapshot.id=[ID],snapshot.name=[NAME][ID_OR_NAME]
-p:显示进度条,仅限3个命令:compareconvertrebase。如果对其他命令使用-p选项,则当进程接收到 SIGUSR1或 SIGINFO 信号时报告进度。
-q:安静模式,不打印任何输出(错误除外)。如果同时使用-q-p选项,则没有进度条。
-S SIZE:指定为了在转换期间创建稀疏图像,qemu-img 只能包含零的连续字节数。此值向下舍入到最接近的512字节。单位:b、k、m、g、t。详见convertbench命令。
-t CACHE-T SRC_CACHE:分别指定应该与目标文件、源文件一起使用的缓存模式。请参阅模拟器的-drive cache=...选项的文档,了解允许的值。
-o OPTIONS:执行镜像格式的特有选项。OPTIONS 是一个逗号分隔的名称=值的列表。使用-o ?查看该镜像格式支持哪些选项。

[root@localhost ~]# qemu-img amend -f qcow2 -o ?
Supported options:
size             Virtual disk size
compat           Compatibility level (0.10 or 1.1)
backing_file     File name of a base image
backing_fmt      Image format of the base image
encryption       Encrypt the image
cluster_size     qcow2 cluster size
preallocation    Preallocation mode (allowed values: off, metadata, falloc, full)
lazy_refcounts   Postpone refcount updates

[root@localhost ~]# qemu-img amend -f qcow -o ?
Supported options:
size             Virtual disk size
backing_file     File name of a base image
encryption       Encrypt the image

[root@localhost ~]# qemu-img amend -f raw -o ?
Supported options:
size             Virtual disk size
 
[root@localhost ~]# qemu-img amend -f vdi -o ?
Supported options:
size             Virtual disk size
static           VDI static (pre-allocated) image

子命令

amend

qemu-img amend [--object OBJECTDEF] [--image-opts] [-p] [-q] [-f FMT] [-t CACHE] -o OPTIONS FILENAME

修改镜像文件的格式选项,是 qcow2 格式的特有命令。

[root@localhost ~]# qemu-img amend -f qcow2 -o ?
Supported options:
size             Virtual disk size
compat           Compatibility level (0.10 or 1.1)
backing_file     File name of a base image
backing_fmt      Image format of the base image
encryption       Encrypt the image
cluster_size     qcow2 cluster size
preallocation    Preallocation mode (allowed values: off, metadata, falloc, full)
lazy_refcounts   Postpone refcount updates

[root@localhost ~]# qemu-img info base.img
image: base.img
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

[root@localhost ~]# qemu-img amend base.img -o size=2G
[root@localhost ~]# qemu-img info base.img
image: base.img
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 260K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@localhost ~]# qemu-img amend base.img -o backing_file=/root/test/diff1.img
[root@localhost ~]# qemu-img info base.img
image: base.img
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 260K
cluster_size: 65536
backing file: /root/test/diff1.img
Format specific information:
    compat: 1.1
    lazy refcounts: false

bench

qemu-img bench [-c COUNT] [-d DEPTH] [-f FMT] [--flush-interval=FLUSH_INTERVAL] [-i AIO] [-n] [--no-drain] [-o OFFSET] [--pattern=PATTERN] [-q] [-s BUFFER_SIZE] [-S STEP_SIZE] [-t CACHE] [-w] [-U] FILENAME

对镜像运行一个简单的顺序 I/O 基准测试(benchmark)。如果指定了-w,则执行写测试,否则执行读测试。

总共执行个数为COUNT的 I/O 请求,每个BUFFER_SIZE 字节大小,并且DEPTH个请求并行执行。第一个请求从OFFSET给定的位置开始,每个请求按STEP_SIZE增加当前位置。如果没有给出STEP_SIZE,则使用BUFFER_SIZE 作为其值。

如果为写测试指定了FLUSH_INTERVAL,则只要剩余的请求数量是FLUSH_INTERVAL的倍数,则在进行新的写操作之前,请求队列将被耗尽,并发出刷新。如果指定了--no-drain,则在不首先清空请求队列的情况下发出刷新。

-i AIO:指定不同的 AIO 后端: threads、native、io_uring。
-n:尽可能使用 native AIO 后端。在 Linux 上,只有在指定了-t none-t directsync时,该选项才能正常工作。
--pattern=PATTERN:对于写测试,默认情况下会写入一个由零填充的缓冲区。这可以被 本选项所指定的字节模式覆盖。

check

qemu-img check [--object OBJECTDEF] [--image-opts] [-q] [-f FMT] [--output=OFMT] [-r [leaks | all]] [-T SRC_CACHE] [-U] FILENAME

对镜像执行一致性检查,只支持 qcow2、 qed 、 vdi 格式。
--output:可选值为human(默认)、json。
-r [leaks | all]:尝试修复在检查期间发现的任何不一致。-r leaks只修复cluster leaks。 -r all 修复所有类型的错误,这可能导致选择错误的修复或隐藏已经发生的损坏的风险更高。

check 命令的退出代码:
0:检查完毕,镜像(现在)是一致的。
1:由于内部错误,检查未完成。
2:检查完成,镜像损坏。
3:检查完成,镜像已泄漏群集(leaked clusters),但没有损坏。
63:镜像格式不支持检查。

如果指定了 -r,退出代码代表的是修复后镜像的状态。也就是说,一个成功的-r all 将产生退出代码0。

[root@localhost ~]# qemu-img check /root/test/base.img
No errors were found on the image.
Image end offset: 262144

[root@localhost ~]# qemu-img check /root/test/base.img --output=json
{
    "image-end-offset": 262144,
    "total-clusters": 163840,
    "check-errors": 0,
    "filename": "/root/test/base.img",
    "format": "qcow2"
}

commit

qemu-img commit [--object OBJECTDEF] [--image-opts] [-q] [-f FMT] [-t CACHE] [-b BASE] [-d] [-p] FILENAME

把 FILENAME 镜像中记录的更改提交到其关系链的某个 backing file 中。如果 backing file 比 FILENAME 小,那么backing file的大小将调整为与 FILENAME 相同的大小。如果FILENAME小于backing file,则不会截断backing file。如果您希望backing file与较小的FILENAME的大小一致,那么一旦 commit 操作成功完成,您可以自己安全地截断它。

-d:commit 成功后,将默认清空FILENAME这个镜像文件。如果之后不需要 FILENAME 并打算删除它,可以通过指定-d选项来跳过清空过程。
-b BASE:指定将镜像中记录的更改提交到哪个 backing file 中(必须在该镜像的关系链中)。默认提交到该镜像的直接 backing file 中。请注意,在提交操作之后,-b指定的 BASE 到 FILENAME 之间的所有镜像文件都将无效,并且在读取时可能返回垃圾数据。-b隐含了 -d的效果(不清空 FILENAME )。

[root@localhost ~]# qemu-img create /root/test/diff2.img -b /root/test/diff1.img -f qcow2
Formatting '/root/test/diff2.img', fmt=qcow2 size=10737418240 backing_file='/root/test/diff1.img' encryption=off cluster_size=65536 lazy_refcounts=off

[root@localhost ~]# qemu-img info /root/test/diff2.img
image: /root/test/diff2.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: /root/test/diff1.img
Format specific information:
    compat: 1.1
    lazy refcounts: false

[root@localhost ~]# qemu-img commit /root/test/diff2.img
Image committed.

compare

qemu-img compare [--object OBJECTDEF] [--image-opts] [-f FMT] [-F FMT] [-T SRC_CACHE] [-p] [-q] [-s] [-U] FILENAME1 FILENAME2

比较两个镜像是否有相同的内容。可以比较不同格式、设置的镜像。
除非指定了-f (用于 FILENAME1)和/或-F (用于 FILENAME2)选项,否则将自动检测镜像的格式。

默认情况下,如果较大的镜像在另一个镜像结束之后的区域中只包含未分配的扇区和/或零扇区,则不同大小的镜像被认为是相同的。此外,如果在一个镜像中没有分配任何扇区,并且在第二个镜像中只包含零字节,也被认为是相同的。可以通过指定-s选项来使用严格模式,以上两种情形的比较结果都将为不同。

默认情况下,此命令打印结果消息,显示两个镜像相同,或显示第一个不同字节的位置的信息。此外,在使用-s严格模式时,结果消息可以报告不同的镜像大小。

退出代码:
0:两个镜像是完全相同的。
1:两个镜像不同。
2:打开镜像时出错。
3:检查扇区分配时出错。
4:读取数据时出错。

[root@localhost ~]# qemu-img compare /root/test/base.img /root/test/diff1.img
Images are identical.

[root@localhost ~]# qemu-img compare /root/test/base.img /root/base.img
Warning: Image size mismatch!
Images are identical.

[root@localhost ~]# qemu-img compare -s /root/test/base.img /root/base.img
Strict mode: Image size mismatch!

convert

qemu-img convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-m NUM_COROUTINES] [-W] [--salvage] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME

将镜像文件(或其内部快照)从一种镜像格式转换为另一种镜像格式。例如,将 VMware 用的 vmdk 格式文件转换为 qcow2 格式文件,这对从其他虚拟化方案转移到 KVM 上的用户非常有用。当把 raw 格式的镜像(非稀疏格式)转换成 qcow2、qcow、cow 等稀疏格式的文件时,可以缩小镜像在主机上的实际占用空间。

-O OUTPUT_FMT:指定输出文件的镜像格式,默认为raw。
-c:压缩,只有 qcow 和 qcow2 格式支持压缩。压缩是只读的。这意味着如果一个压缩扇区被重写,那么它将被重写为未压缩的数据。
-C:尝试使用 copy offloading 将数据从源镜像移动到目标图像。如果数据是远程的,比如使用 NFS 或 iSCSI 后端,这可能会提高性能,但是不会自动稀疏零扇区,并且可能导致一个完全分配的目标镜像,这取决于主机对获取分配信息的支持。
-B BACKING_FILE:当指定了 backing file 时,输出文件是基于该 backing file 的增量文件(copy-on-write),backing file应该与输入文件具有相同的内容,路径、图像格式等可以有所不同。(译者注:当不指定此选项,并且输入、输出格式都设为 qcow2 镜像格式时,例如qemu-img convert -f qcow2 -O qcow2 FILENAME OUTPUT_FILENAME,可以起到将输入镜像及其所有 backing file 文件合并输出为一个镜像的效果,同时保持输入镜像不变。而使用commit命令时,虽然也能得到一个合并的镜像,但是输入镜像会改变,只能先把输入镜像及其所有 backing file 文件都复制出来一份,在副本文件上使用commit命令,才能不改变输入文件本身。)
-S SPARSE_SIZE:指示连续的字节数(默认为 4k) ,这些字节必须只包含零,以便 qemu-img 在转换期间创建稀疏镜像。如果 SPARSE_SIZE 为0,则不会对源镜像进行未分配扇区或零扇区扫描,并且目标镜像将始终完全分配。
-n:跳过目标文件的创建,用于 rbd 等格式,如果目标卷已经基于 qemu-img 不支持的特定选项创建。
-w:启用无序写入,以提高性能。这仅推荐用于预先分配的设备,如主机设备或其他原始块设备。-w无序写入不能与-c创建压缩镜像同时使用。
-m NUM_COROUTINES:指定在转换过程中有多少协程并行工作(默认为 8)。
--salvage:读取时尽量忽略 I/O 错误。除非处于安静模式(-q),否则仍将打印错误。无法从输入镜像中读取的区域将被视为仅包含零。
--target-is-zero:假设读取目标镜像总是返回零。此参数与带有 backing file 的目标镜像相互排斥。还需要使用-n参数来跳过镜像创建。

[root@localhost ~]# qemu-img convert -O vmdk base.img vmware.img
[root@localhost ~]# qemu-img info vmware.img
image: vmware.img
file format: vmdk
virtual size: 2.0G (2147483648 bytes)
disk size: 12K
cluster_size: 65536
Format specific information:
    cid: 53085815
    parent cid: 4294967295
    create type: monolithicSparse
    extents:
        [0]:
            virtual size: 2147483648
            filename: vmware.img
            cluster size: 65536
            format:
			
[root@localhost ~]# ll -h raw.img
-rw-r--r-- 1 root root 2.0G Nov 14 20:37 raw.img
[root@localhost ~]# qemu-img convert -O qcow2 raw.img small.img
[root@localhost ~]# qemu-img info small.img
image: small.img
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@localhost ~]# ll -h small.img
-rw-r--r-- 1 root root 193K Nov 14 20:45 small.img

[root@localhost ~]# qemu-img convert -O qcow2 -S 0 small.img big.img
[root@localhost ~]# qemu-img info big.img
image: big.img
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 4.0G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@localhost ~]# ll -h big.img
-rw-r--r-- 1 root root 2.1G Nov 14 21:00 big.img

create

qemu-img create [--object OBJECTDEF] [-q] [-f FMT] [-b BACKING_FILE] [-F BACKING_FMT] [-u] [-o OPTIONS] FILENAME [SIZE]

在路径 FILENAME 上创建大小为 SIZE 、格式为 FMT 的新镜像文件。

如果使用了-b BACKING_FILE选项(相当于-o backing_file=BACKING_FILE),则新镜像文件将是 BACKING_FILE 的差异盘,此时不需要指定 SIZE。除非使用 commit 命令把差异盘中的数据提交到 BACKING_FILE 中,否则 BACKING_FILE 永远不会被修改。

如果 FILENAME 是相对路径,则程序将从 FILENAME 所在目录查找 BACKING_FILE。

注意,程序将打开 BACKING_FILE 以检查它是否有效。可以通过-u选项使用不安全模式,这意味着即使无法打开 BACKING_FILE,程序也会创建新镜像文件。此时,你需要自己确保 BACKING_FILE 是规范有效的。

创建一个全新盘镜像文件

[root@localhost ~]# qemu-img create -f qcow2 /root/test/base.img 10G
Formatting '/root/test/base.img', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off

创建一个差异盘镜像文件

[root@localhost ~]# qemu-img create -f qcow2 /root/test/diff1.img -b /root/test/base.img
Formatting '/root/test/diff1.img', fmt=qcow2 size=10737418240 backing_file='/root/test/base.img' encryption=off cluster_size=65536 lazy_refcounts=off

dd

qemu-img dd [--image-opts] [-U] [-f FMT] [-O OUTPUT_FMT] [bs=BLOCK_SIZE] [count=BLOCKS] [skip=BLOCKS] if=INPUT of=OUTPUT

从 INPUT 文件复制到 OUTPUT 文件,将其从 FMT 格式转换为 OUTPUT_FMT 格式。

bs=BLOCK_SIZE:指定块的大小,默认为512字节。size 的语法类似于 dd(1) 的 size 语法。
count=BLOCKS:指定要复制的 INPUT 文件的块数,达到此数量时就停止读取 INPUT 文件。
if=INPUT:指定输入文件。
of=OUTPUT:指定输出文件。
skip=BLOCKS:指定要跳过 INPUT 文件的块数。

info

qemu-img info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [-U] FILENAME

查看镜像文件的磁盘大小、backing file、内部快照等详细信息。
--backing-chain:显示该镜像的关系链中所有 backing file 的信息。
--output:可选值为human(默认)、json。
-f FMT:指定用什么镜像格式来查看该文件,默认使用该文件本身的镜像格式。例如,使用-f raw-f qcow2来查看一个用qcow2创建的镜像,其virtual size值不相同。

返回字段:
image:info命令中提供的 FILENAME。
file format:镜像格式。
virtual size:即虚拟机看到的磁盘大小。
disk size:该镜像文件在主机文件系统上占用的空间大小。如果主机没有文件系统或其他原因导致获取不到该信息,则显示为0。(译者注:似乎不完全等于ll -h显示的大小)
cluster_size:该镜像格式的 cluster_size(如果适用)。
encrypted:该镜像是否加密,只有当加密时才显示。
cleanly shut down:如果镜像是脏的,将显示 no,并且必须在 qemu 下次打开它时进行自动修复。
backing file:如果该镜像有 backing file,则显示。
backing file format:backing file 的镜像格式(if the image enforces it)。
Snapshot list:列出该镜像所有内部快照。
Format specific information:该镜像格式的特定信息。

[root@localhost ~]# qemu-img info /root/test/base.img
image: /root/test/base.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    
[root@localhost ~]# ll -h /root/test/base.img
-rw-r--r-- 1 root root 193K Nov 14 15:41 /root/test/base.img

[root@localhost ~]# qemu-img info /root/test/diff1.img
image: /root/test/diff1.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: /root/test/base.img
Format specific information:
    compat: 1.1
    lazy refcounts: false

[root@localhost ~]# ll -h /root/test/
total 392K
-rw-r--r-- 1 root root 193K Nov 14 15:41 base.img
-rw-r--r-- 1 root root 193K Nov 14 16:12 snap1.img

[root@localhost ~]# qemu-img info /root/test/diff1.img --backing-chain
image: /root/test/diff1.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: /root/test/base.img
Format specific information:
    compat: 1.1
    lazy refcounts: false

image: /root/test/base.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    
[root@localhost ~]# qemu-img info /root/test/diff1.img --backing-chain --output=json
[
    {
        "virtual-size": 10737418240,
        "filename": "/root/test/diff1.img",
        "cluster-size": 65536,
        "format": "qcow2",
        "actual-size": 200704,
        "format-specific": {
            "type": "qcow2",
            "data": {
                "compat": "1.1",
                "lazy-refcounts": false
            }
        },
        "backing-filename": "/root/test/base.img",
        "dirty-flag": false
    },
    {
        "virtual-size": 10737418240,
        "filename": "/root/test/base.img",
        "cluster-size": 65536,
        "format": "qcow2",
        "actual-size": 200704,
        "format-specific": {
            "type": "qcow2",
            "data": {
                "compat": "1.1",
                "lazy-refcounts": false
            }
        },
        "dirty-flag": false
    }
]

[root@localhost ~]# qemu-img info -f raw /root/test/base.img
image: /root/test/base.img
file format: raw
virtual size: 193K (197120 bytes)
disk size: 196K

map

dump 镜像文件的元数据,即每个扇区的分配状态,包括关系链中的 backing file 。

qemu-img map [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [-U] FILENAME

--output:可选值为human(默认)、json。
--output=human只转储文件中已知的非零区域,完全省略文件中已知为零的部分,对于关系链中未分配的部分也是如此。 输出结果中将标识可以读取数据的位置,以及在文件中的偏移量。每一行包括四个字段,前三个字段是十六进制数字。例如:

Offset          Length          Mapped to       File
0               0x20000         0x50000         /tmp/overlay.qcow2
0x100000        0x10000         0x95380000      /tmp/backing.qcow2

意味着0x20000(131072)字节在 /tmp/overlay.qcow2 中可用(以镜像中的偏移量0为开始,以raw格式打开),映射到0x50000(327680)开始。如果使用--output=human,则压缩、加密或以其他方式无法获得raw格式的数据将导致错误。注意,文件名可以包含换行,因此在脚本中解析这种输出格式是不安全的。

--output=json:返回 JSON 格式的字典数组,还包括3个字段:
data:扇区是否包含实际数据,如果为 false,扇区要么未分配,要么存储为优化的全零 clusters。
zero:数据是否已知为零。
depth:0表示只包含该镜像文件,1表示还包含一层 backing file ,2表示还包含两层 backing file,以此类推。

在 JSON 格式中,offset 字段可能不显示。如果 data 为 false 并且存在 offset 字段,则表示文件中的相应扇区尚未使用,但它们已预先分配。

有关更多信息,请参考 QEMU 源代码中的 include/block/block.h。

[root@localhost ~]# qemu-img map /root/test/base.img
Offset          Length          Mapped to       File
[root@localhost ~]# qemu-img map --output=json /root/test/base.img
[{ "start": 0, "length": 10737418240, "depth": 0, "zero": true, "data": false}]

measure

qemu-img measure [--output=OFMT] [-O OUTPUT_FMT] [-o OPTIONS] [--size N | [--object OBJECTDEF] [--image-opts] [-f FMT] [-l SNAPSHOT_PARAM] FILENAME]

计算新镜像所需的文件大小。此信息可用于为逻辑卷或 SAN LUNs 适当调整大小,以便将镜像放置其中。此命令返回的大小足以放置镜像。
--output=OFMT:可选值为 human 或 json。
--size N: 如同使用create命令创建一个新的空镜像文件一样。
FILENAME:如同使用convert命令转换现有镜像文件一样。新文件的格式由 OUTPUT_FMT 给出,而现有文件的格式由 FMT 给出。
-O OUTPUT_FMT-f FMT:分别指定新镜像、已有镜像的格式。
-l SNAPSHOT_PARAM:使用已有镜像的内部快照。

返回字段:

required size: 524288
fully allocated size: 1074069504

required size:是新镜像的文件大小。如果镜像格式支持紧凑表示(compact representation),则它可能小于 virtual disk size。
fully allocated size:是数据写满所有扇区后新镜像的文件大小。这是除了内部快照、脏位图(dirty bitmaps)、 vmstate data 、其他高级镜像格式特性之外,镜像文件可以占用的最大大小。

snapshot

# qemu-img snapshot [--object OBJECTDEF] [--image-opts] [-U] [-q] [-l | -a SNAPSHOT | -c SNAPSHOT | -d SNAPSHOT] FILENAME

列出(-l)、应用(-a)、创建(-c)、删除(-d)镜像文件内的快照。应用快照是指将磁盘镜像恢复到快照时的状态。

[root@localhost ~]# qemu-img snapshot -c snap1.img base.img
[root@localhost ~]# qemu-img snapshot -c snap2.img base.img
[root@localhost ~]# qemu-img snapshot -l base.img
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snap1.img                 0 2020-11-15 11:11:19   00:00:00.000
2         snap2.img                 0 2020-11-15 11:14:12   00:00:00.000

[root@localhost ~]# qemu-img info base.img
image: base.img
file format: qcow2
virtual size: 3.0G (3221225472 bytes)
disk size: 268K
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snap1.img                 0 2020-11-15 11:11:19   00:00:00.000
2         snap2.img                 0 2020-11-15 11:14:12   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: false

[root@localhost ~]# qemu-img snapshot -a snap1.img base.img
[root@localhost ~]# qemu-img info base.img
image: base.img
file format: qcow2
virtual size: 3.0G (3221225472 bytes)
disk size: 268K
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snap1.img                 0 2020-11-15 11:11:19   00:00:00.000
2         snap2.img                 0 2020-11-15 11:14:12   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: false

[root@localhost ~]# qemu-img snapshot -l base.img
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snap1.img                 0 2020-11-15 11:11:19   00:00:00.000
2         snap2.img                 0 2020-11-15 11:14:12   00:00:00.000

[root@localhost ~]# qemu-img snapshot -d snap2.img base.img
[root@localhost ~]# qemu-img snapshot -l base.img
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snap1.img                 0 2020-11-15 11:11:19   00:00:00.000

rebase

qemu-img rebase [--object OBJECTDEF] [--image-opts] [-U] [-q] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-p] [-u] -b BACKING_FILE [-F BACKING_FMT] FILENAME

修改镜像文件的 backing_file,是qcow2、qed格式镜像的特有操作。
-b BACKING_FILE:指定新的 backing_file,如果设为空值,则该镜像将独立存在,没有任何 backing_file。
-F BACKING_FMT:指定新 backing_file 的镜像格式。
-t CACHE:指定用于该镜像文件的缓存模式,而 SRC _ CACHE 指定用于读取备份文件的缓存模式。
-T SRC_CACHE:指定用于读取 backing_file 的缓存模式。

rebase 有两种不同的操作模式:
1、安全模式:这是默认模式,并执行一个真正的 rebase 操作。新的 backing_file 可能与旧的不同,qemu-img rebase 将负责保持的虚拟机可见的内容不变。为了实现这一点,在实际更换 backing_file 之前,新旧 backing_file 之间的任何不同 clusters 都会合并到该镜像文件中。请注意,安全模式是一个昂贵的操作,相当于 convert 一个镜像。只有当旧的 backing_file 仍然存在时,安全模式才能正常工作。
2、不安全模式:-u选项。在此模式下,只更改该镜像的 backing_file 文件名(和格式),而不对文件内容进行任何检查。用户必须自己确保新 backing_file 是正确的,否则虚拟机可见的内容将被破坏。此模式对于 backing_file 重命名了或路径移动了的情形非常有用。它可以在没有可访问的旧的 backing_file 时使用。

可以使用 rebase 对两个磁盘镜像执行“ diff”操作。例如:将 base.img 复制为 modified.img,在 modified.img 上运行虚拟机,与 base.img 相比, modified.img 新增了一些更改。为了获得一个只包含这些更改的差异盘镜像(diff.qcow2),请执行以下操作。注意 rebase 命令在安全模式下会把 modified.img 和 base.img 之间的差异都提交到 diff.qcow2 中。此时,modified.img 可以被丢弃,因为 base.img + diff.qcow2包含相同的信息。

qemu-img create -f qcow2 -b modified.img diff.qcow2
qemu-img rebase -b base.img diff.qcow2
[root@localhost ~]# qemu-img info /root/test/diff1.img
image: /root/test/diff1.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: /root/test/base.img
Format specific information:
    compat: 1.1
    lazy refcounts: false

[root@localhost ~]# qemu-img create -f qcow2 /root/test/newbase.img 5G
Formatting '/root/test/newbase.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off

[root@localhost ~]# qemu-img rebase -b /root/test/newbase.img /root/test/diff1.img

[root@localhost ~]# qemu-img info /root/test/diff1.img
image: /root/test/diff1.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: /root/test/newbase.img
Format specific information:
    compat: 1.1
    lazy refcounts: false
	
[root@localhost ~]# qemu-img rebase -u -b /root/test/base.img /root/test/diff1.img

[root@localhost ~]# qemu-img info /root/test/diff1.img
image: /root/test/diff1.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: /root/test/base.img
Format specific information:
    compat: 1.1
    lazy refcounts: false

resize

qemu-img resize [--object OBJECTDEF] [--image-opts] [-f FMT] [--preallocation=PREALLOC] [-q] [--shrink] FILENAME [+ | -]SIZE

调整镜像文件的size。只有raw格式的镜像同时支持增大和缩小,而qcow2格式只支持增大。

在使用此命令缩小磁盘映像之前,必须使用 VM 中的文件系统和分区工具来相应地减少分配的文件系统和分区大小。不这样做将导致数据丢失!在使用这个命令增大磁盘镜像之后,您必须使用 VM 中的文件系统和分区工具才能真正开始使用设备上的新空间。

--shrink:当缩小镜像时,必须使用此选项,表示用户确认丢失截断后的所有数据。
--preallocation:在增大镜像时,可以使用此选项指定在主机上为镜像预分配空间的模式。可选值:off、 falloc、 full。falloc 模式通过调用 posix_fallocate() 为镜像预分配空间。full 模式通过将数据写入底层存储为镜像预分配空间。数据可能为零,也可能不为零,这取决于存储位置。

[root@localhost ~]# qemu-img resize raw.img -1G
Image resized.

[root@localhost ~]# qemu-img info raw.img
image: raw.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0

[root@localhost ~]# qemu-img resize raw.img +1G
Image resized.

[root@localhost ~]# qemu-img info raw.img
image: raw.img
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 0

[root@localhost ~]# qemu-img resize base.img +1G
Image resized.

[root@localhost ~]# qemu-img info base.img
image: base.img
file format: qcow2
virtual size: 3.0G (3221225472 bytes)
disk size: 200K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
	
[root@localhost ~]# qemu-img resize base.img -1G
qemu-img: qcow2 doesn't support shrinking images yet
qemu-img: This image does not support resize

镜像格式

只有 raw、qcow2 格式的镜像能够直接在 QEMU 上运行虚拟机,其他格式必须转换为这两种格式的任意一种。

raw

默认格式。优点是简单,易于导出到所有其他模拟器。如果主机文件系统支持 holes(例如 Linux 上的 ext2、ext3,Windows 上的 NTFS),则只有已写扇区会保留空间。使用qemu-img info能够查看该镜像在主机上的实际大小,或使用 Unix/Linux 的ls命令。虽然原始图像提供了最佳性能,但只有非常基本的特性可用。例如,没有可用的快照。

格式选项
preallocation:指定预分配的模式(可选值: off、 falloc、 full)。falloc 模式通过调用 posix_fallocate() 为镜像预分配空间。full 模式通过将数据写入底层存储为镜像预分配空间。数据可能为零,也可能不为零,这取决于存储位置。

qcow2

QEMU 的镜像格式,最通用的格式,有很多特性。例如,使用它可以获得更小的镜像(如果主机文件系统不支持 holes,例如 Windows ,这种格式将很有用)、可选的 AES 加密、基于 zlib 的压缩、支持多个虚拟机快照。注意,这这些特性是以性能为代价的。

格式选项
compat:指定要使用的 qcow2 版本。compat=0.10使用传统的镜像格式,0.10及以后版本的 QEMU 都可以读取。compat=1.1(默认)启用了只有 1.1及以后版本的 QEMU 才支持的镜像格式扩展。其中包括了 zero clusters,它允许对稀疏图像进行高效的 copy-on-read 。
backing_file:基础镜像的文件名,详见create命令。
backing_fmt:backing_file 的镜像格式。
encryption:使用128位 AES-CBC 对镜像进行加密。在 qcow 和 qcow2 镜像中使用的加密技术 被现代加密标准认为时有缺陷的,存在一些设计问题:
1、AES-CBC 密码用于基于扇区号的可预测初始化向量。这使得它很容易受到选择明文攻击(chosen plaintext attacks),这种攻击可以揭示加密数据的存在。
2、用户密码被直接用作加密密钥。选择不当或较短的密码会危及加密的安全性。
3、在密码被破坏的情况下,没有办法更改密码来保护 qcow 镜像中的数据。必须克隆该镜像,在新文件中使用不同的加密密码。然后必须使用类似于 shred 的程序安全删除旧镜像文件。在许多现代存储技术中,即使这样做也是无效的。
4、用于加密扇区的初始化向量基于来宾虚拟扇区号,而不是主机物理扇区。当一个磁盘镜像有多个内部快照时,这意味着多个物理扇区中的数据用同一个初始向量(initialization vector)加密。在 CBC 模式下,如果攻击可以收集用相同的 IV 和一些可预测的数据加密的多个扇区,这就打开了水印攻击(watermarking attacks)的可能性。使用相同密码短语的多个 qcow2 镜像也暴露了这个弱点,因为密码短语直接用作密钥。
因此,强烈反对使用 qcow/qcow2 的加密技术。建议用户使用其他加密技术,如 Linux dm-crypt/LUKS 系统。
cluster_size:修改 qcow2 的 cluster size(必须在 512 和 2M 之间)。较小的 cluster size 可以改善镜像文件大小,而较大的 cluster size 通常提供更好的性能。
preallocation:指定为镜像预分配空间的模式(允许值: off、 metadata、 falloc、 full)。带有预分配元数据的镜像最初比较大,但在需要增大镜像时可以提高性能。fallocfull模式类似于 raw 格式的相同选项,但是也设置元数据。
lazy_refcounts:推迟引用计数的更新,以避免元数据 I/O 并提高性能。这对于cache=writethrough来说尤其有趣,因为它不批处理元数据更新。折衷的做法是,在主机崩溃之后,必须重新构建引用计数表,即在下一次打开时,需要一个(自动的)qemu-img check-r all,这可能需要一些时间。只有在指定compat=1.1时才能启用此选项。
nocow:关闭文件的 COW。它只对 btrfs 有效,对其他文件系统没有影响。Btrfs 在运行虚拟机镜像文件时性能较低,当虚拟机上的操作系统也使用 Btrfs 作为文件系统时性能更低。关闭 COW 是减轻这种不良性能的一种方法。通常有两种方法可以关闭 btrfs 上的 COW:
1、通过挂载 nodatacow 来禁用它,然后所有新创建的文件将是 NOCOW。
2、对于空文件,添加 NOCOW 文件属性。
注意: 此选项仅对新文件或空文件有效。如果有一个已有的文件是 COW 并且已经有了数据块,那么不能通过设置nocow=on来将其更改为 NOCOW。可以使用lsattr filename命令来检查是否设置了 NOCOW 标志(大写C是 NOCOW 标志)。

其他格式

QEMU 还支持与旧版本或其他 hypervisors 兼容的各种镜像文件格式,包括 VMDK、 VDI、 VHD (vpc)、 VHDX、 qcow1、 QED。有关支持的格式的完整列表,请参阅qemu-img --help。有关这些格式的详细说明,请参阅 QEMU 块驱动程序参考文档。

这些镜像格式的块驱动程序的主要用途是镜像转换(convert命令)。为了运行虚拟机,建议将磁盘镜像转换为 raw 或 qcow2 格式,以获得良好的性能。

bochs:Bochs 磁盘镜像格式。
cloop :Linux Compressed Loop 镜像,仅用于重用直接压缩的 CD-ROM 映像,例如 Knoppix CD-ROM 中的镜像。
cow:用户模式 Linux Copy On Write 镜像格式,仅用于与以前版本兼容。
dmg:Mac 磁盘镜像格式。
nbd:Network block device。
parallels:Parallels 虚拟化磁盘镜像格式。
qcow: 旧的 QEMU 映像格式,仅用于与以前版本兼容。
qed: 旧 QEMU 映像格式,仅用于与以前版本兼容。
vdi:Oracle VM VirtualBox 硬碟 hard disk 镜像格式。
vhdx:微软 Hyper-V virtual hard disk-X 磁盘镜像格式。
vmdk:VMware 3和4兼容的镜像格式。
vvfat :虚拟 VFAT 磁盘镜像格式。

Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

参考文档

官方文档

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值