[Libguestfs] [PATCH v8 4/4] v2v: ova: don't extract files from OVA if it's not needed

Richard W.M. Jones rjones at redhat.com
Tue Feb 7 21:07:34 UTC 2017


On Sat, Feb 04, 2017 at 03:10:46PM +0100, Tomáš Golembiovský wrote:
> We don't have to always extract all files from the OVA archive. The OVA,
> as defined in the standard, is plain tar. We can work directly over the
> tar archive if we use correct 'offset' and 'size' options when defining
> the backing file for QEMU. This puts much lower requirement on available
> disk space.
> 
> Since the virt-v2v behaviour for OVA input now depends on QEMU version
> available this affects some of the tests. Expected result of the
> affected also has to depend on the QEMU used thus such tests will have
> two *.expected files.
> 
> Signed-off-by: Tomáš Golembiovský <tgolembi at redhat.com>

This commit (I think) breaks virt-v2v when run with the libvirt
backend using an OVA input file.  The error from v2v/test-v2v-i-ova.sh
is:

  Original error from libvirt: internal error: missing parser implementation 
  for JSON backing volume driver 'raw' [code=1 int1=-1]

which I think is caused because libvirt doesn't understand a backing
file with the format 'json:{"driver":"raw",...}'.  Full log is
attached.  This is similar but not exactly the same as this bug:

  https://bugzilla.redhat.com/show_bug.cgi?id=1134878

