[Libguestfs] [p2v PATCH 01/10] remove qemu-nbd support

Laszlo Ersek
2022-03-31T07:22:02Z

On 03/24/22 10:13, Richard W.M. Jones wrote:
> virt-p2v needs an NBD server running on the p2v machine to export the
> disks.  Originally we used qemu-nbd since that was the only choice.
> In 2017, I added support for nbdkit as an alternative to qemu-nbd.
>
> So now we're in the situation where either server can be used (see
> virt-p2v.git/nbd.c).  For added complexity we also support both
> servers in either systemd socket activation (SA) mode or "no-SA"
mode,
> so that's 4 combinations.
>
> This is silly, we should support only one NBD server, and since
> systemd socket activation is well-supported and more flexible, we
> should just use it.
>
> So the question is *which* NBD server to support.  That's not so much
> a technical matter since both servers can easily serve a local block
> device (always raw format).  However I do think that nbdkit might
> genuinely be the better choice here:
>
>  - qemu-nbd links to the whole qemu block layer, nbdkit can be shipped
>    with just the plugin we need, so it should be smaller with less
>    code surface
>
>  - nbdkit-file-plugin has a better method of not trashing the host
>    page cache
>
>  - could use nbdkit --exit-with-parent feature (which we don't at the
>    moment)
>
>  - nbdkit is widely available in distros these days
>
> Also that file uses AI_ADDRCONFIG so I guess it has problems with IPv6.

This patch removes qemu-nbd support, as the first step.

"test-virt-p2v.sh" is simply removed, as the remaining
"test-virt-p2v-nbdkit.sh" is mostly identical.

Ref: https://listman.redhat.com/archives/libguestfs/2022-March/028475.html
Suggested-by: Richard W.M. Jones <rjones at redhat.com>
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
 Makefile.am                                                         |   2 -
 contrib/aux-scripts/do-build.sh                                     |   7 +-
 contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch |  34 -----
 dependencies.m4                                                     |   6 +-
 docs/p2v-building.pod                                               |   9 +-
 main.c                                                              |   2 +-
 nbd.c                                                               | 136
+-------------------
 test-virt-p2v-nbdkit.sh                                             |   5 +-
 test-virt-p2v-scp.sh                                                |   2 +-
 test-virt-p2v-ssh.sh                                                |   4 +-
 test-virt-p2v.sh                                                    |  56
--------
 virt-p2v.pod                                                        |  29 ++---
 12 files changed, 31 insertions(+), 261 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 2080890b14e3..e98129e99028 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -27,36 +27,35 @@ SUBDIRS += bash
 EXTRA_DIST = \
 	$(BUILT_SOURCES) \
 	$(TESTS) $(LIBGUESTFS_TESTS) $(SLOW_TESTS) \
 	AUTHORS \
 	contrib/aux-scripts/do-build.sh \
 	contrib/build-p2v-iso.sh \

contrib/patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch
\
-	contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch \
 	contrib/test-p2v-iso.sh \
 	dependencies.m4 \
 	generate-p2v-authors.pl \
 	generate-p2v-config.pl \
 	issue \
 	kiwi-config.sh \
 	kiwi-config.xml.in \
 	launch-virt-p2v \
 	libguestfs/README \
 	miniexpect/README \
 	p2v.ks.in \
 	p2v.service \
 	podcheck.pl \
 	test-functions.sh \
 	test-virt-p2v-docs.sh \
 	test-virt-p2v-pxe.sshd_config.in \
 	test-virt-p2v-scp.sh \
 	test-virt-p2v-ssh.sh \
 	virt-p2v.pod \
 	virt-p2v-make-disk.in \
 	virt-p2v-make-disk.pod \
 	virt-p2v-make-kickstart.in \
 	virt-p2v-make-kickstart.pod \
 	virt-p2v-make-kiwi.in \
 	virt-p2v-make-kiwi.pod

 # Don't clean ssh_host_rsa_key{,.pub} or id_rsa{,.pub} since those
 # consume system entropy to regenerate.
@@ -339,7 +338,6 @@ TESTS = \
 	test-virt-p2v-docs.sh

 LIBGUESTFS_TESTS = \
-	test-virt-p2v.sh \
 	test-virt-p2v-nbdkit.sh

 if HAVE_LIBGUESTFS
