zfs set 命令用于通过 NFS 或 SMB 协议共享和发布 ZFS 文件系统。或者,您可以在创建文件系统时设置 share.nfs 或 share.smb 属性。
例如,创建和共享 tank/sales 文件系统。对于每个用户,缺省共享权限均为读写权限。后代 tank/sales/logs 文件也将自动共享,因为 share.nfs 属性会继承到后代文件系统且 tank/sales/log 文件系统会设置为只读访问权限。
# zfs create -o share.nfs=on tank/sales # zfs create -o share.nfs.ro=\* tank/sales/logs # zfs get -r share.nfs tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs on local tank/sales% share.nfs on inherited from tank/sales tank/sales/log share.nfs on inherited from tank/sales tank/sales/log% share.nfs on inherited from tank/sales
您可以按照以下方式为共享文件系统提供特定系统的 root 访问权限:
# zfs set share.nfs=on tank/home/data # zfs set share.nfs.sec.default.root=neo.daleks.com tank/home/data
在已升级到最新池版本 34 的池中,提供了新的共享语法,可利用 ZFS 属性继承,从而更轻松地进行共享维护。每个共享特征将成为单独的 share 属性。share 属性由以 share. 前缀开头的名称标识。share 属性示例包括 share.desc、share.nfs.nosuid 和 share.smb.guestok。
share.nfs 属性控制是否启用 NFS 共享。share.smb 属性控制是否启用 SMB 共享。传统的 sharenfs 和 sharesmb 属性名称仍可用,因为在新池中,sharenfs 是 share.nfs 的别名,sharesmb 是 share.smb 的别名。如果要共享 tank/home 文件系统,请使用类似如下的语法:
# zfs set share.nfs=on tank/home
在此示例中,share.nfs 属性值会继承到任何后代文件系统。例如:
# zfs create tank/home/userA # zfs create tank/home/userB # grep tank/home /etc/dfs/sharetab /tank/home tank_home nfs sec=sys,rw /tank/home/userA tank_home_userA nfs sec=sys,rw /tank/home/userB tank_home_userB nfs sec=sys,rw
在旧池中,只有 sharenfs 和 sharesmb 属性由后代文件系统继承。其他共享特征均存储在每个共享的 .zfs/shares 文件中,不会被继承。
一个特殊规则是,只要创建了从其父项继承 sharenfs 或 sharesmb 的新文件系统,就会基于 sharenfs 或 sharesmb 值为此文件系统创建缺省共享。请注意,如果直接将 sharenfs 设置为 on,则在后代文件系统中创建的缺省共享只具有缺省 NFS 特征。例如:
# zpool get version tank NAME PROPERTY VALUE SOURCE tank version 33 default # zfs create -o sharenfs=on tank/home # zfs create tank/home/userA # grep tank/home /etc/dfs/sharetab /tank/home tank_home nfs sec=sys,rw /tank/home/userA tank_home_userA nfs sec=sys,r
您可以创建命名共享,它可以在 SMB 环境中设置权限和属性时提供更多的灵活性。例如:
# zfs share -o share.smb=on tank/workspace%myshare
在上一示例中,zfs share 命令为 tank/workspace 文件系统创建了名为 myshare 的 SMB 共享。您可以通过此文件系统的 .zfs/shares 目录访问 SMB 共享以及显示或设置特定权限或 ACL。每个 SMB 共享均由单独的 .zfs/shares 文件表示。例如:
# ls -lv /tank/workspace/.zfs/shares -rwxrwxrwx+ 1 root root 0 May 15 10:31 myshare 0:everyone@:read_data/write_data/append_data/read_xattr/write_xattr /execute/delete_child/read_attributes/write_attributes/delete /read_acl/write_acl/write_owner/synchronize:allow
命名共享从父文件系统继承共享属性。如果在上一示例中将 share.smb.guestok 属性添加到父文件系统,此属性将继承到命名共享。例如:
# zfs get -r share.smb.guestok tank/workspace NAME PROPERTY VALUE SOURCE tank/workspace share.smb.guestok on inherited from tank tank/workspace%myshare share.smb.guestok on inherited from tank
在为文件系统的子目录定义共享时,命名服务在 NFS 环境中可能会很有帮助。例如:
# zfs create -o share.nfs=on -o share.nfs.anon=99 -o share.auto=off tank/home # mkdir /tank/home/userA # mkdir /tank/home/userB # zfs share -o share.path=/tank/home/userA tank/home%userA # zfs share -o share.path=/tank/home/userB tank/home%userB # grep tank/home /etc/dfs/sharetab /tank/home/userA userA nfs anon=99,sec=sys,rw /tank/home/userB userB nfs anon=99,sec=sys,rw
上一示例还说明了,在保持所有其他属性继承不变的情况下,将文件系统的 share.auto 设置为 off 将禁用该文件系统的自动共享。与大多数其他共享属性不同,share.auto 属性不可继承。
创建公共 NFS 共享时还可以使用命名共享。只能在命名 NFS 共享上创建公共共享。例如:
# zfs create -o mountpoint=/pub tank/public # zfs share -o share.nfs=on -o share.nfs.public=on tank/public%pubshare # grep pub /etc/dfs/sharetab /pub pubshare nfs public,sec=sys,rw
有关 NFS 和 SMB 共享属性的详细说明,请参见 share_nfs(1M) 和 share_smb(1M)。
创建自动共享时,会从文件系统名称中构建唯一资源名称。构建的名称是文件系统名称的副本,但是,对于文件系统名称中的字符,如果在资源名称中不合法,将被替换为下划线字符 (_)。例如,data/home/john 的资源名称是 data_home_john。
通过设置 share.autoname 属性名称,可以在创建自动共享时将文件系统名称替换为特定名称。在继承时还会使用该特定名称替换前缀文件系统名称。例如:
# zfs create -o share.smb=on -o share.autoname=john data/home/john # zfs create data/home/john/backups # grep john /etc/dfs/sharetab /data/home/john john smb /data/home/john/backups john_backups smb
如果在尚未处于共享状态的文件系统上使用传统的 share 命令或 zfs set share 命令,其 share.auto 值将自动设置为 off。传统的命令始终会创建命名共享。此特殊规则可防止自动共享干扰要创建的命名共享。
通过使用 zfs get 命令显示文件共享属性的值。以下示例显示了如何显示一个文件系统的 share.nfs 属性:
# zfs get share.nfs tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs on local
以下示例显示了如何显示后代文件系统的 share.nfs 属性:
# zfs get -r share.nfs tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs on local tank/sales% share.nfs on inherited from tank/sales tank/sales/log share.nfs on inherited from tank/sales tank/sales/log% share.nfs on inherited from tank/sales
zfs get all 命令语法不能获取扩展共享属性信息。
可以通过使用以下语法显示有关 NFS 或 SMB 共享信息的特定详细信息:
# zfs get share.nfs.all tank/sales NAME PROPERTY VALUE SOURCE tank/sales share.nfs.aclok off default tank/sales share.nfs.anon default tank/sales share.nfs.charset.* ... default tank/sales share.nfs.cksum default tank/sales share.nfs.index default tank/sales share.nfs.log default tank/sales share.nfs.noaclfab off default tank/sales share.nfs.nosub off default tank/sales share.nfs.nosuid off default tank/sales share.nfs.public - - tank/sales share.nfs.sec default tank/sales share.nfs.sec.* ... default
因为存在多个共享属性,请考虑使用非缺省值显示属性。例如:
# zfs get -e -s local,received,inherited share.all tank/home NAME PROPERTY VALUE SOURCE tank/home share.auto off local tank/home share.nfs on local tank/home share.nfs.anon 99 local tank/home share.protocols nfs local tank/home share.smb.guestok on inherited from tank
可以通过在文件系统共享上指定新属性或修改的属性来更改共享属性值。例如,如果在创建文件系统时设置只读属性,则可将此属性设置为 off。
# zfs create -o share.nfs.ro=\* tank/data # zfs get share.nfs.ro tank/data NAME PROPERTY VALUE SOURCE tank/data share.nfs.sec.sys.ro * local # zfs set share.nfs.ro=none tank/data # zfs get share.nfs.ro tank/data NAME PROPERTY VALUE SOURCE tank/data share.nfs.sec.sys.ro off local
如果创建 SMB 共享,还可以添加 NFS 共享协议。例如:
# zfs set share.smb=on tank/multifs # zfs set share.nfs=on tank/multifs # grep multifs /etc/dfs/sharetab /tank/multifs tank_multifs nfs sec=sys,rw /tank/multifs tank_multifs smb -
删除 SMB 协议:
# zfs set share.smb=off tank/multifs # grep multifs /etc/dfs/sharetab /tank/multifs tank_multifs nfs sec=sys,rw
您可以重命名已命名的共享。例如:
# zfs share -o share.smb=on tank/home/abc%abcshare # grep abc /etc/dfs/sharetab /tank/home/abc abcshare smb - # zfs rename tank/home/abc%abcshare tank/home/abc%a1share # grep abc /etc/dfs/sharetab /tank/home/abc a1share smb -
您可以通过使用 zfs unshare 命令临时取消共享命名共享而不将其销毁。例如:
# zfs unshare tank/home/abc%a1share # grep abc /etc/dfs/sharetab # # zfs share tank/home/abc%a1share # grep abc /etc/dfs/sharetab /tank/home/abc a1share smb -
发出 zfs unshare 命令时,会取消共享所有文件系统共享。在对文件系统发出 zfs share 命令之前或为文件系统设置 share.nfs 或 share.smb 属性之前,这些共享将保持独享状态。
在发出 zfs unshare 命令时不会删除已定义的共享,在下次对文件系统发出 zfs share 命令时或为文件系统设置 share.nfs 或 share.smb 属性时,它们会重新处于共享状态。
您可以通过将 share.nfs 或 share.smb 属性设置为 off 来取消文件系统共享。例如:
# zfs set share.nfs=off tank/multifs # grep multifs /etc/dfs/sharetab #
您可以使用 zfs destroy 命令永久删除命名共享。例如:
# zfs destroy tank/home/abc%a1share
从 Oracle Solaris 11 开始,您可以在 Oracle Solaris 非全局区域创建和发布 NFS 共享。
如果挂载了某个 ZFS 文件系统且它在非全局区域中可用,则可以在该区域中共享它。
如果文件系统未委托给非全局区域或者未在非全局区域中挂载,则可以在全局区域中共享该文件系统。如果文件系统已添加到非全局区域,则只能使用传统的 share 命令来共享该文件系统。
例如,/export/home/data 和 /export/home/data1 文件系统在 zfszone 中可用。
zfszone# share -F nfs /export/home/data zfszone# cat /etc/dfs/sharetab
zfszone# zfs set share.nfs=on tank/zones/export/home/data1 zfszone# cat /etc/dfs/sharetab