在 Ubuntu 12.10 中使用 Luks 加密的慢速 SSD + dm-crypt

Ale*_*lcu 11 performance encryption ssd luks 12.10

我在 Sata 3 接口上的笔记本电脑(三星 840 Pro)中安装了一个 128 GB SSD。这台笔记本电脑还配备了 i5 3210m Ivy Bridge Intel 处理器和 8 GB 内存。

我安装了 Ubuntu 12.10,使用图形安装程序来获得全盘加密。我有点失望,因为我期待规格必须产生比我得到的更好的结果。

在查看此SSD 基准测试页面时,它声称我的处理器能够执行以下操作:

  • ~500 MB/s : 使用 AES-NI
  • ~200 MB/s : 没有 AES-NI

看看我得到的数字,我想我可能没有启用 AES-NI。但首先 ...

读取未加密的数据很快:

# hdparm -Tt /dev/sda1

/dev/sda1:
 Timing cached reads:   14814 MB in  2.00 seconds = 7411.70 MB/sec
 Timing buffered disk reads: 242 MB in  0.48 seconds = 502.75 MB/sec
Run Code Online (Sandbox Code Playgroud)

这实际上接近我 SSD 的“高达 530 MB/s”的规格,并且进行dd测试会产生与上述类似的结果。

使用 dm-crypt 写入加密数据也很快(否则使用 eCryptfs 写入性能很糟糕,低于 100 MB/s),数字接近 SSD 规范(我猜写入是缓冲的或其他东西):

# dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.93896 s, 365 MB/s
Run Code Online (Sandbox Code Playgroud)

然而,读取加密数据是另一回事:

# echo 3 > /proc/sys/vm/drop_caches
# dd if=tempfile of=/dev/null bs=1M count=1024

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 5.85956 s, 183 MB/s
Run Code Online (Sandbox Code Playgroud)

在撰写此消息时,我实际上很幸运地获得了 183 MB/s,因为这个数字会有所不同。通常它大约在 150 MB/s 左右,但我在新启动时也接近 300 MB/s,但随后性能逐渐下降到 200 MB/s 以下,而我没有启动任何应用程序。请注意,在进行此测试时,我没有其他进程进行 I/O(如 所示iotop)。

此外,这是hdparm产生更差结果的测试:

 # hdparm -Tt /dev/mapper/sda2_crypt 

 /dev/mapper/sda2_crypt:
  Timing cached reads:   14816 MB in  2.00 seconds = 7412.86 MB/sec
  Timing buffered disk reads: 422 MB in  3.01 seconds = 140.11 MB/sec
Run Code Online (Sandbox Code Playgroud)

我还通过查看htop……不知道如何解释我所看到的内容来进行实验,因为 i5 处理器执行超线程,但是 4 个线程中有 2 个线程在测试期间使用率约为 73%,而另一个线程2 个线程未使用。事实上,如果我启动 2 个dd从 2 个不同文件读取的进程(以防止缓冲),那么iotop报告的总速度约为 400 MB/s。所以这绝对感觉像是受 CPU 限制。

我的失望来自于我的 i5 处理器支持AES-NI的事实。使用我在上面所做的相同测试,未加密数据的读取速度超过 500 MB/s。所以我们谈论的是加密分区至少慢 3 倍。

我真的不知道我的 dm-crypt 安装是否使用 AES-NI。这是输出lsmod

 # lsmod | grep aes
 aesni_intel            51038  35 
 cryptd                 20404  10 ghash_clmulni_intel,aesni_intel
 aes_x86_64             17256  1 aesni_intel
Run Code Online (Sandbox Code Playgroud)

这是输出cryptsetup

 # cryptsetup status sda2_crypt
 /dev/mapper/sda2_crypt is active and is in use.
   type:    LUKS1
   cipher:  aes-xts-plain64
   keysize: 512 bits
   device:  /dev/sda2
   offset:  4096 sectors
   size:    249565184 sectors
   mode:    read/write
   flags:   discards
Run Code Online (Sandbox Code Playgroud)

那么,这是预期的吗?AES-NI 不应该比这更好吗?

另外,如何禁用 AES-NI 以查看是否有任何区别?也许我应该以某种方式启用它,但在我的搜索中没有找到任何提示。

谢谢,

Cha*_*tha 6

您的三星 840 Pro 支持硬件 AES 加密。如果您的笔记本电脑 BIOS 支持 ATA 安全功能模式设置主密码和用户密码,那么您很幸运。

通过在 BIOS 中设置 ATA 主密码,然后对驱动器进行安全擦除,驱动器固件应生成新的随机 AES 密钥。安全擦除后,请确保您设置了良好的 ATA 主密码和用户密码。据我已经能够建立(见我在这里的帖子http://vxlabs.com/2012/12/22/ssds-with-usable-built-in-hardware-based-full-disk-encryption/)三星还使用您的 ATA 密码加密其 AES 密钥。

这将为您提供全速 AES 加密,无需软件。


小智 5

Ubuntu 中存在配置错误,导致 aesni_intel 模块没有足够早地加载,无法处理引导解锁设备的加密。我能够通过执行以下操作在我的机器上修复此问题:

sudo vim /etc/initramfs-tools/modules
Run Code Online (Sandbox Code Playgroud)

在最后一行下方,添加

# enable h/w accelerated encryption
cryptd
aes_x86_64
aesni_intel
Run Code Online (Sandbox Code Playgroud)

然后运行

sudo update-initramfs -u -k all
Run Code Online (Sandbox Code Playgroud)

重新启动,并享受。在此之后,在类似的 SSD 上,我看到 500MB/s 的读写速度,而 CPU 使用率可以忽略不计。

有关此错误的完整详细信息位于https://bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/908387/comments/7