diff --git a/contrib/aux-scripts/do-build.sh b/contrib/aux-scripts/do-build.sh
index 53a844d9c99d..0ef2ab185beb 100644
--- a/contrib/aux-scripts/do-build.sh
+++ b/contrib/aux-scripts/do-build.sh
@@ -49,22 +49,21 @@ pushd libguestfs-*
 # Various hacks for different versions of RHEL.
 case $osversion in
     rhel-5.*|centos-5.*)
         # This just forces configure to ignore these missing dependencies.
         export LIBTINFO_CFLAGS=-D_GNU_SOURCE
         export LIBTINFO_LIBS=-lncurses
         export JANSSON_CFLAGS=-D_GNU_SOURCE
         export JANSSON_LIBS=-ljansson
         # Remove some unsupported flags that the configure script hard codes.
         sed -i -e 's/-fno-strict-overflow//' configure
         sed -i -e 's/-Wno-strict-overflow//' configure
         # Apply some RHEL 5 only patches.
         patch -p1 <
../patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch
-        patch -p1 <
../patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
         ;;
     rhel-6.*|centos-6.*)
         # This just forces configure to ignore these missing dependencies.
         export LIBTINFO_CFLAGS=-D_GNU_SOURCE
         export LIBTINFO_LIBS=-lncurses
         export JANSSON_CFLAGS=-D_GNU_SOURCE
         export JANSSON_LIBS=-ljansson
         ;;
@@ -106,41 +105,43 @@ popd
 # More hacks for different versions of RHEL.
 case $osversion in
     rhel-5.*|centos-5.*)
         # RHEL 5 livecd-tools is broken with syslinux, this fixes it:
         sed -i -e 's,/usr/lib/syslinux/,/usr/share/syslinux/,g'\
             /usr/lib/python2.4/site-packages/imgcreate/live.py
         # livecd-tools cannot parse certain aspects of the kickstart:
         sed -i \
             -e 's/--plaintext//g' \
             -e 's/^firewall.*//g' \
             -e 's/^%end.*//g' \
             p2v.ks
         # Remove some packages which don't exist on RHEL 5:
         sed -i \
             -e 's,^dracut-live.*,,g' \
             -e 's,^dejavu-.*,,g' \
             -e 's,^mesa-dri-drivers.*,,g' \
             -e 's,^network-manager-applet.*,,g' \
             -e 's,^nm-connection-editor.*,,g' \
-            -e 's,^/usr/bin/qemu-nbd.*,,g' \
+            -e 's,^/usr/sbin/nbdkit.*,,g' \
+            -e
's,^/usr/lib64/nbdkit/plugins/nbdkit-file-plugin.so.*,,g' \
             -e '/^net-tools/a syslinux' \
             p2v.ks
         # Remove systemctl lines, doesn't exist on RHEL 5.
         sed -i \
             -e 's/^\(systemctl.*\)/#\1/g' \
             p2v.ks
         ;;
     rhel-6.*|centos-6.*)
         # Remove some packages which don't exist on RHEL 6:
         sed -i \
             -e 's,^dracut-live.*,,g' \
             -e 's,^firewalld.*,,g' \
             -e 's,^network-manager-applet.*,,g' \
             -e 's,^nm-connection-editor.*,,g' \
-            -e 's,^/usr/bin/qemu-nbd.*,,g' \
+            -e 's,^/usr/sbin/nbdkit.*,,g' \
+            -e
's,^/usr/lib64/nbdkit/plugins/nbdkit-file-plugin.so.*,,g' \
             p2v.ks
         # Remove systemctl lines, doesn't exist on RHEL 5.
         sed -i \
             -e 's/^\(systemctl.*\)/#\1/g' \
             p2v.ks
         ;;
