From nobody Fri Apr 19 19:15:37 2024 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 Fri Apr 19 19:15:37 2024 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. +

"default" 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 Fri Apr 19 19:15:37 2024 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 Fri Apr 19 19:15:37 2024 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