Virt-sparsify

How can I successfully run virt-sparsify. I get this:

 sudo virt-sparsify -v -x win11-2.qcow2 win11-2-sparse.qcow2 -tmp /opt
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: disk_format "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2"
libguestfs: command: run: qemu-img --help | grep -sqE -- '\binfo\b.*-U\b'
libguestfs: command: run: qemu-img
libguestfs: command: run: \ info
libguestfs: command: run: \ --output json
libguestfs: command: run: \ /run/media/j/Ventoy/qemukvm-images/win11-2.qcow2
libguestfs: parse_json: qemu-img info JSON output:\n{\n    "children": [\n        {\n            "name": "file",\n            "info": {\n                "children": [\n                ],\n                "virtual-size": 71993393152,\n                "filename": "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2",\n                "format": "file",\n                "actual-size": 71993393152,\n                "format-specific": {\n                    "type": "file",\n                    "data": {\n                    }\n                },\n                "dirty-flag": false\n            }\n        }\n    ],\n    "virtual-size": 103079215104,\n    "filename": "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2",\n    "cluster-size": 65536,\n    "format": "qcow2",\n    "actual-size": 71993393152,\n    "format-specific": {\n        "type": "qcow2",\n        "data": {\n            "compat": "1.1",\n            "compression-type": "zlib",\n            "lazy-refcounts": false,\n            "refcount-bits": 16,\n            "corrupt": false,\n            "extended-l2": false\n        }\n    },\n    "dirty-flag": false\n}\n\n
libguestfs: trace: disk_format = "qcow2"
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: disk_virtual_size "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2"
libguestfs: command: run: qemu-img --help | grep -sqE -- '\binfo\b.*-U\b'
libguestfs: command: run: qemu-img
libguestfs: command: run: \ info
libguestfs: command: run: \ --output json
libguestfs: command: run: \ /run/media/j/Ventoy/qemukvm-images/win11-2.qcow2
libguestfs: parse_json: qemu-img info JSON output:\n{\n    "children": [\n        {\n            "name": "file",\n            "info": {\n                "children": [\n                ],\n                "virtual-size": 71993393152,\n                "filename": "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2",\n                "format": "file",\n                "actual-size": 71993393152,\n                "format-specific": {\n                    "type": "file",\n                    "data": {\n                    }\n                },\n                "dirty-flag": false\n            }\n        }\n    ],\n    "virtual-size": 103079215104,\n    "filename": "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2",\n    "cluster-size": 65536,\n    "format": "qcow2",\n    "actual-size": 71993393152,\n    "format-specific": {\n        "type": "qcow2",\n        "data": {\n            "compat": "1.1",\n            "compression-type": "zlib",\n            "lazy-refcounts": false,\n            "refcount-bits": 16,\n            "corrupt": false,\n            "extended-l2": false\n        }\n    },\n    "dirty-flag": false\n}\n\n
libguestfs: trace: disk_virtual_size = 103079215104
virt-sparsify: debug: input disk virtual size is 103079215104 bytes (96.0G)
[   0.0] Create overlay file in /opt to protect source disk
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: disk_create "/opt/sparsify0f5891.qcow2" "qcow2" -1 "backingfile:/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2" "compat:1.1"
libguestfs: trace: disk_format "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2"
libguestfs: command: run: qemu-img --help | grep -sqE -- '\binfo\b.*-U\b'
libguestfs: command: run: qemu-img
libguestfs: command: run: \ info
libguestfs: command: run: \ --output json
libguestfs: command: run: \ /run/media/j/Ventoy/qemukvm-images/win11-2.qcow2
libguestfs: parse_json: qemu-img info JSON output:\n{\n    "children": [\n        {\n            "name": "file",\n            "info": {\n                "children": [\n                ],\n                "virtual-size": 71993393152,\n                "filename": "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2",\n                "format": "file",\n                "actual-size": 71993393152,\n                "format-specific": {\n                    "type": "file",\n                    "data": {\n                    }\n                },\n                "dirty-flag": false\n            }\n        }\n    ],\n    "virtual-size": 103079215104,\n    "filename": "/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2",\n    "cluster-size": 65536,\n    "format": "qcow2",\n    "actual-size": 71993393152,\n    "format-specific": {\n        "type": "qcow2",\n        "data": {\n            "compat": "1.1",\n            "compression-type": "zlib",\n            "lazy-refcounts": false,\n            "refcount-bits": 16,\n            "corrupt": false,\n            "extended-l2": false\n        }\n    },\n    "dirty-flag": false\n}\n\n
libguestfs: trace: disk_format = "qcow2"
libguestfs: command: run: qemu-img
libguestfs: command: run: \ create
libguestfs: command: run: \ -f qcow2
libguestfs: command: run: \ -o backing_file=/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2,backing_fmt=qcow2,compat=1.1
libguestfs: command: run: \ /opt/sparsify0f5891.qcow2
libguestfs: Formatting '/opt/sparsify0f5891.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=103079215104 compat=1.1 backing_file=/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16\n
libguestfs: trace: disk_create = 0
[   0.1] Examine source disk
libguestfs: trace: set_verbose true
libguestfs: trace: set_verbose = 0
libguestfs: trace: add_drive "/opt/sparsify0f5891.qcow2" "readonly:false" "format:qcow2" "cachemode:unsafe"
libguestfs: trace: add_drive = 0
libguestfs: trace: set_network false
libguestfs: trace: set_network = 0
libguestfs: trace: launch
libguestfs: trace: max_disks
libguestfs: trace: max_disks = 255
libguestfs: trace: get_tmpdir
libguestfs: trace: get_tmpdir = "/tmp"
libguestfs: trace: version
libguestfs: trace: version = <struct guestfs_version = major: 1, minor: 59, release: 8, extra: fedora=44,release=1.fc44,libvirt, >
libguestfs: trace: get_backend
libguestfs: trace: get_backend = "libvirt"
libguestfs: launch: program=virt-sparsify
libguestfs: launch: version=1.59.8fedora=44,release=1.fc44,libvirt
libguestfs: launch: backend registered: direct
libguestfs: launch: backend registered: libvirt
libguestfs: launch: backend=libvirt
libguestfs: launch: tmpdir=/tmp/libguestfsOup5a2
libguestfs: launch: umask=0022
libguestfs: launch: euid=0
libguestfs: launch: host: Linux ws-study 7.0.13-200.fc44.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jun 19 22:51:30 UTC 2026 x86_64
libguestfs: libvirt version = 12000000
libguestfs: guest random name = guestfs-kqrkvpiyxqxdxm4r
libguestfs: connect to libvirt
libguestfs: opening libvirt handle: URI = qemu:///system, auth = default+wrapper, flags = 0
libguestfs: successfully opened libvirt handle: conn = 0x556afd05a080
libguestfs: qemu version (reported by libvirt) = 10002002
libguestfs: get libvirt capabilities
libguestfs: parsing capabilities XML
libguestfs: trace: get_backend_setting "force_kvm"
libguestfs: trace: get_backend_setting = NULL (error)
libguestfs: trace: get_backend_setting "force_tcg"
libguestfs: trace: get_backend_setting = NULL (error)
libguestfs: parsing domcapabilities XML
libguestfs: trace: get_backend_setting "internal_libvirt_label"
libguestfs: trace: get_backend_setting = NULL (error)
libguestfs: trace: get_backend_setting "internal_libvirt_imagelabel"
libguestfs: trace: get_backend_setting = NULL (error)
libguestfs: trace: get_backend_setting "internal_libvirt_norelabel_disks"
libguestfs: trace: get_backend_setting = NULL (error)
libguestfs: build appliance
libguestfs: trace: get_cachedir
libguestfs: trace: get_cachedir = "/var/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 /var/tmp/.guestfs-0/lock
libguestfs: command: run: \ --copy-kernel
libguestfs: command: run: \ -f ext2
libguestfs: command: run: \ --host-cpu x86_64
libguestfs: command: run: \ /usr/lib64/guestfs/supermin.d
libguestfs: command: run: \ -o /var/tmp/.guestfs-0/appliance.d
supermin: version: 5.3.5
supermin: rpm: detected RPM version 6.0
supermin: rpm: detected RPM architecture x86_64
supermin: package handler: fedora/rpm
supermin: acquiring lock on /var/tmp/.guestfs-0/lock
supermin: if-newer: output does not need rebuilding
libguestfs: finished building supermin appliance
libguestfs: trace: disk_create "/tmp/libguestfsOup5a2/overlay1.qcow2" "qcow2" -1 "backingfile:/var/tmp/.guestfs-0/appliance.d/root"
libguestfs: trace: disk_format "/var/tmp/.guestfs-0/appliance.d/root"
libguestfs: command: run: qemu-img --help | grep -sqE -- '\binfo\b.*-U\b'
libguestfs: command: run: qemu-img
libguestfs: command: run: \ info
libguestfs: command: run: \ --output json
libguestfs: command: run: \ /var/tmp/.guestfs-0/appliance.d/root
libguestfs: parse_json: qemu-img info JSON output:\n{\n    "children": [\n        {\n            "name": "file",\n            "info": {\n                "children": [\n                ],\n                "virtual-size": 4294967296,\n                "filename": "/var/tmp/.guestfs-0/appliance.d/root",\n                "format": "file",\n                "actual-size": 501555200,\n                "format-specific": {\n                    "type": "file",\n                    "data": {\n                    }\n                },\n                "dirty-flag": false\n            }\n        }\n    ],\n    "virtual-size": 4294967296,\n    "filename": "/var/tmp/.guestfs-0/appliance.d/root",\n    "format": "raw",\n    "actual-size": 501555200,\n    "dirty-flag": false\n}\n\n
libguestfs: trace: disk_format = "raw"
libguestfs: command: run: qemu-img
libguestfs: command: run: \ create
libguestfs: command: run: \ -f qcow2
libguestfs: command: run: \ -o backing_file=/var/tmp/.guestfs-0/appliance.d/root,backing_fmt=raw
libguestfs: command: run: \ /tmp/libguestfsOup5a2/overlay1.qcow2
libguestfs: Formatting '/tmp/libguestfsOup5a2/overlay1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=4294967296 backing_file=/var/tmp/.guestfs-0/appliance.d/root backing_fmt=raw lazy_refcounts=off refcount_bits=16\n
libguestfs: trace: disk_create = 0
libguestfs: trace: get_sockdir
libguestfs: trace: get_sockdir = "/tmp"
libguestfs: create libvirt XML
libguestfs: trace: get_cachedir
libguestfs: trace: get_cachedir = "/var/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-kqrkvpiyxqxdxm4r</name>\n  <memory unit="MiB">1280</memory>\n  <currentMemory unit="MiB">1280</currentMemory>\n  <cpu mode="maximum">\n    <feature policy="disable" name="la57"/>\n  </cpu>\n  <vcpu>1</vcpu>\n  <features>\n    <acpi/>\n  </features>\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 machine="q35">hvm</type>\n    <kernel>/var/tmp/.guestfs-0/appliance.d/kernel</kernel>\n    <initrd>/var/tmp/.guestfs-0/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=UUID=0a22b69c-183d-484c-99a9-1e5318996faf selinux=0 guestfs_verbose=1 TERM=xterm-256color</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="/opt/sparsify0f5891.qcow2"/>\n      <target dev="sda" bus="scsi"/>\n      <driver name="qemu" type="qcow2" cache="unsafe"/>\n      <address type="drive" controller="0" bus="0" target="0" unit="0"/>\n    </disk>\n    <disk type="file" device="disk">\n      <source file="/tmp/libguestfsOup5a2/overlay1.qcow2"/>\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    </disk>\n    <serial type="unix">\n      <source mode="connect" path="/tmp/libguestfs5XH9q9/console.sock"/>\n      <target port="0"/>\n    </serial>\n    <channel type="unix">\n      <source mode="connect" path="/tmp/libguestfs5XH9q9/guestfsd.sock"/>\n      <target type="virtio" name="org.libguestfs.channel.0"/>\n    </channel>\n    <controller type="usb" model="none"/>\n    <memballoon model="none"/>\n  </devices>\n  <qemu:commandline>\n    <qemu:env name="TMPDIR" value="/var/tmp"/>\n  </qemu:commandline>\n</domain>\n
libguestfs: trace: get_cachedir
libguestfs: trace: get_cachedir = "/var/tmp"
libguestfs: command: run: ls
libguestfs: command: run: \ -a
libguestfs: command: run: \ -l
libguestfs: command: run: \ -R
libguestfs: command: run: \ -Z /var/tmp/.guestfs-0
libguestfs: /var/tmp/.guestfs-0:
libguestfs: total 0
libguestfs: drwxr-xr-x. 1 root root unconfined_u:object_r:user_tmp_t:s0   30 Jun 28 09:30 .
libguestfs: drwxrwxrwt. 1 root root system_u:object_r:tmp_t:s0          1988 Jun 28 09:30 ..
libguestfs: drwxr-xr-x. 1 root root unconfined_u:object_r:user_tmp_t:s0   32 Jun 28 09:30 appliance.d
libguestfs: -rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0    0 Jun 27 17:00 lock
libguestfs: 
libguestfs: /var/tmp/.guestfs-0/appliance.d:
libguestfs: total 517312
libguestfs: drwxr-xr-x. 1 root root unconfined_u:object_r:user_tmp_t:s0         32 Jun 28 09:30 .
libguestfs: drwxr-xr-x. 1 root root unconfined_u:object_r:user_tmp_t:s0         30 Jun 28 09:30 ..
libguestfs: -rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0    9483264 Jun 28 09:30 initrd
libguestfs: -rwxr-xr-x. 1 root root unconfined_u:object_r:user_tmp_t:s0   18684264 Jun 28 09:30 kernel
libguestfs: -rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0 4294967296 Jun 28 09:30 root
libguestfs: command: run: ls
libguestfs: command: run: \ -a
libguestfs: command: run: \ -l
libguestfs: command: run: \ -Z /tmp/libguestfs5XH9q9
libguestfs: total 0
libguestfs: drwxr-xr-x.  2 root root unconfined_u:object_r:user_tmp_t:s0  80 Jun 28 09:30 .
libguestfs: drwxrwxrwt. 25 root root system_u:object_r:tmp_t:s0          640 Jun 28 09:30 ..
libguestfs: srw-rw----.  1 root root unconfined_u:object_r:user_tmp_t:s0   0 Jun 28 09:30 console.sock
libguestfs: srw-rw----.  1 root root unconfined_u:object_r:user_tmp_t:s0   0 Jun 28 09:30 guestfsd.sock
libguestfs: launch libvirt guest
libguestfs: trace: launch = -1 (error)
virt-sparsify: error: libguestfs error: could not create appliance through 
libvirt. Original error from libvirt: Cannot access backing file 
'/run/media/j/Ventoy/qemukvm-images/win11-2.qcow2' of storage file 
'/opt/sparsify0f5891.qcow2' (as uid:107, gid:107): Permission denied 
[code=38 int1=13]
libguestfs: trace: close
libguestfs: closing guestfs handle 0x556afd05a690 (state 0)
libguestfs: command: run: rm
libguestfs: command: run: \ -rf /tmp/libguestfsOup5a2
libguestfs: command: run: rm
libguestfs: command: run: \ -rf /tmp/libguestfs5XH9q9
libguestfs: trace: close
libguestfs: closing guestfs handle 0x556afd059cf0 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x556afd058f90 (state 0)
libguestfs: trace: close
libguestfs: closing guestfs handle 0x556afd0586f0 (state 0)

That’s what’s happening.
User with ID 107 does not have access to the qcow file in /opt

try

sudo LIBGUESTFS_BACKEND=direct virt-sparsify -v -x win11-2.qcow2 win11-2-sparse.qcow2 --tmp /opt