OpenZFS集成了通过以下三种方式共享数据集:
但是FreeBSD内置仅支持NFS和iSCSI。
可以使用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目标软件共享zvol。
FreeBSD10和更新版本包括Cam Target Layer守护进程ctld,它充当iSCSI目标。
ctld软件通常比旧FreeBSD版本中使用的istgt软件包具有更高的性能。
然而,ZFS管理工具尚未与FreeBSD iSCSI目标软件集成。管理ctld内的zvol共享,而不是与zfs共享。我们将介绍配置zvol支持的iSCSI目标以及ZFS支持的iSCSI设备的一些性能考虑因素。
有关iSCSI的更多详细信息以及如何不使用它,可参阅FreeBSD Mastery: Specialty Filesystems。
iSCSI目标通过网络提供SCSI风格的存储服务。可能会将其视为iSCSI服务器,但目标与服务器略有不同。iSCSI目标从不自行启动任何活动。所有请求都必须来自客户端或发initiator(发起者)。
基本iSCSI服务需要一个入口组(portal group)、一个目标(target)和一个逻辑单元号(LUN——Logical Unit Number)。
以下是/etc/ctl.com中的一个片段,它定义了一个门户组:
xxxxxxxxxx
portal-group group0 {
discovery-auth-group no-authentication
listen 0.0.0.0
listen [::]
}
入口组命名为group0。此处没有配置身份验证。强烈建议为生产环境iSCSI目标配置身份验证。此入口组在计算机上的所有IPv4和IPv6上都可用。
接下来我们定义此门户组的目标,此目标包含一个LUN:
xxxxxxxxxx
target iqn.2013-11.org.mwlucas:target0 {
auth-group no-authentication
portal-group group0
lun 0 {
path /dev/zvol/vm/db1
size 1T
}
}
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:
xxxxxxxxxx
# service ctld start
状态和错误消息显示在/var/log/messages中。
如果ctld不符合需求,请使用你喜欢的任何目标软件。使用zvol的设备节点将其提供给发起者。
许多不同的操作系统支持NFS,无论是作为服务器还是客户端,或者两者兼有。
FreeBSD可以使用/etc/exports文件管理ZFS支持的NFS导出。也可以用zfs处理NFS管理工作。
不要同时使用/etc/exports和ZFS管理NFS共享,这会加大管理难度,尤其是排错过程。
FreeBSD主机必须有一个/etc/exports文件来提供NFS共享,即使完全在ZFS中管理NFS。最简单的方法是创建一个空的/etc/exprots文件。
我们将从ZFS的角度介绍NFS的管理,并在有用的地方与传统的NFS配置进行比较。
如果主机没有运行NFS所需的服务,则在ZFS级别启用NFS不会起任何作用。
在/etc/rc.conf中设置以下内容,在系统启动时自动启动NFS提供服务所需的进程:
xxxxxxxxxx
nfs_server_enable=YES
rpcbind_enable=YES
mountd_enable=YES
rpc_lockd_enable=YES
rpc_statd_enable=YES
并非所有环境都需要所有这些服务,但打开它们不会使用太多系统资源,并且提供了最广泛的兼容性和不错的性能。
还必须允许网络上的主机通过/etc/hosts.allow条目访问rpcbind。在这里,我让网络203.0.113.0/24访问我的NFS服务:
xxxxxxxxxx
rpcbind: 203.0.113.0/255.255.255.0 : allow
如果没有此hosts.allow条目,将没有客户端可以访问。
ZFS基于每个数据集配置NFS。
ZFS属性sharenfs规定了数据集的共享方式。此属性可以配置数据集的on、off或NFS共享选项。
如果设置为off,ZFS不会为此数据集配置共享。但数据集仍然可以通过/etc/exports共享。
如果设置为on,这相当于在/etc/exprots中单独列出文件系统。将zroot/home的sharefs设置为on类似下面的/etc/exports条目:
xxxxxxxxxx
/home
任何地方的任何主机都以访问并NFS挂载此主机。
明智的做法是只允许某些主机访问:
xxxxxxxxxx
# zfs set sharenfs="203.0.113.208" zroot/home
这类似/etc/exports条目:
xxxxxxxxxx
/home 203.0.113.208
如果必须在属性中输入更复杂的值,请将其在引号中或其他方式转义:
xxxxxxxxxx
# zfs set sharenfs="-network 203.0.113.0 -mask 255.255.255.0" zroot/home
任何使/etc/exports条目有效的条目都可以用作sharenfs的值。
sharenfs属性无法支持任何需要/etc/exports中多行的NFS属性。对于这些环境,必须使用传统的exports文件。
NFSv4是与NFSv2或v3完全不同的协议。除非理解NFSv4,否则不要启用它。
要启用NFSv4,在/etc/rc.conf中设置如下:
xxxxxxxxxx
nfs_server_enable=YES
mountd_enable=YES
nfsv4_server_enable=YES
nfsuserd_enable=YES
你还需要在/etc/exports中有一行,定义NFS树的根。这通常是文件系统的根目录:
xxxxxxxxxx
V4: /
使用单个数据集上的sharefs属性启动和禁用NFS共享。
与旧版NFS一样,使用sharenfs属性为单个数据集配置导出。然而,NFSv4导出目录树中的所有内容,因此继承骑着相当大的作用。
将sharenfs设置为on告诉NFS无限制地与所有人共享数据集。完全依赖防火墙或数据包过滤器来防止未经授权访问此数据集及其子数据集。
与其他ZFS属性一样,sharenfs是可继承的。如果你共享了zroot/home,则也同时共享了它下面的所主目录。
将其设置为IP地址或掩码语句,可以像NFSv2/3导出一样共享数据集。
FreeBSD将sharenfs属性组装到导出文件/etc/zfs/exports中。如果你熟悉NFS,检查此文件可能会让你了解文件共享为何如此工作。
检查客户端和服务器上的/var/log/messages,了解装载失败的原因。在hosts.allow和防火墙问题之后,我们看到最常见的错误是sharenfs属性无效。
经过几十年实践,Lucas仍然将允许网络指定为CIDR块,而不是NFS友好的格式。