[libvirt] [PATCH 0/5 v2] Improve Ceph Qemu+RBD support

Sage Weil sage at newdream.net
Wed Oct 12 16:45:08 UTC 2011


Hi Daniel,

On Wed, 12 Oct 2011, Daniel P. Berrange wrote:
> On Mon, Sep 19, 2011 at 09:13:38PM -0700, Sage Weil wrote:
> > The current support for qemu and Ceph RBD (rados block device) has two 
> > main deficiencies: authentication doesn't work, and it relies on 
> > environment variables (which don't work with latest upstream). This 
> > patch set addresses both those problems.
> > 
> > The first two patches update the xml schemas and conf to add a Ceph 
> > secret type and to specify authentication information along with the rbd 
> > disk.
> >
> > The next two patches make some libvirt changes.  We pass virConnectPtr 
> > down into the Domain{Attach,Detach} methods (needed to access secrets 
> > while building the qemu command), and add a helper that will escape 
> > arbitrary characters.
> > 
> > The final patch replaces the current RBD qemu code and uses the new conf 
> > info to do authentication properly.  (We still need to make a change 
> > there to avoid having the authentication key show up on qemu command 
> > line; I'll clean that up shortly.)
> > 
> > Comments on this approach?
> 
> Ok, I've finally got myself a Ceph cluster up & running, with RBD
> exports to a QEMU guest[1], so I can give more sensible answers to
> these patches :-)
> 
> 
> Overall you are taking the current XML for a disk:
> 
>   <disk type='network' device='disk'>
>     <driver name='qemu' type='raw'/>
>     <source protocol='rbd' name='demo/wibble'>
>       <host name='lettuce.example.org' port='6798'/>
>       <host name='mustard.example.org' port='6798'/>
>       <host name='avocado.example.org' port='6798'/>
>     </source>
>     <target dev='vdb' bus='virtio'/>
>   </disk>
> 
> and adding one new element <auth> such that we get
> 
>   <disk type='network' device='disk'>
>     <driver name='qemu' type='raw'/>
>     <source protocol='rbd' name='demo/wibble'>
>       <auth id='admin' domain='clustername'/>
>       <host name='lettuce.example.org' port='6798'/>
>       <host name='mustard.example.org' port='6798'/>
>       <host name='avocado.example.org' port='6798'/>
>     </source>
>     <target dev='vdb' bus='virtio'/>
>   </disk>
> 
> together with some secret XML that looks like:
> 
>   <secret ephemeral='no' private='no'>
>     <uuid>0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f</uuid>
>     <usage type='ceph'>
>       <auth id='admin' domain='clustername'/>
>     </usage>
>   </secret>
> 
> When starting a guest the auth id + domain are concatenated to find
> the secret. The 'id' is also used as the username to pass to QEMU.
> The 'domain' is only ever used for the secret lookup part, never
> passed to QEMU, since the host IP addrs do that job.
> 
> By comparison, QCow2 encryption disks are done with:
> 
>   <disk type='file' device='disk'>
>       <driver name='qemu' type='qcow2'/>
>       <source file='/home/berrange/VirtualMachines/demo.qcow2'/>
>       <target dev='hda' bus='ide'/>
>       <encryption format='qcow'>
>         <secret type='passphrase' uuid='0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f'/>
>       </encryption>
>   </disk>
> 
> And the secret with:
> 
>   <secret ephemeral='no' private='no'>
>     <uuid>0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f</uuid>
>     <usage type='volume'>
>       <volume>/home/berrange/VirtualMachines/demo.qcow2</volume>
>     </usage>
>   </secret>
> 
> When starting a guest, the secret UUID is used to find the passphrase.
> 
> 
> So we have a difference in the way the secrets are linked to the disks
> between Ceph and QCow2 here.
> 
> I can see the appeal of doing it the way you have, but at the same time
> I would like to have consistency with the QCow2 approach, and UUIDs are
> a stronger identifier IMHO.
> 
> Also, although the secret XML is exposed auth id + domain as separate
> attributes in the XML, internally they're processed as a concatenated
> string, likewise the public API uses a concatenated string form. So
> I think the XML ought to use that form too, and not split them.
> 
> Finally, I think the concept of authentication credentials for
> disks, could be more generally useful than just for Ceph or other
> network block devs, so I'm somewhat inclined to move it outside the
> <source> element
> 
> 
> Thus I would propose a slight variation on what you've done:
> 
>   <disk type='network' device='disk'>
>     <driver name='qemu' type='raw'/>
>     <auth username='admin'>
>        <secret type='passphrase' uuid='0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f'/>
>     </auth>
>     <source protocol='rbd' name='demo/wibble'>
>       <host name='lettuce.example.org' port='6798'/>
>       <host name='mustard.example.org' port='6798'/>
>       <host name='avocado.example.org' port='6798'/>
>     </source>
>     <target dev='vdb' bus='virtio'/>
>   </disk>
> 
> 
> And in the secret XML:
> 
>   <secret ephemeral='no' private='no'>
>     <uuid>0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f</uuid>
>     <usage type='ceph'>
>       <domain>some.cluster.name/admin</domain>
>     </usage>
>   </secret>
> 
> 
> Though I think the UUID based lookup should be primary, I would also
> accept an optional alternate syntax based on usage strings, if you
> think that's important:
> 
>   <disk type='network' device='disk'>
>     <driver name='qemu' type='raw'/>
>     <auth username='admin'>
>        <secret type='passphrase' usage='some.cluster.name/admin'/>
>     </auth>
>     <source protocol='rbd' name='demo/wibble'>
>       <host name='lettuce.example.org' port='6798'/>
>       <host name='mustard.example.org' port='6798'/>
>       <host name='avocado.example.org' port='6798'/>
>     </source>
>     <target dev='vdb' bus='virtio'/>
>   </disk>

Yes, I like this much better as well.  I wasn't particularly happy with 
how the keys were being identified; this is much cleaner.

I'll respin these and resend shortly.

Thanks for the review!
sage




More information about the libvir-list mailing list