Richard W.M. Jones
2022-Jan-25 10:45 UTC
[Libguestfs] [PATCH v2v 1/2] input: libvirt: Share a single connection to the source NBD server
When using virt-p2v from RHEL 7, it starts a very old qemu-nbd server
(probably 1.5.3) which required the --shared parameter to enable
sharing even in read-only mode. Since it doesn't pass this parameter
only a single connection at a time is allowed, and further connections
will deadlock. Note that later versions of qemu-nbd changed this so
that read-only connections permit sharing.
In modular virt-v2v we now use nbdkit-nbd-plugin to proxy the
connection to virt-p2v / qemu-nbd. When you connect to this multiple
times, as virt-v2v does, it will make multiple connections to the
backend qemu-nbd. This will cause a deadlock.
We can use the nbdkit-nbd-plugin shared=true flag to enable the plugin
to share a single connection to the backend between multiple nbdkit
clients.
---
input/input_libvirt.ml | 1 +
1 file changed, 1 insertion(+)
diff --git a/input/input_libvirt.ml b/input/input_libvirt.ml
index 33f61086ec..42050c157b 100644
--- a/input/input_libvirt.ml
+++ b/input/input_libvirt.ml
@@ -76,6 +76,7 @@ and libvirt_servers dir disks Nbdkit.add_filter cmd
"cow";
Nbdkit.add_arg cmd "hostname" hostname;
Nbdkit.add_arg cmd "port" (string_of_int port);
+ Nbdkit.add_arg cmd "shared" "true";
let _, pid = Nbdkit.run_unix ~socket cmd in
(* --exit-with-parent should ensure nbdkit is cleaned
--
2.32.0
Richard W.M. Jones
2022-Jan-25 10:45 UTC
[Libguestfs] [PATCH v2v 2/2] v2v: Send nbdinfo debug information to stderr not stdout
When running in verbose mode (virt-v2v -vx) debug messages are
supposed to only be written to stderr. This allows virt-p2v and other
wrappers to separate ordinary progress messages and warnings, from
debugging information.
However when we added nbdinfo output (only printed in verbose mode),
the output was wrongly sent to stdout instead of stderr. You can show
this as follows:
$ virt-v2v -vx -i disk /var/tmp/fedora-35.qcow2 -o null 2>/dev/null
[ 0.0] Setting up the source: -i disk /var/tmp/fedora-35.qcow2
[ 1.0] Opening the source
... some messages elided ...
protocol: newstyle-fixed without TLS <-- debug output to stdout
export="":
export-size: 6442450944 (6G)
content: DOS/MBR boot sector
uri: nbd+unix:///?socket=/tmp/v2v.Xqvaml/in0
... etc ...
This patch sends the nbdinfo debugging output to stderr instead.
Reported-by: Tingting Zheng
Fixes: commit 255722cbf39afc0b012e2ac00d16fa6ba2f8c21f
---
v2v/v2v.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index d74cc21f0a..a91d8cef8f 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -631,7 +631,7 @@ and nbdcopy output_alloc input_uri output_uri *)
and nbdinfo ?(content = false) uri let cmd - sprintf "nbdinfo%s
%s"
+ sprintf "nbdinfo%s %s >&2"
(if content then " --content" else " --no-content")
(quote uri) in
ignore (Sys.command cmd)
--
2.32.0
Laszlo Ersek
2022-Jan-26 08:28 UTC
[Libguestfs] [PATCH v2v 1/2] input: libvirt: Share a single connection to the source NBD server
On 01/25/22 11:45, Richard W.M. Jones wrote:> When using virt-p2v from RHEL 7, it starts a very old qemu-nbd server > (probably 1.5.3) which required the --shared parameter to enable > sharing even in read-only mode. Since it doesn't pass this parameter > only a single connection at a time is allowed, and further connections > will deadlock. Note that later versions of qemu-nbd changed this so > that read-only connections permit sharing. > > In modular virt-v2v we now use nbdkit-nbd-plugin to proxy the > connection to virt-p2v / qemu-nbd. When you connect to this multiple > times, as virt-v2v does, it will make multiple connections to the > backend qemu-nbd. This will cause a deadlock. > > We can use the nbdkit-nbd-plugin shared=true flag to enable the plugin > to share a single connection to the backend between multiple nbdkit > clients. > --- > input/input_libvirt.ml | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/input/input_libvirt.ml b/input/input_libvirt.ml > index 33f61086ec..42050c157b 100644 > --- a/input/input_libvirt.ml > +++ b/input/input_libvirt.ml > @@ -76,6 +76,7 @@ and libvirt_servers dir disks > Nbdkit.add_filter cmd "cow"; > Nbdkit.add_arg cmd "hostname" hostname; > Nbdkit.add_arg cmd "port" (string_of_int port); > + Nbdkit.add_arg cmd "shared" "true"; > let _, pid = Nbdkit.run_unix ~socket cmd in > > (* --exit-with-parent should ensure nbdkit is cleaned >Reviewed-by: Laszlo Ersek <lersek at redhat.com>