From nobody Tue May 13 23:02:07 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com;
dmarc=pass(p=none dis=none) header.from=redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1526473788765306.11349774736357;
Wed, 16 May 2018 05:29:48 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com
[10.5.11.11])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 8AB5BA7FD2;
Wed, 16 May 2018 12:29:46 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 4CEB4600C0;
Wed, 16 May 2018 12:29:46 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 054344CA94;
Wed, 16 May 2018 12:29:46 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com
[10.5.11.25])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4GCTabK001386 for ;
Wed, 16 May 2018 08:29:36 -0400
Received: by smtp.corp.redhat.com (Postfix)
id 3F8362010CB2; Wed, 16 May 2018 12:29:36 +0000 (UTC)
Received: from localhost.localdomain.com (ovpn-116-88.phx2.redhat.com
[10.3.116.88])
by smtp.corp.redhat.com (Postfix) with ESMTP id DC7EB20155E8
for ; Wed, 16 May 2018 12:29:35 +0000 (UTC)
From: John Ferlan
To: libvir-list@redhat.com
Date: Wed, 16 May 2018 08:29:28 -0400
Message-Id: <20180516122931.30854-2-jferlan@redhat.com>
In-Reply-To: <20180516122931.30854-1-jferlan@redhat.com>
References: <20180516122931.30854-1-jferlan@redhat.com>
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v2 1/4] storage_util: Alter qemu storage
encryption arguments
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]);
Wed, 16 May 2018 12:29:47 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
https://bugzilla.redhat.com/show_bug.cgi?id=3D1526382
As of QEMU 2.9, qemu-img has enforced using the "encrypt.key-secret"
in order to create a qcow[2] encrypted volume. Thus, the existing code
to create an encrypted volume using qcow[2] encryption techniques will
fail, such as :
$ qemu-img create -f qcow2 -b /dev/null \
-o backing_fmt=3Draw,encryption=3Don \
demo.tmp 5242880K
Formatting 'demo.tmp', fmt=3Dqcow2 size=3D5368709120 backing_file=3D/dev/=
null
backing_fmt=3Draw encryption=3Don cluster_size=3D65536 lazy_refcounts=3Do=
ff
refcount_bits=3D16
qemu-img: demo.tmp: Parameter 'encrypt.key-secret' is required for cipher
$
This patch will resolve this by adding the correct parameters for
the creation. The new format of parameters roughly follows that of
LUKS encryption model with a few minor differences:
1. Usage of "encrypt.key-secret=3D$alias" instead of just plain
"key-secret=3D$alias" as the parameter.
2. Usage of "encrypt.format=3Daes" instead of "encryption=3Don"
The result is the following command syntax for the same example:
$ qemu-img create -f qcow2 -b /dev/null \
--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretF=
ile \
-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0=
\
demo.tmp 5242880K
Formatting 'test.img', fmt=3Dqcow2 size=3D5368709120 backing_file=3D/dev/=
null
backing_fmt=3Draw encrypt.format=3Daes encrypt.key-secret=3Dsec0 cluster_=
size=3D65536
lazy_refcounts=3Doff refcount_bits=3D16
$
Thus this patch removes the LUKS specific checks in a few places and
alters the algorithms as necessary in order to allow either form of
encryption.
The storagevolxml2argvtest.c test is adjusted to pass a dummy path to
the secret file and the outputs adjusted to illustrate the new format
for the various arguments.
This patch requires usage of the secrets object and model. There is no
plan for backwards compatibility for qcow[2] encryption. The desire is
to move towards usage of LUKS encryption anyway.
NB: Although the qemu-img convert examples change in the test output,
they are essentially still broken (they wouldn't work before this patch
either for the same reasons create fails). A follow-up patch will alter
the algorithm and syntax.
Signed-off-by: John Ferlan
---
src/storage/storage_util.c | 24 +++++++++++-------=
----
src/util/virqemu.c | 10 +++++++--
src/util/virqemu.h | 3 ++-
tests/storagevolxml2argvdata/qcow2-1.1.argv | 4 +++-
tests/storagevolxml2argvdata/qcow2-compat.argv | 4 +++-
.../qcow2-from-logical-compat.argv | 3 ++-
tests/storagevolxml2argvdata/qcow2-lazy.argv | 6 ++++--
.../qcow2-nobacking-convert-prealloc-compat.argv | 4 +++-
.../qcow2-nobacking-prealloc-compat.argv | 4 +++-
.../qcow2-nocapacity-convert-prealloc.argv | 7 ++++---
tests/storagevolxml2argvdata/qcow2-nocapacity.argv | 4 +++-
.../storagevolxml2argvdata/qcow2-nocow-compat.argv | 6 ++++--
tests/storagevolxml2argvdata/qcow2-nocow.argv | 3 ++-
tests/storagevolxml2argvtest.c | 2 +-
14 files changed, 54 insertions(+), 30 deletions(-)
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
index 554fc757ed..a8a6a3e401 100644
--- a/src/storage/storage_util.c
+++ b/src/storage/storage_util.c
@@ -827,11 +827,10 @@ storageBackendCreateQemuImgOpts(virStorageEncryptionI=
nfoDefPtr enc,
virBufferAsprintf(&buf, "backing_fmt=3D%s,",
virStorageFileFormatTypeToString(info.backingFor=
mat));
=20
- if (info.format =3D=3D VIR_STORAGE_FILE_RAW && enc) {
- virQEMUBuildQemuImgKeySecretOpts(&buf, enc, info.secretAlias);
- } else {
- if (info.encryption)
- virBufferAddLit(&buf, "encryption=3Don,");
+ if (enc) {
+ bool qcow =3D (info.format =3D=3D VIR_STORAGE_FILE_QCOW ||
+ info.format =3D=3D VIR_STORAGE_FILE_QCOW2);
+ virQEMUBuildQemuImgKeySecretOpts(&buf, enc, info.secretAlias, qcow=
);
}
=20
if (info.preallocate) {
@@ -1231,8 +1230,12 @@ virStorageBackendCreateQemuImgCmdFromVol(virStorageP=
oolObjPtr pool,
if (info.backingPath)
virCommandAddArgList(cmd, "-b", info.backingPath, NULL);
=20
- if (info.format =3D=3D VIR_STORAGE_FILE_RAW && vol->target.encryption =
&&
- vol->target.encryption->format =3D=3D VIR_STORAGE_ENCRYPTION_FORMA=
T_LUKS) {
+ if (vol->target.encryption) {
+ if (!secretPath) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("path to secret data file is required"));
+ return NULL;
+ }
if (virAsprintf(&info.secretAlias, "%s_encrypt0", vol->name) < 0)
goto error;
if (storageBackendCreateQemuImgSecretObject(cmd, info.secretPath,
@@ -1344,11 +1347,8 @@ storageBackendGenerateSecretData(virStoragePoolObjPt=
r pool,
return -1;
}
=20
- if (vol->target.format =3D=3D VIR_STORAGE_FILE_RAW &&
- enc->format =3D=3D VIR_STORAGE_ENCRYPTION_FORMAT_LUKS) {
- if (!(*secretPath =3D storageBackendCreateQemuImgSecretPath(pool, =
vol)))
- return -1;
- }
+ if (!(*secretPath =3D storageBackendCreateQemuImgSecretPath(pool, vol)=
))
+ return -1;
=20
return 0;
}
diff --git a/src/util/virqemu.c b/src/util/virqemu.c
index 04cd71605e..b20d09d945 100644
--- a/src/util/virqemu.c
+++ b/src/util/virqemu.c
@@ -307,6 +307,7 @@ virQEMUBuildBufferEscapeComma(virBufferPtr buf, const c=
har *str)
* @buf: buffer to build the string into
* @enc: pointer to encryption info
* @alias: alias to use
+ * @qcow: using qcow encryption
*
* Generate the string for id=3D$alias and any encryption options for
* into the buffer.
@@ -315,7 +316,8 @@ virQEMUBuildBufferEscapeComma(virBufferPtr buf, const c=
har *str)
* it's expected other arguments are appended after the id=3D$alias string.
* So either turn something like:
*
- * "key-secret=3D$alias,"
+ * "key-secret=3D$alias," or
+ * "encrypt.format=3Daes,encrypt.key-secret=3D$alias,"
*
* or
* "key-secret=3D$alias,cipher-alg=3Dtwofish-256,cipher-mode=3Dcbc,
@@ -325,8 +327,12 @@ virQEMUBuildBufferEscapeComma(virBufferPtr buf, const =
char *str)
void
virQEMUBuildQemuImgKeySecretOpts(virBufferPtr buf,
virStorageEncryptionInfoDefPtr enc,
- const char *alias)
+ const char *alias,
+ bool qcow)
{
+ if (qcow)
+ virBufferAddLit(buf, "encrypt.format=3Daes,encrypt.");
+
virBufferAsprintf(buf, "key-secret=3D%s,", alias);
=20
if (!enc->cipher_name)
diff --git a/src/util/virqemu.h b/src/util/virqemu.h
index 2599481753..9a01640c6e 100644
--- a/src/util/virqemu.h
+++ b/src/util/virqemu.h
@@ -52,7 +52,8 @@ char *virQEMUBuildDriveCommandlineFromJSON(virJSONValuePt=
r src);
void virQEMUBuildBufferEscapeComma(virBufferPtr buf, const char *str);
void virQEMUBuildQemuImgKeySecretOpts(virBufferPtr buf,
virStorageEncryptionInfoDefPtr enc,
- const char *alias)
+ const char *alias,
+ bool qcow)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
=20
#endif /* __VIR_QEMU_H_ */
diff --git a/tests/storagevolxml2argvdata/qcow2-1.1.argv b/tests/storagevol=
xml2argvdata/qcow2-1.1.argv
index c4dcb1bc3c..ff3d62d0a1 100644
--- a/tests/storagevolxml2argvdata/qcow2-1.1.argv
+++ b/tests/storagevolxml2argvdata/qcow2-1.1.argv
@@ -1,3 +1,5 @@
qemu-img create -f qcow2 -b /dev/null \
--o backing_fmt=3Draw,encryption=3Don,compat=3D1.1 \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o backing_fmt=3Draw,encrypt.format=3Daes,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0,compat=3D1.1 \
/var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/qcow2-compat.argv b/tests/storage=
volxml2argvdata/qcow2-compat.argv
index 37ad2c078d..8aa8c7ce84 100644
--- a/tests/storagevolxml2argvdata/qcow2-compat.argv
+++ b/tests/storagevolxml2argvdata/qcow2-compat.argv
@@ -1,3 +1,5 @@
qemu-img create -f qcow2 -b /dev/null \
--o backing_fmt=3Draw,encryption=3Don,compat=3D0.10 \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o backing_fmt=3Draw,encrypt.format=3Daes,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0,compat=3D0.10 \
/var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv b/=
tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv
index 5f365b1f84..849c5f0218 100644
--- a/tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv
+++ b/tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv
@@ -1,3 +1,4 @@
qemu-img convert -f raw -O qcow2 \
--o encryption=3Don,compat=3D0.10 \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,compat=
=3D0.10 \
/dev/HostVG/Swap /var/lib/libvirt/images/OtherDemo.img
diff --git a/tests/storagevolxml2argvdata/qcow2-lazy.argv b/tests/storagevo=
lxml2argvdata/qcow2-lazy.argv
index b7058b84cc..0c29a3fb33 100644
--- a/tests/storagevolxml2argvdata/qcow2-lazy.argv
+++ b/tests/storagevolxml2argvdata/qcow2-lazy.argv
@@ -1,3 +1,5 @@
qemu-img create -f qcow2 -b /dev/null \
--o backing_fmt=3Draw,encryption=3Don,compat=3D1.1,lazy_refcounts \
-/var/lib/libvirt/images/OtherDemo.img 5242880K
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o backing_fmt=3Draw,encrypt.format=3Daes,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0,compat=3D1.1,\
+lazy_refcounts /var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc-=
compat.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc=
-compat.argv
index 3d93ec8480..a95749eafa 100644
--- a/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc-compat.=
argv
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc-compat.=
argv
@@ -1,3 +1,5 @@
qemu-img convert -f raw -O qcow2 \
--o encryption=3Don,preallocation=3Dmetadata,compat=3D0.10 \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,\
+preallocation=3Dmetadata,compat=3D0.10 \
/var/lib/libvirt/images/sparse.img /var/lib/libvirt/images/OtherDemo.img
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-prealloc-compat.a=
rgv b/tests/storagevolxml2argvdata/qcow2-nobacking-prealloc-compat.argv
index 903c94e33d..30b61442a4 100644
--- a/tests/storagevolxml2argvdata/qcow2-nobacking-prealloc-compat.argv
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-prealloc-compat.argv
@@ -1,3 +1,5 @@
qemu-img create -f qcow2 \
--o encryption=3Don,preallocation=3Dmetadata,compat=3D0.10 \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,\
+preallocation=3Dmetadata,compat=3D0.10 \
/var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc=
.argv b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv
index 73499178e7..51bdaaf684 100644
--- a/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv
+++ b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv
@@ -1,4 +1,5 @@
qemu-img convert -f raw -O qcow2 \
--o encryption=3Don,preallocation=3Dfalloc,compat=3D0.10 \
-/var/lib/libvirt/images/sparse.img \
-/var/lib/libvirt/images/OtherDemo.img
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,\
+preallocation=3Dfalloc,compat=3D0.10 \
+/var/lib/libvirt/images/sparse.img /var/lib/libvirt/images/OtherDemo.img
diff --git a/tests/storagevolxml2argvdata/qcow2-nocapacity.argv b/tests/sto=
ragevolxml2argvdata/qcow2-nocapacity.argv
index fd88055890..920cff8771 100644
--- a/tests/storagevolxml2argvdata/qcow2-nocapacity.argv
+++ b/tests/storagevolxml2argvdata/qcow2-nocapacity.argv
@@ -1,5 +1,7 @@
qemu-img create \
-f qcow2 \
-b /dev/null \
--o backing_fmt=3Draw,encryption=3Don,compat=3D0.10 \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o backing_fmt=3Draw,encrypt.format=3Daes,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0,compat=3D0.10 \
/var/lib/libvirt/images/OtherDemo.img
diff --git a/tests/storagevolxml2argvdata/qcow2-nocow-compat.argv b/tests/s=
toragevolxml2argvdata/qcow2-nocow-compat.argv
index d5a7547011..1c9a1a4da4 100644
--- a/tests/storagevolxml2argvdata/qcow2-nocow-compat.argv
+++ b/tests/storagevolxml2argvdata/qcow2-nocow-compat.argv
@@ -1,3 +1,5 @@
qemu-img create -f qcow2 -b /dev/null \
--o backing_fmt=3Draw,encryption=3Don,nocow=3Don,compat=3D0.10 \
-/var/lib/libvirt/images/OtherDemo.img 5242880K
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o backing_fmt=3Draw,encrypt.format=3Daes,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0,nocow=3Don,\
+compat=3D0.10 /var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/qcow2-nocow.argv b/tests/storagev=
olxml2argvdata/qcow2-nocow.argv
index e54801c78a..68c16f8e20 100644
--- a/tests/storagevolxml2argvdata/qcow2-nocow.argv
+++ b/tests/storagevolxml2argvdata/qcow2-nocow.argv
@@ -1,3 +1,4 @@
qemu-img create -f qcow2 -b /dev/null \
--o backing_fmt=3Draw,encryption=3Don,nocow=3Don \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,nocow=
=3Don \
/var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c
index 0265a0ffe2..4286c50c6e 100644
--- a/tests/storagevolxml2argvtest.c
+++ b/tests/storagevolxml2argvtest.c
@@ -82,7 +82,7 @@ testCompareXMLToArgvFiles(bool shouldFail,
cmd =3D virStorageBackendCreateQemuImgCmdFromVol(obj, vol,
inputvol, flags,
create_tool,
- NULL);
+ "/path/to/secretFile");
if (!cmd) {
if (shouldFail) {
virResetLastError();
--=20
2.14.3
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Tue May 13 23:02:07 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com;
dmarc=pass(p=none dis=none) header.from=redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1526473817560504.3804642340024;
Wed, 16 May 2018 05:30:17 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com
[10.5.11.24])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 1CA1630D2932;
Wed, 16 May 2018 12:30:15 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21])
by smtp.corp.redhat.com (Postfix) with ESMTPS id DA08630025FA;
Wed, 16 May 2018 12:30:14 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 914514CAA0;
Wed, 16 May 2018 12:30:14 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com
[10.5.11.25])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4GCTaHP001392 for ;
Wed, 16 May 2018 08:29:36 -0400
Received: by smtp.corp.redhat.com (Postfix)
id C29A22010CBB; Wed, 16 May 2018 12:29:36 +0000 (UTC)
Received: from localhost.localdomain.com (ovpn-116-88.phx2.redhat.com
[10.3.116.88])
by smtp.corp.redhat.com (Postfix) with ESMTP id 67A632010CB2
for ; Wed, 16 May 2018 12:29:36 +0000 (UTC)
From: John Ferlan
To: libvir-list@redhat.com
Date: Wed, 16 May 2018 08:29:29 -0400
Message-Id: <20180516122931.30854-3-jferlan@redhat.com>
In-Reply-To: <20180516122931.30854-1-jferlan@redhat.com>
References: <20180516122931.30854-1-jferlan@redhat.com>
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v2 2/4] storage_util: Fix qemu qcow[2] encryption
convert processing
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.24
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]);
Wed, 16 May 2018 12:30:16 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
As with qcow[2] encryption create processing, the convert processing
requires usage of the "encrypt.key-secret" option and secret objects
for converting an input volume to use qcow[2] encryption. Assuming
an input file sparse.img exists (e.g. qemu-img create -f raw sparse 500K):
$ qemu-img convert -f raw -O qcow2 -o encryption=3Don sparse.img demo.img
qemu-img: demo.img: error while converting qcow2: Parameter
'encrypt.key-secret' is required for cipher
$
Unlike create processing, the convert processing cannot be done in
one command option, such as:
$ qemu-img convert -f raw -O qcow2 \
--object secret,id=3Ddemo.img_encrypt0,file=3D/path/to/secretFile \
-o encrypt.format=3Daes,encrypt.key-secret=3Ddemo.img_encrypt0 \
sparse.img demo.img
qemu-img: Could not open 'demo.img': Parameter 'encrypt.key-secret' is
required for cipher
$
What convert processing requires is a two step process which first creates
the object using the sizing parameters from the input source and then uses
the --image-opts, -n, and --target-image-opts options along with inline
driver options to describe the input and output files, thus resulting in:
$ qemu-img create -f qcow2 \
--object secret,id=3Ddemo.img_encrypt0,file=3D/path/to/secretFile \
-o encrypt.format=3Daes,encrypt.key-secret=3Ddemo.img_encrypt0 \
demo.img 500K
Formatting 'demo.img', fmt=3Dqcow2 size=3D512000 encrypt.format=3Daes
encrypt.key-secret=3Dsec0 cluster_size=3D65536 lazy_refcounts=3Doff refcoun=
t_bits=3D16
$ qemu-img convert --image-opts -n --target-image-opts \
--object secret,id=3Ddemo.img_encrypt0,file=3D/path/to/secretFile \
driver=3Draw,file.filename=3Dsparse.img \
driver=3Dqcow2,file.filename=3Ddemo.img,encrypt.key-secret=3Ddemo.img_e=
ncrypt0
$
Similar processing would be used for LUKS encryption, except the
"encrypt.format=3Daes" is not provided and the "encrypt.key-secret"
is only "key-secret", e.g.:
$ qemu-img create -f luks \
--object secret,id=3Ddemo.img_encrypt0,file=3D/path/to/secretFile \
-o key-secret=3Ddemo.img_encrypt0 \
demo.img 500K
Formatting 'demo.img', fmt=3Dluks size=3D512000 key-secret=3Ddemo.img_encry=
pt0
$ qemu-img convert --image-opts -n --target-image-opts \
--object secret,id=3Ddemo.img_encrypt0,file=3D/path/to/secretFile \
driver=3Draw,file.filename=3Dsparse.img \
driver=3Dluks,file.filename=3Ddemo.img,key-secret=3Ddemo.img_encrypt0
$
This patch handles the convert processing by running the processing
in a do..while loop essentially reusing the existing create logic and
arguments to create the target vol from the inputvol and then converting
the inputvol using new arguments.
Signed-off-by: John Ferlan
---
docs/formatstorageencryption.html.in | 10 ++
src/storage/storage_util.c | 113 ++++++++++++++++-=
----
src/storage/storage_util.h | 10 +-
.../qcow2-from-logical-compat.argv | 9 +-
.../qcow2-nobacking-convert-prealloc-compat.argv | 9 +-
.../qcow2-nocapacity-convert-prealloc.argv | 9 +-
tests/storagevolxml2argvtest.c | 61 ++++++++---
7 files changed, 178 insertions(+), 43 deletions(-)
diff --git a/docs/formatstorageencryption.html.in b/docs/formatstorageencry=
ption.html.in
index 23efbf932e..984c7d8b8b 100644
--- a/docs/formatstorageencryption.html.in
+++ b/docs/formatstorageencryption.html.in
@@ -38,6 +38,16 @@
secret value at the time of volume creation, and store it using the
specified uuid
.
+
+ Since 4.4.0, the command line generated
+ by libvirt to create a default
or qcow
+ encrypted volume has changed. This is a result of changes made
+ to qemu-img in QEMU 2.9 which requires different arguments to be
+ provided in order to create a qcow encrypted volume. This change
+ is not compatible with older qemu-img images and there is no plan
+ to provide backwards compatibility. It is strongly recommended
+ to use the "luks" encryption format.
+
<encryption format=3D"default"/>
can be specified=
only
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
index a8a6a3e401..29adf0cdbe 100644
--- a/src/storage/storage_util.c
+++ b/src/storage/storage_util.c
@@ -943,12 +943,15 @@ storageBackendCreateQemuImgCheckEncryption(int format,
=20
static int
storageBackendCreateQemuImgSetInput(virStorageVolDefPtr inputvol,
+ virStorageVolEncryptConvertStep conver=
tStep,
struct _virStorageBackendQemuImgInfo *=
info)
{
- if (!(info->inputPath =3D inputvol->target.path)) {
- virReportError(VIR_ERR_INVALID_ARG, "%s",
- _("missing input volume target path"));
- return -1;
+ if (convertStep !=3D VIR_STORAGE_VOL_ENCRYPT_CREATE) {
+ if (!(info->inputPath =3D inputvol->target.path)) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("missing input volume target path"));
+ return -1;
+ }
}
=20
info->inputFormat =3D inputvol->target.format;
@@ -1119,6 +1122,7 @@ static int
virStorageBackendCreateQemuImgSetInfo(virStoragePoolObjPtr pool,
virStorageVolDefPtr vol,
virStorageVolDefPtr inputvol,
+ virStorageVolEncryptConvertStep conv=
ertStep,
struct _virStorageBackendQemuImgInfo=
*info)
{
/* Treat output block devices as 'raw' format */
@@ -1166,7 +1170,7 @@ virStorageBackendCreateQemuImgSetInfo(virStoragePoolO=
bjPtr pool,
}
=20
if (inputvol &&
- storageBackendCreateQemuImgSetInput(inputvol, info) < 0)
+ storageBackendCreateQemuImgSetInput(inputvol, convertStep, info) <=
0)
return -1;
=20
if (virStorageSourceHasBacking(&vol->target) &&
@@ -1185,6 +1189,27 @@ virStorageBackendCreateQemuImgSetInfo(virStoragePool=
ObjPtr pool,
}
=20
=20
+static void
+virStorageBackendCreateQemuImgCmdEncryptConvert(virCommandPtr cmd,
+ virStorageEncryptionPtr en=
c,
+ struct _virStorageBackendQ=
emuImgInfo info)
+{
+ /* source */
+ virCommandAddArgFormat(cmd, "driver=3Draw,file.filename=3D%s", info.in=
putPath);
+
+ /* dest */
+ if (enc->format =3D=3D VIR_STORAGE_ENCRYPTION_FORMAT_LUKS) {
+ virCommandAddArgFormat(cmd,
+ "driver=3Dluks,file.filename=3D%s,key-secre=
t=3D%s",
+ info.path, info.secretAlias);
+ } else {
+ virCommandAddArgFormat(cmd,
+ "driver=3Dqcow2,file.filename=3D%s,encrypt.=
key-secret=3D%s",
+ info.path, info.secretAlias);
+ }
+}
+
+
/* Create a qemu-img virCommand from the supplied arguments */
virCommandPtr
virStorageBackendCreateQemuImgCmdFromVol(virStoragePoolObjPtr pool,
@@ -1192,7 +1217,8 @@ virStorageBackendCreateQemuImgCmdFromVol(virStoragePo=
olObjPtr pool,
virStorageVolDefPtr inputvol,
unsigned int flags,
const char *create_tool,
- const char *secretPath)
+ const char *secretPath,
+ virStorageVolEncryptConvertStep c=
onvertStep)
{
virCommandPtr cmd =3D NULL;
struct _virStorageBackendQemuImgInfo info =3D {
@@ -1208,22 +1234,30 @@ virStorageBackendCreateQemuImgCmdFromVol(virStorage=
PoolObjPtr pool,
.secretPath =3D secretPath,
.secretAlias =3D NULL,
};
- virStorageEncryptionInfoDefPtr enc =3D NULL;
+ virStorageEncryptionPtr enc =3D NULL;
+ virStorageEncryptionInfoDefPtr encinfo =3D NULL;
=20
virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
=20
- if (virStorageBackendCreateQemuImgSetInfo(pool, vol, inputvol, &info) =
< 0)
+ if (virStorageBackendCreateQemuImgSetInfo(pool, vol, inputvol,
+ convertStep, &info) < 0)
goto error;
=20
cmd =3D virCommandNew(create_tool);
=20
- /* ignore the backing volume when we're converting a volume */
- if (info.inputPath)
+ /* ignore the backing volume when we're converting a volume
+ * including when we're doing a two step convert during create */
+ if (info.inputPath || convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_CREAT=
E)
info.backingPath =3D NULL;
=20
- if (info.inputPath)
+ /* Converting to use encryption is a two step process - step 1 is to
+ * create the image and step 2 is to convert it using special argument=
s */
+ if (info.inputPath && convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_NONE)
virCommandAddArgList(cmd, "convert", "-f", info.inputFormatStr,
"-O", info.type, NULL);
+ else if (info.inputPath && convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_=
CONVERT)
+ virCommandAddArgList(cmd, "convert", "--image-opts", "-n",
+ "--target-image-opts", NULL);
else
virCommandAddArgList(cmd, "create", "-f", info.type, NULL);
=20
@@ -1241,19 +1275,23 @@ virStorageBackendCreateQemuImgCmdFromVol(virStorage=
PoolObjPtr pool,
if (storageBackendCreateQemuImgSecretObject(cmd, info.secretPath,
info.secretAlias) < 0)
goto error;
- enc =3D &vol->target.encryption->encinfo;
+ enc =3D vol->target.encryption;
+ encinfo =3D &enc->encinfo;
}
=20
- if (storageBackendCreateQemuImgSetOptions(cmd, enc, info) < 0)
- goto error;
+ if (convertStep !=3D VIR_STORAGE_VOL_ENCRYPT_CONVERT) {
+ if (storageBackendCreateQemuImgSetOptions(cmd, encinfo, info) < 0)
+ goto error;
+ if (info.inputPath)
+ virCommandAddArg(cmd, info.inputPath);
+ virCommandAddArg(cmd, info.path);
+ if (!info.inputPath && (info.size_arg || !info.backingPath))
+ virCommandAddArgFormat(cmd, "%lluK", info.size_arg);
+ } else {
+ virStorageBackendCreateQemuImgCmdEncryptConvert(cmd, enc, info);
+ }
VIR_FREE(info.secretAlias);
=20
- if (info.inputPath)
- virCommandAddArg(cmd, info.inputPath);
- virCommandAddArg(cmd, info.path);
- if (!info.inputPath && (info.size_arg || !info.backingPath))
- virCommandAddArgFormat(cmd, "%lluK", info.size_arg);
-
return cmd;
=20
error:
@@ -1360,14 +1398,15 @@ storageBackendDoCreateQemuImg(virStoragePoolObjPtr =
pool,
virStorageVolDefPtr inputvol,
unsigned int flags,
const char *create_tool,
- const char *secretPath)
+ const char *secretPath,
+ virStorageVolEncryptConvertStep convertStep)
{
int ret;
virCommandPtr cmd;
=20
cmd =3D virStorageBackendCreateQemuImgCmdFromVol(pool, vol, inputvol,
flags, create_tool,
- secretPath);
+ secretPath, convertStep=
);
if (!cmd)
return -1;
=20
@@ -1388,6 +1427,7 @@ storageBackendCreateQemuImg(virStoragePoolObjPtr pool,
int ret =3D -1;
char *create_tool;
char *secretPath =3D NULL;
+ virStorageVolEncryptConvertStep convertStep =3D VIR_STORAGE_VOL_ENCRYP=
T_NONE;
=20
virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, -1);
=20
@@ -1402,8 +1442,33 @@ storageBackendCreateQemuImg(virStoragePoolObjPtr poo=
l,
if (storageBackendGenerateSecretData(pool, vol, &secretPath) < 0)
goto cleanup;
=20
- ret =3D storageBackendDoCreateQemuImg(pool, vol, inputvol, flags,
- create_tool, secretPath);
+ /* Using an input file for encryption requires a multi-step process
+ * to create an image of the same size as the inputvol and then to
+ * convert the inputvol afterwards. */
+ if (secretPath && inputvol)
+ convertStep =3D VIR_STORAGE_VOL_ENCRYPT_CREATE;
+
+ do {
+ ret =3D storageBackendDoCreateQemuImg(pool, vol, inputvol, flags,
+ create_tool, secretPath,
+ convertStep);
+
+ /* Failure to convert, attempt to delete what we created */
+ if (ret < 0 && convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_CONVERT)
+ ignore_value(virFileRemove(vol->target.path,
+ vol->target.perms->uid,
+ vol->target.perms->gid));
+
+ if (ret < 0 || convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_NONE)
+ goto cleanup;
+
+ if (convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_CREATE)
+ convertStep =3D VIR_STORAGE_VOL_ENCRYPT_CONVERT;
+ else if (convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_CONVERT)
+ convertStep =3D VIR_STORAGE_VOL_ENCRYPT_DONE;
+ } while (convertStep !=3D VIR_STORAGE_VOL_ENCRYPT_DONE);
+
+
cleanup:
if (secretPath) {
unlink(secretPath);
diff --git a/src/storage/storage_util.h b/src/storage/storage_util.h
index 9307702754..6fc8e8972c 100644
--- a/src/storage/storage_util.h
+++ b/src/storage/storage_util.h
@@ -153,13 +153,21 @@ char *virStorageBackendStablePath(virStoragePoolObjPt=
r pool,
const char *devpath,
bool loop);
=20
+typedef enum {
+ VIR_STORAGE_VOL_ENCRYPT_NONE =3D 0,
+ VIR_STORAGE_VOL_ENCRYPT_CREATE,
+ VIR_STORAGE_VOL_ENCRYPT_CONVERT,
+ VIR_STORAGE_VOL_ENCRYPT_DONE,
+} virStorageVolEncryptConvertStep;
+
virCommandPtr
virStorageBackendCreateQemuImgCmdFromVol(virStoragePoolObjPtr pool,
virStorageVolDefPtr vol,
virStorageVolDefPtr inputvol,
unsigned int flags,
const char *create_tool,
- const char *secretPath);
+ const char *secretPath,
+ virStorageVolEncryptConvertStep c=
onvertStep);
=20
int virStorageBackendSCSIFindLUs(virStoragePoolObjPtr pool,
uint32_t scanhost);
diff --git a/tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv b/=
tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv
index 849c5f0218..46d54d01c6 100644
--- a/tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv
+++ b/tests/storagevolxml2argvdata/qcow2-from-logical-compat.argv
@@ -1,4 +1,9 @@
-qemu-img convert -f raw -O qcow2 \
+qemu-img create -f qcow2 \
--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,compat=
=3D0.10 \
-/dev/HostVG/Swap /var/lib/libvirt/images/OtherDemo.img
+/var/lib/libvirt/images/OtherDemo.img 5242880K
+qemu-img convert --image-opts -n --target-image-opts \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+driver=3Draw,file.filename=3D/dev/HostVG/Swap \
+driver=3Dqcow2,file.filename=3D/var/lib/libvirt/images/OtherDemo.img,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc-=
compat.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc=
-compat.argv
index a95749eafa..b755c1e9c4 100644
--- a/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc-compat.=
argv
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc-compat.=
argv
@@ -1,5 +1,10 @@
-qemu-img convert -f raw -O qcow2 \
+qemu-img create -f qcow2 \
--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,\
preallocation=3Dmetadata,compat=3D0.10 \
-/var/lib/libvirt/images/sparse.img /var/lib/libvirt/images/OtherDemo.img
+/var/lib/libvirt/images/OtherDemo.img 5242880K
+qemu-img convert --image-opts -n --target-image-opts \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+driver=3Draw,file.filename=3D/var/lib/libvirt/images/sparse.img \
+driver=3Dqcow2,file.filename=3D/var/lib/libvirt/images/OtherDemo.img,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0
diff --git a/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc=
.argv b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv
index 51bdaaf684..fca8cba49b 100644
--- a/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv
+++ b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv
@@ -1,5 +1,10 @@
-qemu-img convert -f raw -O qcow2 \
+qemu-img create -f qcow2 \
--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
-o encrypt.format=3Daes,encrypt.key-secret=3DOtherDemo.img_encrypt0,\
preallocation=3Dfalloc,compat=3D0.10 \
-/var/lib/libvirt/images/sparse.img /var/lib/libvirt/images/OtherDemo.img
+/var/lib/libvirt/images/OtherDemo.img 0K
+qemu-img convert --image-opts -n --target-image-opts \
+--object secret,id=3DOtherDemo.img_encrypt0,file=3D/path/to/secretFile \
+driver=3Draw,file.filename=3D/var/lib/libvirt/images/sparse.img \
+driver=3Dqcow2,file.filename=3D/var/lib/libvirt/images/OtherDemo.img,\
+encrypt.key-secret=3DOtherDemo.img_encrypt0
diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c
index 4286c50c6e..e72e08a7d2 100644
--- a/tests/storagevolxml2argvtest.c
+++ b/tests/storagevolxml2argvtest.c
@@ -43,6 +43,7 @@ testCompareXMLToArgvFiles(bool shouldFail,
unsigned long parse_flags)
{
char *actualCmdline =3D NULL;
+ virStorageVolEncryptConvertStep convertStep =3D VIR_STORAGE_VOL_ENCRYP=
T_NONE;
int ret =3D -1;
=20
virCommandPtr cmd =3D NULL;
@@ -79,20 +80,56 @@ testCompareXMLToArgvFiles(bool shouldFail,
testSetVolumeType(vol, def);
testSetVolumeType(inputvol, inputpool);
=20
- cmd =3D virStorageBackendCreateQemuImgCmdFromVol(obj, vol,
- inputvol, flags,
- create_tool,
- "/path/to/secretFile");
- if (!cmd) {
- if (shouldFail) {
- virResetLastError();
- ret =3D 0;
+ /* Using an input file for encryption requires a multi-step process
+ * to create an image of the same size as the inputvol and then to
+ * convert the inputvol afterwards. Since we only care about the
+ * command line we have to copy code from storageBackendCreateQemuImg
+ * and adjust it for the test needs. */
+ if (inputvol && vol->target.encryption)
+ convertStep =3D VIR_STORAGE_VOL_ENCRYPT_CREATE;
+
+ do {
+ cmd =3D virStorageBackendCreateQemuImgCmdFromVol(obj, vol,
+ inputvol, flags,
+ create_tool,
+ "/path/to/secretFil=
e",
+ convertStep);
+ if (!cmd) {
+ if (shouldFail) {
+ virResetLastError();
+ ret =3D 0;
+ }
+ goto cleanup;
}
- goto cleanup;
- }
=20
- if (!(actualCmdline =3D virCommandToString(cmd)))
- goto cleanup;
+ if (convertStep !=3D VIR_STORAGE_VOL_ENCRYPT_CONVERT) {
+ if (!(actualCmdline =3D virCommandToString(cmd)))
+ goto cleanup;
+ } else {
+ char *createCmdline =3D actualCmdline;
+ char *cvtCmdline;
+ int rc;
+
+ if (!(cvtCmdline =3D virCommandToString(cmd)))
+ goto cleanup;
+
+ rc =3D virAsprintf(&actualCmdline, "%s\n%s",
+ createCmdline, cvtCmdline);
+
+ VIR_FREE(createCmdline);
+ VIR_FREE(cvtCmdline);
+ if (rc < 0)
+ goto cleanup;
+ }
+
+ if (convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_NONE)
+ convertStep =3D VIR_STORAGE_VOL_ENCRYPT_DONE;
+ else if (convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_CREATE)
+ convertStep =3D VIR_STORAGE_VOL_ENCRYPT_CONVERT;
+ else if (convertStep =3D=3D VIR_STORAGE_VOL_ENCRYPT_CONVERT)
+ convertStep =3D VIR_STORAGE_VOL_ENCRYPT_DONE;
+
+ } while (convertStep !=3D VIR_STORAGE_VOL_ENCRYPT_DONE);
=20
if (virTestCompareToFile(actualCmdline, cmdline) < 0)
goto cleanup;
--=20
2.14.3
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Tue May 13 23:02:07 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com;
dmarc=pass(p=none dis=none) header.from=redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 15264737927931000.6866014442928;
Wed, 16 May 2018 05:29:52 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com
[10.5.11.16])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 33382387227;
Wed, 16 May 2018 12:29:51 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id E2B5B177D3;
Wed, 16 May 2018 12:29:50 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 91DFC1801247;
Wed, 16 May 2018 12:29:50 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com
[10.5.11.25])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4GCTbQE001401 for ;
Wed, 16 May 2018 08:29:37 -0400
Received: by smtp.corp.redhat.com (Postfix)
id 4042E2010CBB; Wed, 16 May 2018 12:29:37 +0000 (UTC)
Received: from localhost.localdomain.com (ovpn-116-88.phx2.redhat.com
[10.3.116.88])
by smtp.corp.redhat.com (Postfix) with ESMTP id F197A2010CB2
for ; Wed, 16 May 2018 12:29:36 +0000 (UTC)
From: John Ferlan
To: libvir-list@redhat.com
Date: Wed, 16 May 2018 08:29:30 -0400
Message-Id: <20180516122931.30854-4-jferlan@redhat.com>
In-Reply-To: <20180516122931.30854-1-jferlan@redhat.com>
References: <20180516122931.30854-1-jferlan@redhat.com>
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v2 3/4] storage_util: Don't assume "luks"
encryption for resize
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]);
Wed, 16 May 2018 12:29:51 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
Similar to encrypted image creation/conversion resizing the
volume requires providing different parameters for luks and
qcow[2] encryption.
Alter storageBackendResizeQemuImgImageOpts to take the @type
parameter filled in during storageBackendResizeQemuImg to either
the current type or "luks" for a RAW image and use that to
generate the "driver=3D%s" value and to determine whether to use
"encrypt.key-secret" or "key-secret".
Signed-off-by: John Ferlan
---
src/storage/storage_util.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
index 29adf0cdbe..b7b86d76cb 100644
--- a/src/storage/storage_util.c
+++ b/src/storage/storage_util.c
@@ -1088,20 +1088,26 @@ storageBackendCreateQemuImgSecretObject(virCommandP=
tr cmd,
=20
=20
/* Add a --image-opts to the qemu-img resize command line:
- * --image-opts driver=3Dluks,file.filename=3D$volpath,key-secret=3D$se=
cretAlias
- *
- * NB: format=3Draw is assumed
+ * --image-opts driver=3D%s,\
+ * [encrypt.]key-secret=3D$secretAlias,\
+ * file.filename=3D$volpath
*/
static int
storageBackendResizeQemuImgImageOpts(virCommandPtr cmd,
+ const char *type,
const char *path,
const char *secretAlias)
{
virBuffer buf =3D VIR_BUFFER_INITIALIZER;
char *commandStr =3D NULL;
=20
- virBufferAsprintf(&buf, "driver=3Dluks,key-secret=3D%s,file.filename=
=3D",
- secretAlias);
+ virBufferAsprintf(&buf, "driver=3D%s,", type);
+ if (STREQ(type, "luks"))
+ virBufferAsprintf(&buf, "key-secret=3D%s,", secretAlias);
+ else
+ virBufferAsprintf(&buf, "encrypt.key-secret=3D%s,", secretAlias);
+ virBufferAddLit(&buf, "file.filename=3D");
+
virQEMUBuildBufferEscapeComma(&buf, path);
=20
if (virBufferCheckError(&buf) < 0) {
@@ -2403,7 +2409,7 @@ storageBackendResizeQemuImg(virStoragePoolObjPtr pool,
int ret =3D -1;
char *img_tool =3D NULL;
virCommandPtr cmd =3D NULL;
- const char *type;
+ const char *type =3D virStorageFileFormatTypeToString(vol->target.form=
at);
char *secretPath =3D NULL;
char *secretAlias =3D NULL;
=20
@@ -2417,8 +2423,6 @@ storageBackendResizeQemuImg(virStoragePoolObjPtr pool,
if (vol->target.encryption) {
if (vol->target.format =3D=3D VIR_STORAGE_FILE_RAW)
type =3D "luks";
- else
- type =3D virStorageFileFormatTypeToString(vol->target.format);
=20
storageBackendLoadDefaultSecrets(vol);
=20
@@ -2448,7 +2452,7 @@ storageBackendResizeQemuImg(virStoragePoolObjPtr pool,
secretAlias) < 0)
goto cleanup;
=20
- if (storageBackendResizeQemuImgImageOpts(cmd, vol->target.path,
+ if (storageBackendResizeQemuImgImageOpts(cmd, type, vol->target.pa=
th,
secretAlias) < 0)
goto cleanup;
}
--=20
2.14.3
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Tue May 13 23:02:07 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com;
dmarc=pass(p=none dis=none) header.from=redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 152647379782954.5850501996473;
Wed, 16 May 2018 05:29:57 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com
[10.5.11.22])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 34C4830D2679;
Wed, 16 May 2018 12:29:56 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 0450F1001925;
Wed, 16 May 2018 12:29:56 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id B06EB4CAA7;
Wed, 16 May 2018 12:29:55 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com
[10.5.11.25])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4GCTbJY001406 for ;
Wed, 16 May 2018 08:29:37 -0400
Received: by smtp.corp.redhat.com (Postfix)
id AD51B2010CC4; Wed, 16 May 2018 12:29:37 +0000 (UTC)
Received: from localhost.localdomain.com (ovpn-116-88.phx2.redhat.com
[10.3.116.88])
by smtp.corp.redhat.com (Postfix) with ESMTP id 6A2462010CB2
for ; Wed, 16 May 2018 12:29:37 +0000 (UTC)
From: John Ferlan
To: libvir-list@redhat.com
Date: Wed, 16 May 2018 08:29:31 -0400
Message-Id: <20180516122931.30854-5-jferlan@redhat.com>
In-Reply-To: <20180516122931.30854-1-jferlan@redhat.com>
References: <20180516122931.30854-1-jferlan@redhat.com>
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v2 4/4] docs: Update news.xml to describe
encrypted image issues
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]);
Wed, 16 May 2018 12:29:56 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
Signed-off-by: John Ferlan
---
docs/news.xml | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/docs/news.xml b/docs/news.xml
index 7d40e85b9a..216e8b9754 100644
--- a/docs/news.xml
+++ b/docs/news.xml
@@ -67,6 +67,18 @@
+
+
+ Fix issues with encrypted image creation, conversion, and resize
+
+
+ Changes in QEMU 2.9 to arguments for qemu-img to use secrets for
+ encrypted image creation, conversion, and resize are incompatible
+ with prior versions of qemu-img. Alter encrypted image handling
+ to follow the model currently used for LUKS images for QCOW[2]
+ encrypted images.
+
+
--=20
2.14.3
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list