From: Stefan Berger <stefanb@linux.vnet.ibm.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Stefan Hajnoczi <stefanha@gmail.com>,
Kent E Yoder <yoder1@us.ibm.com>,
Corey Bryant <coreyb@linux.vnet.ibm.com>,
Michael Roth <mdroth@linux.vnet.ibm.com>,
qemu-devel <qemu-devel@nongnu.org>,
Joel Schopp <jschopp@linux.vnet.ibm.com>,
Kenneth Goldman <kgoldman@us.ibm.com>,
Anthony Liguori <anthony@codemonkey.ws>
Subject: Re: [Qemu-devel] vNVRAM / blobstore design
Date: Thu, 28 Mar 2013 13:02:37 -0400 [thread overview]
Message-ID: <515477AD.7030702@linux.vnet.ibm.com> (raw)
In-Reply-To: <20130328163108.GA30183@redhat.com>
On 03/28/2013 12:31 PM, Michael S. Tsirkin wrote:
> On Thu, Mar 28, 2013 at 12:11:22PM -0400, Stefan Berger wrote:
>> On 03/27/2013 03:12 PM, Stefan Berger wrote:
>>> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>
>>>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>>>
>>>>>> What I struggle with is that we're calling this a "blobstore". Using
>>>>>> BER to store "blobs" seems kind of pointless especially when we're
>>>>>> talking about exactly three blobs.
>>>>>>
>>>>>> I suspect real hardware does something like, flash is N
>>>>>> bytes, blob 1 is
>>>>>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is
>>>>>> (N - X - Y)
>>>>>> bytes.
>>>>>>
>>>>>> Do we really need to do anything more than that?
>>>>> I typically call it NVRAM, but earlier discussions seemed to prefer
>>>>> 'blobstore'.
>>>>>
>>>>> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
>>>>> use any visitors but used a directory in the first sector pointing to
>>>>> the actual blobs in other sectors of the block device. The organization
>>>>> of the directory and assignment of the blobs to their sectors, aka 'the
>>>>> layout of the data' in the disk image, was handled by the
>>>>> NVRAM/blobstore implementation.
>>>> Okay, the short response is:
>>>>
>>>> Just make the TPM have a DRIVE property, drop all notion of
>>>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
>>>> each blob.
>>> Fine by me. I don't see the need for visitors. I guess sharing of
>>> the persistent storage between different types of devices is not a
>>> goal here so that a layer that hides the layout and the blobs'
>>> position within the storage would be necessary. Also fine by me
>>> for as long as we don't come back to this discussion.
>> One thing I'd like to get clarity about is the following
>> corner-case. A user supplies some VM image as persistent storage for
>> the TPM. It contains garbage. How do we handle this case? Does the
>> TPM then just start writing its state into this image or do we want
>> to have some layer in place that forces a user to go through the
>> step of formatting after that layer indicates that the data are
>> unreadable. Besides that a completely empty image also contains
>> garbage from the perspective of TPM persistent state and for that
>> layer.
>>
>> My intention would (again) be to put a header in front of every
>> blob. That header would contain a crc32 covering that header (minus
>> the crc32 field itself of course) plus the blob to determine whether
>> the blob is garbage or not. It is similar in those terms as the 1st
>> implementation where we also had a directory that contained that
>> crc32 for the directory itself and for each blob. This is not a
>> filesystem, I know that.
>>
>> Regards,
>> Stefan
>>
>>
> It was precisely this addition of more and more metadata
> that made me suggest a format like BER. But of course
> a file per field will do too: following what Anthony suggested you would
> put the checksum in a separate file?
>
My intention would be to still support migration, so a block device /
image file is then probably the best choice addressing this concern
unless we force every setup to provide a shared filesystem. I think the
latter wouldn't be accepted.
Another idea (again) would be to support encryption on other image file
than QCoW2. Here the user would supply the AES key to that persistent
storage layer and that layer would keep a flag whether the blobs are
encrypted and encrypt them upon writing , decrypt them upon reading. The
crc32 also here could serve the purpose of seeing whether the right key
was supplied, which can be detected upon decryption and the blob's crc
not matching what was computed when it was written. If crc32 is not good
enough, we can use a sha1 for this 'integrity' check or possibly the
padding of AES can reveal the bad decryption as well. Some form of
integrity checking in conjunction with a formatting step seems
necessary. Besides that not having to use QCoW2, and with that getting
automatic support for snapshotting, addresses a concern from the
virtualized TPM spec that as far as I know doesn't want to see multiple
states of the same TPM, which in effect snapshotting could cause. So if
one wanted to be compliant to that spec one could use raw VM image files
and along with that get encryption and migration.
At least in the following aspects we are away from the hardware-world:
- image files are accessible through the filesystem and can be looked
into and their secrets retrieved while the NVRAM of a device may be
shielded and more difficult to be examined (it's not impossible) -> so
we may want to have encryption for every type of image file and not just
rely on QCoW2 encryption or assume the image files always reside in
encrypted filesystems
- admittedly a corner case: persistent storage that contains garbage
needs to be consciously formatted or the user asked what to do; an image
file with all zeros could probably be detected, though, but if we
require formatting for the case where garbage is found,we may as well
require it here also
I understand your suggestion with the BER encoding. One problematic
aspect of the whole BER stuff including all the other patches around it
seem to be that they are be too big (~5.5ksloc) to find much love.
Stefan
next prev parent reply other threads:[~2013-03-28 17:02 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-25 21:39 [Qemu-devel] vNVRAM / blobstore design Stefan Berger
2013-03-25 22:05 ` Anthony Liguori
2013-03-25 22:20 ` Stefan Berger
2013-03-27 15:17 ` Corey Bryant
2013-03-27 15:20 ` Corey Bryant
2013-03-27 15:30 ` Michael S. Tsirkin
2013-03-27 16:07 ` mdroth
2013-03-27 15:43 ` Kenneth Goldman
2013-03-27 15:53 ` Michael S. Tsirkin
2013-03-27 16:12 ` Joel Schopp
2013-03-27 16:46 ` Stefan Berger
2013-03-27 17:14 ` Anthony Liguori
2013-03-27 17:27 ` Stefan Berger
2013-03-27 18:27 ` Anthony Liguori
2013-03-27 19:12 ` Stefan Berger
2013-03-28 16:11 ` Stefan Berger
2013-03-28 16:31 ` Michael S. Tsirkin
2013-03-28 17:02 ` Stefan Berger [this message]
2013-03-28 17:27 ` Anthony Liguori
2013-03-28 17:36 ` Stefan Berger
2013-03-28 17:39 ` Michael S. Tsirkin
2013-03-29 13:55 ` Stefan Berger
2013-03-29 15:12 ` Anthony Liguori
2013-03-29 17:33 ` Kenneth Goldman
2013-03-31 8:17 ` Michael S. Tsirkin
2013-03-31 20:48 ` Kenneth Goldman
2013-04-02 12:06 ` Michael S. Tsirkin
2013-04-02 13:24 ` Kenneth Goldman
2013-04-02 13:37 ` Michael S. Tsirkin
2013-03-27 18:04 ` Michael S. Tsirkin
2013-03-27 16:20 ` Kenneth Goldman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=515477AD.7030702@linux.vnet.ibm.com \
--to=stefanb@linux.vnet.ibm.com \
--cc=anthony@codemonkey.ws \
--cc=coreyb@linux.vnet.ibm.com \
--cc=jschopp@linux.vnet.ibm.com \
--cc=kgoldman@us.ibm.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=yoder1@us.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).