On Tue, Mar 27, 2012 at 09:58:57PM -0600, Eric Blake wrote:
On 03/26/2012 09:59 PM, Eric Blake wrote:
> This is the counter-proposal to my earlier RFC for storage migration via
> snapshot mirrors[1], resulting from a NACK on the code review for that
> earlier proposal[2]. In particular, this proposal fleshes out some of
> Paolo's design overview on the qemu wiki[3].
>
>
> Under //domain/drivers/disk, next to <source file='...'/>, add
<mirror
> file='...'/>
I'm debating on the best way to lay this out. Right now, we have:
<domain ...>...
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/fedora-local.img'/>
<target dev='vda' bus='virtio'/>
</disk>
But with the new virDomainBlockCopy, you can specify a different file
format for the mirror. I'm also thinking towards a future day where we
can have the <domain> list the entire backing chain, rather than probing
qcow2 headers. One idea is to have <driver> and <source> repeated for
each layer of the chain, where <mirror> specifies a parallel chain, and
<backingFile> nests. For example, suppose I create a mirror with the
following layout (this could be created via virDomainBlockCopy(dom,
"top", "base", "mirror", "qed", 0, 0), as a way
to convert file types
and collapse the chain on the fly but without changing the raw base file):
base[raw] <- middle[qcow2] <- top[qcow2]
\-------- mirror[qed]
<disk ...>
<driver name='qemu' type='qcow2'/>
<source file='/path/to/top'/>
<mirror>
<driver name='qemu' type='qed'/>
<source file='/path/to/mirror'/>
<backingFile>
<driver name='qemu' type='raw'/>
<source file='/path/to/base'/>
</backingFile>
</mirror>
<backingFile>
<driver name='qemu' type='qcow2'/>
<source file='/path/to/middle'/>
<backingFile>
<driver name='qemu' type='raw'/>
<source file='/path/to/base'/>
</backingFile>
</backingFile>
</disk>
On the other hand, while the top-level <driver> holds items like caching
and error policy, it can be assumed that the mirror and backing file
chain share that policy, so the only unique thing for mirrors and
backing files is the file type. Also, instead of nesting, you can rely
on ordering of repetitive elements. Perhaps the same relationship could
be shown as:
<disk ...>
<driver name='qemu' type='qcow2'/>
<source file='/path/to/top'/>
<mirror>
<source file='/path/to/mirror' format='qed'/>
<backing file='/path/to/base' format='raw'/>
</mirror>
<backing file='/path/to/middle' format='qcow2'/>
<backing file='/path/to/base' format='raw'/>
</disk>
Preferences?
I have a proof of concept here:
https://gitorious.org/~berrange/libvirt/staging/commits/backing-file
This patch introduces some new XML to cope with this.
1. An image with no backing files:
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/demo.img'/>
<backingFile/>
...
</disk>
2. An image with one backing file
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/demo.qcow'/>
<backingFile>
<source file='/var/lib/libvirt/images/bar.qcow'
format='qcow2'/>
</backingFile>
...
</disk>
3. An image with two backing files
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/demo.qcow'/>
<backingFile>
<source file='/var/lib/libvirt/images/bar.qcow'
format='qcow2'/>
<source file='/var/lib/libvirt/images/foo.qcow'
format='raw'/>
</backingFile>
...
</disk>
The problem with my patch, is that I only implemented it for file/block
types. It needs to be expanded to also cover our various network types
before it can be merged.
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|