diff --git a/contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
b/contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
deleted file mode 100644
index d0bc2cfc9ec2..000000000000
--- a/contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 3ccd25c981431426038d7952f5b0b86118d92c23 Mon Sep 17 00:00:00 2001
-From: "Richard W.M. Jones" <rjones at redhat.com>
-Date: Sat, 21 Jan 2017 05:57:17 -0500
-Subject: [PATCH 2/2] RHEL 5 ONLY QEMU-NBD 1.4 HAS NO -f OPTION
-
----
- p2v/nbd.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/p2v/nbd.c b/p2v/nbd.c
-index b1caf2f..2232b08 100644
---- a/p2v/nbd.c
-+++ b/p2v/nbd.c
-@@ -409,7 +409,7 @@ start_qemu_nbd (const char *device,
-               "-r",            /* readonly (vital!) */
-               "-p", port_str,  /* listening port */
-               "-t",            /* persistent */
--              "-f", "raw",     /* force raw format */
-+              //"-f", "raw",     /* force raw format */
-               "-b", ipaddr,    /* listen only on loopback interface
*/
-               "--cache=unsafe",  /* use unsafe caching for speed */
-               device,            /* a device like /dev/sda */
-@@ -424,7 +424,7 @@ start_qemu_nbd (const char *device,
-               "qemu-nbd",
-               "-r",            /* readonly (vital!) */
-               "-t",            /* persistent */
--              "-f", "raw",     /* force raw format */
-+              //"-f", "raw",     /* force raw format */
-               "--cache=unsafe",  /* use unsafe caching for speed */
-               device,            /* a device like /dev/sda */
-               NULL);
---
-1.8.2.3
-
diff --git a/dependencies.m4 b/dependencies.m4
index 40b3786cb0b7..20d068028dbe 100644
--- a/dependencies.m4
+++ b/dependencies.m4
@@ -23,39 +23,40 @@ dnl only runs on the virt-v2v conversion server.
 ifelse(REDHAT,1,
   dnl Used by the virt-p2v binary.
   pcre
   libxml2
   gtk`'GTK_VERSION
   dbus-libs

   dnl Run as external programs by the p2v binary.
   /usr/bin/ssh
-  /usr/bin/qemu-nbd
+  /usr/sbin/nbdkit
+  /usr/lib64/nbdkit/plugins/nbdkit-file-plugin.so
   which

   dnl Generally useful tools to use within xterm
   vim-minimal

   dnl Useful disk and diagnostic utilities.
   iscsi-initiator-utils

   dnl X11 environment
   /usr/bin/xinit
   /usr/bin/Xorg
   xorg-x11-drivers
   xorg-x11-fonts-Type1
   dejavu-sans-fonts
   dejavu-sans-mono-fonts
   mesa-dri-drivers
   metacity

   NetworkManager
   nm-connection-editor
   network-manager-applet
   dnl dbus is required by nm-applet, but not a dependency in Fedora
   dbus-x11
   dnl sysadmins prefer ifconfig
   net-tools

   dnl RHBZ#1157679
   @hardware-support
 )
@@ -128,33 +129,34 @@ ifelse(SUSE,1,
 ifelse(OPENMANDRIVA,1,
   dnl Used by the virt-p2v binary.
   pcre
   libxml2
   gtk`'GTK_VERSION
   dbus-libs

   dnl Run as external programs by the p2v binary.
   /usr/bin/ssh
-  /usr/bin/qemu-nbd
+  /usr/sbin/nbdkit
+  /usr/lib64/nbdkit/plugins/nbdkit-file-plugin.so
   which

   dnl Generally useful tools to use within xterm
   vim-enhanced

   dnl X11 environment
   /usr/bin/xinit
   /usr/bin/Xorg
   xorg-x11-drivers
   xorg-x11-fonts-Type1
   dejavu-sans-fonts
   dejavu-sans-mono-fonts
   mesa-dri-drivers
   kwin_x11

   NetworkManager
   nm-connection-editor
   network-manager-applet
   dnl dbus is required by nm-applet, but not a dependency in Fedora
   dbus-x11
   dnl sysadmins prefer ifconfig
   net-tools
 )
diff --git a/docs/p2v-building.pod b/docs/p2v-building.pod
index f249f742554a..21edc0255015 100644
--- a/docs/p2v-building.pod
+++ b/docs/p2v-building.pod
@@ -73,15 +73,12 @@ I<Required>.

 I<Required>.

-=item qemu-nbd
-
 =item nbdkit

-Optional.  qemu-nbd is used for testing.
+Optional.

-L<virt-p2v(1)> requires either qemu-nbd or nbdkit, but these only need
-to be present on the virt-p2v ISO, they do not need to be installed at
-compile time.
+L<virt-p2v(1)> requires nbdkit, but it only needs to be present on the
+virt-p2v ISO, it does not need to be installed at compile time.

 =item Gtk E<ge> 2.24, or 3

diff --git a/main.c b/main.c
index a28a8b64ddaa..e4e9c1fe21c1 100644
--- a/main.c
+++ b/main.c
@@ -87,27 +87,27 @@ static void __attribute__((noreturn))
 usage (int status)
 {
   if (status != EXIT_SUCCESS)
     fprintf (stderr, _("Try ?%s --help? for more information.\n"),
              g_get_prgname ());
   else {
     printf (_("%s: Convert a physical machine to use KVM\n"
               "Copyright (C) 2009-2019 Red Hat Inc.\n"
               "Usage:\n"
               "  %s [--options]\n"
               "Options:\n"
               "  --help                 Display brief help\n"
               " --cmdline=CMDLINE       Used to debug command line
parsing\n"
               " --colors|--colours      Use ANSI colour sequences even if
not tty\n"
               " --iso                   Running in the ISO
environment\n"
-              " --nbd=qemu-nbd,nbdkit   Search order for NBD
servers\n"
+              " --nbd=nbdkit            Search order for NBD
servers\n"
               " --test-disk=DISK.IMG    For testing, use disk as
/dev/sda\n"
               "  -v|--verbose           Verbose messages\n"
               "  -V|--version           Display version and exit\n"
               "For more information, see the manpage %s(1).\n"),
             g_get_prgname (), g_get_prgname (),
             g_get_prgname ());
   }
   exit (status);
 }

 /* XXX Copied from fish/options.c. */
diff --git a/nbd.c b/nbd.c
index db6228a8aba0..46f6304d2c51 100644
--- a/nbd.c
+++ b/nbd.c
@@ -1,47 +1,47 @@
 /* virt-p2v
  * Copyright (C) 2009-2019 Red Hat Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  *
  * This program 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 General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */

 /**
  * This file handles the virt-p2v I<--nbd> command line option
- * and running either L<qemu-nbd(8)> or L<nbdkit(1)>.
+ * and running L<nbdkit(1)>.
  */

 #include <config.h>

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <time.h>
 #include <netdb.h>
 #include <errno.h>
 #include <error.h>
 #include <libintl.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <assert.h>

 #include "p2v.h"

 /* How long to wait for the NBD server to start (seconds). */
 #define WAIT_NBD_TIMEOUT 10

 /* The local port that the NBD server listens on (incremented for
  * each server which is started).
  */
@@ -50,10 +50,8 @@ static int nbd_local_port;
 /* List of servers specified by the --nbd option. */
 enum nbd_server {
   /* 0 is reserved for "end of list" */
-  QEMU_NBD = 1,
-  QEMU_NBD_NO_SA = 2,
-  NBDKIT = 3,
-  NBDKIT_NO_SA = 4,
+  NBDKIT = 1,
+  NBDKIT_NO_SA = 2,
 };
 static enum nbd_server *cmdline_servers = NULL;

@@ -61,32 +59,29 @@ static const char *
 nbd_server_string (enum nbd_server s)
 {
   const char *ret = NULL;

   switch (s) {
-  case QEMU_NBD: ret = "qemu-nbd"; break;
-  case QEMU_NBD_NO_SA: ret =  "qemu-nbd-no-sa"; break;
   case NBDKIT: ret = "nbdkit"; break;
   case NBDKIT_NO_SA: ret =  "nbdkit-no-sa"; break;
   }

   if (ret == NULL)
     abort ();

   return ret;
 }

 /* If no --nbd option is passed, we use this standard list instead.
  * Must match the documentation in virt-p2v(1).
  */
 static const enum nbd_server standard_servers[] -  { QEMU_NBD, QEMU_NBD_NO_SA,
NBDKIT, NBDKIT_NO_SA, 0 };
+  { NBDKIT, NBDKIT_NO_SA, 0 };

 /* After testing the list of servers passed by the user, this is
  * server we decide to use.
  */
 static enum nbd_server use_server;

-static pid_t start_qemu_nbd (const char *device, const char *ipaddr, int port,
int *fds, size_t nr_fds);
 static pid_t start_nbdkit (const char *device, const char *ipaddr, int port,
int *fds, size_t nr_fds);
 static int get_local_port (void);
 static int open_listening_socket (const char *ipaddr, int **fds, size_t
*nr_fds);
@@ -131,44 +126,40 @@ void
 set_nbd_option (const char *opt)
 {
   size_t i, len;
   CLEANUP_FREE_STRING_LIST char **strs = NULL;

   if (cmdline_servers != NULL)
     error (EXIT_FAILURE, 0, _("--nbd option appears multiple
times"));

   strs = guestfs_int_split_string (',', opt);

   if (strs == NULL)
     error (EXIT_FAILURE, errno, _("malloc"));

   len = guestfs_int_count_strings (strs);
   if (len == 0)
     error (EXIT_FAILURE, 0, _("--nbd option cannot be empty"));

   cmdline_servers = malloc (sizeof (enum nbd_server) * (len + 1));
   if (cmdline_servers == NULL)
     error (EXIT_FAILURE, errno, _("malloc"));

   for (i = 0; strs[i] != NULL; ++i) {
-    if (STREQ (strs[i], "qemu-nbd") || STREQ (strs[i],
"qemu"))
-      cmdline_servers[i] = QEMU_NBD;
-    else if (STREQ (strs[i], "qemu-nbd-no-sa") || STREQ (strs[i],
"qemu-no-sa"))
-      cmdline_servers[i] = QEMU_NBD_NO_SA;
-    else if (STREQ (strs[i], "nbdkit"))
+    if (STREQ (strs[i], "nbdkit"))
       cmdline_servers[i] = NBDKIT;
     else if (STREQ (strs[i], "nbdkit-no-sa"))
       cmdline_servers[i] = NBDKIT_NO_SA;
     else
       error (EXIT_FAILURE, 0, _("--nbd: unknown server: %s"),
strs[i]);
   }

   assert (i == len);
   cmdline_servers[i] = 0;       /* marks the end of the list */
 }

 /**
  * Test the I<--nbd> option (or built-in default list) to see which
  * servers are actually installed and appear to be working.
  *
  * Set the C<use_server> global accordingly.
  */
@@ -176,113 +167,88 @@ void
 test_nbd_servers (void)
 {
   size_t i;
   int r;
   const enum nbd_server *servers;

   /* Initialize nbd_local_port. */
   if (is_iso_environment)
     /* The p2v ISO should allow us to open up just about any port, so
      * we can fix a port number in that case.  Using a predictable
      * port number in this case should avoid rare errors if the port
      * colides with another (ie. it'll either always fail or never
      * fail).
      */
     nbd_local_port = 50123;
   else
     /* When testing on the local machine, choose a random port. */
     nbd_local_port = 50000 + (random () % 10000);

   if (cmdline_servers != NULL)
     servers = cmdline_servers;
   else
     servers = standard_servers;

   use_server = 0;

   for (i = 0; servers[i] != 0; ++i) {
 #if DEBUG_STDERR
     fprintf (stderr, "checking for %s ...\n", nbd_server_string
(servers[i]));
 #endif

     switch (servers[i]) {
-    case QEMU_NBD: /* with socket activation */
-      r = system ("qemu-nbd --version"
-#ifndef DEBUG_STDERR
-                  " >/dev/null 2>&1"
-#endif
-                  " && grep -sq LISTEN_PID `which qemu-nbd`"
-                  );
-      if (r == 0) {
-        use_server = servers[i];
-        goto finish;
-      }
-      break;
-
-    case QEMU_NBD_NO_SA:
-      r = system ("qemu-nbd --version"
-#ifndef DEBUG_STDERR
-                  " >/dev/null 2>&1"
-#endif
-                  );
-      if (r == 0) {
-        use_server = servers[i];
-        goto finish;
-      }
-      break;
-
     case NBDKIT: /* with socket activation */
       r = system ("nbdkit file --version"
 #ifndef DEBUG_STDERR
                   " >/dev/null 2>&1"
 #endif
                   " && grep -sq LISTEN_PID `which nbdkit`"
                   );
       if (r == 0) {
         use_server = servers[i];
         goto finish;
       }
       break;

     case NBDKIT_NO_SA:
       r = system ("nbdkit file --version"
 #ifndef DEBUG_STDERR
                   " >/dev/null 2>&1"
 #endif
                   );
       if (r == 0) {
         use_server = servers[i];
         goto finish;
       }
       break;

     default:
       abort ();
     }
   }

  finish:
   if (use_server == 0) {
     fprintf (stderr,
              _("%s: no working NBD server was found, cannot
continue.\n"
                "Please check the --nbd option in the virt-p2v(1) man
page.\n"),
              g_get_prgname ());
     exit (EXIT_FAILURE);
   }

   /* Release memory used by the --nbd option. */
   free (cmdline_servers);
   cmdline_servers = NULL;

 #if DEBUG_STDERR
   fprintf (stderr, "picked %s\n", nbd_server_string (use_server));
 #endif
 }

 /**
  * Start the NBD server.
  *
  * We previously tested all NBD servers (see C<test_nbd_servers>) and
  * hopefully found one which will work.
  *
  * Returns the process ID (E<gt> 0) or C<0> if there is an error.
  */
@@ -290,56 +256,35 @@ pid_t
 start_nbd_server (const char **ipaddr, int *port, const char *device)
 {
   int *fds = NULL;
   size_t i, nr_fds;
   pid_t pid;

   switch (use_server) {
-  case QEMU_NBD:                /* qemu-nbd with socket activation */
-    /* Ideally we would bind this socket to "localhost", but that
-     * requires two listening FDs, and qemu-nbd currently cannot
-     * support socket activation with two FDs.  So we only bind to the
-     * IPv4 address.
-     */
-    *ipaddr = "127.0.0.1";
-    *port = open_listening_socket (*ipaddr, &fds, &nr_fds);
-    if (*port == -1) return -1;
-    pid = start_qemu_nbd (device, *ipaddr, *port, fds, nr_fds);
-    for (i = 0; i < nr_fds; ++i)
-      close (fds[i]);
-    free (fds);
-    return pid;
-
-  case QEMU_NBD_NO_SA:          /* qemu-nbd without socket activation */
-    *ipaddr = "localhost";
-    *port = get_local_port ();
-    if (*port == -1) return -1;
-    return start_qemu_nbd (device, *ipaddr, *port, NULL, 0);
-
   case NBDKIT:                  /* nbdkit with socket activation */
     *ipaddr = "localhost";
     *port = open_listening_socket (*ipaddr, &fds, &nr_fds);
     if (*port == -1) return -1;
     pid = start_nbdkit (device, *ipaddr, *port, fds, nr_fds);
     for (i = 0; i < nr_fds; ++i)
       close (fds[i]);
     free (fds);
     return pid;

   case NBDKIT_NO_SA:            /* nbdkit without socket activation */
     *ipaddr = "localhost";
     *port = get_local_port ();
     if (*port == -1) return -1;
     return start_nbdkit (device, *ipaddr, *port, NULL, 0);
   }

   abort ();
 }

 #define FIRST_SOCKET_ACTIVATION_FD 3

 /**
  * Set up file descriptors and environment variables for
  * socket activation.
  *
  * Note this function runs in the child between fork and exec.
  */
@@ -347,103 +292,32 @@ static inline void
 socket_activation (int *fds, size_t nr_fds)
 {
   size_t i;
   char nr_fds_str[16];
   char pid_str[16];

   if (fds == NULL) return;

   for (i = 0; i < nr_fds; ++i) {
     int fd = FIRST_SOCKET_ACTIVATION_FD + i;
     if (fds[i] != fd) {
       dup2 (fds[i], fd);
       close (fds[i]);
     }
   }

   snprintf (nr_fds_str, sizeof nr_fds_str, "%zu", nr_fds);
   setenv ("LISTEN_FDS", nr_fds_str, 1);
   snprintf (pid_str, sizeof pid_str, "%d", (int) getpid ());
   setenv ("LISTEN_PID", pid_str, 1);
 }

-/**
- * Start a local L<qemu-nbd(1)> process.
- *
- * If we are using socket activation, C<fds> and C<nr_fds> will
- * contain the locally pre-opened file descriptors for this.
- * Otherwise if C<fds == NULL> we pass the port number.
- *
- * Returns the process ID (E<gt> 0) or C<0> if there is an error.
- */
-static pid_t
-start_qemu_nbd (const char *device,
-                const char *ipaddr, int port, int *fds, size_t nr_fds)
-{
-  pid_t pid;
-  char port_str[64];
-
-#if DEBUG_STDERR
-  fprintf (stderr, "starting qemu-nbd for %s on %s:%d%s\n",
-           device, ipaddr, port,
-           fds == NULL ? "" : " using socket activation");
-#endif
-
-  snprintf (port_str, sizeof port_str, "%d", port);
-
-  pid = fork ();
-  if (pid == -1) {
-    set_nbd_error ("fork: %m");
-    return 0;
-  }
-
-  if (pid == 0) {               /* Child. */
-    close (0);
-    if (open ("/dev/null", O_RDONLY) == -1) {
-      perror ("open: /dev/null");
-      _exit (EXIT_FAILURE);
-    }
-
-    if (fds == NULL) {          /* without socket activation */
-      execlp ("qemu-nbd",
-              "qemu-nbd",
-              "-r",            /* readonly (vital!) */
-              "-p", port_str,  /* listening port */
-              "-t",            /* persistent */
-              "-f", "raw",     /* force raw format */
-              "-b", ipaddr,    /* listen only on loopback interface
*/
-              "--cache=unsafe",  /* use unsafe caching for speed */
-              device,            /* a device like /dev/sda */
-              NULL);
-      perror ("qemu-nbd");
-      _exit (EXIT_FAILURE);
-    }
-    else {                      /* socket activation */
-      socket_activation (fds, nr_fds);
-
-      execlp ("qemu-nbd",
-              "qemu-nbd",
-              "-r",            /* readonly (vital!) */
-              "-t",            /* persistent */
-              "-f", "raw",     /* force raw format */
-              "--cache=unsafe",  /* use unsafe caching for speed */
-              device,            /* a device like /dev/sda */
-              NULL);
-      perror ("qemu-nbd");
-      _exit (EXIT_FAILURE);
-    }
-  }
-
-  /* Parent. */
-  return pid;
-}
-
 /**
  * Start a local L<nbdkit(1)> process using the
  * L<nbdkit-file-plugin(1)>.
  *
  * If we are using socket activation, C<fds> and C<nr_fds> will
  * contain the locally pre-opened file descriptors for this.
  * Otherwise if C<fds == NULL> we pass the port number.
  *
  * Returns the process ID (E<gt> 0) or C<0> if there is an error.
  */
diff --git a/test-virt-p2v-nbdkit.sh b/test-virt-p2v-nbdkit.sh
index 9adb195f9249..8e91d45c4014 100755
--- a/test-virt-p2v-nbdkit.sh
+++ b/test-virt-p2v-nbdkit.sh
@@ -1,28 +1,27 @@
 #!/bin/bash -
 # libguestfs virt-p2v test script
 # Copyright (C) 2014-2019 Red Hat Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
 #
 # This program 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 General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.

-# Test virt-p2v in non-GUI mode using nbdkit instead of qemu-nbd.
+# Test virt-p2v in non-GUI mode using nbdkit.

 set -e

 $TEST_FUNCTIONS
 skip_if_skipped
 skip_if_backend uml
-skip_unless nbdkit file --version
 skip_unless test -f fedora.img
 skip_unless test -f blank-part.img

@@ -47,7 +46,7 @@ export PATH=$d:$PATH
 # The Linux kernel command line.
 cmdline="p2v.server=localhost p2v.name=fedora p2v.disks=$f1,$f2
p2v.o=local p2v.os=$(pwd)/$d p2v.network=em1:wired,other p2v.post="

-# Only use nbdkit, disable qemu-nbd.
+# Only use nbdkit.
 $VG virt-p2v --cmdline="$cmdline" --nbd=nbdkit,nbdkit-no-sa

 # Test the libvirt XML metadata and a disk was created.
diff --git a/test-virt-p2v-scp.sh b/test-virt-p2v-scp.sh
index ca851012fb85..65ed018cdfb8 100755
--- a/test-virt-p2v-scp.sh
+++ b/test-virt-p2v-scp.sh
@@ -1,20 +1,20 @@
 #!/bin/bash -
 # Copyright (C) 2014-2019 Red Hat Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
 #
 # This program 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 General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.

-# This is an scp substitute used by test-virt-p2v.sh.
+# This is an scp substitute used by test-virt-p2v-nbdkit.sh.

 TEMP=`getopt \
         -o 'o:P:' \
diff --git a/test-virt-p2v-ssh.sh b/test-virt-p2v-ssh.sh
index 2442b7d3f2c6..8a14b71fbd4b 100755
--- a/test-virt-p2v-ssh.sh
+++ b/test-virt-p2v-ssh.sh
@@ -1,20 +1,20 @@
 #!/bin/bash -
 # Copyright (C) 2014 Red Hat Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
 #
 # This program 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 General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.

-# This is an ssh substitute used by test-virt-p2v.sh.
+# This is an ssh substitute used by test-virt-p2v-nbdkit.sh.

 TEMP=`getopt \
         -o 'l:No:p:R:' \
@@ -28,29 +28,29 @@ eval set -- "$TEMP"
 while true ; do
     case "$1" in
         # Regular arguments that we can just ignore.
         -N)
             shift
             ;;
         -l|-o|-p)
             shift 2
             ;;

         # ssh -R 0:localhost:<port> (port forwarding).  Don't
actually
         # port forward, just return the original port number here so that
-        # the conversion process connects directly to qemu-nbd.
+        # the conversion process connects directly to nbdkit.
         -R)
             arg="$2"
             port="$(echo $arg | awk -F: '{print $3}')"
             echo "Allocated port" $port "for remote
forward"
             shift 2
             ;;

         --)
             shift
 	    break
             ;;
         *)
             echo "$0: internal error ($1)"
             exit 1
             ;;
     esac
