# 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:<dirty-bitmap-export-name>

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:<dirty-bitmap-export-name>`:

`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`