管理ZFS文件系统(part 3)

ZFS文件系统可以动态创建和销毁,无需分配或格式化任何底层磁盘空间。

共享和取消共享ZFS文件系统

以下是NFS和SMB文件系统包: 每个文件系统可以被定义多个共享。每个共享的名称不相同。
可以定义用于共享文件系统中特定路径的属性。
默认情况下,所有文件系统都不共享。通常NFS服务在创建共享之前是不会启动的。创建了有效的共享之后,NFS服务将自动启动。
如果一个ZFS文件系统的mountpoint属性被设置为传统模式,该文件系统只能使用传统的share命令共享。 共享tank/home文件系统的例子:
$ zfs set share.nfs=on tank/home
上面的例子设置了tank/home文件系统的share.nfs属性为on,它的子文件系统将继承这一设置:
$ zfs create tank/home/userA
$ zfs create tank/home/userB		
也可以指定附加的属性值或修改已经存在的属性值:
$ zfs set share.nfs.nosuid=on tank/home/userA
$ zfs set share.nfs=on tank/home/userA		

  1. 关于共享有标签的文件系统
  2. 传统ZFS共享语法
  3. 新的ZFS共享语法
    1. 使用每个属性继承共享
    2. 继承旧池的ZFS共享
    3. ZFS命名共享
    4. ZFS自动共享
    5. 显示ZFS共享信息
    6. 更改ZFS共享属性值
    7. 发布和取消发布ZFS共享
    8. 移除ZFS共享
    9. 非全局区域内的ZFS共享
  4. ZFS共享迁移/过渡问题
  5. ZFS文件系统共享问题的疑难解答
关于共享有标签的文件系统
标签可以用来标记文件和文件系统,用于强制执行更严格的安全要求。
默认情况下,Oracle Solaris 11.4进制共享带标签的NFS文件。
top
传统ZFS共享语法
Oracle Solaris 11语法仍然受支持,因此可以分两步共享文件系统。所有池版本都支持此语法。 使用zfs get share命令可以查看文件系统共享(FreeBSD中是zfs get sharenfs|sharesmb):
$ zfs get share rpool/fs1
NAME       PROPERTY  VALUE  SOURCE
rpool/fs1  share     name=fs1,path=/rpool/fs1,prot=nfs  local		
此外,共享文件系统的share命令仍然支持在文件系统中共享任何目录。例如:
$ share -F nfs /tank/zfsfs
$ grep zfsfs /etc/dfs/sharetab
/tank/zfsfs    tank_zfsfs     nfs     sec=sys,rw		
FreeBSD中并没有这个命令
top
新的ZFS共享语法
zfs set命令可以用于通过NFS或SMB协议共享和发布ZFS文件系统。或者在创建文件系统时设置share.nfs|share.smb属性。
例如:
$ zfs create -o share.nfs=on tank/sales	[FreeBSD中是sharenfs=on]
$ zfs create -o share.nfs.ro=\* tank/sales/logs  [FreeBSD中没有sharenfs.ro,此命令应改为:zfs create -o sharenfs=ro\* tank/sale/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		
在FreeBSD中,sharenfs=on|off|opts。如果设置on,则数据集默认的共享属性是:sec=sys,rw,crossmnt,no_subtree_check。
如果要以只读方式‌共享,,需要在sharefs=后面跟ro

可以为共享文件系统提供特定系统的root访问,例如:
$ zfs set share.nfs=on tank/home/data
$ zfs set share.nfs.sec.default.root=neo.daleks.com tank/home/data		
这个没弄明白 top
使用每个属性继承共享
利用ZFS属性继承可以简化共享维护。每个共享特性都称为单独的share属性。每个share属性由share.开头,比如share.descshare.nfs.nosuidshare.smb.guestok
这节似乎不适用于FreeBSD,关于FreeBSD中对应的功能还有待发掘 top
继承旧池的ZFS共享
旧池中,只有sharenfssharesmb属性会被后代文件系统继承。其他共享特性被保存在每个共享系统的.zfs/shares文件中,并且不会被继承。
一条特殊规则是:每当创建从其父级继承sharenfs或sharesmb的新文件系统时,都会从sharenfs或sharesmb值为该文件系统创建默认共享。比如:
$ 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		
top
ZFS命名共享
创建命名共享使得在SMB环境中设置权限和属性具有更大的灵活性。
$ zfs share -o share.smb=on tank/workspace%myshare
此例SMB共享tank/workspace文件系统为myshare。
可以通过文件系统的.zfs/shares目录设置指定的权限或ACLs。例如:
$ 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		
FreeBSD中,ls命令没有-v选项
命名共享会从父文件系统继承属性。例如:
$ 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  		
创建公共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		
top
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		
top
显示ZFS共享信息
使用zfs get命令显示共享属性的值。例如:
$ zfs get share.nfs tank/sales
NAME        PROPERTY   VALUE  SOURCE
tank/sales  share.nfs  on     local		
同样,使用-r选项可以显示子文件系统的信息:
$ 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 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		
top
更改ZFS共享属性值
通过在文件系统共享上指定新的或修改的属性,可以更改共享属性值。例如,如果在创建文件系统时设置只读属性,可以将该属性设置为禁用:
$ 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 create -o multilevel=on -o encryption=on rpool/ftp-files
$ zfs set =/ftpsource rpool/ftp-files
$ setlabel "Conf - Internal Use Only" /ftpsource

$ zfs set share.nfs.labeled=on rpool/ftp-files
$ zfs set share.nfs=on rpool/ftp-files		
也可以使用zfs share命令启用带标记的文件系统的共享:
$ zfs share -o nfs=on -o share.nfs.labeled=on rpool/ftp-files
top
发布和取消发布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     -		
top
移除ZFS共享
可以通过设置share.nfs或share.smb属性停止共享:
$ zfs set share.nfs=off tank/mutifs
也可以通过使用zfs destroy命令永久删除命名共享:
$ zfs destroy tank/home/abc%a1share
top
非全局区域内的ZFS共享
例如:/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		
top
ZFS共享迁移/过渡问题
审查以下过度问题: top
ZFS文件系统共享问题的疑难解答
查看以下共享错误条件: 下表列出了已知共享状态以及如何解决这些状态:
共享状态 描述 解决方法
INVALID 该共享无效,因为它在内部不一致或与另一个共享冲突 尝试使用以下命令重新共享无效共享:
$ zfs share FS%share
使用此命令将显示有关共享的哪个方面验证失败的错误消息。请更正此问题,然后重试共享。
SHARED 该共享已经共享 无需操作
UNSHARED 共享有效但没有共享 尝试使用以下命令重新共享无效共享:
使用zfs share命令重新共享单个共享或父文件系统。
UNVALIDATED 该共享尚未验证。包含共享的文件系统可能未处于可共享状态。例如,它未装入或委托给当前区域以外的区域。或者,已创建代表所需共享的ZFS属性,但尚未验证为合法共享。 尝试使用以下命令重新共享无效共享:
使用zfs share命令重新共享单个共享或父文件系统。如果文件系统本身是可共享的,则尝试重新共享将成功共享(并将状态转换为共享)或失败共享(并将状态转换为无效)。或者,您可以使用share –A命令列出所有装载的文件系统中的所有共享。这将导致装入的文件系统中的所有共享被解析为非共享(有效但尚未共享)或无效。
top

2021/12/23