diff --git a/test-virt-p2v.sh b/test-virt-p2v.sh
deleted file mode 100755
index 9629e1b0235a..000000000000
--- a/test-virt-p2v.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash -
-# libguestfs virt-p2v test script
-# Copyright (C) 2014 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-# Test virt-p2v in non-GUI mode.
-
-set -e
-
-$TEST_FUNCTIONS
-skip_if_skipped
-skip_if_backend uml
-skip_unless test -f fedora.img
-skip_unless test -f blank-part.img
-
-f1="$abs_builddir/fedora.img"
-f2="$abs_builddir/blank-part.img"
-
-d=test-virt-p2v.d
-rm -rf $d
-mkdir $d
-
-# We don't want the program under test to run real 'ssh' or
'scp'.
-# They won't work.  Therefore create dummy 'ssh' and 'scp'
binaries.
-pushd $d
-ln -sf "$abs_srcdir/test-virt-p2v-ssh.sh" ssh
-ln -sf "$abs_srcdir/test-virt-p2v-scp.sh" scp
-popd
-export PATH=$d:$PATH
-
-# Note that the PATH already contains the local virt-p2v & virt-v2v
-# binaries under test (because of the ./run script).
-
-# The Linux kernel command line.
-cmdline="p2v.server=localhost p2v.name=fedora p2v.disks=$f1,$f2
p2v.o=local p2v.os=$(pwd)/$d p2v.network=em1:wired,other p2v.post="
-
-$VG virt-p2v --cmdline="$cmdline"
-
-# Test the libvirt XML metadata and a disk was created.
-test -f $d/fedora.xml
-test -f $d/fedora-sda
-test -f $d/fedora-sdb
-
-rm -r $d
diff --git a/virt-p2v.pod b/virt-p2v.pod
index 5f4aa5763524..eb220cbf1cee 100644
--- a/virt-p2v.pod
+++ b/virt-p2v.pod
@@ -509,19 +509,10 @@ features such as the Shutdown popup button.
 =item B<--nbd=server[,server...]>

 Select which NBD server is used.  By default the following servers are
