Launch QEMU with QMP: ----------------------------------------------------------------------- $> x86_64-softmmu/qemu-system-x86_64 -display none -no-user-config \ -nodefaults -monitor stdio -machine pc,accel=kvm,usb=off \ -cpu IvyBridge -m 2048 -blockdev node-name=node-Base,driver=qcow2,file.driver=file,file.filename=./base.qcow2 \ -device virtio-blk,drive=node-Base,id=virtio0 \ -qmp unix:./qmp-sock,server,nowait ----------------------------------------------------------------------- Launch `qmp-shell`: ----------------------------------------------------------------------- $> ./qmp-shell -v -p /export/qmp-sock (QEMU) query-version { "execute": "query-version", "arguments": {} } { "return": { "qemu": { "micro": 50, "major": 2, "minor": 12 }, "package": "v2.12.0-1690-g81e21aa70c-dirty" } } (QEMU) ----------------------------------------------------------------------- Run `blockdev-create`: On the "file" laer, create an empty file of size '0', without any image format in it (this makes more sense for network protocols): ----------------------------------------------------------------------- (QEMU) blockdev-create job-id=job0 options={"driver":"file","filename":"foo.qcow2","size":0} { "execute": "blockdev-create", "arguments": { "job-id": "job0", "options": { "size": 0, "driver": "file", "filename": "foo.qcow2" } } } { "return": {} } (QEMU) {u'timestamp': {u'seconds': 1530607920, u'microseconds': 27852}, u'data': {u'status': u'null', u'id': u'job1'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530608045, u'microseconds': 217758}, u'data': {u'status': u'created', u'id': u'job1'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530608045, u'microseconds': 217899}, u'data': {u'status': u'running', u'id': u'job1'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530608045, u'microseconds': 218513}, u'data': {u'status': u'aborting', u'id': u'job1'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530608045, u'microseconds': 218626}, u'data': {u'status': u'concluded', u'id': u'job1'}, u'event': u'JOB_STATUS_CHANGE'} ----------------------------------------------------------------------- Now re-run `blockdev-create` to create the "qcow2" format on the above created file: ----------------------------------------------------------------------- (QEMU) blockdev-create job-id=job1 options={"driver":"qcow2","size":16384,"file":{"driver":"file","filename":"foo.qcow2"}} { "execute": "blockdev-create", "arguments": { "job-id": "job1", "options": { "driver": "qcow2", "file": { "driver": "file", "filename": "foo.qcow2" }, "size": 16384 } } } { "return": {} } (QEMU) {u'timestamp': {u'seconds': 1530609183, u'microseconds': 437398}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530609183, u'microseconds': 437534}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530609183, u'microseconds': 438212}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530609183, u'microseconds': 438308}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'} {u'timestamp': {u'seconds': 1530609183, u'microseconds': 438391}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'} ----------------------------------------------------------------------- Query for the jobs: ----------------------------------------------------------------------- (QEMU) query-jobs { "execute": "query-jobs", "arguments": {} } { "return": [ { "status": "concluded", "current-progress": 1, "total-progress": 1, "id": "job1", "type": "create" }, { "status": "concluded", "current-progress": 1, "total-progress": 1, "id": "job0", "type": "create" } ] } (QEMU) ----------------------------------------------------------------------- Dismiss both the jobs (they can be dismissed the moment you get 'concluded' event; the only reason it stays around is so you can still query its result): ----------------------------------------------------------------------- (QEMU) job-dismiss id=job1 { "execute": "job-dismiss", "arguments": { "id": "job0" } } { "return": {} } (QEMU) {u'timestamp': {u'seconds': 1530608959, u'microseconds': 208670}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'} (QEMU) job-dismiss id=job1 { "execute": "job-dismiss", "arguments": { "id": "job1" } } { "return": {} } (QEMU) {u'timestamp': {u'seconds': 1530608963, u'microseconds': 776448}, u'data': {u'status': u'null', u'id': u'job1'}, u'event': u'JOB_STATUS_CHANGE'} ----------------------------------------------------------------------- Now add the just-created 'foo.qcow2' to the QEMU and give it a 'node-name': ----------------------------------------------------------------------- (QEMU) blockdev-add driver=qcow2 node-name=node-Foo file={"driver":"file","filename":"foo.qcow2"} { "execute": "blockdev-add", "arguments": { "node-name": "node-Foo", "driver": "qcow2", "file": { "driver": "file", "filename": "foo.qcow2" } } } { "return": {} } (QEMU) ----------------------------------------------------------------------- Optionally, query for the block devices: ----------------------------------------------------------------------- (QEMU) query-named-block-nodes [...] "bps_wr": 0, "drv": "qcow2", "node-name": "node-Foo", "bps": 0, "iops": 0, "write_threshold": 0, "file": "foo.qcow2", [...] }, [...] "bps_wr": 0, "drv": "qcow2", "node-name": "node-Base", "bps": 0, "iops": 0, "write_threshold": 0, "file": "./base.qcow2", [...] }, -----------------------------------------------------------------------