block: export LUKS specific data to qemu-img info
The qemu-img info command has the ability to expose format
specific metadata about volumes. Wire up this facility for
the LUKS driver to report on cipher configuration and key
slot usage.
$ qemu-img info ~/VirtualMachines/demo.luks
image: /home/berrange/VirtualMachines/demo.luks
file format: luks
virtual size: 98M (102760448 bytes)
disk size: 100M
encrypted: yes
Format specific information:
ivgen alg: plain64
hash alg: sha1
cipher alg: aes-128
uuid: 6ddee74b-3a22-408c-8909-6789d4fa2594
cipher mode: xts
slots:
[0]:
active: true
iters: 572706
key offset: 4096
stripes: 4000
[1]:
active: false
key offset: 135168
[2]:
active: false
key offset: 266240
[3]:
active: false
key offset: 397312
[4]:
active: false
key offset: 528384
[5]:
active: false
key offset: 659456
[6]:
active: false
key offset: 790528
[7]:
active: false
key offset: 921600
payload offset: 2097152
master key iters: 142375
One somewhat undesirable artifact is that the data fields are
printed out in (apparently) random order. This will be addressed
later by changing the way the block layer pretty-prints the
image specific data.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-id: 1469192015-16487-3-git-send-email-berrange@redhat.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
40c8502822
commit
c7c4cf498f
@ -563,6 +563,53 @@ static int block_crypto_create_luks(const char *filename,
|
|||||||
filename, opts, errp);
|
filename, opts, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int block_crypto_get_info_luks(BlockDriverState *bs,
|
||||||
|
BlockDriverInfo *bdi)
|
||||||
|
{
|
||||||
|
BlockDriverInfo subbdi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = bdrv_get_info(bs->file->bs, &subbdi);
|
||||||
|
if (ret != 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bdi->unallocated_blocks_are_zero = false;
|
||||||
|
bdi->can_write_zeroes_with_unmap = false;
|
||||||
|
bdi->cluster_size = subbdi.cluster_size;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ImageInfoSpecific *
|
||||||
|
block_crypto_get_specific_info_luks(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
BlockCrypto *crypto = bs->opaque;
|
||||||
|
ImageInfoSpecific *spec_info;
|
||||||
|
QCryptoBlockInfo *info;
|
||||||
|
|
||||||
|
info = qcrypto_block_get_info(crypto->block, NULL);
|
||||||
|
if (!info) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (info->format != Q_CRYPTO_BLOCK_FORMAT_LUKS) {
|
||||||
|
qapi_free_QCryptoBlockInfo(info);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
spec_info = g_new(ImageInfoSpecific, 1);
|
||||||
|
spec_info->type = IMAGE_INFO_SPECIFIC_KIND_LUKS;
|
||||||
|
spec_info->u.luks.data = g_new(QCryptoBlockInfoLUKS, 1);
|
||||||
|
*spec_info->u.luks.data = info->u.luks;
|
||||||
|
|
||||||
|
/* Blank out pointers we've just stolen to avoid double free */
|
||||||
|
memset(&info->u.luks, 0, sizeof(info->u.luks));
|
||||||
|
|
||||||
|
qapi_free_QCryptoBlockInfo(info);
|
||||||
|
|
||||||
|
return spec_info;
|
||||||
|
}
|
||||||
|
|
||||||
BlockDriver bdrv_crypto_luks = {
|
BlockDriver bdrv_crypto_luks = {
|
||||||
.format_name = "luks",
|
.format_name = "luks",
|
||||||
.instance_size = sizeof(BlockCrypto),
|
.instance_size = sizeof(BlockCrypto),
|
||||||
@ -576,6 +623,8 @@ BlockDriver bdrv_crypto_luks = {
|
|||||||
.bdrv_co_readv = block_crypto_co_readv,
|
.bdrv_co_readv = block_crypto_co_readv,
|
||||||
.bdrv_co_writev = block_crypto_co_writev,
|
.bdrv_co_writev = block_crypto_co_writev,
|
||||||
.bdrv_getlength = block_crypto_getlength,
|
.bdrv_getlength = block_crypto_getlength,
|
||||||
|
.bdrv_get_info = block_crypto_get_info_luks,
|
||||||
|
.bdrv_get_specific_info = block_crypto_get_specific_info_luks,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void block_crypto_init(void)
|
static void block_crypto_init(void)
|
||||||
|
|||||||
@ -85,7 +85,11 @@
|
|||||||
{ 'union': 'ImageInfoSpecific',
|
{ 'union': 'ImageInfoSpecific',
|
||||||
'data': {
|
'data': {
|
||||||
'qcow2': 'ImageInfoSpecificQCow2',
|
'qcow2': 'ImageInfoSpecificQCow2',
|
||||||
'vmdk': 'ImageInfoSpecificVmdk'
|
'vmdk': 'ImageInfoSpecificVmdk',
|
||||||
|
# If we need to add block driver specific parameters for
|
||||||
|
# LUKS in future, then we'll subclass QCryptoBlockInfoLUKS
|
||||||
|
# to define a ImageInfoSpecificLUKS
|
||||||
|
'luks': 'QCryptoBlockInfoLUKS'
|
||||||
} }
|
} }
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user