Linux中的ZFS RAID和LUKSencryption

我打算在Linux中为一个LUKSencryption的Z-RAID池安装一套3x 2TB 7200rpm驱动器(对于NAS解决scheme)。

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

我对此有以下担忧:

我pipe理的服务器之一运行您描述的configurationtypes。 它有六个1TB硬盘,并在其上安装了LUKSencryption的RAIDZ池。 我还有一个LUKSencryption的ZFS镜像中的两个3TB硬盘驱动器,每周都会被交换出去。 服务器已经使用这个configuration大约三年了,我从来没有遇到过问题。

如果你需要在Linux上encryptionZFS,那么我推荐这个设置。 我正在使用ZFS-Fuse,而不是Linux上的ZFS。 但是,我相信这对Linux上除ZFS以外的结果没有任何影响,可能会比我使用的设置有更好的性能。

在此设置中,冗余数据被encryption多次,因为LUKS不能“察觉”Z-RAID。 在LUKS-on-mdadm解决scheme中,数据被encryption一次,而且只是多次写入磁盘。

请记住,LUKS不知道RAID。 它只知道它坐在一个块设备的顶部。 如果使用mdadm创buildRAID设备,然后luksformatluksformat ,则mdadm luksformatencryption数据复制到底层存储设备,而不是LUKS。

LUKS问题2.8的问题解决了encryption应该在RAID之上还是其他方式 。 它提供了下面的图表。

 Filesystem <- top | Encryption | RAID | Raw partitions | Raw disks <- bottom 

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

 RAID-Z and ZFS Filesystem <-top | Encryption | Raw partitions (optional) | Raw disks <- bottom 

我已经列出了可选的原始分区,因为ZFS预计它将使用原始块存储而不是分区。 虽然可以使用分区来创buildzpool,但不build议这样做,因为这会增加无用的pipe理级别,并且在计算分区块alignment时的偏移量时需要考虑这一点。

这不会严重阻碍写入性能吗? 我的CPU支持Intel AES-NI。

只要您selectAES-NI驱动程序支持的encryption方法,就不应该出现性能问题。 如果您拥有cryptsetup 1.6.0或更高版本,则可以运行cryptsetup benchmark并查看哪种algorithm将提供最佳性能。

LUKS推荐选项上的这个问题也可能是有价值的。

鉴于您有硬件encryption支持,由于分区错位,您更可能会遇到性能问题。

Linux上的ZFS已将ashift属性添加到zfs命令,以允许您指定硬盘驱动器的扇区大小。 根据链接的FAQ, ashift=12会告诉你正在使用4K块大小的驱动器。

LUKS FAQ指出LUKS分区具有1 MB的alignment。 问题6.12和6.13详细讨论了这一点,并提供了关于如何使LUKS分区头部变大的build议。 但是,我不确定是否有足够的空间来确保您的ZFS文件系统将在4K边界上创build。 如果这是一个需要解决的问题,我会很有兴趣听到这是如何解决的。 由于您使用的是2TB硬盘,因此您可能不会遇到这个问题。

在设备映射器LUKS容器上操作时,ZFS是否会注意到磁盘故障而不是物理设备?

只要能够读取和写入磁盘故障,ZFS就会意识到磁盘故障。 ZFS需要块存储,并不关心或了解存储的细节以及来自哪里。 它只跟踪所遇到的任何读取,写入或校验和错误。 监控底层存储设备的运行状况取决于您。

ZFS文档有一个值得一读的故障排除部分 。 关于更换或修复受损设备的部分介绍了在故障情况下您可能遇到的情况以及如何解决问题。 你会做同样的事情,你会为没有ZFS的设备。 检查系统日志中的SCSI驱动程序,HBA或HD控制器和/或SMART监视软件的消息,然后采取相应措施。

重复数据删除和其他ZFSfunction如何?

无论底层块存储是否encryption,所有ZFSfunction都可以工作。

概要

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

首先要记住的是,ZFS不应该以这种方式使用。

ZFS不是一个通用的文件系统,它由一个RAID层,文件系统甚至文件服务器组成,因为ZFS本身就支持NFS。

当ZFS是控制器中运行的软件,系统RAM是控制器高速caching(ARC),而x86 CPU是控制器上的CPU时,将ZFS视为一个硬件控制器。

说,ZFS期待原始磁盘没有任何层顶部。 甚至不要考虑ZFS和磁盘中间的RAID控制器。 只需使用简单的HBA卡或控制器刷新到IT(JBOD)模式,所以它可以处理,例如,SMART错误。

ZFS的设置和使用非常复杂,它不是一个通用的文件系统,应该正确使用,以避免不可恢复的数据丢失。 由于它具有自动校验和function,所以ZFS没有恢复工具。 当你失去一个池时,你需要汇总备份。

如果您没有可用的系统RAM来执行此操作,则不要考虑ZFS重复数据删除。 重复数据删除表可以容易地达到千兆字节,如果您没有可用的内存来加载重复数据删除表,您最终将获得一个不可卸载的池。 因此,如果您想节省空间,请在您的池上启用lz4压缩,这将节省空间并增加IOPS,因为块查找将花费更less的时间。

如果您需要encryption,则应该使用ZFSencryption。

最后,ZFS是一种内存饥饿。 一些build议表示,每1TB的原始磁盘空间需要1GB的RAM。 这主要是由于ZFS的性质和caching。 小于8GB内存的任何东西都不能用于ZFS。

考虑使用ZFS设备,如果您只需要NAS / SAN / DAS,如FreeNAS或NexentaStor。 他们可以自由使用。

另一种实现是创build一个ZVOL块设备( http://zfsonlinux.org/example-zvol.html ),使用LUKSencryption新创build的ZVOL,然后在encryption块之上创build一个ext4(或其他)文件系统设备。