I'm trying to export qcow2 images from ova format using qemu-nbd. I create 2 compressed qcow2 images, with different data:
$ qemu-img info disk1.qcow2 image: disk1.qcow2 file format: qcow2 virtual size: 200 MiB (209715200 bytes) disk size: 384 KiB ... $ qemu-img info disk2.qcow2 image: disk2.qcow2 file format: qcow2 virtual size: 200 MiB (209715200 bytes) disk size: 384 KiB ... And packed them in a tar file. This is not a valid ova but good enough for this test: $ tar tvf vm.ova -rw-r--r-- nsoffer/nsoffer 454144 2020-06-22 21:34 disk1.qcow2 -rw-r--r-- nsoffer/nsoffer 454144 2020-06-22 21:34 disk2.qcow2 To get info about the disks in ova file, we can use: $ python -c 'import tarfile; print(list({"name": m.name, "offset": m.offset_data, "size": m.size} for m in tarfile.open("vm.ova")))' [{'name': 'disk1.qcow2', 'offset': 512, 'size': 454144}, {'name': 'disk2.qcow2', 'offset': 455168, 'size': 454144}] First I tried the obvious: $ qemu-nbd --persistent --socket=/tmp/nbd.sock --read-only --offset=512 vm.ova And it works, but it exposes the qcow2 data. I want to raw data so I can upload the guest data to ovirt, where is may be converted to qcow2 format. $ qemu-img info --output json "nbd+unix://?socket=/tmp/nbd.sock" { "virtual-size": 209715200, "filename": "nbd+unix://?socket=/tmp/nbd.sock", "format": "qcow2", ... } Looking in qemu manual and qapi/block-core.json, I could construct this command: $ qemu-nbd --persistent --socket=/tmp/nbd.sock --read-only 'json:{"driver": "qcow2", "file": {"driver": "raw", "offset": 512, "size": 454144, "file": {"driver": "file", "filename": "vm.ova"}}}' And it works: $ qemu-img info --output json "nbd+unix://?socket=/tmp/nbd.sock" { "virtual-size": 209715200, "filename": "nbd+unix://?socket=/tmp/nbd.sock", "format": "raw" } $ qemu-img map --output json "nbd+unix://?socket=/tmp/nbd.sock" [{ "start": 0, "length": 104857600, "depth": 0, "zero": false, "data": true, "offset": 0}, { "start": 104857600, "length": 104857600, "depth": 0, "zero": true, "data": false, "offset": 104857600}] $ qemu-img map --output json disk1.qcow2 [{ "start": 0, "length": 104857600, "depth": 0, "zero": false, "data": true}, { "start": 104857600, "length": 104857600, "depth": 0, "zero": true, "data": false}] $ qemu-img convert -f raw -O raw nbd+unix://?socket=/tmp/nbd.sock disk1.raw $ qemu-img info disk1.raw image: disk1.raw file format: raw virtual size: 200 MiB (209715200 bytes) disk size: 100 MiB $ qemu-img compare disk1.raw disk1.qcow2 Images are identical. I wonder if this is the best way to stack a qcow2 driver on top of a raw driver exposing a range from a tar file. I found similar example for gluster in: docs/system/device-url-syntax.rst.inc Richard suggested to try nbdkit tar plugin, but the plugin is not available on RHEL, and this adds additional dependency, when we already use qemu-nbd. Nir