| QEMU Disk Network Block Device Server |
| ===================================== |
| |
| Synopsis |
| -------- |
| |
| **qemu-nbd** [*OPTION*]... *filename* |
| |
| **qemu-nbd** -L [*OPTION*]... |
| |
| **qemu-nbd** -d *dev* |
| |
| Description |
| ----------- |
| |
| Export a QEMU disk image using the NBD protocol. |
| |
| Other uses: |
| |
| - Bind a /dev/nbdX block device to a QEMU server (on Linux). |
| - As a client to query exports of a remote NBD server. |
| |
| Options |
| ------- |
| |
| .. program:: qemu-nbd |
| |
| *filename* is a disk image filename, or a set of block |
| driver options if ``--image-opts`` is specified. |
| |
| *dev* is an NBD device. |
| |
| .. option:: --object type,id=ID,...props... |
| |
| Define a new instance of the *type* object class identified by *ID*. |
| See the :manpage:`qemu(1)` manual page for full details of the properties |
| supported. The common object types that it makes sense to define are the |
| ``secret`` object, which is used to supply passwords and/or encryption |
| keys, and the ``tls-creds`` object, which is used to supply TLS |
| credentials for the qemu-nbd server or client. |
| |
| .. option:: -p, --port=PORT |
| |
| TCP port to listen on as a server, or connect to as a client |
| (default ``10809``). |
| |
| .. option:: -o, --offset=OFFSET |
| |
| The offset into the image. |
| |
| .. option:: -b, --bind=IFACE |
| |
| The interface to bind to as a server, or connect to as a client |
| (default ``0.0.0.0``). |
| |
| .. option:: -k, --socket=PATH |
| |
| Use a unix socket with path *PATH*. |
| |
| .. option:: --image-opts |
| |
| Treat *filename* as a set of image options, instead of a plain |
| filename. If this flag is specified, the ``-f`` flag should |
| not be used, instead the :option:`format=` option should be set. |
| |
| .. option:: -f, --format=FMT |
| |
| Force the use of the block driver for format *FMT* instead of |
| auto-detecting. |
| |
| .. option:: -r, --read-only |
| |
| Export the disk as read-only. |
| |
| .. option:: -A, --allocation-depth |
| |
| Expose allocation depth information via the |
| ``qemu:allocation-depth`` metadata context accessible through |
| NBD_OPT_SET_META_CONTEXT. |
| |
| .. option:: -B, --bitmap=NAME |
| |
| If *filename* has a qcow2 persistent bitmap *NAME*, expose |
| that bitmap via the ``qemu:dirty-bitmap:NAME`` metadata context |
| accessible through NBD_OPT_SET_META_CONTEXT. |
| |
| .. option:: -s, --snapshot |
| |
| Use *filename* as an external snapshot, create a temporary |
| file with ``backing_file=``\ *filename*, redirect the write to |
| the temporary one. |
| |
| .. option:: -l, --load-snapshot=SNAPSHOT_PARAM |
| |
| Load an internal snapshot inside *filename* and export it |
| as an read-only device, SNAPSHOT_PARAM format is |
| ``snapshot.id=[ID],snapshot.name=[NAME]`` or ``[ID_OR_NAME]`` |
| |
| .. option:: --cache=CACHE |
| |
| The cache mode to be used with the file. See the documentation of |
| the emulator's ``-drive cache=...`` option for allowed values. |
| |
| .. option:: -n, --nocache |
| |
| Equivalent to :option:`--cache=none`. |
| |
| .. option:: --aio=AIO |
| |
| Set the asynchronous I/O mode between ``threads`` (the default), |
| ``native`` (Linux only), and ``io_uring`` (Linux 5.1+). |
| |
| .. option:: --discard=DISCARD |
| |
| Control whether ``discard`` (also known as ``trim`` or ``unmap``) |
| requests are ignored or passed to the filesystem. *DISCARD* is one of |
| ``ignore`` (or ``off``), ``unmap`` (or ``on``). The default is |
| ``ignore``. |
| |
| .. option:: --detect-zeroes=DETECT_ZEROES |
| |
| Control the automatic conversion of plain zero writes by the OS to |
| driver-specific optimized zero write commands. *DETECT_ZEROES* is one of |
| ``off``, ``on``, or ``unmap``. ``unmap`` |
| converts a zero write to an unmap operation and can only be used if |
| *DISCARD* is set to ``unmap``. The default is ``off``. |
| |
| .. option:: -c, --connect=DEV |
| |
| Connect *filename* to NBD device *DEV* (Linux only). |
| |
| .. option:: -d, --disconnect |
| |
| Disconnect the device *DEV* (Linux only). |
| |
| .. option:: -e, --shared=NUM |
| |
| Allow up to *NUM* clients to share the device (default |
| ``1``). Safe for readers, but for now, consistency is not |
| guaranteed between multiple writers. |
| |
| .. option:: -t, --persistent |
| |
| Don't exit on the last connection. |
| |
| .. option:: -x, --export-name=NAME |
| |
| Set the NBD volume export name (default of a zero-length string). |
| |
| .. option:: -D, --description=DESCRIPTION |
| |
| Set the NBD volume export description, as a human-readable |
| string. |
| |
| .. option:: -L, --list |
| |
| Connect as a client and list all details about the exports exposed by |
| a remote NBD server. This enables list mode, and is incompatible |
| with options that change behavior related to a specific export (such as |
| :option:`--export-name`, :option:`--offset`, ...). |
| |
| .. option:: --tls-creds=ID |
| |
| Enable mandatory TLS encryption for the server by setting the ID |
| of the TLS credentials object previously created with the --object |
| option; or provide the credentials needed for connecting as a client |
| in list mode. |
| |
| .. option:: --fork |
| |
| Fork off the server process and exit the parent once the server is running. |
| |
| .. option:: --pid-file=PATH |
| |
| Store the server's process ID in the given file. |
| |
| .. option:: --tls-authz=ID |
| |
| Specify the ID of a qauthz object previously created with the |
| :option:`--object` option. This will be used to authorize connecting users |
| against their x509 distinguished name. |
| |
| .. option:: -v, --verbose |
| |
| Display extra debugging information. |
| |
| .. option:: -h, --help |
| |
| Display this help and exit. |
| |
| .. option:: -V, --version |
| |
| Display version information and exit. |
| |
| .. option:: -T, --trace [[enable=]PATTERN][,events=FILE][,file=FILE] |
| |
| .. include:: ../qemu-option-trace.rst.inc |
| |
| Examples |
| -------- |
| |
| Start a server listening on port 10809 that exposes only the |
| guest-visible contents of a qcow2 file, with no TLS encryption, and |
| with the default export name (an empty string). The command is |
| one-shot, and will block until the first successful client |
| disconnects: |
| |
| :: |
| |
| qemu-nbd -f qcow2 file.qcow2 |
| |
| Start a long-running server listening with encryption on port 10810, |
| and whitelist clients with a specific X.509 certificate to connect to |
| a 1 megabyte subset of a raw file, using the export name 'subset': |
| |
| :: |
| |
| qemu-nbd \ |
| --object tls-creds-x509,id=tls0,endpoint=server,dir=/path/to/qemutls \ |
| --object 'authz-simple,id=auth0,identity=CN=laptop.example.com,,\ |
| O=Example Org,,L=London,,ST=London,,C=GB' \ |
| --tls-creds tls0 --tls-authz auth0 \ |
| -t -x subset -p 10810 \ |
| --image-opts driver=raw,offset=1M,size=1M,file.driver=file,file.filename=file.raw |
| |
| Serve a read-only copy of a guest image over a Unix socket with as |
| many as 5 simultaneous readers, with a persistent process forked as a |
| daemon: |
| |
| :: |
| |
| qemu-nbd --fork --persistent --shared=5 --socket=/path/to/sock \ |
| --read-only --format=qcow2 file.qcow2 |
| |
| Expose the guest-visible contents of a qcow2 file via a block device |
| /dev/nbd0 (and possibly creating /dev/nbd0p1 and friends for |
| partitions found within), then disconnect the device when done. |
| Access to bind qemu-nbd to an /dev/nbd device generally requires root |
| privileges, and may also require the execution of ``modprobe nbd`` |
| to enable the kernel NBD client module. *CAUTION*: Do not use |
| this method to mount filesystems from an untrusted guest image - a |
| malicious guest may have prepared the image to attempt to trigger |
| kernel bugs in partition probing or file system mounting. |
| |
| :: |
| |
| qemu-nbd -c /dev/nbd0 -f qcow2 file.qcow2 |
| qemu-nbd -d /dev/nbd0 |
| |
| Query a remote server to see details about what export(s) it is |
| serving on port 10809, and authenticating via PSK: |
| |
| :: |
| |
| qemu-nbd \ |
| --object tls-creds-psk,id=tls0,dir=/tmp/keys,username=eblake,endpoint=client \ |
| --tls-creds tls0 -L -b remote.example.com |
| |
| See also |
| -------- |
| |
| :manpage:`qemu(1)`, :manpage:`qemu-img(1)` |