在 Oracle® Solaris 11.2 中管理 ZFS 文件系统

退出打印视图

更新时间: 2014 年 12 月
 
 

新的 ZFS 共享语法

zfs set 命令用于通过 NFS 或 SMB 协议共享和发布 ZFS 文件系统。或者,您可以在创建文件系统时设置 share.nfsshare.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

包含每属性继承的 ZFS 共享

在已升级到最新池版本 34 的池中,提供了新的共享语法,可利用 ZFS 属性继承,从而更轻松地进行共享维护。每个共享特征将成为单独的 share 属性。share 属性由以 share. 前缀开头的名称标识。share 属性示例包括 share.descshare.nfs.nosuidshare.smb.guestok

share.nfs 属性控制是否启用 NFS 共享。share.smb 属性控制是否启用 SMB 共享。传统的 sharenfssharesmb 属性名称仍可用,因为在新池中,sharenfsshare.nfs 的别名,sharesmbshare.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   
旧池中的 ZFS 共享继承

在旧池中,只有 sharenfssharesmb 属性由后代文件系统继承。其他共享特征均存储在每个共享的 .zfs/shares 文件中,不会被继承。

一个特殊规则是,只要创建了从其父项继承 sharenfssharesmb 的新文件系统,就会基于 sharenfssharesmb 值为此文件系统创建缺省共享。请注意,如果直接将 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

ZFS 命名共享

您可以创建命名共享,它可以在 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)

ZFS 自动共享

创建自动共享时,会从文件系统名称中构建唯一资源名称。构建的名称是文件系统名称的副本,但是,对于文件系统名称中的字符,如果在资源名称中不合法,将被替换为下划线字符 (_)。例如,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 共享信息

通过使用 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

更改 ZFS 共享属性值

可以通过在文件系统共享上指定新属性或修改的属性来更改共享属性值。例如,如果在创建文件系统时设置只读属性,则可将此属性设置为 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 共享

您可以通过使用 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.nfsshare.smb 属性之前,这些共享将保持独享状态。

在发出 zfs unshare 命令时不会删除已定义的共享,在下次对文件系统发出 zfs share 命令时或为文件系统设置 share.nfsshare.smb 属性时,它们会重新处于共享状态。

删除 ZFS 共享

您可以通过将 share.nfsshare.smb 属性设置为 off 来取消文件系统共享。例如:

# zfs set share.nfs=off tank/multifs
# grep multifs /etc/dfs/sharetab
# 

您可以使用 zfs destroy 命令永久删除命名共享。例如:

# zfs destroy tank/home/abc%a1share

非全局区域中的 ZFS 文件共享

从 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