nbdinfo(1) | LIBNBD | nbdinfo(1) |
nbdinfo - display information and metadata about NBD servers and exports
nbdinfo [--json] NBD
"NBD" is an NBD URI or subprocess:
NBD := nbd://... | nbd+unix:// (or other URI formats) | [ CMD ARGS ... ]
nbdinfo --size [--json] NBD
nbdinfo --is read-only|rotational NBD
nbdinfo --can cache|connect|... NBD
nbdinfo --map [--totals] [--json] NBD
nbdinfo -L|--list [--json] NBD
nbdinfo --help
nbdinfo --version
nbdinfo displays information and metadata about an NBD server.
The single required parameter can be the NBD URI of the server (see https://github.com/NetworkBlockDevice/nbd/blob/master/doc/uri.md):
$ nbdinfo nbd://localhost protocol: newstyle-fixed without TLS, using structured packets export="": export-size: 1048576 (1M) content: data uri: nbd://localhost:10809/ is_rotational: false is_read_only: false can_cache: true can_df: true can_fast_zero: true can_flush: true can_fua: true can_multi_conn: true can_trim: true can_zero: true block_size_minimum: 1 block_size_preferred: 4096 block_size_maximum: 33554432
For an NBD server on a local Unix domain socket you would use a command such as this (with similar output to above):
$ nbdinfo "nbd+unix:///?socket=/tmp/unixsock"
Or you can run the NBD server as a subprocess (see section "Subprocess" below):
$ nbdinfo -- [ qemu-nbd -r -f qcow2 file.qcow2 ]
To display the output as JSON (eg. for scripting with jq(1)) add the --json parameter:
$ nbdinfo --json nbd://localhost | jq . { "protocol": "newstyle-fixed", "TLS": false, "structured": true, "exports": [ { "export-name": "", "content": "DOS/MBR boot sector; partition 1 : ID=0xc, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 2048, 4148704 sectors", "uri": "nbd://localhost:10809/", "is_rotational": false, "is_read_only": true, "can_cache": true, "can_df": true, "can_fast_zero": false, "can_flush": false, "can_fua": false, "can_multi_conn": true, "can_trim": false, "can_zero": false, "block_size_minimum": 1, "block_size_preferred": 4096, "block_size_maximum": 33554432, "export-size": 2125119488, "export-size-str": "2075312K" } ] }
To display only the size in bytes of the NBD export (useful for scripting) use the --size parameter:
$ nbdinfo --size nbd://localhost 1048576
$ nbdinfo --size [ nbdkit null 1M ] 1048576
Use one of the options below to test NBD flags. The command does not print anything. Instead it exits with success (exit code 0) if true, or failure (exit code 2) if false. (Other exit codes indicate an error querying the flag). You can use it in shell scripts like this:
if nbdinfo --is read-only nbd://localhost || ! nbdinfo --can trim nbd://localhost then error "the device must support writing and trimming" fi
To show a map of which areas of the disk are allocated and sparse, use the --map option:
$ nbdinfo --map nbd://localhost/ 0 1048576 0 data 1048576 1048576 3 hole,zero
The fields are: start, size, type, description (optional).
The type field is an integer showing the raw value from the NBD protocol. For some maps nbdinfo knows how to translate the type into a printable description.
To get parseable JSON output, add --json:
$ nbdinfo --map --json nbd://localhost/ [{ "offset": 0, "length": 1048576, "type": 0, "description": "data" }, { "offset": 1048576, "length": 1048576, "type": 3, "description": "hole,zero" }]
By default this shows the "base:allocation" map, but you can show other maps too:
$ nbdinfo --map=qemu:dirty-bitmap:bitmap nbd://localhost/ 0 1048576 1 dirty
For more information on NBD maps, see Metadata querying in the NBD protocol.
Using --map --totals performs the same operation as --map but displays a summary of the total size of each type of allocation, in bytes and as a percentage (of the virtual size of the export). This is useful for estimating how much real storage is used on the server, or might be required when copying a sparse image with nbdcopy(1).
In the example below, half (50.0%) of the disk is allocated data and half is unallocated:
$ nbdinfo --map --totals nbd://localhost/ 1048576 50.0% 0 data 1048576 50.0% 3 hole,zero
The fields are: total size in bytes, percentage of the virtual size, type, description (optional).
You can also get the same information in parseable form using --json:
$ nbdinfo --map --totals --json nbd://localhost/ [{ "size": 1048576, "percent": 50, "type": 0, "description": "data" }, { "size": 1048576, "percent": 50, "type": 3, "description": "hole,zero" }]
As with the --map option, by default this shows the "base:allocation" map, but you can show the summary for other maps.
To list all the exports available on an NBD server use the --list (-L) option. To get parseable JSON output, add --json.
For example:
$ nbdkit file dir=. --run 'nbdinfo --list "$uri"' protocol: newstyle-fixed without TLS export="Fedora-Workstation-Live-x86_64-29-1.2.iso": export-size: 1931476992 (1842M) uri: nbd://localhost:10809/Fedora-Workstation-Live-x86_64-29-1.2.iso [...] export="debian-10.4.0-amd64-DVD-1.iso": export-size: 3955556352 (3862848K) uri: nbd://localhost:10809/debian-10.4.0-amd64-DVD-1.iso [...]
nbdinfo can also run an NBD server as a subprocess. This requires an NBD server which understands systemd socket activation, such as qemu-nbd(8) or nbdkit(1). All the usual nbdinfo modes can be used.
For example, to give general information or display the map of a qcow2 file:
nbdinfo -- [ qemu-nbd -r -f qcow2 file.qcow2 ]
nbdinfo --map -- [ qemu-nbd -r -f qcow2 file.qcow2 ]
Note that "[ ... ]" are separate parameters, and must be surrounded by spaces. "--" separates nbdinfo parameters from subprocess parameters.
You could use "qemu-img info" (see qemu-img(1)) to query a single export from an NBD server. "qemu-nbd -L" (see qemu-nbd(8)) can list NBD exports. nbdsh(1) or the libnbd(3) API can be used for more complex queries.
For further information see the NBD protocol and the following libnbd functions: nbd_can_cache(3), nbd_can_df(3), nbd_can_fast_zero(3), nbd_can_flush(3), nbd_can_fua(3), nbd_can_multi_conn(3), nbd_can_trim(3), nbd_can_zero(3), nbd_is_read_only(3), nbd_get_structured_replies_negotiated(3).
When not using --list, the default is --content, ie. probing the content. To prevent content probing, use --no-content.
When using --list, the default is --no-content (since downloading from each export is expensive). To enable content probing use --list --content.
For further information see the NBD protocol and the following libnbd functions: nbd_is_read_only(3), nbd_is_rotational(3), nbd_get_tls_negotiated(3).
See the "Map" section above.
See the "Map totals" section above.
libnbd(3), nbdcopy(1), nbddump(1), nbdfuse(1), nbdsh(1), file(1), jq(1), qemu-img(1), qemu-nbd(8).
Richard W.M. Jones
Eric Blake
Copyright (C) 2020-2021 Red Hat Inc.
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2023-01-04 | libnbd-1.14.2 |