[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] live block copy/stream/snapshot discussion

From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] live block copy/stream/snapshot discussion
Date: Mon, 11 Jul 2011 15:47:15 +0100

Kevin, Marcelo,
I'd like to reach agreement on the QMP/HMP APIs for live block copy
and image streaming.  Libvirt has acked the image streaming APIs that
Adam proposed and I think they are a good fit for the feature.  I have
described that API below for your review (it's exactly what the QED
Image Streaming patches provide).

Marcelo: Are you happy with this API for live block copy?  Also please
take a look at the switch command that I am proposing.

Image streaming API

For leaf images with copy-on-read semantics, the stream commands allow the user
to populate local blocks by manually streaming them from the backing image.
Once all blocks have been streamed, the dependency on the original backing
image can be removed.  Therefore, stream commands can be used to implement
post-copy live block migration and rapid deployment.

The block_stream command can be used to stream a single cluster, to
start streaming the entire device, and to cancel an active stream.  It
is easiest to allow the block_stream command to manage streaming for the
entire device but a managent tool could use single cluster mode to
throttle the I/O rate.

The command synopses are as follows:


Copy data from a backing file into a block device.

If the optional 'all' argument is true, this operation is performed in the
background until the entire backing file has been copied.  The status of
ongoing block_stream operations can be checked with query-block-stream.


- all:    copy entire device (json-bool, optional)
- stop:   stop copying to device (json-bool, optional)
- device: device name (json-string)


- device: device name (json-string)
- len:    size of the device, in bytes (json-int)
- offset: ending offset of the completed I/O, in bytes (json-int)


-> { "execute": "block_stream", "arguments": { "device": "virtio0" } }
<- { "return":  { "device": "virtio0", "len": 10737418240, "offset": 512 } }

-> { "execute": "block_stream", "arguments": { "all": true, "device":
"virtio0" } }
<- { "return": {} }

-> { "execute": "block_stream", "arguments": { "stop": true, "device":
"virtio0" } }
<- { "return": {} }


Show progress of ongoing block_stream operations.

Return a json-array of all operations.  If no operation is active then an empty
array will be returned.  Each operation is a json-object with the following

- device: device name (json-string)
- len:    size of the device, in bytes (json-int)
- offset: ending offset of the completed I/O, in bytes (json-int)


-> { "execute": "query-block-stream" }
<- { "return":[
       { "device": "virtio0", "len": 10737418240, "offset": 709632}

Block device switching API

Extend the 'change' command to support changing the image file without
media change notification.

Perhaps we should take the opportunity to add a "format" argument for
image files?


Change a removable medium or VNC configuration.


- "device": device name (json-string)
- "target": filename or item (json-string)
- "arg": additional argument (json-string, optional)
- "notify": whether to notify guest, defaults to true (json-bool, optional)


1. Change a removable medium

-> { "execute": "change",
             "arguments": { "device": "ide1-cd0",
                            "target": "/srv/images/Fedora-12-x86_64-DVD.iso" } }
<- { "return": {} }

2. Change a disk without media change notification

-> { "execute": "change",
             "arguments": { "device": "virtio-blk0",
                            "target": "/srv/images/vm_1.img",
                            "notify": false } }

3. Change VNC password

-> { "execute": "change",
             "arguments": { "device": "vnc", "target": "password",
                            "arg": "foobar1" } }
<- { "return": {} }

How live block copy works

Live block copy does the following:

1. Create the destination file: qemu-img create -f $cow_fmt -o
backing_file=$base destination.$cow_fmt
2. Switch to the destination file: change -n virtio-blk0 /srv/images/vm_1.img
3. Stream the base into the image file: block_stream -a virtio-blk0


reply via email to

[Prev in Thread] Current Thread [Next in Thread]