第三章:共享数据集

OpenZFS集成了通过以下三种方式共享数据集:

但是FreeBSD内置仅支持NFS和iSCSI。本章将介绍FreeBSD的iSCSI和NFS实现,以及它们与ZFS的关系,并提供一些关于将SMB与ZFS一起使用的说明。

第三章:共享数据集SMBiSCSI目标配置网络文件系统NFS配置类型启用NFSv2/v3配置NFSv2/v3 via ZFS启用NFSv4通过ZFS配置NFSv4调试ZFS NFS

SMB

可以使用Samba等程序通过SMB共享ZFS数据集(https://www.samba.org)。它在任何其他文件系统上的工作方式都于Samba完全相同。ZFS对Samba几乎没有任何限制或要求,甚至可以通过设置 casesensitivity 属性为 mixed 来混用大小写,以适应SMB与Windows客户端共享数据集。

然而,通过Samba共享的ZFS数据集对SMB客户端来说可能看起来很奇怪。随着池的填满,客户端会看到数据集的大小缩小。如果你通过SMB监视可用空间,你会得到非常奇怪的结果。FreeNAS包括特殊支持,可以向Windows用户正确显示空间利用率。

可以利用Samba和ZFS来复制Windows文件服务器上的许多功能。例如,可以通过Windows卷影复制访问ZFS快照。FreeNAS使用许多这样的技巧来支持Windows客户端。

如果ZFS的主要作用是通过SMB支持Windows客户端,作者强烈建议使用FreeNAS。

iSCSI

您可以通过您喜欢的任何iSCSI目标软件共享zvol。FreeBSD 10和更高版本包括Cam Target Layer守护程序 ctld(8) ,它用作iSCSI目标。ctld(8) 软件通常比旧FreeBSD版本中使用的 istgt 软件包具有更高的性能。

然而,ZFS管理工具尚未与FreeBSD iSCSI目标软件集成。在 ctld 中管理zvol的共享,而不是使用 zfs(8) 。我们将介绍配置支持zvol的iSCSI目标,以及支持ZFS的iSCSI设备的一些性能注意事项。

有关iSCSI以及如何不使用它的更多详细信息,请参阅Lucas的《FreeBSD Mastery:Specialty Filesystems》。

目标配置

iSCSI目标通过网络提供SCSI风格的存储服务。可以将其视为iSCSI服务器,但目标与服务器略有不同。iSCSI目标从不单独启动任何活动。所有请求都必须来自客户端,或称 initiator (发起者)。

基本iSCSI服务需要一个入口组(portal group)、一个目标(target)和一个逻辑单元号(LUN——Logical Unit Number)。

以下是 /etc/ctl.com 中的一个片段,它定义了一个门户组:

入口组命名为 group0 。此处没有配置身份验证。强烈建议为生产环境iSCSI目标配置身份验证。此入口组在计算机上的所有IPv4和IPv6上都可用。

接下来我们定义此门户组的目标,此目标包含一个LUN:

iSCSI目标的名称基于提供目标的组织的域名。理论上,您几乎可以随心所欲地命名iSCSI目标,但一些启动器软件试图使用该名称来设置优化。最好不要从商业SAN提供商那里复制目标名称。

iSCSI设备的命名方案始终以字符串 iqn 开头。然后是域名注册的年份和月份,后面是反向域名。在这里,mwlucas.org是在2013年11月注册的,因此目标名称以 iqn.2013-11.org.mwlucas 开头。然后,我们有一个冒号和这个特定目标的名称。

与我们的门户组一样,此目标不需要身份验证。门户组关键字将我们与之前创建的 group0 门户组联系起来。

此目标只有一个 LUN ,编号为 0 。我们给出文件或设备节点的路径以及目标的大小。请注意,我们在这里使用的设备节点 /dev/zvol/vm/db1 。虽然zvol可能有多个设备节点,但始终访问 /dev/zvol 下iSCSI导出的zvol的设备节点。最好使用dev的 volmode 创建这样的zvol,这样服务器的GEOM层就不会尝试和玉佩置zvol。

配置好 /etc/ctl.conf 之后,启动 ctld(8)

状态和错误消息显示在 /var/log/messages 中。

如果 ctld(8) 不符合需求,请使用你喜欢的任何目标软件。使用zvol的设备节点将其提供给发起者。

网络文件系统

关于网络文件系统(Network File System,NFS)的书已经写了整整一本。许多不同的操作系统都支持NFS,可以作为服务器或客户端,也可以同时作为两者。在本书中,我们将重点讨论通过ZFS集成工具提供NFS共享。

NFS配置类型

您可以使用传统的FreeBSD /etc/exports 文件管理ZFS支持的NFS导出,不会发生任何可怕的事情。如果您是FreeBSD老手,/etc/exports 甚至可能会感觉更舒服。但 zfs(8) 为您处理NFS管理的许多方面,并且在所有ZFS平台上工作相同。

无论您如何在主机上管理NFS,我们强烈建议您选择一种方法并坚持使用它。不要同时使用 /etc/exports 和ZFS来管理NFS共享。FreeBSD从两个位置读取共享信息,使故障排除更加烦人。

FreeBSD主机必须具有 /etc/exports 文件才能为NFS共享提供服务,即使您完全在ZFS中管理NFS也是如此。实现这一点的最简单方法是运行命令: touch /etc/exports ,尽管您可能希望导出文件仅包含将其他系统管理员定向到 zfs(8) 的注释。

与iSCSI一样,我们不会完全涵盖NFS。我们将从ZFS的角度讨论管理NFS,并在有用的地方与传统的NFS配置进行比较。

启用NFSv2/v3

如果主机未运行NFS所需的服务,则在ZFS级别启用NFS不会起任何作用。在 /etc/rc.conf 中设置以下内容,以在引导时启动为NFS提供服务所需的进程。

并非所有环境都需要所有这些服务,但打开它们不会使用太多系统资源,并且提供了最广泛的兼容性和不错的性能。

还必须允许网络上的主机通过 /etc/hosts.allow 条目访问 rpcbind(8) 。在这里,我让网络 203.0.113.0/24 访问我的NFS服务:

如果没有此 hosts.allow 条目,将没有客户端可以访问。

(该文件中有 rpcbind : ALL : deny ,即默认拒绝所有rpcbind)

配置NFSv2/v3 via ZFS

ZFS基于每个数据集配置NFS。ZFS属性 sharenfs 规定了数据集的共享方式。此属性可以配置数据集的 onoff 或NFS共享选项。

启用NFSv4

NFSv4是与NFSv2或v3完全不同的协议。除非您理解,否则不要启用NFSv4。本节将让那些已经拥有一些NFSv4知识的人启动并运行。

要启用NFSv4,请在 /etc/rc.conf 中设置以下内容:

/etc/exports 中还需要一行,定义NFS树的根。这通常是文件系统根目录。

使用单个数据集上的 sharefs 属性启动和禁用NFS共享。

通过ZFS配置NFSv4

与旧版NFS一样,使用 sharenfs 属性为单个数据集配置导出。然而,NFSv4导出目录树中的所有内容,因此继承发挥了相当大的作用。

sharenfs 设置为 on 会告诉NFS与每个人共享数据集,没有限制。您完全依赖防火墙或数据包筛选器来防止对此数据集及其子数据集的未授权访问。与其他ZFS属性一样, sharenfs 也是继承的。如果共享 zroot/home ,则共享它下面的所有主目录。

sharenfs 设置为 off 会通知NFS不共享此数据集。使用此选项可以故意覆盖父数据集的 sharenfs 设置。

将其设置为IP地址或掩码语句,将共享数据集,就像它对NFSv2/3导出所做的那样。

调试ZFS NFS

FreeBSD将 sharenfs 属性组装到导出文件 /etc/zfs/exports 中。如果您熟悉NFS,则检查该文件可能会让您深入了解文件共享工作的原因。

检查客户机和服务器上的 /var/log/messages ,以获得有关装载失败原因的提示。在 hosts.allow 和防火墙问题之后,我们看到的最常见的错误是无效的 sharenfs 属性。经过几十年的实践,Lucas仍然将允许的网络指定为CIDR块,而不是NFS友好格式。