On Thu, Dec 17, 2020 at 10:39:36AM +0100, Peter Krempa wrote:
> On Mon, Dec 14, 2020 at 22:49:03 -0500, Masayoshi Mizuma wrote:
> > On Sat, Dec 12, 2020 at 11:57:15AM +0100, Peter Krempa wrote:
> > > On Fri, Dec 11, 2020 at 20:58:48 -0500, Masayoshi Mizuma wrote:
> > > > Hello,
> > > > 
> > > > I would like to start multiple KVM guests from one qcow2 image, and
> > > > discard the changes which the KVM guests done.
> > > > 
> > > > transient disk option is useful for discarding the changes, however,
> > > > we cannot start multiple KVM guest from one qcow2 image because the
> > > > image is write-locked by the first guest to be started.
> > > > 
> > > > I suppose the disk which transient option is enabled don't need to
> > > > get the write lock because any changes go to the overlay image, and
> > > > the overlay image is removed when the guest shutdown.
> > > > 
> > > > qemu has 'locking' option and the write lock is disabled when 
> > > > locking=off.
> > > > To implement that, I have two ideas. I would appreciate it if you could
> > > > give me the ideas which way is better (or another way).
> > > 
> > > There are two aspects of this.
> > > 
> > > 1) Controlling the locking property of qemu may be worth in many cases,
> > > so by itself this would be a worthwhile patchset to add control of
> > > qemu locking for a per-backing store basis.
> > > 
> > > 2) Disabling locking to achieve this is wrong though. The qemu image
> > > locking infrastructure is justified and prevents many problems which
> > > users might get into by wrong configuration.
> > > 
> > > For <transient/> disks, we should rather instantiate the top level
> > > format node as 'readonly' and then put a read-write overlay on top of
> > > it. This still prevents from using the file which became a backing file
> > > in read-write mode in another VM.
> > 
> > Thank you for the idea!
> > I just tried to change the original image to read-only (changed the 
> > "read-only":false
> > to "read-only":true) simply, then created a read-write overlay.
> > qemu stopped with following assertion:
> > 
> >   qemu-system-x86_64: ../block/io.c:1874: bdrv_co_write_req_prepare: 
> > Assertion `child->perm & BLK_PERM_WRITE' failed.
> > 
> > It looks like the qemu hit the assertion because the permission of the 
> > overlay image
> > is same as the original image.
> > Probably I'm missing something... I'll dive into that...
> 
> Could you please post the command line and the QMP commands? Maybe
> something isn't configured right in libvirt. Alternatively qemu might
> need modification.

Sure, here is the qemu command line options and QMP commands:

qemu command line options:

qemu-system-x86_64 \
        -M q35,accel=kvm,usb=off,vmport=off,smm=on,dump-guest-core=off \
        -smp 4 \
        -m 4096 \
        -blockdev 
'{"driver":"file","filename":"/var/lib/libvirt/images/guest.qcow2","node-name":"storage1","auto-read-only":true,"discard":"unmap"}'
 \
        -blockdev 
'{"node-name":"format1","read-only":true,"driver":"qcow2","file":"storage1","backing":null}'
 \
        -device virtio-blk-pci,drive=format1,id=virtio-disk0,bootindex=1 \
        -nographic \
        -nodefaults \
        -no-user-config \
        -serial telnet::1235,server,nowait \
        -qmp tcp::1335,server,nowait \
        -S

QMP commands:
(Before running following QMP commands, I create 
'/var/lib/libvirt/images/guest.qcow2.TRANSIENT'
 by touch command)

   {"execute":"qmp_capabilities"}
   
{"execute":"blockdev-add","arguments":{"driver":"file","filename":"/var/lib/libvirt/images/guest.qcow2.TRANSIENT","node-name":"storage2","auto-read-only":true,"discard":"unmap"}}
   
{"execute":"blockdev-create","arguments":{"job-id":"create","options":{"driver":"qcow2","file":"storage2","size":10737418240,"cluster-size":65536,"backing-file":"/var/lib/libvirt/images/guest.qcow2","backing-fmt":"qcow2"}}}
   
{"execute":"blockdev-add","arguments":{"node-name":"format2","read-only":false,"driver":"qcow2","file":"storage2","backing":null}}
   
{"execute":"blockdev-snapshot","arguments":{"node":"format1","overlay":"format2"}}
   {"execute":"cont"}

After "cont" command executed, qemu stops as following assertion:

    qemu-system-x86_64: ../block/io.c:1865: bdrv_co_write_req_prepare: 
Assertion `child->perm & BLK_PERM_WRITE' failed.

Thanks,
Masa

Reply via email to