-checked and the first one found is used:
-I<--nbd=qemu-nbd,qemu-nbd-no-sa,nbdkit,nbdkit-no-sa>
+checked and the first one found is used: I<--nbd=nbdkit,nbdkit-no-sa>

 =over 4

-=item B<qemu-nbd>
-
-Use qemu-nbd.
-
-=item B<qemu-nbd-no-sa>
-
-Use qemu-nbd, but disable socket activation.
-
 =item B<nbdkit>

 Use nbdkit with the file plugin (see: L<nbdkit-file-plugin(1)>).
@@ -532,9 +523,9 @@ Use nbdkit, but disable socket activation

 =back

-The C<*-no-sa> variants allow virt-p2v to fall back to older versions
-of qemu-nbd and nbdkit which did not support
-L<socket
activation|http://0pointer.de/blog/projects/socket-activation.html>.
+The C<nbdkit-no-sa> variant allows virt-p2v to fall back to older
+versions of nbdkit which did not support L<socket
+activation|http://0pointer.de/blog/projects/socket-activation.html>.

 =item B<--test-disk=/PATH/TO/DISK.IMG>

@@ -679,22 +670,21 @@ Before conversion actually begins, virt-p2v then makes one
or more
 further ssh connections to the server for data transfer.

 The transfer protocol used currently is NBD (Network Block Device),
