跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 管理:ZFS 文件系统 Oracle Solaris 11.1 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
6. 使用 Oracle Solaris ZFS 快照和克隆
7. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
Oracle Solaris 11.1 发行版通过利用 ZFS 属性继承来简化 ZFS 共享管理。在运行池版本 34 的池中启用了新的共享语法。
每个文件系统可定义多个共享。一个共享名可唯一标识一个共享。您可以定义用来共享文件系统中的特定路径的属性。缺省情况下,所有文件系统都不共享。通常,在创建共享之前,NFS 服务器服务不会启动。如果创建了有效的共享,NFS 服务将自动启动。如果 ZFS 文件系统的 mountpoint 属性设置为 legacy,则只能通过使用传统的 share 命令共享该文件系统。
share.nfs 属性会替换以前发行版中用于定义和发布 NFS 共享的 sharenfs 属性。
share.smb 属性会替换以前发行版中用于定义和发布 SMB 共享的 sharesmb 属性。
sharenfs 属性和 sharesmb 属性分别是 share.nfs 属性和 share.smb 属性的别名。
/etc/dfs/dfstab 文件不再用于在引导时共享文件系统。设置这些属性以自动共享文件系统。SMF 管理 ZFS 或 UFS 共享信息,以便在重新引导系统时自动共享文件系统。此功能意味着,其 sharenfs 或 sharesmb 属性未设置为 off 的所有文件系统在引导时均处于共享状态。
sharemgr 接口不再可用。传统的 share 命令仍可用于创建传统的共享。请参见下面的示例。
share-a 命令与以前的 share -ap 命令类似,因此,共享文件系统将是持久性的。share -p 选项不再可用。
例如,如果要共享 tank/home 文件系统,请使用如下语法:
# zfs set share.nfs=on tank/home
您还可以在现有文件系统共享上指定其他属性值,也可以修改现有属性值。例如:
# zfs set share.nfs.nosuid=on tank/home/userA
在上一示例中,对 tank/home 文件系统设置了 share.nfs 属性,share.nfs 属性值将继承到任何后代文件系统。例如:
# zfs create tank/home/userA # zfs create tank/home/userB
Oracle Solaris 11 语法仍受支持,因此,您可以分两步共享文件系统。此语法在所有池版本中均受支持。
首先使用 zfs set share 命令创建 ZFS 文件系统的 NFS 或 SMB 共享。
# zfs create rpool/fs1 # zfs set share=name=fs1,path=/rpool/fs1,prot=nfs rpool/fs1 name=fs1,path=/rpool/fs1,prot=nfs
然后将 sharenfs 或 sharesmb 属性设置为 on 以发布共享。例如:
# zfs set sharenfs=on rpool/fs1 # grep fs1 /etc/dfs/sharetab /rpool/fs1 fs1 nfs sec=sys,rw
可以使用传统的 zfs get share 命令显示文件系统共享。
# zfs get share rpool/fs1 NAME PROPERTY VALUE SOURCE rpool/fs1 share name=fs1,path=/rpool/fs1,prot=nfs local
此外,用于共享文件系统的 share 命令仍受支持,以共享文件系统中的任何目录,其语法与 Oracle Solaris 10 发行版中的语法类似。例如,要共享某个 ZFS 文件系统:
# share -F nfs /tank/zfsfs # grep zfsfs /etc/dfs/sharetab /tank/zfsfs tank_zfsfs nfs sec=sys,rw
上面的语法与共享 UFS 文件系统的语法完全一致:
# share -F nfs /ufsfs # grep ufsfs /etc/dfs/sharetab /ufsfs - nfs rw /tank/zfsfs tank_zfsfs nfs rw
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 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 on 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
在本节中识别任何转换问题。
导入带有旧共享属性的文件系统-导入池或接收文件系统流(它们均在 Oracle Solaris 11 之前创建)时,sharenfs 和 sharesmb 属性会在属性值中直接包括所有共享属性。在大多数情况下,一旦共享每个文件系统,这些传统的共享属性就会转换为一组等效的命名共享。因为在大多数情况下,导入操作会触发挂载和共享,所以,在导入过程中会直接发生转换为命名共享的操作。
从 Oracle Solaris 11 升级-在池升级到版本 34 之后,第一个文件系统共享需要的时间可能会很长,因为命名服务需要转换为新格式。升级过程中创建的命名服务是正确的,但不能利用共享属性继承。
显示共享属性值:
# zfs get share.nfs filesystem # zfs get share.smb filesystem
如果引导回较旧的 BE,请将 sharenfs 和 sharesmb 属性重置为其原始值。
从 Oracle Solaris 11 Express 升级-在 Oracle Solaris 11 和 11.1 中,sharenfs 和 sharesmb 属性只能具有 off 和 on 值。这些属性不再用于定义共享特征。
/etc/dfs/dfstab 文件不再用于在引导时共享文件系统。引导时,将自动共享包括已启用文件系统共享的所有已挂载 ZFS 文件系统。将 sharenfs 或 sharesmb 设置为 on 时,将启用共享。
sharemgr 接口不再可用。传统的 share 命令仍可用于创建传统的共享。share-a 命令与以前的 share -ap 命令类似,因此,共享文件系统将是持久性的。share -p 选项不再可用。
升级系统-如果因该发行版中的属性更改而导致引导回 Oracle Solaris 11 Express BE,则 ZFS 共享将是不正确的。非 ZFS 共享不受影响。如果您打算引导回较旧的 BE,则在 pkg update 操作之前应该首先保存现有共享配置的副本,以便能够在 ZFS 数据集上恢复共享配置。
在较旧的 BE 中,使用 sharemgr show -vp 命令可列出所有共享及其配置。
使用以下命令显示共享属性值:
# zfs get sharenfs filesystem # zfs get sharesmb filesystem
如果返回到较旧的 BE,请将 sharenfs 和 sharesmb 属性以及使用 sharemgr 定义的所有共享重置为其原始值。
传统的取消共享行为-使用 unshare -a 命令或 unshareall 命令可取消共享文件系统,但是不会更新 SMF 共享系统信息库。如果尝试重新共享现有的共享,则会检查到共享系统信息库中的冲突,并显示一个错误。
查看以下共享行为方案和注意事项:
在 zfs clone 和 zfs send 操作中,共享属性和 .zfs/shares 文件的处理方式不同。.zfs/shares 文件包含在快照中并保留在 zfs clone 和 zfs send 操作。包含命名共享的共享属性未包含在快照中。有关 zfs send 和 zfs receive 操作期间的属性行为的说明,请参见向 ZFS 快照流应用不同的属性值。完成克隆操作之后,所有文件均来自上一克隆快照,而属性将继承自克隆在 ZFS 文件系统分层结构中的新位置。
某些传统的共享操作会自动禁用自动共享并将现有自动共享转换为等效的命名共享。如果某文件系统未按预期处于共享状态,请检查其 share.auto 值是否已设置为 off。
如果对创建命名共享的请求由于此共享与自动共享冲突而失败,则可能需要禁用自动共享才能继续。
如果以只读方式导入池,则其属性及其文件均不能修改。在这种情况下,不能引入新共享。如果在导出池之前已建立共享,则可以使用现有共享特征(如果可能)。
下表列出了已知共享状态以及解决它们的方式(如果需要)。
|