Bug 1206406
| Summary: | blockcopy to a gluster volume calls drive-mirror with wrong parameters | ||
|---|---|---|---|
| Product: | Red Hat Enterprise Linux 7 | Reporter: | Luyao Huang <lhuang> |
| Component: | libvirt | Assignee: | Ján Tomko <jtomko> |
| Status: | CLOSED ERRATA | QA Contact: | Virtualization Bugs <virt-bugs> |
| Severity: | medium | Docs Contact: | |
| Priority: | medium | ||
| Version: | 7.2 | CC: | dyuan, jtomko, mzhan, rbalakri, shyu, yanyang |
| Target Milestone: | rc | ||
| Target Release: | --- | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
| Whiteboard: | |||
| Fixed In Version: | libvirt-1.2.14-1.el7 | Doc Type: | Bug Fix |
| Doc Text: | Story Points: | --- | |
| Clone Of: | Environment: | ||
| Last Closed: | 2015-11-19 06:25:41 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: | |||
Fixed upstream by:
commit c5fbad66234b1b1a9afc36ef2fe3a3d903886386
Author: Shanzhi Yu <shyu>
CommitDate: 2015-03-27 10:30:50 +0100
qemu: end the job when try to blockcopy to non-file destination
Blockcopy to non-file destination is not supported according the code,
but a 'goto endjob' is missed after checking the destination.
This leads to calling drive-mirror with wrong parameters.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1206406
Signed-off-by: Shanzhi Yu <shyu>
Signed-off-by: Ján Tomko <jtomko>
git describe: v1.2.14-rc1-2-gc5fbad6
Verify this bug with libvirt-1.2.16-1.el7.x86_64 libvirt-1.2.16-1.el7.x86_64
1. Prepare transient guest
# virsh list --transient
Id Name State
----------------------------------------------------
4 vol-d running
2. Prepare destination file
# cat gluster.xml
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source protocol='gluster' name='gluster-vol1/rh6.img.s2'>
<host name='10.66.x.xxx'/>
</source>
<target dev='vdb' bus='virtio'/>
<shareable/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
</disk>
# cat rbd.xml
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source protocol='rbd' name='libvirt-pool/test.img'>
<host name='10.66.x.xxx'/>
<host name='10.66.x.xxx'/>
<host name='10.66.x.xxx'/>
</source>
<target dev='vdb' bus='virtio'/>
<shareable/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
</disk>
# virsh blockcopy vol-d vdb --xml rbd.xml
error: argument unsupported: non-file destination not supported yet
# virsh blockcopy vol-d vdb --xml gluster.xml
error: argument unsupported: non-file destination not supported yet
I have a problem. when do block copy to a local file with absolute/relative path we don't need option "--dest", while if do block copy with "dest.xml", --xml is needed.
otherwise it will treat dest.xml file as the real destination file.
# virsh blockcopy r7 vdb
error: need either --dest or --xml
# virsh blockcopy r7 vdb rbd.xml
Block Copy started
Should libvirt can recognise it is a config file but not a destination file path when pass a xml file to it ?
Without this problem, this bug can be verified.
virsh should not guess whether it's a config file based on the extension or its contents. The third parameter is assumed to be the destination, I have sent a patch against the virsh manual to clarify that: https://www.redhat.com/archives/libvir-list/2015-June/msg00629.html Thanks, verify this bug. Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://rhn.redhat.com/errata/RHBA-2015-2202.html |
description of problem: libvirt send a wrong command to qemu when try to do blcok migrate to a gluster volume Version-Release number of selected component (if applicable): libvirt-1.2.13-1.el7.x86_64 How reproducible: 100% Steps to Reproduce: 1.prepare a transient vm # virsh create test3.xml 2.prepare gluster volume xml: # cat gluster.xml <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='gluster' name='gluster-vol1/rh6.img.s2'> <host name='10.66.100.118'/> </source> <target dev='vdd' bus='virtio'/> <shareable/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </disk> 3. do blockcopy # virsh blockcopy test3 hda --xml gluster.xml error: internal error: unable to execute QEMU command 'drive-mirror': Could not create file: Permission denied Actual results: libvirt send a wrong command to qemu when try to do blcok migrate to a gluster volume Expected results: if support this do it success, if not report error more early infomation: 2015-03-27 02:00:55.601+0000: 11778: debug : virStorageFileBackendGlusterInit:588 : initializing gluster storage file 0x7fdd58001300 (gluster://10.66.100.118:0/gluster-vol1/rh6.img.s2)[0:0] 2015-03-27 02:00:55.642+0000: 11778: debug : virStorageFileChown:2783 : chown of storage file 0x7fdd58001300 to 107:107 2015-03-27 02:00:55.644+0000: 11778: debug : virStorageFileBackendGlusterDeinit:559 : deinitializing gluster storage file 0x7fdd58001300 (gluster://10.66.100.118:0/gluster-vol1/rh6.img.s2) 2015-03-27 02:00:55.644+0000: 11778: info : virObjectUnref:259 : OBJECT_UNREF: obj=0x7fdd68186020 2015-03-27 02:00:55.644+0000: 11778: debug : qemuDomainObjEnterMonitorInternal:1548 : Entering monitor (mon=0x7fdd60000d00 vm=0x7fdd68248400 name=test3) 2015-03-27 02:00:55.644+0000: 11778: info : virObjectRef:296 : OBJECT_REF: obj=0x7fdd60000d00 2015-03-27 02:00:55.644+0000: 11778: debug : qemuMonitorDriveMirror:3430 : mon=0x7fdd60000d00, device=drive-ide0-0-0, file=/rh6.img.s2, format=raw, bandwidth=0, granularity=0, buf_size=0, flags=0 2015-03-27 02:00:55.644+0000: 11778: debug : virJSONValueToString:1665 : object=0x7fdd5829af70 2015-03-27 02:00:55.644+0000: 11778: debug : virJSONValueToString:1698 : result={"execute":"drive-mirror","arguments":{"device":"drive-ide0-0-0","target":"/rh6.img.s2","sync":"full","mode":"absolute-paths","format":"raw"},"id":"libvirt-10"} 2015-03-27 02:00:55.644+0000: 11778: debug : qemuMonitorJSONCommandWithFd:290 : Send command '{"execute":"drive-mirror","arguments":{"device":"drive-ide0-0-0","target":"/rh6.img.s2","sync":"full","mode":"absolute-paths","format":"raw"},"id":"libvirt-10"}' for write with FD -1 2015-03-27 02:00:55.644+0000: 11778: info : virEventPollUpdateHandle:152 : EVENT_POLL_UPDATE_HANDLE: watch=10 events=15 2015-03-27 02:00:55.644+0000: 11778: debug : virEventPollInterruptLocked:726 : Interrupting 2015-03-27 02:00:55.644+0000: 11778: info : qemuMonitorSend:972 : QEMU_MONITOR_SEND_MSG: mon=0x7fdd60000d00 msg={"execute":"drive-mirror","arguments":{"device":"drive-ide0-0-0","target":"/rh6.img.s2","sync":"full","mode":"absolute-paths","format":"raw"},"id":"libvirt-10"} fd=-1 ... 2015-03-27 02:00:55.651+0000: 11774: info : qemuMonitorIOProcess:399 : QEMU_MONITOR_IO_PROCESS: mon=0x7fdd60000d00 buf={"id": "libvirt-10", "error": {"class": "GenericError", "desc": "Could not create file: Permission denied"}} len=110 Also i can find avc report that qemu try to create/read file in "/" time->Fri Mar 27 09:58:07 2015 type=SYSCALL msg=audit(1427421487.828:135051): arch=c000003e syscall=4 success=yes exit=0 a0=7f070e71ce40 a1=7fff204b3370 a2=7fff204b3370 a3=7f0706262920 items=0 ppid=1 pid=10603 auid=4294967295 uid=107 gid=107 euid=107 suid=107 fsuid=107 egid=107 sgid=107 fsgid=107 tty=(none) ses=4294967295 comm="qemu-kvm" exe="/usr/libexec/qemu-kvm" subj=system_u:system_r:svirt_t:s0:c81,c359 key=(null) type=AVC msg=audit(1427421487.828:135051): avc: denied { getattr } for pid=10603 comm="qemu-kvm" path="/rh6.img.s2" dev="dm-0" ino=1055130 scontext=system_u:system_r:svirt_t:s0:c81,c359 tcontext=system_u:object_r:root_t:s0 tclass=file ---- Additional info: From Shanzhi Yu: The error show it is not supported to copy to no-file destination. What we need is a goto endjob when try to copy to a non-file destination diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index db4f0b4..f07e4fb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16642,6 +16642,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, if (!virStorageSourceIsLocalStorage(mirror)) { virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", _("non-file destination not supported yet")); + goto endjob; } if (stat(mirror->path, &st) < 0) { if (errno != ENOENT) {