[Libguestfs] [PATCH libnbd] PROPOSAL Add nbdcp (NBD copying) tool.

Martin Kletzander mkletzan at redhat.com
Thu Jan 23 10:40:25 UTC 2020


On Wed, Jan 22, 2020 at 02:40:37PM +0000, Richard W.M. Jones wrote:
>This is a proposal for an NBD to/from file copying tool (not actually
>written).  Obviously this would duplicate functionality which is
>already available in qemu-img convert.
>
>The reasons for writing this tool would be:
>
> - to produce a tool which is very focused on the specific needs of
>   virt-v2v and similar migration scenarios
>
> - to have a small tool with minimal dependencies
>
> - fix some of the obvious problems with qemu-img convert like how it
>   handles devices which are already zeroed, and preallocation
>
> - enable optimizations which make sense for NBD but which might not
>   be applicable to qemu (eg. multi-conn, freely writing out of order
>   from multiple threads).
>
>Alternative is of course to not write a new tool and instead try to
>fix all this stuff in qemu-img itself.
>
>Anyway let me know your thoughts.
>

I like the proposal, there is only one thing I do not completely understand,
whether `-a sparse -S 0` means to just preserver the sparseness based on
whatever the server provides.

It would also be nice to have an option to specify a list of blocks to copy from
a file for example.  Although it might be a niche feature and people should just
use libnbd at that point.

>Rich.
>
>
>nbdcp(1)                            LIBNBD                            nbdcp(1)
>
>NAME
>       nbdcp - copy between NBD servers and local files
>
>SYNOPSIS
>        nbdcp [-a|--target-allocation allocated|sparse]
>              [-m|--multi-conn <n>] [-M|--multi-conn-target <n>]
>              [-p|--progress-bar] [-S|--sparse-detect <n>]
>              [-T|--threads <n>] [-z|--target-is-zero]
>              'nbd://...'|DISK.IMG 'nbd://...'|DISK.IMG
>
>DESCRIPTION
>       nbdcp is a utility that can copy quickly between NBD servers and local
>       raw format files (or block devices).  It can copy:
>
>       from NBD server to file (or block device)
>           For example, this command copies from the NBD server listening on
>           port 10809 on "example.com" to a local file called disk.img:
>
>            nbdcp nbd://example.com disk.img
>
>       from file (or block device) to NBD server
>           For example, this command copies from a local block device /dev/sda
>           to the NBD server listening on Unix domain socket /tmp/socket:
>
>            nbdcp /dev/sda 'nbd+unix:///?socket=/tmp/socket'
>
>       from NBD server to NBD server
>           For example this copies between two different exports on the same
>           NBD server:
>
>            nbdcp nbd://example.com/export1 nbd://example.com/export2
>
>       This program cannot: copy from file to file (use cp(1) or dd(1)), copy
>       to or from formats other than raw (use qemu-img(1) convert), or access
>       servers other than NBD servers (also use qemu-img(1)).
>
>       NBD servers are specified by their URI, following the NBD URI standard
>       at https://github.com/NetworkBlockDevice/nbd/blob/master/doc/uri.md
>
>   Controlling sparseness or preallocation in the target
>       The options -a (--target-allocation), -S (--sparse-detect) and -z
>       (--target-is-zero) together control sparseness in the target file.
>
>       By default nbdcp tries to both preserve sparseness from the source and
>       will detect runs of allocated zeroes and turn them into sparseness.  To
>       turn off detection of sparseness use "-S 0".
>
>       The -z option should be used if and only if you know that the target
>       block device is zeroed already.  This allows an important optimization
>       where nbdcp can skip zeroing or trimming parts of the disk that are
>       already zero.
>
>       The -a option is used to control the desired final preallocation state
>       of the target.  The default is "-a sparse" which makes the target as
>       sparse as possible.  "-a allocated" makes the target fully allocated.
>
>OPTIONS
>       --help
>           Display brief command line help and exit.
>
>       -a allocated
>       --target-allocation=allocated
>           Make the target fully allocated.
>
>       -a sparse
>       --target-allocation=sparse
>           Make the target as sparse as possible.  This is the default.  See
>           also "Controlling sparseness or preallocation in the target".
>
>       -m N
>       --multi-conn=N
>           Enable NBD multi-conn with up to "N" connections.  Only some NBD
>           servers support this but it can greatly improve performance.
>
>           The default is to enable multi-conn if we detect that the server
>           supports it, with up to 4 connections.
>
>       -M N
>       --multi-conn-target=N
>           If you are copying between NBD servers, use -m to control the
>           multi-conn setting for the source server, and this option (-M) to
>           control the multi-conn setting for the target server.
>
>       -p
>       --progress-bar
>           Display a progress bar during copying.
>
>       -p machine:FD
>       --progress-bar=machine:FD
>           Write a machine-readable progress bar to file descriptor "FD".
>           This progress bar prints lines with the format "COPIED/TOTAL"
>           (where "COPIED" and "TOTAL" are 64 bit unsigned integers).
>
>       -S 0
>       --sparse-detect=0
>           Turn off sparseness detection.
>
>       -S N
>       --sparse-detect=N
>           Detect runs of zero bytes of at least size "N" bytes and turn them
>           into sparse blocks on the target (if "-a sparse" is used).  This is
>           the default, with a 512 byte block size.
>
>       -T N
>       --threads N
>           Use at most "N" threads when copying.  Usually more threads leads
>           to better performance, up to the limit of the number of cores on
>           your machine and the parallelism of the underlying disk or network.
>           The default is to use the number of online processors.
>
>       -z
>       --target-is-zero
>           Declare that the target block device contains only zero bytes (or
>           sparseness that reads back as zeroes).  You must only use this
>           option if you are sure that this is true, since it means that nbdcp
>           will enable an optimization where it skips zeroing parts of the
>           disk that are zero on the source.
>
>       -V
>       --version
>           Display the package name and version and exit.
>
>SEE ALSO
>       qemu-img(1), libnbd(3), nbdsh(1).
>
>AUTHORS
>       Richard W.M. Jones
>
>COPYRIGHT
>       Copyright (C) 2020 Red Hat Inc.
>
>LICENSE
>       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
>
>libnbd-1.3.1                      2020-01-22                          nbdcp(1)
>
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20200123/998925fe/attachment.sig>


More information about the Libguestfs mailing list