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>