Encryption

QEMU/KVM 是否對加密的 qcow2 圖像使用 Intel AES 指令,如果主機 CPU 有它們?

  • March 20, 2015

KVM 的 qcow2 圖像文件格式可以使用 AES 加密。加密應用於集群級別

每個集群中的每個扇區都使用 AES 密碼塊連結模式獨立加密,使用小端格式的扇區偏移量(相對於設備的開頭)作為 128 位初始化向量的前 64 位。

集群大小可以設置為從512字節到 2M(64K 似乎是預設值)。

使用 qcow2 加密的主要問題之一是對 CPU 的性能影響——每次磁碟寫入或非記憶體讀取都需要加密或解密。

我想知道的是 QEMU/KVM 是否使用Intel AES 指令來減輕主機 CPU 的性能損失?如果是這樣,使用或性能是否很大程度上取決於集群大小?

英特爾® AES 指令是一組新的指令,從基於 32 納米英特爾® 微架構代號 Westmere 的全新 2010 年英特爾® 酷睿™ 處理器家族開始。這些指令使用 FIPS 第 197 號出版物定義的高級加密標準 (AES) 實現快速、安全的數據加密和解密。由於 AES 目前是主要的分組密碼,並且用於各種協議,因此新指令很有價值適用於廣泛的應用。

至少對於 Fedora 20 軟體包qemu-img(1.6.2、10.fc20)不使用AES-NI進行 AES 加密。

確認

可以這樣驗證:

  1. CPU有AES-NI嗎?
$ grep aes /proc/cpuinfo  -i

例如我的 Intel Core 7 有這個擴展。 2. 安裝必要的調試包:

# debuginfo-install qemu-img
  1. qemu-img在調試器中執行:
$ gdb --args qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
  1. 在未針對 AES-NI 優化的眾所周知的 qemu 加密函式中設置斷點:
(gdb) b AES_encrypt
Breakpoint 1 at 0x794b0: file util/aes.c, line 881.
  1. 執行程序:
(gdb) r
Starting program: /usr/bin/qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2

結果

在我的測試中,它確實停在那裡:

Breakpoint 1, AES_encrypt (in=0x7ffff7fabd60 "...", key=0x555555c1b510) at util/aes.c:881
881          const AES_KEY *key) {
(gdb) n
889     assert(in && out && key);
(gdb) n
881          const AES_KEY *key) {
(gdb) n
889     assert(in && out && key);
(gdb) n
896     s0 = GETU32(in     ) ^ rk[0];
(gdb) n
897     s1 = GETU32(in +  4) ^ rk[1];

這意味著確實沒有使用英特爾 AES 指令。

我的第一個想法是,qemu-img也許只是使用libcrypto這樣的方式,以便在可用時自動使用 AES-NI。qemu-img甚至連結到 libcrypto (cf ldd $(which qemu-img)) - 但它似乎沒有將它用於 AES 加密。唔。

我通過 grepping QEMU 原始碼得出斷點位置。在 Fedora 上,你可以像這樣得到它:

$ fedpkg clone -a qemu
$ cd qemu
$ fedpkg source
$ tar xfv qemu-2.2.0-rc1.tar.bz2
$ cd qemu-2.2.0-rc1

注意: gdb可以通過quit 命令退出。

引用自:https://unix.stackexchange.com/questions/170016