Linux 中的 ZFS RAID 和 LUKS 加密

Mas*_*erM 28 linux zfs network-attached-storage encryption luks

我计划在 Linux 中设置一组 3x 2TB 7200rpm 驱动器作为 LUKS 加密的 Z-RAID 池(用于 NAS 解决方案)。

我对手头问题的理解是,实现这一目标的唯一方法是在luksFormat每个物理设备上,然后从未锁定的 LUKS 容器中组装一个 zpool。

我对此有以下担忧:

  • 它不会显着阻碍写入性能吗?在这种设置中,冗余数据被多次加密,因为 LUKS 不“知道”Z-RAID。在 LUKS-on-mdadm 解决方案中,数据被加密一次,只是多次写入磁盘。我的 CPU 支持 Intel AES-NI。

  • 在设备映射器 LUKS 容器而不是物理设备上运行时,ZFS 会意识到磁盘故障吗?重复数据删除和其他 ZFS 功能怎么样?

Sta*_*ish 34

我管理的其中一台服务器运行您描述的配置类型。它有六个 1TB 硬盘,上面有一个 LUKS 加密的 RAIDZ 池。我在 LUKS 加密的 ZFS 镜像中还有两个 3TB 硬盘驱动器,它们每周都会更换以移出现场。服务器已经使用这种配置大约三年了,我从来没有遇到过它的问题。

如果您需要在 Linux 上使用 ZFS 加密,那么我建议您使用此设置。我在 Linux 上使用 ZFS-Fuse,而不是 ZFS。但是,我相信除了 Linux 上的 ZFS 可能比我使用的设置具有更好的性能之外,这对结果没有任何影响。

在这种设置中,冗余数据被多次加密,因为 LUKS 不“知道”Z-RAID。在 LUKS-on-mdadm 解决方案中,数据被加密一次,只是多次写入磁盘。

请记住,LUKS 不知道 RAID。它只知道它位于块设备的顶部。如果您使用 mdadm 创建一个 RAID 设备,然后luksformat它,则是 mdadm 将加密数据复制到底层存储设备,而不是 LUKS。

LUKS 常见问题解答的问题 2.8 解决了加密是否应该在 RAID 之上或相反的问题。它提供了下图。

Filesystem     <- top
|
Encryption
|
RAID
|
Raw partitions
|
Raw disks      <- bottom
Run Code Online (Sandbox Code Playgroud)

由于 ZFS 结合了 RAID 和文件系统功能,因此您的解决方案需要如下所示。

RAID-Z and ZFS Filesystem  <-top
|
Encryption
|
Raw partitions (optional)
|
Raw disks                  <- bottom
Run Code Online (Sandbox Code Playgroud)

我已将原始分区列为可选,因为 ZFS 预计它将使用原始块存储而不是分区。虽然您可以使用分区创建 zpool,但不建议这样做,因为它会增加无用的管理级别,并且在计算用于分区块对齐的偏移量时需要考虑到这一点。

它不会显着阻碍写入性能吗?[...] 我的 CPU 支持 Intel AES-NI。

只要您选择 AES-NI 驱动程序支持的加密方法,就不应该有性能问题。如果您有 cryptsetup 1.6.0 或更高版本,您可以运行cryptsetup benchmark并查看哪种算法将提供最佳性能。

这个关于 LUKS 推荐选项的问题也可能很有价值。

鉴于您有硬件加密支持,您更有可能因分区未对齐而面临性能问题。

Linux 上的 ZFS 已将该ashift属性添加到zfs命令中,以允许您指定硬盘驱动器的扇区大小。根据链接的常见问题解答,ashift=12会告诉它您使用的是 4K 块大小的驱动器。

LUKS 常见问题说明 LUKS 分区的对齐为 1 MB。问题 6.12 和 6.13对此进行了详细讨论,并提供了有关如何使 LUKS 分区标头更大的建议。但是,我不确定是否有可能使它足够大以确保您的 ZFS 文件系统将在 4K 边界上创建。如果这是您需要解决的问题,我很想听听这对您有什么影响。由于您使用的是 2TB 驱动器,因此您可能不会遇到此问题。

在设备映射器 LUKS 容器而不是物理设备上运行时,ZFS 会意识到磁盘故障吗?

ZFS 将意识到磁盘故障,因为它可以毫无问题地读取和写入磁盘。ZFS 需要块存储,并且不关心或不知道该存储的细节及其来源。它只跟踪它遇到的任何读、写或校验和错误。由您来监控底层存储设备的运行状况。

ZFS 文档中有一节是关于故障排除的,值得一读。关于更换或修复损坏设备的部分描述了在故障情况下您可能会遇到的情况以及您可能如何解决它。您在此处执行的操作与对没有 ZFS 的设备执行的操作相同。检查系统日志中是否有来自 SCSI 驱动程序、HBA 或 HD 控制器和/或 SMART 监控软件的消息,然后采取相应措施。

重复数据删除和其他 ZFS 功能怎么样?

无论底层块存储是否加密,所有 ZFS 功能都将正常工作。

概括

  1. LUKS 加密设备上的 ZFS 运行良好。
  2. 如果您有硬件加密,只要您使用硬件支持的加密方法,您就不会看到性能下降。使用cryptsetup benchmark查看将最适合您的硬件。
  3. 将 ZFS 视为组合成单个实体的 RAID 和文件系统。请参阅上面的 ASCII 图表,了解它在存储堆栈中的位置。
  4. 您需要解锁 ZFS 文件系统使用的每个 LUKS 加密块设备。
  5. 以与现在相同的方式监控存储硬件的运行状况。
  6. 如果您使用具有 4K 块的驱动器,请注意文件系统的块对齐。您可能需要尝试使用 luksformat 选项或其他设置来获得可接受速度所需的对齐方式。

2020 年 2 月更新

我写这个答案已经六年了。Linux v0.8.0 上的 ZFS支持本机加密,如果您对 LUKS 没有特定需求,则应考虑使用本机加密。

  • +1 寻找一种方法来使这项工作*与*示例一起工作。 (3认同)
  • @ViníciusFerrão:还要注意 FreeBSD 和 FreeNAS 使用相同的 ZFS 加密方法。`geli` 用于创建加密设备,明文数据通过 ZFS 使用的第二个设备提供。请参阅 http://doc.freenas.org/index.php/Volumes#Encryption 上的第二个要点。 (3认同)
  • @CMCDragonkai 由于 L2ARC 和 SLOG 设备都包含池中的零碎数据,如果您对存储进行加密以提供机密性(这通常是首先使用加密存储的重点),您几乎肯定想要运行任何类似加密的 L2ARC 和 SLOG 设备。 (3认同)
  • 1 MiB 已经可以被 4KiB 整除,所以如果你使用原始磁盘,你应该一直正确对齐到 ashift=20(我认为这在我的职业生涯中没有必要)。 (2认同)