I have added a workaround in the test for now, but please look at
whether this can be fixed more permanently.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW
-------------- next part --------------
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_tmpdir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_tmpdir = 0
libguestfs: trace: set_cachedir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_cachedir = 0
libguestfs: trace: set_path "/home/rjones/d/libguestfs/appliance"
libguestfs: trace: set_path = 0
libguestfs: create: flags = 0, handle = 0x55c0a01e50a0, program = guestfish
libguestfs: trace: get_backend
libguestfs: trace: get_backend = "libvirt"
libguestfs: trace: shutdown
libguestfs: trace: shutdown = 0
libguestfs: trace: close
libguestfs: closing guestfs handle 0x55c0a01e50a0 (state 0)
~/d/libguestfs/v2v ~/d/libguestfs/v2v
~/d/libguestfs/v2v
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_tmpdir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_tmpdir = 0
libguestfs: trace: set_cachedir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_cachedir = 0
libguestfs: trace: set_path "/home/rjones/d/libguestfs/appliance"
libguestfs: trace: set_path = 0
libguestfs: create: flags = 0, handle = 0x10c4c60, program = virt-v2v
libguestfs: trace: get_cachedir
libguestfs: trace: get_cachedir = "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_tmpdir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_tmpdir = 0
libguestfs: trace: set_cachedir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_cachedir = 0
libguestfs: trace: set_path "/home/rjones/d/libguestfs/appliance"
libguestfs: trace: set_path = 0
libguestfs: create: flags = 0, handle = 0x10c50b0, program = virt-v2v
libguestfs: trace: get_cachedir
libguestfs: trace: get_cachedir = "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_tmpdir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_tmpdir = 0
libguestfs: trace: set_cachedir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_cachedir = 0
libguestfs: trace: set_path "/home/rjones/d/libguestfs/appliance"
libguestfs: trace: set_path = 0
libguestfs: create: flags = 0, handle = 0x10c5660, program = virt-v2v
libguestfs: trace: get_cachedir
libguestfs: trace: get_cachedir = "/home/rjones/d/libguestfs/tmp"
[   0.0] Opening the source -i ova test-v2v-i-ova.d/test-ova.ova
[   0.1] Creating an overlay to protect the source from being modified
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_tmpdir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_tmpdir = 0
libguestfs: trace: set_cachedir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_cachedir = 0
libguestfs: trace: set_path "/home/rjones/d/libguestfs/appliance"
libguestfs: trace: set_path = 0
libguestfs: create: flags = 0, handle = 0x11406d0, program = virt-v2v
libguestfs: trace: disk_has_backing_file "/home/rjones/d/libguestfs/tmp/v2vovlb76359.qcow2"
libguestfs: command: run: qemu-img
libguestfs: command: run: \ info
libguestfs: command: run: \ --output json
libguestfs: command: run: \ /dev/fd/3
libguestfs: parse_json: qemu-img info JSON output:\n{\n    "backing-filename-format": "vmdk",\n    "virtual-size": 536870912,\n    "filename": "/dev/fd/3",\n    "cluster-size": 65536,\n    "format": "qcow2",\n    "actual-size": 200704,\n    "format-specific": {\n        "type": "qcow2",\n        "data": {\n            "compat": "1.1",\n            "lazy-refcounts": false,\n            "refcount-bits": 16,\n            "corrupt": false\n        }\n    },\n    "full-backing-filename": "json:{ \"file\": { \"driver\": \"raw\", \"offset\": 10752, \"size\": 4063232, \"file\": { \"filename\": \"test-v2v-i-ova.d/test-ova.ova\" } } }",\n    "backing-filename": "json:{ \"file\": { \"driver\": \"raw\", \"offset\": 10752, \"size\": 4063232, \"file\": { \"filename\": \"test-v2v-i-ova.d/test-ova.ova\" } } }",\n    "dirty-flag": false\n}\n\n
libguestfs: trace: disk_has_backing_file = 1
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_tmpdir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_tmpdir = 0
libguestfs: trace: set_cachedir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_cachedir = 0
libguestfs: trace: set_path "/home/rjones/d/libguestfs/appliance"
libguestfs: trace: set_path = 0
libguestfs: create: flags = 0, handle = 0x113fde0, program = virt-v2v
libguestfs: trace: disk_virtual_size "/home/rjones/d/libguestfs/tmp/v2vovlb76359.qcow2"
libguestfs: command: run: qemu-img
libguestfs: command: run: \ info
libguestfs: command: run: \ --output json
libguestfs: command: run: \ /dev/fd/3
libguestfs: parse_json: qemu-img info JSON output:\n{\n    "backing-filename-format": "vmdk",\n    "virtual-size": 536870912,\n    "filename": "/dev/fd/3",\n    "cluster-size": 65536,\n    "format": "qcow2",\n    "actual-size": 200704,\n    "format-specific": {\n        "type": "qcow2",\n        "data": {\n            "compat": "1.1",\n            "lazy-refcounts": false,\n            "refcount-bits": 16,\n            "corrupt": false\n        }\n    },\n    "full-backing-filename": "json:{ \"file\": { \"driver\": \"raw\", \"offset\": 10752, \"size\": 4063232, \"file\": { \"filename\": \"test-v2v-i-ova.d/test-ova.ova\" } } }",\n    "backing-filename": "json:{ \"file\": { \"driver\": \"raw\", \"offset\": 10752, \"size\": 4063232, \"file\": { \"filename\": \"test-v2v-i-ova.d/test-ova.ova\" } } }",\n    "dirty-flag": false\n}\n\n
libguestfs: trace: disk_virtual_size = 536870912
[   0.1] Initializing the target -o local -os test-v2v-i-ova.d
[   0.1] Opening the overlay
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: set_tmpdir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_tmpdir = 0
libguestfs: trace: set_cachedir "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: set_cachedir = 0
libguestfs: trace: set_path "/home/rjones/d/libguestfs/appliance"
libguestfs: trace: set_path = 0
libguestfs: create: flags = 0, handle = 0x1140130, program = virt-v2v
libguestfs: trace: set_identifier "v2v"
libguestfs: trace: v2v: set_identifier = 0
libguestfs: trace: v2v: get_memsize
libguestfs: trace: v2v: get_memsize = 500
libguestfs: trace: v2v: set_memsize 2000
libguestfs: trace: v2v: set_memsize = 0
libguestfs: trace: v2v: set_network true
libguestfs: trace: v2v: set_network = 0
libguestfs: trace: v2v: add_drive "/home/rjones/d/libguestfs/tmp/v2vovlb76359.qcow2" "format:qcow2" "cachemode:unsafe" "discard:besteffort" "copyonread:true"
libguestfs: trace: v2v: add_drive = 0
libguestfs: trace: v2v: launch
libguestfs: trace: v2v: get_tmpdir
libguestfs: trace: v2v: get_tmpdir = "/home/rjones/d/libguestfs/tmp"
libguestfs: trace: v2v: version
libguestfs: trace: v2v: version = <struct guestfs_version = major: 1, minor: 35, release: 21, extra: , >
libguestfs: trace: v2v: get_backend
libguestfs: trace: v2v: get_backend = "libvirt"
libguestfs: launch: program=virt-v2v
libguestfs: launch: identifier=v2v
libguestfs: launch: version=1.35.21
libguestfs: launch: backend registered: unix
libguestfs: launch: backend registered: uml
libguestfs: launch: backend registered: libvirt
libguestfs: launch: backend registered: direct
libguestfs: launch: backend=libvirt
libguestfs: launch: tmpdir=/home/rjones/d/libguestfs/tmp/libguestfsPT4q2Y
libguestfs: launch: umask=0002
libguestfs: launch: euid=1000
libguestfs: libvirt version = 3000000 (3.0.0)
libguestfs: guest random name = guestfs-rkoxuu2n9eeycio5
libguestfs: connect to libvirt
libguestfs: opening libvirt handle: URI = qemu:///session, auth = default+wrapper, flags = 0
libguestfs: successfully opened libvirt handle: conn = 0x1177320
libguestfs: qemu version (reported by libvirt) = 2008000 (2.8.0)
libguestfs: get libvirt capabilities
libguestfs: parsing capabilities XML
libguestfs: trace: v2v: get_backend_setting "force_tcg"
libguestfs: trace: v2v: get_backend_setting = NULL (error)
libguestfs: trace: v2v: get_backend_setting "internal_libvirt_label"
libguestfs: trace: v2v: get_backend_setting = NULL (error)
libguestfs: trace: v2v: get_backend_setting "internal_libvirt_imagelabel"
libguestfs: trace: v2v: get_backend_setting = NULL (error)
libguestfs: trace: v2v: get_backend_setting "internal_libvirt_norelabel_disks"
libguestfs: trace: v2v: get_backend_setting = NULL (error)
libguestfs: trace: v2v: get_backend_setting "network_bridge"
libguestfs: trace: v2v: get_backend_setting = NULL (error)
libguestfs: build appliance
libguestfs: trace: v2v: get_cachedir
libguestfs: trace: v2v: get_cachedir = "/home/rjones/d/libguestfs/tmp"
libguestfs: begin building supermin appliance
libguestfs: run supermin
libguestfs: command: run: /usr/bin/supermin
libguestfs: command: run: \ --build
libguestfs: command: run: \ --verbose
libguestfs: command: run: \ --if-newer
libguestfs: command: run: \ --lock /home/rjones/d/libguestfs/tmp/.guestfs-1000/lock
libguestfs: command: run: \ --copy-kernel
libguestfs: command: run: \ -f ext2
libguestfs: command: run: \ --host-cpu x86_64
libguestfs: command: run: \ /home/rjones/d/libguestfs/appliance/supermin.d
libguestfs: command: run: \ -o /home/rjones/d/libguestfs/tmp/.guestfs-1000/appliance.d
supermin: version: 5.1.17
supermin: rpm: detected RPM version 4.13
supermin: package handler: fedora/rpm
supermin: acquiring lock on /home/rjones/d/libguestfs/tmp/.guestfs-1000/lock
supermin: if-newer: output does not need rebuilding
libguestfs: finished building supermin appliance
libguestfs: trace: v2v: disk_create "/home/rjones/d/libguestfs/tmp/libguestfsPT4q2Y/overlay1" "qcow2" -1 "backingfile:/home/rjones/d/libguestfs/tmp/.guestfs-1000/appliance.d/root" "backingformat:raw"
libguestfs: command: run: qemu-img
libguestfs: command: run: \ create
libguestfs: command: run: \ -f qcow2
libguestfs: command: run: \ -o backing_file=/home/rjones/d/libguestfs/tmp/.guestfs-1000/appliance.d/root,backing_fmt=raw
libguestfs: command: run: \ /home/rjones/d/libguestfs/tmp/libguestfsPT4q2Y/overlay1
Formatting '/home/rjones/d/libguestfs/tmp/libguestfsPT4q2Y/overlay1', fmt=qcow2 size=4294967296 backing_file=/home/rjones/d/libguestfs/tmp/.guestfs-1000/appliance.d/root backing_fmt=raw encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
libguestfs: trace: v2v: disk_create = 0
libguestfs: trace: v2v: get_sockdir
libguestfs: trace: v2v: get_sockdir = "/run/user/1000"
libguestfs: create libvirt XML
libguestfs: trace: v2v: get_cachedir
libguestfs: trace: v2v: get_cachedir = "/home/rjones/d/libguestfs/tmp"
libguestfs: libvirt XML:\n<?xml version="1.0"?>\n<domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">\n  <name>guestfs-rkoxuu2n9eeycio5</name>\n  <memory unit="MiB">2000</memory>\n  <currentMemory unit="MiB">2000</currentMemory>\n  <cpu mode="host-passthrough">\n    <model fallback="allow"/>\n  </cpu>\n  <vcpu>1</vcpu>\n  <clock offset="utc">\n    <timer name="rtc" tickpolicy="catchup"/>\n    <timer name="pit" tickpolicy="delay"/>\n    <timer name="hpet" present="no"/>\n  </clock>\n  <os>\n    <type>hvm</type>\n    <kernel>/home/rjones/d/libguestfs/tmp/.guestfs-1000/appliance.d/kernel</kernel>\n    <initrd>/home/rjones/d/libguestfs/tmp/.guestfs-1000/appliance.d/initrd</initrd>\n    <cmdline>panic=1 console=ttyS0 edd=off udevtimeout=6000 udev.event-timeout=6000 no_timer_check printk.time=1 cgroup_disable=memory usbcore.nousb cryptomgr.notests tsc=reliable 8250.nr_uarts=1 root=/dev/sdb selinux=0 guestfs_verbose=1 guestfs_network=1 TERM=xterm-256color guestfs_identifier=v2v</cmdline>\n    <bios useserial="yes"/>\n  </os>\n  <on_reboot>destroy</on_reboot>\n  <devices>\n    <rng model="virtio">\n      <backend model="random">/dev/urandom</backend>\n    </rng>\n    <controller type="scsi" index="0" model="virtio-scsi"/>\n    <disk device="disk" type="file">\n      <source file="/home/rjones/d/libguestfs/tmp/v2vovlb76359.qcow2"/>\n      <target dev="sda" bus="scsi"/>\n      <driver name="qemu" type="qcow2" cache="unsafe" discard="unmap"/>\n      <address type="drive" controller="0" bus="0" target="0" unit="0"/>\n    </disk>\n    <disk type="file" device="disk">\n      <source file="/home/rjones/d/libguestfs/tmp/libguestfsPT4q2Y/overlay1"/>\n      <target dev="sdb" bus="scsi"/>\n      <driver name="qemu" type="qcow2" cache="unsafe"/>\n      <address type="drive" controller="0" bus="0" target="1" unit="0"/>\n      <shareable/>\n    </disk>\n    <serial type="unix">\n      <source mode="connect" path="/run/user/1000/libguestfsnN9AkE/console.sock"/>\n      <target port="0"/>\n    </serial>\n    <channel type="unix">\n      <source mode="connect" path="/run/user/1000/libguestfsnN9AkE/guestfsd.sock"/>\n      <target type="virtio" name="org.libguestfs.channel.0"/>\n    </channel>\n    <interface type="bridge">\n      <source bridge="virbr0"/>\n      <model type="virtio"/>\n    </interface>\n    <controller type="usb" model="none"/>\n    <memballoon model="none"/>\n  </devices>\n  <qemu:commandline>\n    <qemu:env name="TMPDIR" value="/home/rjones/d/libguestfs/tmp"/>\n  </qemu:commandline>\n</domain>\n
libguestfs: trace: v2v: get_cachedir
libguestfs: trace: v2v: get_cachedir = "/home/rjones/d/libguestfs/tmp"
libguestfs: command: run: ls
libguestfs: command: run: \ -a
libguestfs: command: run: \ -l
libguestfs: command: run: \ -R
libguestfs: command: run: \ -Z /home/rjones/d/libguestfs/tmp/.guestfs-1000
libguestfs: /home/rjones/d/libguestfs/tmp/.guestfs-1000:
libguestfs: total 92
libguestfs: drwxr-xr-x. 3 rjones rjones unconfined_u:object_r:user_tmp_t:s0  4096 Feb  7 21:02 .
libguestfs: drwxrwxr-x. 6 rjones rjones system_u:object_r:tmp_t:s0          45056 Feb  7 21:02 ..
libguestfs: drwxr-xr-x. 2 rjones rjones unconfined_u:object_r:user_tmp_t:s0  4096 Feb  7 20:58 appliance.d
libguestfs: -rw-r--r--. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0     0 Feb  7 17:41 lock
libguestfs: -rw-rw-r--. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0 10027 Feb  7 18:26 qemu.devices
libguestfs: -rw-rw-r--. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0 23588 Feb  7 18:26 qemu.help
libguestfs: -rw-rw-r--. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0    35 Feb  7 18:26 qemu.stat
libguestfs: 
libguestfs: /home/rjones/d/libguestfs/tmp/.guestfs-1000/appliance.d:
libguestfs: total 422532
libguestfs: drwxr-xr-x. 2 rjones rjones unconfined_u:object_r:user_tmp_t:s0       4096 Feb  7 20:58 .
libguestfs: drwxr-xr-x. 3 rjones rjones unconfined_u:object_r:user_tmp_t:s0       4096 Feb  7 21:02 ..
libguestfs: -rw-r--r--. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0     521728 Feb  7 21:02 initrd
libguestfs: -rwxr-xr-x. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0    7172184 Feb  7 21:02 kernel
libguestfs: -rw-r--r--. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0 4294967296 Feb  7 21:02 root
libguestfs: command: run: ls
libguestfs: command: run: \ -a
libguestfs: command: run: \ -l
libguestfs: command: run: \ -Z /run/user/1000/libguestfsnN9AkE
libguestfs: total 0
libguestfs: drwx------. 2 rjones rjones unconfined_u:object_r:user_tmp_t:s0  80 Feb  7 21:02 .
libguestfs: drwx------. 7 rjones rjones system_u:object_r:user_tmp_t:s0     160 Feb  7 21:02 ..
libguestfs: srwxrwxr-x. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0   0 Feb  7 21:02 console.sock
libguestfs: srwxrwxr-x. 1 rjones rjones unconfined_u:object_r:user_tmp_t:s0   0 Feb  7 21:02 guestfsd.sock
libguestfs: launch libvirt guest
libguestfs: trace: v2v: launch = -1 (error)
virt-v2v: error: libguestfs error: could not create appliance through 
libvirt.

Try running qemu directly without libvirt using this environment variable:
export LIBGUESTFS_BACKEND=direct

Original error from libvirt: internal error: missing parser implementation 
for JSON backing volume driver 'raw' [code=1 int1=-1]

If reporting bugs, run virt-v2v with debugging enabled and include the 
complete output:

  virt-v2v -v -x [...]
libguestfs: trace: close
libguestfs: closing guestfs handle 0x10c4c60 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x10c50b0 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x10c5660 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x11406d0 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x113fde0 (state 0)
libguestfs: trace: v2v: close
libguestfs: closing guestfs handle 0x1140130 (state 0)
libguestfs: command: run: rm
libguestfs: command: run: \ -rf /home/rjones/d/libguestfs/tmp/libguestfsPT4q2Y
libguestfs: command: run: rm
libguestfs: command: run: \ -rf /run/user/1000/libguestfsnN9AkE
FAIL test-v2v-i-ova.sh (exit status: 1)


More information about the Libguestfs mailing list