QEMU NBD protocol support ========================= QEMU supports the NBD protocol, and has an internal NBD client (see ``block/nbd.c``), an internal NBD server (see ``blockdev-nbd.c``), and an external NBD server tool (see ``qemu-nbd.c``). The common code is placed in ``nbd/*``. The NBD protocol is specified here: https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md The following paragraphs describe some specific properties of NBD protocol realization in QEMU. Metadata namespaces ------------------- QEMU supports the ``base:allocation`` metadata context as defined in the NBD protocol specification, and also defines an additional metadata namespace ``qemu``. ``qemu`` namespace ------------------ The ``qemu`` namespace currently contains two available metadata context types. The first is related to exposing the contents of a dirty bitmap alongside the associated disk contents. That metadata context is named with the following form:: qemu:dirty-bitmap: Each dirty-bitmap metadata context defines only one flag for extents in reply for ``NBD_CMD_BLOCK_STATUS``: bit 0: ``NBD_STATE_DIRTY``, set when the extent is "dirty" The second is related to exposing the source of various extents within the image, with a single metadata context named:: qemu:allocation-depth In the allocation depth context, the entire 32-bit value represents a depth of which layer in a thin-provisioned backing chain provided the data (0 for unallocated, 1 for the active layer, 2 for the first backing layer, and so forth). For ``NBD_OPT_LIST_META_CONTEXT`` the following queries are supported in addition to the specific ``qemu:allocation-depth`` and ``qemu:dirty-bitmap:``: ``qemu:`` returns list of all available metadata contexts in the namespace ``qemu:dirty-bitmap:`` returns list of all available dirty-bitmap metadata contexts Features by version ------------------- The following list documents which qemu version first implemented various features (both as a server exposing the feature, and as a client taking advantage of the feature when present), to make it easier to plan for cross-version interoperability. Note that in several cases, the initial release containing a feature may require additional patches from the corresponding stable branch to fix bugs in the operation of that feature. 2.6 ``NBD_OPT_STARTTLS`` with TLS X.509 Certificates 2.8 ``NBD_CMD_WRITE_ZEROES`` 2.10 ``NBD_OPT_GO``, ``NBD_INFO_BLOCK`` 2.11 ``NBD_OPT_STRUCTURED_REPLY`` 2.12 ``NBD_CMD_BLOCK_STATUS`` for ``base:allocation`` 3.0 ``NBD_OPT_STARTTLS`` with TLS Pre-Shared Keys (PSK), ``NBD_CMD_BLOCK_STATUS`` for ``qemu:dirty-bitmap:``, ``NBD_CMD_CACHE`` 4.2 ``NBD_FLAG_CAN_MULTI_CONN`` for shareable read-only exports, ``NBD_CMD_FLAG_FAST_ZERO`` 5.2 ``NBD_CMD_BLOCK_STATUS`` for ``qemu:allocation-depth`` 7.1 ``NBD_FLAG_CAN_MULTI_CONN`` for shareable writable exports 8.2 ``NBD_OPT_EXTENDED_HEADERS``, ``NBD_FLAG_BLOCK_STATUS_PAYLOAD``