----- Original Message ----- > From: "Stefan Hajnoczi" <stefa...@gmail.com> > To: "Federico Simoncelli" <fsimo...@redhat.com> > Cc: qemu-devel@nongnu.org, aba...@redhat.com, dl...@redhat.com > Sent: Tuesday, October 4, 2011 9:33:48 AM > Subject: Re: [Qemu-devel] New option for snapshot_blkdev to avoid image > creation > > On Mon, Oct 03, 2011 at 04:09:01PM +0000, Federico Simoncelli wrote: > > In some situations might be useful to let qemu use an image that > > was > > prepared for a live snapshot. > > The advantage is that creating the snapshot file outside of the > > qemu > > process we can use the whole range of options provided by the > > format > > (eg for qcow2: encryption, cluster_size and preallocation). > > It is also possible to pre-set a relative path to the backing file > > (now it is created by default as absolute path). > > In the long run it can also avoid the danger of reimplementing > > qemu-img > > inside qemu (if we wanted to expose such options when a snapshot is > > requested). > > When the image file is created based on the backing file size: > > $ qemu-img create -f qcow2 -o backing_file=master.img vm001.qcow2 > > It turns out that bdrv_img_create() opens the backing file with > read/write permissions. This is generally a bad idea but especially > dangerous when the VM currently has the image file open already since > image formats are not designed for multiple initiators (clustering).
Hi Stefan, are you sure that bdrv_img_create opens the backing file with read/write permissions? After a quick check I can't see that happening: $ ./qemu-img create -f qcow2 /tmp/master.img 1G Formatting '/tmp/master.img', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 $ strace -e trace=open ./qemu-img create -f qcow2 -o backing_file=/tmp/master.img /tmp/vm001.qcow2 [...] open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) open("/tmp/master.img", O_RDONLY|O_NONBLOCK) = 3 open("/tmp/master.img", O_RDONLY|O_NONBLOCK) = 3 open("/tmp/master.img", O_RDONLY|O_DSYNC|O_CLOEXEC) = 3 open("/tmp/master.img", O_RDONLY|O_NONBLOCK) = 3 open("/tmp/master.img", O_RDONLY|O_NONBLOCK) = 3 open("/tmp/master.img", O_RDONLY|O_CLOEXEC) = 3 Formatting '/tmp/vm001.qcow2', fmt=qcow2 size=1073741824 backing_file='/tmp/master.img' encryption=off cluster_size=65536 open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) open("/tmp/vm001.qcow2", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 6 open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = 6 open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = 6 open("/tmp/vm001.qcow2", O_RDWR|O_DSYNC|O_CLOEXEC) = 6 open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = 6 open("/tmp/vm001.qcow2", O_RDONLY|O_NONBLOCK) = 6 open("/tmp/vm001.qcow2", O_RDWR|O_CLOEXEC) = 6 -- Federico