Documentation/QMP: Difference between revisions

From QEMU
(Use wait=off instead of the obsolete nowait parameter)
 
(34 intermediate revisions by 8 users not shown)
Line 10: Line 10:
* API/ABI stability guarantees
* API/ABI stability guarantees


Please, also check the [http://git.qemu.org/?p=qemu.git;a=blob_plain;f=QMP/README;hb=HEAD README] file.
Please, also check the [http://git.qemu.org/?p=qemu.git;a=blob_plain;f=docs/interop/qmp-intro.txt;hb=HEAD QMP intro] file for more information.


== Examples ==
== Examples ==
Line 16: Line 16:
The first example explains some important details about QMP. The others are simpler and run on top of the first one.
The first example explains some important details about QMP. The others are simpler and run on top of the first one.


In all examples 'C' stands for 'Client' and 'S' stands for 'Server'.
In all examples "C" stands for "Client" and "S" stands for "Server".


=== Capabilities Negotiation ===
=== Capabilities Negotiation ===
Line 67: Line 67:
== Development ==
== Development ==


Main developer in charge is [mailto:lcapitulino@redhat.com Luiz Capitulino]. All QMP-related discussions happen on the [http://lists.nongnu.org/mailman/listinfo/qemu-devel qemu-devel] mailing list.
QMP being a core part of QEMU, all discussions happen on the [http://lists.nongnu.org/mailman/listinfo/qemu-devel qemu-devel] mailing list.


Luiz's QMP queue can be found at:
== Trying it ==
 
http://repo.or.cz/w/qemu/qmp-unstable.git/shortlog/refs/heads/queue/qmp
 
'''IMPORTANT''': This branch is constantly rebased!
 
=== TODO ===
 
In order of importance.
 
==== Drop the qmp-commands.hx file ====
 
The qmp-commands.hx file is basically a command table. Today, with the advent of the QAPI, the qapi-schema.json file serves the same purpose. We should drop qmp-commands.hx in favor of qapi-schema.json.
 
This is more or less what it takes to do that:
 
# Convert do_device_add() and do_qmp_capabilities() to propagate errors (ie, fill an Error ** object instead of doing qerror_report() calls)
# Do something about qmp_netdev_add(), qmp_qom_get() and qmp_qom_set() (drop them or add QAPI wrappers?)
# Change QMP code in monitor.c to use the QAPI to do command parameter validation and command dispatching (just like qemu-ga does)
# Move QMP examples from qmp-commands.hx to qapi-schema.json
# Drop qmp-commands.hx
 
==== Add full introspection support ====
 
This is about adding a command which returns all QMP types, commands (input and output parameters) and events.
 
Amos Kong is working on this:
 
http://marc.info/?l=qemu-devel&m=137059998004419&w=2
 
==== Add events support to the QAPI ====
 
Today events are exclusively part of the text protocol. This means that they are open coded, QEMU subsystems can't make use of them and they don't appear in qapi-schema.json.
 
We would solve all those problems by adding event support to the QAPI.
 
==== QMP testing ====
 
There should be a QMP test-suite. Either in QEMU itself or externally, like in kvm-autotest (which seems to be the best option).
 
==== HMP command conversion to the QAPI ====
 
Our long term plan is to make HMP, the human monitor, independent of QEMU. This means that HMP code shouldn't call QEMU code other than the monitor.
 
To achieve this we have to split existing HMP-only commands (eg. do_wav_capture() or do_ioport_read()) into a QMP part and an HMP part.
 
== Testing ==
 
This section describes the following ways of testing QMP:
 
* By hand (cumbersome, only worth it if you're chasing a specific bug)
* qmp-shell script (automates part of the job)
* Libvirt integration (assumes familiarity with [http://libvirt.org libvirt])
* libvirt-TCK
* kvm-autotest
 
Please, note that it's very recommended to read the [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/README README] and [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/qmp-spec.txt spec] files, as some of the testing procedures may require knowledge about the protocol format.


=== By hand ===
=== By hand ===
Line 131: Line 75:
1. Start QMP on a TCP socket, so that telnet can be used
1. Start QMP on a TCP socket, so that telnet can be used


  # qemu [...] -qmp tcp:localhost:4444,server
  # qemu [...] -qmp tcp:localhost:4444,server,wait=off


2. Run telnet
2. Run telnet
Line 139: Line 83:
3. You should see QMP's greeting banner
3. You should see QMP's greeting banner


  {"QMP": {"version": {"qemu": {"micro": 50, "minor": 13, "major": 0}, "package": ""}, "capabilities": []}}
  {"QMP": {"version": {"qemu": {"micro": 0, "minor": 6, "major": 1}, "package": ""}, "capabilities": []}}


4. Issue the ''qmp_capabilities'' command, so that QMP enters command mode
4. Issue the ''qmp_capabilities'' command, so that QMP enters command mode
Line 149: Line 93:
  { "execute": "query-commands" }
  { "execute": "query-commands" }


'''NOTE:''' all "info" commands are available under QMP as "query-", for example "info vnc" is "query-vnc"
There's an optimization to this procedure in case you plan to use it often:
 
There's an optimization to this procedure in case you plan to use it often (eg. QMP development):


1. Install programs ''socat'' and ''rlwrap''. If you're running Fedora, you can do
1. Install programs ''socat'' and ''rlwrap''. If you're running Fedora, you can do
Line 167: Line 109:
   mode = "control"
   mode = "control"
   chardev = "qmp"
   chardev = "qmp"
  pretty = "on"


3. Run QEMU
3. Run QEMU
Line 180: Line 123:
=== qmp-shell script ===
=== qmp-shell script ===


This script is available under the [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP QMP] directory in QEMU's source-tree. It automates a bit the testing work, as it can construct commands objects for you.
This script is available under the [http://git.qemu.org/?p=qemu.git;a=tree;f=scripts/qmp;hb=HEAD scripts/qmp/] directory in QEMU's source-tree. It automates a bit the testing work, as it can construct commands objects for you.


1. Start QMP on a unix socket
1. Start QMP on a unix socket


  # qemu [...] -qmp unix:./qmp-sock,server
  # qemu [...] -qmp unix:./qmp-sock,server,wait=off


2. Run the script
2. Run the script
Line 198: Line 141:
  (QEMU) device_add driver=e1000 id=net1
  (QEMU) device_add driver=e1000 id=net1


=== Libvirt ===
== Historic information ==
 
Libvirt already got QMP support, but it's currently disabled. This test procedure explains how to enable it, so that you can have libvirt running on top of QMP.
 
1. Install [http://lloyd.github.com/yajl yajl-devel] (If you're running Fedora 12 or above just do 'yum install yajl-devel')
 
2. From a fresh checkout of [http://libvirt.org/git/?p=libvirt.git;a=summary libvirt master branch] run the following:
 
./autogen.sh --system --enable-compile-warnings=error
 
'''NOTE (1):''' The '--system' flag is a shortcut for compiling with the --prefix and other directories matching a system RPM build.
 
'''NOTE (2):''' Make sure the final summary of autogen.sh tells you that it found the yajl library
 
3. To enable QMP support, edit '''src/qemu/qemu_conf.c''' and find:
 
#if 0
    if (version >= 13000)
        flags |= QEMUD_CMD_FLAG_MONITOR_JSON;
#endif
 
Change to '#if 1', and change the version to 12000 so it detects your GIT build of QEMU
 
4. Run 'make' to build. There is no need to 'make install' anything
especially since that would overwrite your RPM based install
 
5. As root simply stop the current daemon & start the one you built
 
/etc/init.d/libvirtd stop
$HOME/your/git/checkout/of/libvirt/daemon/libvirtd
 
6. As root you can use the newly built virsh too
 
cd $HOME/your/git/checkout/of/libvirt/src
./virsh <BLAH>
 
=== Libvirt-TCK ===
 
TODO: describe libvirt's testing tool.
 
=== kvm-autotest ===
 
TODO: describe [http://www.linux-kvm.org/page/KVM-Autotest kvm-autotest] QMP support.


== Other information ==
* Luiz's QMP talk on KVM Forum 2010 can be found [http://www.linux-kvm.org/images/1/17/2010-forum-qmp-status-talk.pp.pdf here]
* Old QMP page can be accessed [http://www.linux-kvm.org/index.php?title=MonitorProtocol&oldid=3100 here]


* Luiz's QMP talk on KVM Forum 2010 can be found [http://www.cpu.eti.br/talks/qmp-talk-kvm-forum-2010.pdf here]
[[Category:User documentation]]
* Old QMP page can be accessed [http://www.linux-kvm.org/wiki/index.php?title=MonitorProtocol&direction=prev&oldid=3232 here]

Latest revision as of 12:35, 22 March 2022

QEMU Machine Protocol

The QEMU Machine Protocol (QMP) is a JSON-based protocol which allows applications to control a QEMU instance.

Features:

  • Lightweight, text-based, easy to parse data format
  • Asynchronous messages support (events)
  • Capabilities negotiation
  • API/ABI stability guarantees

Please, also check the QMP intro file for more information.

Examples

The first example explains some important details about QMP. The others are simpler and run on top of the first one.

In all examples "C" stands for "Client" and "S" stands for "Server".

Capabilities Negotiation

When a new QMP connection is established, QMP sends its greeting message and enters capabilities negotiation mode. In this mode, only the qmp_capabilities command works. To exit capabilities negotiation mode and enter command mode, the qmp_capabilities command must be issued:

 S: {
        "QMP": {
            "version": {
                "qemu": {
                    "micro": 0,
                    "minor": 6,
                    "major": 1
                },
                "package": ""
            },
            "capabilities": [
            ]
        }
    }
C: { "execute": "qmp_capabilities" }
S: { "return": {}}

The { "return": {} } response is QMP's success response. An error response will contain the "error" keyword instead of "return".

Eject a medium

C: { "execute": "eject", "arguments": { "device": "ide1-cd0" } }
S: { "return": {}}

Query VM status

C: { "execute": "query-status" }
S: {
       "return": {
           "status": "running",
           "singlestep": false,
           "running": true
       }
   }

Asynchronous message

S: { "event": "BLOCK_IO_ERROR",
     "data": { "device": "ide0-hd1",
               "operation": "write",
               "action": "stop" },
     "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }

Development

QMP being a core part of QEMU, all discussions happen on the qemu-devel mailing list.

Trying it

By hand

1. Start QMP on a TCP socket, so that telnet can be used

# qemu [...] -qmp tcp:localhost:4444,server,wait=off

2. Run telnet

$ telnet localhost 4444

3. You should see QMP's greeting banner

{"QMP": {"version": {"qemu": {"micro": 0, "minor": 6, "major": 1}, "package": ""}, "capabilities": []}}

4. Issue the qmp_capabilities command, so that QMP enters command mode

{ "execute": "qmp_capabilities" }

5. You can now issue commands. For example, to get a list of QMP supported commands, issue query-commands

{ "execute": "query-commands" }

There's an optimization to this procedure in case you plan to use it often:

1. Install programs socat and rlwrap. If you're running Fedora, you can do

# yum install socat rlwrap

2. Add the following sections to your QEMU config file (or create a qemu-qmp.conf one):

[chardev "qmp"]
  backend = "socket"
  path = "path to the QMP unix socket"
  server = "on"
  wait = "off"
[mon "qmp"]
  mode = "control"
  chardev = "qmp"
  pretty = "on"

3. Run QEMU

# qemu [...] -readconfig qemu-qmp.conf

4. Run rlwrap

# rlwrap -C qmp socat STDIO UNIX:path-to-the-QMP-unix-socket

You can now issue commands, rlwrap will give you readline support (including persistent history).

qmp-shell script

This script is available under the scripts/qmp/ directory in QEMU's source-tree. It automates a bit the testing work, as it can construct commands objects for you.

1. Start QMP on a unix socket

# qemu [...] -qmp unix:./qmp-sock,server,wait=off

2. Run the script

# qmp-shell ./qmp-sock

3. You should get the following prompt

(QEMU)

4. You can now issue commands. For example, let's add a new device

(QEMU) device_add driver=e1000 id=net1

Historic information

  • Luiz's QMP talk on KVM Forum 2010 can be found here
  • Old QMP page can be accessed here