我计划在 Linux 中设置一组 3x 2TB 7200rpm 驱动器作为 LUKS 加密的 Z-RAID 池(用于 NAS 解决方案)。
我对手头问题的理解是,实现此目的的唯一方法是对luksFormat
每个物理设备,然后用未锁定的 LUKS 容器组装一个 zpool。
我对此有以下担忧:
这不会严重影响写入性能吗?在此设置中,冗余数据被加密多次,因为 LUKS 无法“感知” Z-RAID。在 LUKS-on-mdadm 解决方案中,数据被加密一次,然后多次写入磁盘。我的 CPU 支持 Intel AES-NI。
当在设备映射器 LUKS 容器而非物理设备上操作时,ZFS 会意识到磁盘故障吗?重复数据删除和其他 ZFS 功能怎么样?
答案1
我管理的其中一台服务器运行的配置类型与您描述的相同。它有六块 1TB 硬盘,上面有一个 LUKS 加密的 RAIDZ 池。我还有两个 3TB 硬盘,它们位于一个 LUKS 加密的 ZFS 镜像中,每周都会更换并移出现场。该服务器已使用此配置大约三年了,我从未遇到过问题。
如果您需要在 Linux 上使用加密的 ZFS,那么我推荐此设置。我使用的是 ZFS-Fuse,而不是 Linux 上的 ZFS。但是,我相信这对结果没有影响,只是 Linux 上的 ZFS 可能比我使用的设置具有更好的性能。
在此设置中,冗余数据被加密多次,因为 LUKS 无法“感知” Z-RAID。在 LUKS-on-mdadm 解决方案中,数据被加密一次,然后仅多次写入磁盘。
请记住,LUKS 不知道 RAID。它只知道它位于块设备的顶部。如果您使用 mdadm 创建 RAID 设备,然后使用luksformat
它,那么将加密数据复制到底层存储设备的是 mdadm,而不是 LUKS。
LUKS FAQ 的第 2.8 个问题涉及加密应该在 RAID 之上,反之亦然. 提供下图。
Filesystem <- top
|
Encryption
|
RAID
|
Raw partitions
|
Raw disks <- bottom
由于 ZFS 结合了 RAID 和文件系统功能,因此您的解决方案需要如下所示。
RAID-Z and ZFS Filesystem <-top
|
Encryption
|
Raw partitions (optional)
|
Raw disks <- bottom
我将原始分区列为可选,因为 ZFS 期望使用原始块存储而不是分区。虽然您可以使用分区创建 zpool,但不建议这样做,因为它会增加无用的管理级别,并且在计算分区块对齐的偏移量时需要考虑它。
这不会严重影响写入性能吗? [...] 我的 CPU 支持 Intel AES-NI。
只要您选择 AES-NI 驱动程序支持的加密方法,就不会出现性能问题。如果您有 cryptsetup 1.6.0 或更新版本,您可以运行cryptsetup benchmark
并查看哪种算法将提供最佳性能。
关于 LUKS 推荐选项的问题也可能有价值。
假设您有硬件加密支持,您更有可能因分区错位而面临性能问题。
Linux 上的 ZFS 具有将该ashift
属性添加到zfs
命令中允许您指定硬盘的扇区大小。根据链接的常见问题解答,ashift=12
会告诉它您正在使用块大小为 4K 的驱动器。
LUKS FAQ 指出 LUKS 分区的对齐为 1 MB。问题 6.12 和 6.13详细讨论这个问题,并提供有关如何使 LUKS 分区头更大的建议。但是,我不确定是否可以将其放大到足以确保您的 ZFS 文件系统将在 4K 边界上创建。如果您需要解决此问题,我很想知道这对您有何帮助。由于您使用的是 2TB 驱动器,因此您可能不会遇到此问题。
与物理设备相比,在设备映射器 LUKS 容器上操作时,ZFS 是否会意识到磁盘故障?
ZFS 能够感知磁盘故障,因为它可以毫无问题地读取和写入磁盘。ZFS 需要块存储,并且不关心或了解该存储的具体信息及其来源。它只跟踪遇到的任何读取、写入或校验和错误。监控底层存储设备的运行状况由您决定。
ZFS 文档中有一节关于故障排除的内容值得一读。更换或修理损坏的设备描述在发生故障时可能遇到的情况以及如何解决它。在这里,您可以执行与没有 ZFS 的设备相同的操作。检查系统日志中是否有来自 SCSI 驱动程序、HBA 或 HD 控制器和/或 SMART 监控软件的消息,然后采取相应措施。
重复数据删除和其他 ZFS 功能怎么样?
无论底层块存储是否加密,所有 ZFS 功能都将以相同的方式工作。
概括
- LUKS 加密设备上的 ZFS 运行良好。
- 如果您有硬件加密,只要您使用硬件支持的加密方法,就不会影响性能。使用
cryptsetup benchmark
以了解哪种方法最适合您的硬件。 - 可以将 ZFS 视为 RAID 和文件系统合并为一个实体。请参阅上面的 ASCII 图以了解它在存储堆栈中的位置。
- 您需要解锁 ZFS 文件系统使用的每个 LUKS 加密块设备。
- 以与现在相同的方式监控存储硬件的运行状况。
- 如果您使用的是具有 4K 块的驱动器,请注意文件系统的块对齐。您可能需要尝试使用 luksformat 选项或其他设置来获得可接受速度所需的对齐。
2020 年 2 月更新
从我写下这个答案到现在已经六年了。Linux 上的 ZFS v0.8.0支持本机加密,如果您对 LUKS 没有特定需求,则应该考虑这一点。
答案2
另一种实现方法是创建一个 ZVOL 块设备(http://zfsonlinux.org/example-zvol.html),使用 LUKS 加密新创建的 ZVOL,然后在加密块设备上创建 ext4(或其他)文件系统。