qmp: deprecate drive-backup (use blockdev-backup instead)
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEi5wmzbL9FHyIDoahVh8kwfGfefsFAmGKs0MACgkQVh8kwfGf efsgyA//dna61toqS3kQFDmpzjcrKgUeiR2JlFTagWBvvai2dpC/ozwDlqM5RBcS lahW61mRhs+3lSeOGfzBpb1tYuHpTDbqzhzGj6LSmMg/RqKJ4U3aZSSilpbVUdjn AaMUdIPvW5y/RHiU+U3hzdJb/xUvEJCoc8KVnefud0ziL1IsPm+9k2Pmp3Xozu9i rCVHMB35Intq7hpyVHOTFahv1v0aIRDmOkNNKqCvlBvV+TW49LmXMJa8OjcMclT3 dylBsXDol/lg562DVUbXoLNmP20QeDCAc0pYuVG1kkt8h5YYpAnRyaF/VvmjdhPI MhbxDxdrHU8qrzrvRHyn0HToRT2K96wQjpa/PNPFRXcNhpsSIrg8Mv9UZ+pP2B7+ WZ/PGCcEUr0pItl14hqV+G7C6VOy147vjG5duxoQEuqmjeTO/s2oBvSThd6zdmVN 7w/BUjMBZUCH9eyJYfnxhgK+tF601bEw9AfqpFxX/C9P5LbOy0s1h3Dl2cNABKPt swmj35CeM635rgMJi/+6zKftfhrRokqJi7mDiv79YJP0TkOKOHmJXCyGj9HNn8lJ ZYyA/q5XUp//6dg1lMNWz+Er8rjgLPxbFEiWAas2KIEbc0yy+9XdtkN+xCwjsFsg pA2gxjCL91vhZwTU4bzBtPS2l9APKAO6cw5CbKAclFfm55XOkOY= =mt09 -----END PGP SIGNATURE----- Merge tag 'pull-jobs-2021-11-09' of https://src.openvz.org/scm/~vsementsov/qemu into staging qmp: deprecate drive-backup (use blockdev-backup instead) # gpg: Signature made Tue 09 Nov 2021 06:43:31 PM CET # gpg: using RSA key 8B9C26CDB2FD147C880E86A1561F24C1F19F79FB # gpg: Good signature from "Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 8B9C 26CD B2FD 147C 880E 86A1 561F 24C1 F19F 79FB * tag 'pull-jobs-2021-11-09' of https://src.openvz.org/scm/~vsementsov/qemu: qapi: deprecate drive-backup docs/interop/bitmaps: use blockdev-backup docs/block-replication: use blockdev-backup Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
856f9fa9a2
@ -239,6 +239,17 @@ single ``bitmap``, the new ``block-export-add`` uses a list of ``bitmaps``.
|
|||||||
Member ``values`` in return value elements with meta-type ``enum`` is
|
Member ``values`` in return value elements with meta-type ``enum`` is
|
||||||
deprecated. Use ``members`` instead.
|
deprecated. Use ``members`` instead.
|
||||||
|
|
||||||
|
``drive-backup`` (since 6.2)
|
||||||
|
''''''''''''''''''''''''''''
|
||||||
|
|
||||||
|
Use ``blockdev-backup`` in combination with ``blockdev-add`` instead.
|
||||||
|
This change primarily separates the creation/opening process of the backup
|
||||||
|
target with explicit, separate steps. ``blockdev-backup`` uses mostly the
|
||||||
|
same arguments as ``drive-backup``, except the ``format`` and ``mode``
|
||||||
|
options are removed in favor of using explicit ``blockdev-create`` and
|
||||||
|
``blockdev-add`` calls. See :doc:`/interop/live-block-operations` for
|
||||||
|
details.
|
||||||
|
|
||||||
System accelerators
|
System accelerators
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ Primary | || Secondary disk <--------- hidden-disk 5 <---------
|
|||||||
|| | |
|
|| | |
|
||||||
|| | |
|
|| | |
|
||||||
|| '-------------------------'
|
|| '-------------------------'
|
||||||
|| drive-backup sync=none 6
|
|| blockdev-backup sync=none 6
|
||||||
|
|
||||||
1) The disk on the primary is represented by a block device with two
|
1) The disk on the primary is represented by a block device with two
|
||||||
children, providing replication between a primary disk and the host that
|
children, providing replication between a primary disk and the host that
|
||||||
@ -101,7 +101,7 @@ should support bdrv_make_empty() and backing file.
|
|||||||
that is modified by the primary VM. It should also start as an empty disk,
|
that is modified by the primary VM. It should also start as an empty disk,
|
||||||
and the driver supports bdrv_make_empty() and backing file.
|
and the driver supports bdrv_make_empty() and backing file.
|
||||||
|
|
||||||
6) The drive-backup job (sync=none) is run to allow hidden-disk to buffer
|
6) The blockdev-backup job (sync=none) is run to allow hidden-disk to buffer
|
||||||
any state that would otherwise be lost by the speculative write-through
|
any state that would otherwise be lost by the speculative write-through
|
||||||
of the NBD server into the secondary disk. So before block replication,
|
of the NBD server into the secondary disk. So before block replication,
|
||||||
the primary disk and secondary disk should contain the same data.
|
the primary disk and secondary disk should contain the same data.
|
||||||
|
@ -539,12 +539,11 @@ other partial disk images on top of a base image to reconstruct a full backup
|
|||||||
from the point in time at which the incremental backup was issued.
|
from the point in time at which the incremental backup was issued.
|
||||||
|
|
||||||
The "Push Model" here references the fact that QEMU is "pushing" the modified
|
The "Push Model" here references the fact that QEMU is "pushing" the modified
|
||||||
blocks out to a destination. We will be using the `drive-backup
|
blocks out to a destination. We will be using the `blockdev-backup
|
||||||
<qemu-qmp-ref.html#index-drive_002dbackup>`_ and `blockdev-backup
|
<qemu-qmp-ref.html#index-blockdev_002dbackup>`_ QMP command to create both
|
||||||
<qemu-qmp-ref.html#index-blockdev_002dbackup>`_ QMP commands to create both
|
|
||||||
full and incremental backups.
|
full and incremental backups.
|
||||||
|
|
||||||
Both of these commands are jobs, which have their own QMP API for querying and
|
The command is a background job, which has its own QMP API for querying and
|
||||||
management documented in `Background jobs
|
management documented in `Background jobs
|
||||||
<qemu-qmp-ref.html#Background-jobs>`_.
|
<qemu-qmp-ref.html#Background-jobs>`_.
|
||||||
|
|
||||||
@ -557,6 +556,10 @@ create a new incremental backup chain attached to a drive.
|
|||||||
This example creates a new, full backup of "drive0" and accompanies it with a
|
This example creates a new, full backup of "drive0" and accompanies it with a
|
||||||
new, empty bitmap that records writes from this point in time forward.
|
new, empty bitmap that records writes from this point in time forward.
|
||||||
|
|
||||||
|
The target can be created with the help of `blockdev-add
|
||||||
|
<qemu-qmp-ref.html#index-blockdev_002dadd>`_ or `blockdev-create
|
||||||
|
<qemu-qmp-ref.html#index-blockdev_002dcreate>`_ command.
|
||||||
|
|
||||||
.. note:: Any new writes that happen after this command is issued, even while
|
.. note:: Any new writes that happen after this command is issued, even while
|
||||||
the backup job runs, will be written locally and not to the backup
|
the backup job runs, will be written locally and not to the backup
|
||||||
destination. These writes will be recorded in the bitmap
|
destination. These writes will be recorded in the bitmap
|
||||||
@ -576,12 +579,11 @@ new, empty bitmap that records writes from this point in time forward.
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"target": "/path/to/drive0.full.qcow2",
|
"target": "target0",
|
||||||
"sync": "full",
|
"sync": "full"
|
||||||
"format": "qcow2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -664,12 +666,11 @@ use a transaction to reset the bitmap while making a new full backup:
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"target": "/path/to/drive0.new_full.qcow2",
|
"target": "target0",
|
||||||
"sync": "full",
|
"sync": "full"
|
||||||
"format": "qcow2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -728,19 +729,35 @@ Example: First Incremental Backup
|
|||||||
$ qemu-img create -f qcow2 drive0.inc0.qcow2 \
|
$ qemu-img create -f qcow2 drive0.inc0.qcow2 \
|
||||||
-b drive0.full.qcow2 -F qcow2
|
-b drive0.full.qcow2 -F qcow2
|
||||||
|
|
||||||
|
#. Add target block node:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive0.inc0.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Issue an incremental backup command:
|
#. Issue an incremental backup command:
|
||||||
|
|
||||||
.. code-block:: QMP
|
.. code-block:: QMP
|
||||||
|
|
||||||
-> {
|
-> {
|
||||||
"execute": "drive-backup",
|
"execute": "blockdev-backup",
|
||||||
"arguments": {
|
"arguments": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"target": "drive0.inc0.qcow2",
|
"target": "target0",
|
||||||
"format": "qcow2",
|
"sync": "incremental"
|
||||||
"sync": "incremental",
|
|
||||||
"mode": "existing"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,20 +802,36 @@ Example: Second Incremental Backup
|
|||||||
$ qemu-img create -f qcow2 drive0.inc1.qcow2 \
|
$ qemu-img create -f qcow2 drive0.inc1.qcow2 \
|
||||||
-b drive0.inc0.qcow2 -F qcow2
|
-b drive0.inc0.qcow2 -F qcow2
|
||||||
|
|
||||||
|
#. Add target block node:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive0.inc1.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Issue a new incremental backup command. The only difference here is that we
|
#. Issue a new incremental backup command. The only difference here is that we
|
||||||
have changed the target image below.
|
have changed the target image below.
|
||||||
|
|
||||||
.. code-block:: QMP
|
.. code-block:: QMP
|
||||||
|
|
||||||
-> {
|
-> {
|
||||||
"execute": "drive-backup",
|
"execute": "blockdev-backup",
|
||||||
"arguments": {
|
"arguments": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"target": "drive0.inc1.qcow2",
|
"target": "target0",
|
||||||
"format": "qcow2",
|
"sync": "incremental"
|
||||||
"sync": "incremental",
|
|
||||||
"mode": "existing"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -866,20 +899,36 @@ image:
|
|||||||
file for you, but you lose control over format options like
|
file for you, but you lose control over format options like
|
||||||
compatibility and preallocation presets.
|
compatibility and preallocation presets.
|
||||||
|
|
||||||
|
#. Add target block node:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive0.inc2.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Issue a new incremental backup command. Apart from the new destination
|
#. Issue a new incremental backup command. Apart from the new destination
|
||||||
image, there is no difference from the last two examples.
|
image, there is no difference from the last two examples.
|
||||||
|
|
||||||
.. code-block:: QMP
|
.. code-block:: QMP
|
||||||
|
|
||||||
-> {
|
-> {
|
||||||
"execute": "drive-backup",
|
"execute": "blockdev-backup",
|
||||||
"arguments": {
|
"arguments": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"target": "drive0.inc2.qcow2",
|
"target": "target0",
|
||||||
"format": "qcow2",
|
"sync": "incremental"
|
||||||
"sync": "incremental",
|
|
||||||
"mode": "existing"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -930,6 +979,38 @@ point in time.
|
|||||||
$ qemu-img create -f qcow2 drive0.full.qcow2 64G
|
$ qemu-img create -f qcow2 drive0.full.qcow2 64G
|
||||||
$ qemu-img create -f qcow2 drive1.full.qcow2 64G
|
$ qemu-img create -f qcow2 drive1.full.qcow2 64G
|
||||||
|
|
||||||
|
#. Add target block nodes:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive0.full.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target1",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive1.full.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Create a full (anchor) backup for each drive, with accompanying bitmaps:
|
#. Create a full (anchor) backup for each drive, with accompanying bitmaps:
|
||||||
|
|
||||||
.. code-block:: QMP
|
.. code-block:: QMP
|
||||||
@ -953,21 +1034,19 @@ point in time.
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"target": "/path/to/drive0.full.qcow2",
|
"target": "target0",
|
||||||
"sync": "full",
|
"sync": "full"
|
||||||
"format": "qcow2"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive1",
|
"device": "drive1",
|
||||||
"target": "/path/to/drive1.full.qcow2",
|
"target": "target1",
|
||||||
"sync": "full",
|
"sync": "full"
|
||||||
"format": "qcow2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -1016,6 +1095,38 @@ point in time.
|
|||||||
$ qemu-img create -f qcow2 drive1.inc0.qcow2 \
|
$ qemu-img create -f qcow2 drive1.inc0.qcow2 \
|
||||||
-b drive1.full.qcow2 -F qcow2
|
-b drive1.full.qcow2 -F qcow2
|
||||||
|
|
||||||
|
#. Add target block nodes:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive0.inc0.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target1",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive1.inc0.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Issue a multi-drive incremental push backup transaction:
|
#. Issue a multi-drive incremental push backup transaction:
|
||||||
|
|
||||||
.. code-block:: QMP
|
.. code-block:: QMP
|
||||||
@ -1025,25 +1136,21 @@ point in time.
|
|||||||
"arguments": {
|
"arguments": {
|
||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"format": "qcow2",
|
|
||||||
"mode": "existing",
|
|
||||||
"sync": "incremental",
|
"sync": "incremental",
|
||||||
"target": "drive0.inc0.qcow2"
|
"target": "target0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive1",
|
"device": "drive1",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"format": "qcow2",
|
|
||||||
"mode": "existing",
|
|
||||||
"sync": "incremental",
|
"sync": "incremental",
|
||||||
"target": "drive1.inc0.qcow2"
|
"target": "target1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
@ -1119,19 +1226,35 @@ described above. This example demonstrates the single-job failure case:
|
|||||||
$ qemu-img create -f qcow2 drive0.inc0.qcow2 \
|
$ qemu-img create -f qcow2 drive0.inc0.qcow2 \
|
||||||
-b drive0.full.qcow2 -F qcow2
|
-b drive0.full.qcow2 -F qcow2
|
||||||
|
|
||||||
|
#. Add target block node:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive0.inc0.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Attempt to create an incremental backup via QMP:
|
#. Attempt to create an incremental backup via QMP:
|
||||||
|
|
||||||
.. code-block:: QMP
|
.. code-block:: QMP
|
||||||
|
|
||||||
-> {
|
-> {
|
||||||
"execute": "drive-backup",
|
"execute": "blockdev-backup",
|
||||||
"arguments": {
|
"arguments": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"target": "drive0.inc0.qcow2",
|
"target": "target0",
|
||||||
"format": "qcow2",
|
"sync": "incremental"
|
||||||
"sync": "incremental",
|
|
||||||
"mode": "existing"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1164,6 +1287,19 @@ described above. This example demonstrates the single-job failure case:
|
|||||||
"event": "BLOCK_JOB_COMPLETED"
|
"event": "BLOCK_JOB_COMPLETED"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#. Remove target node:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-del",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Delete the failed image, and re-create it.
|
#. Delete the failed image, and re-create it.
|
||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
@ -1172,20 +1308,36 @@ described above. This example demonstrates the single-job failure case:
|
|||||||
$ qemu-img create -f qcow2 drive0.inc0.qcow2 \
|
$ qemu-img create -f qcow2 drive0.inc0.qcow2 \
|
||||||
-b drive0.full.qcow2 -F qcow2
|
-b drive0.full.qcow2 -F qcow2
|
||||||
|
|
||||||
|
#. Add target block node:
|
||||||
|
|
||||||
|
.. code-block:: QMP
|
||||||
|
|
||||||
|
-> {
|
||||||
|
"execute": "blockdev-add",
|
||||||
|
"arguments": {
|
||||||
|
"node-name": "target0",
|
||||||
|
"driver": "qcow2",
|
||||||
|
"file": {
|
||||||
|
"driver": "file",
|
||||||
|
"filename": "drive0.inc0.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
#. Retry the command after fixing the underlying problem, such as
|
#. Retry the command after fixing the underlying problem, such as
|
||||||
freeing up space on the backup volume:
|
freeing up space on the backup volume:
|
||||||
|
|
||||||
.. code-block:: QMP
|
.. code-block:: QMP
|
||||||
|
|
||||||
-> {
|
-> {
|
||||||
"execute": "drive-backup",
|
"execute": "blockdev-backup",
|
||||||
"arguments": {
|
"arguments": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"target": "drive0.inc0.qcow2",
|
"target": "target0",
|
||||||
"format": "qcow2",
|
"sync": "incremental"
|
||||||
"sync": "incremental",
|
|
||||||
"mode": "existing"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1210,7 +1362,8 @@ described above. This example demonstrates the single-job failure case:
|
|||||||
Example: Partial Transactional Failures
|
Example: Partial Transactional Failures
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
QMP commands like `drive-backup <qemu-qmp-ref.html#index-drive_002dbackup>`_
|
QMP commands like `blockdev-backup
|
||||||
|
<qemu-qmp-ref.html#index-blockdev_002dbackup>`_
|
||||||
conceptually only start a job, and so transactions containing these commands
|
conceptually only start a job, and so transactions containing these commands
|
||||||
may succeed even if the job it created later fails. This might have surprising
|
may succeed even if the job it created later fails. This might have surprising
|
||||||
interactions with notions of how a "transaction" ought to behave.
|
interactions with notions of how a "transaction" ought to behave.
|
||||||
@ -1240,25 +1393,21 @@ and one succeeds:
|
|||||||
"arguments": {
|
"arguments": {
|
||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"format": "qcow2",
|
|
||||||
"mode": "existing",
|
|
||||||
"sync": "incremental",
|
"sync": "incremental",
|
||||||
"target": "drive0.inc0.qcow2"
|
"target": "target0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive1",
|
"device": "drive1",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"format": "qcow2",
|
|
||||||
"mode": "existing",
|
|
||||||
"sync": "incremental",
|
"sync": "incremental",
|
||||||
"target": "drive1.inc0.qcow2"
|
"target": "target1"
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
@ -1375,25 +1524,21 @@ applied:
|
|||||||
},
|
},
|
||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive0",
|
"device": "drive0",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"format": "qcow2",
|
|
||||||
"mode": "existing",
|
|
||||||
"sync": "incremental",
|
"sync": "incremental",
|
||||||
"target": "drive0.inc0.qcow2"
|
"target": "target0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "drive-backup",
|
"type": "blockdev-backup",
|
||||||
"data": {
|
"data": {
|
||||||
"device": "drive1",
|
"device": "drive1",
|
||||||
"bitmap": "bitmap0",
|
"bitmap": "bitmap0",
|
||||||
"format": "qcow2",
|
|
||||||
"mode": "existing",
|
|
||||||
"sync": "incremental",
|
"sync": "incremental",
|
||||||
"target": "drive1.inc0.qcow2"
|
"target": "target1"
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
@ -116,8 +116,8 @@ QEMU block layer supports.
|
|||||||
(3) ``drive-mirror`` (and ``blockdev-mirror``): Synchronize a running
|
(3) ``drive-mirror`` (and ``blockdev-mirror``): Synchronize a running
|
||||||
disk to another image.
|
disk to another image.
|
||||||
|
|
||||||
(4) ``drive-backup`` (and ``blockdev-backup``): Point-in-time (live) copy
|
(4) ``blockdev-backup`` (and the deprecated ``drive-backup``):
|
||||||
of a block device to a destination.
|
Point-in-time (live) copy of a block device to a destination.
|
||||||
|
|
||||||
|
|
||||||
.. _`Interacting with a QEMU instance`:
|
.. _`Interacting with a QEMU instance`:
|
||||||
@ -555,13 +555,14 @@ Currently, there are four different kinds:
|
|||||||
|
|
||||||
(3) ``none`` -- Synchronize only the new writes from this point on.
|
(3) ``none`` -- Synchronize only the new writes from this point on.
|
||||||
|
|
||||||
.. note:: In the case of ``drive-backup`` (or ``blockdev-backup``),
|
.. note:: In the case of ``blockdev-backup`` (or deprecated
|
||||||
the behavior of ``none`` synchronization mode is different.
|
``drive-backup``), the behavior of ``none``
|
||||||
Normally, a ``backup`` job consists of two parts: Anything
|
synchronization mode is different. Normally, a
|
||||||
that is overwritten by the guest is first copied out to
|
``backup`` job consists of two parts: Anything that is
|
||||||
the backup, and in the background the whole image is
|
overwritten by the guest is first copied out to the
|
||||||
copied from start to end. With ``sync=none``, it's only
|
backup, and in the background the whole image is copied
|
||||||
the first part.
|
from start to end. With ``sync=none``, it's only the
|
||||||
|
first part.
|
||||||
|
|
||||||
(4) ``incremental`` -- Synchronize content that is described by the
|
(4) ``incremental`` -- Synchronize content that is described by the
|
||||||
dirty bitmap
|
dirty bitmap
|
||||||
@ -928,19 +929,22 @@ Shutdown the guest, by issuing the ``quit`` QMP command::
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Live disk backup --- ``drive-backup`` and ``blockdev-backup``
|
Live disk backup --- ``blockdev-backup`` and the deprecated``drive-backup``
|
||||||
-------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
The ``drive-backup`` (and its newer equivalent ``blockdev-backup``) allows
|
The ``blockdev-backup`` (and the deprecated ``drive-backup``) allows
|
||||||
you to create a point-in-time snapshot.
|
you to create a point-in-time snapshot.
|
||||||
|
|
||||||
In this case, the point-in-time is when you *start* the ``drive-backup``
|
In this case, the point-in-time is when you *start* the
|
||||||
(or its newer equivalent ``blockdev-backup``) command.
|
``blockdev-backup`` (or deprecated ``drive-backup``) command.
|
||||||
|
|
||||||
|
|
||||||
QMP invocation for ``drive-backup``
|
QMP invocation for ``drive-backup``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Note that ``drive-backup`` command is deprecated since QEMU 6.2 and
|
||||||
|
will be removed in future.
|
||||||
|
|
||||||
Yet again, starting afresh with our example disk image chain::
|
Yet again, starting afresh with our example disk image chain::
|
||||||
|
|
||||||
[A] <-- [B] <-- [C] <-- [D]
|
[A] <-- [B] <-- [C] <-- [D]
|
||||||
@ -965,11 +969,22 @@ will be issued, indicating the live block device job operation has
|
|||||||
completed, and no further action is required.
|
completed, and no further action is required.
|
||||||
|
|
||||||
|
|
||||||
|
Moving from the deprecated ``drive-backup`` to newer ``blockdev-backup``
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
``blockdev-backup`` differs from ``drive-backup`` in how you specify
|
||||||
|
the backup target. With ``blockdev-backup`` you can't specify filename
|
||||||
|
as a target. Instead you use ``node-name`` of existing block node,
|
||||||
|
which you may add by ``blockdev-add`` or ``blockdev-create`` commands.
|
||||||
|
Correspondingly, ``blockdev-backup`` doesn't have ``mode`` and
|
||||||
|
``format`` arguments which don't apply to an existing block node. See
|
||||||
|
following sections for details and examples.
|
||||||
|
|
||||||
|
|
||||||
Notes on ``blockdev-backup``
|
Notes on ``blockdev-backup``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
The ``blockdev-backup`` command is equivalent in functionality to
|
The ``blockdev-backup`` command operates at node-level in a Block Driver
|
||||||
``drive-backup``, except that it operates at node-level in a Block Driver
|
|
||||||
State (BDS) graph.
|
State (BDS) graph.
|
||||||
|
|
||||||
E.g. the sequence of actions to create a point-in-time backup
|
E.g. the sequence of actions to create a point-in-time backup
|
||||||
|
@ -1709,6 +1709,9 @@
|
|||||||
# The operation can be stopped before it has completed using the
|
# The operation can be stopped before it has completed using the
|
||||||
# block-job-cancel command.
|
# block-job-cancel command.
|
||||||
#
|
#
|
||||||
|
# Features:
|
||||||
|
# @deprecated: This command is deprecated. Use @blockdev-backup instead.
|
||||||
|
#
|
||||||
# Returns: - nothing on success
|
# Returns: - nothing on success
|
||||||
# - If @device is not a valid block device, GenericError
|
# - If @device is not a valid block device, GenericError
|
||||||
#
|
#
|
||||||
@ -1724,7 +1727,7 @@
|
|||||||
#
|
#
|
||||||
##
|
##
|
||||||
{ 'command': 'drive-backup', 'boxed': true,
|
{ 'command': 'drive-backup', 'boxed': true,
|
||||||
'data': 'DriveBackup' }
|
'data': 'DriveBackup', 'features': ['deprecated'] }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @blockdev-backup:
|
# @blockdev-backup:
|
||||||
|
@ -54,6 +54,10 @@
|
|||||||
# @blockdev-snapshot-sync: since 1.1
|
# @blockdev-snapshot-sync: since 1.1
|
||||||
# @drive-backup: Since 1.6
|
# @drive-backup: Since 1.6
|
||||||
#
|
#
|
||||||
|
# Features:
|
||||||
|
# @deprecated: Member @drive-backup is deprecated. Use member
|
||||||
|
# @blockdev-backup instead.
|
||||||
|
#
|
||||||
# Since: 1.1
|
# Since: 1.1
|
||||||
##
|
##
|
||||||
{ 'enum': 'TransactionActionKind',
|
{ 'enum': 'TransactionActionKind',
|
||||||
@ -62,7 +66,7 @@
|
|||||||
'block-dirty-bitmap-disable', 'block-dirty-bitmap-merge',
|
'block-dirty-bitmap-disable', 'block-dirty-bitmap-merge',
|
||||||
'blockdev-backup', 'blockdev-snapshot',
|
'blockdev-backup', 'blockdev-snapshot',
|
||||||
'blockdev-snapshot-internal-sync', 'blockdev-snapshot-sync',
|
'blockdev-snapshot-internal-sync', 'blockdev-snapshot-sync',
|
||||||
'drive-backup' ] }
|
{ 'name': 'drive-backup', 'features': [ 'deprecated' ] } ] }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @AbortWrapper:
|
# @AbortWrapper:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user