-which is proxied over ssh.  The NBD server is L<qemu-nbd(1)> by
-default but others can be selected using the I<--nbd> command line
-option.
+which is proxied over ssh.  The NBD server is L<nbdkit(1)>; socket
+activation can be controlled using the I<--nbd> command line option.

 There is one ssh connection per physical hard disk on the source
 machine (the common case ? a single hard disk ? is shown below):

  ????????????????                      ???????????????????
  ? virt-p2v     ?                      ? virt-v2v        ?
  ? (physical    ?  control connection  ? (conversion     ?
  ?  server)   ???????????????????????????? server)       ?
  ?              ?                      ?                 ?
  ?              ?  data connection     ?                 ?
  ?            ????????????????????????????               ?
- ?qemu-nbd ? ?? ?                      ??? ? NBD         ?
- ?/dev/sda      ?                      ?     requests    ?
+ ? nbdkit  ? ?? ?                      ??? ? NBD         ?
+ ? /dev/sda     ?                      ?     requests    ?
  ?              ?                      ?                 ?
  ????????????????                      ???????????????????

@@ -708,7 +698,7 @@ that virt-v2v via libguestfs can open nbd connections which
directly
 read the hard disk(s) of the physical server.

 Two layers of protection are used to ensure that there are no writes
-to the hard disks: Firstly, the qemu-nbd I<-r> (readonly) option is
+to the hard disks: Firstly, the nbdkit I<-r> (readonly) option is
 used.  Secondly libguestfs creates an overlay on top of the NBD
 connection which stores writes in a temporary file on the conversion
 file.
@@ -731,7 +721,6 @@ L<virt-p2v-make-disk(1)>,
 L<virt-p2v-make-kickstart(1)>,
 L<virt-p2v-make-kiwi(1)>,
 L<virt-v2v(1)>,
-L<qemu-nbd(1)>,
 L<nbdkit(1)>, L<nbdkit-file-plugin(1)>,
 L<ssh(1)>,
 L<sshd(8)>,
--
2.19.1.3.g30247aa5d201