Bug 811649
| Summary: | libguestfs cannot open disk images which are symlinks to files that contain ':' (colon) character | |||
|---|---|---|---|---|
| Product: | [Community] Virtualization Tools | Reporter: | Richard W.M. Jones <rjones> | |
| Component: | libguestfs | Assignee: | Richard W.M. Jones <rjones> | |
| Status: | CLOSED UPSTREAM | QA Contact: | ||
| Severity: | unspecified | Docs Contact: | ||
| Priority: | unspecified | |||
| Version: | unspecified | CC: | dyasny, mbooth, virt-maint | |
| Target Milestone: | --- | |||
| Target Release: | --- | |||
| Hardware: | Unspecified | |||
| OS: | Unspecified | |||
| Whiteboard: | ||||
| Fixed In Version: | Doc Type: | Bug Fix | ||
| Doc Text: | Story Points: | --- | ||
| Clone Of: | ||||
| : | 812092 (view as bug list) | Environment: | ||
| Last Closed: | 2012-04-12 20:56:49 UTC | Type: | Bug | |
| Regression: | --- | Mount Type: | --- | |
| Documentation: | --- | CRM: | ||
| Verified Versions: | Category: | --- | ||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | ||
| Cloudforms Team: | --- | Target Upstream Version: | ||
| Embargoed: | ||||
| Bug Depends On: | ||||
| Bug Blocks: | 812092 | |||
|
Description
Richard W.M. Jones
2012-04-11 15:46:34 UTC
OK I *can* reproduce this.
Using Python, RHEL 6.3, libguestfs 1.16.15.
I wrote the following script:
------------------- /tmp/test.py -----------
import guestfs
guest = guestfs.GuestFS()
guest.set_qemu('/usr/libexec/qemu-kvm')
guest.add_drive_opts('/mnt/scratch/test1.img', format='qcow2')
guest.launch()
--------------------------------------------
/mnt/scratch is an NFSv4 filesystem exported from another machine.
test1.img is a raw disk image created on another machine.
Running this script produces:
$ python /tmp/test.py
python: Objects/stringobject.c:115: PyString_FromString: Assertion `str != ((void *)0)' failed.
Aborted (core dumped)
Enabling debug:
[00275ms] /usr/libexec/qemu-kvm \
-global virtio-blk-pci.scsi=off \
-drive file=/mnt/scratch/test1.img,cache=off,format=qcow2,if=virtio \
-nodefconfig \
-nodefaults \
-nographic \
-m 500 \
-no-reboot \
-device virtio-serial \
-serial stdio \
-chardev socket,path=/tmp/libguestfsTuLj1x/guestfsd.sock,id=channel0 \
-device virtserialport,chardev=channel0,name=org.libguestfs.channel.0 \
-kernel /var/tmp/.guestfs-500/kernel.19013 \
-initrd /var/tmp/.guestfs-500/initrd.19013 \
-append 'panic=1 console=ttyS0 udevtimeout=300 no_timer_check acpi=off printk.time=1 cgroup_disable=memory selinux=0 guestfs_verbose=1 TERM=xterm ' \
-drive file=/var/tmp/.guestfs-500/root.19013,snapshot=on,if=virtio,cache=unsafeopen /dev/kvm: No such file or directory
Could not initialize KVM, will disable KVM support
qemu-kvm: -drive file=/mnt/scratch/test1.img,cache=off,format=qcow2,if=virtio: could not open disk image /mnt/scratch/test1.img: Invalid argument
libguestfs: child_cleanup: 0x1707040: child process died
python: Objects/stringobject.c:115: PyString_FromString: Assertion `str != ((void *)0)' failed.
Aborted (core dumped)
NB. the core dump is a separate issue, bug 811650.
Can also reproduce this on libguestfs 1.17.27 on Fedora. Sorry, my stupid mistake. Of course the error from qemu there is correct because I used a raw format image, but forced the format to be qcow2. I cannot reproduce the "fails to start" problem after fixing that. I reproduced this on Igor's original machine, and
the error is very strange. In the text below, compare
the original string passed to add_drive_opts with the
corrupted(?) string that gets placed on the qemu
command line.
In [1]: import guestfs
In [2]: g = guestfs.GuestFS()
In [3]: g.set_verbose(1)
In [4]: g.add_drive_opts('/rhev/data-center/1b6f5ed0-6363-4600-b050-0438efd36570/d09e3b5f-c06a-4fb8-9e11-219e70787edc/kuku', format='qcow2')
In [5]: g.launch()
[00145ms] /usr/libexec/qemu-kvm \
-global virtio-blk-pci.scsi=off \
-drive file=/rhev/data-center/mnt/dandylion:_export_regression_reg1/d09e3b5f-c06a-4fb8-9e11-219e70787edc/kuku,cache=off,format=qcow2,if=virtio \
-nodefconfig \
-enable-kvm \
-nodefaults \
-nographic \
-m 500 \
-no-reboot \
-device virtio-serial \
-serial stdio \
-chardev socket,path=/tmp/libguestfsd3mNvG/guestfsd.sock,id=channel0 \
-device virtserialport,chardev=channel0,name=org.libguestfs.channel.0 \
-kernel /var/tmp/.guestfs-36/kernel.11742 \
-initrd /var/tmp/.guestfs-36/initrd.11742 \
-append 'panic=1 console=ttyS0 udevtimeout=300 no_timer_check acpi=off printk.time=1 cgroup_disable=memory selinux=0 guestfs_verbose=1 TERM=xterm ' \
-drive file=/var/tmp/.guestfs-36/root.11742,snapshot=on,if=virtio,cache=unsafeqemu-kvm: -drive file=/rhev/data-center/mnt/dandylion:_export_regression_reg1/d09e3b5f-c06a-4fb8-9e11-219e70787edc/kuku,cache=off,format=qcow2,if=virtio: could not open disk image /rhev/data-center/mnt/dandylion:_export_regression_reg1/d09e3b5f-c06a-4fb8-9e11-219e70787edc/kuku: No such file or directory
libguestfs: child_cleanup: 0x1abcdf0: child process died
The problem is that *we* are rewriting the path (calling realpath(3)) and the destination path contains a colon which breaks qemu's parsing. A simple reproducer: $ qemu-img create -f qcow2 '/tmp/foo' 1G Formatting '/tmp/foo', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 $ mv /tmp/foo /tmp/foo:bar $ guestfish -a /tmp/foo\:bar -v run [... fails with ...] qemu-kvm: -drive file=/tmp/foo:bar,cache=off,if=virtio: could not open disk image /tmp/foo:bar: No such file or directory I pushed patches upstream (in libguestfs 1.17.29) that should fix this. 4dba0e1e9d7fca190e7877856ce69618d99e85c9 4be630edb31f654068509d470e8b44039580954d d2183a62aadff11609b561d3f821ec7d6094aa39 a9bd90abfb3d4519278dfff305b8b7033ae6d76a qemu has fixed this upstream, so I've been able to put a complete fix into libguestfs. https://github.com/libguestfs/libguestfs/commit/a95214b1985e694946e3426120a6fdc13a3f081f |