QEMU/KVM 是否對加密的 qcow2 圖像使用 Intel AES 指令,如果主機 CPU 有它們?
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 加密。確認
可以這樣驗證:
- CPU有AES-NI嗎?
$ grep aes /proc/cpuinfo -i
例如我的 Intel Core 7 有這個擴展。 2. 安裝必要的調試包:
# debuginfo-install qemu-img
qemu-img
在調試器中執行:$ gdb --args qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
- 在未針對 AES-NI 優化的眾所周知的 qemu 加密函式中設置斷點:
(gdb) b AES_encrypt Breakpoint 1 at 0x794b0: file util/aes.c, line 881.
- 執行程序:
(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 (cfldd $(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
可以通過q
uit 命令退出。