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

退出打印视图

更新时间: 2014 年 12 月
 
 

以缩写格式设置和显示 ZFS 文件的 ACL

可通过使用 14 个唯一字母表示权限的缩写格式来设置和显示 ZFS 文件的权限。Table 7–2 和Table 7–4 列出了表示简写权限的字母。

可以使用 ls –V 命令显示用于文件和目录的缩写 ACL 列表。例如:

# ls -V file.1
-rw-r--r--   1 root     root      206695 Jul 20 14:27 file.1
owner@:rw-p--aARWcCos:-------:allow
group@:r-----a-R-c--s:-------:allow
everyone@:r-----a-R-c--s:-------:allow

以下介绍了缩写的 ACL 输出:

owner@

所有者可以读取和修改文件的内容(rw=read_data/write_data、p=append_data)。所有者还可以修改文件的属性,如时间戳、扩展属性和 ACL(a=read_attributes 、W=write_xattr、R= read_xattr、A=write_attributes、c=read_acl、C=write_acl)。此外,所有者还可以修改文件的所有权 (o=write_owner)。

synchronize (s) 访问权限当前未实现。

group@

向组授予对文件的读取权限 (r= read_data) 和对文件属性的读取权限(a=read_attributes 、R=read_xattr、c= read_acl)。

synchronize (s) 访问权限当前未实现。

everyone@

向用户或组之外的所有人员授予对文件以及文件属性的读取权限(r=read_data、a=append_data、R=read_xattr、c=read_acl 和 s=synchronize)。

synchronize (s) 访问权限当前未实现。

与详细 ACL 格式相比,缩写 ACL 格式具有以下优点:

  • 可将权限指定为 chmod 命令的位置参数。

  • 可以删除用于标识无权限的连字符 (-) 字符,并且只需指定必需的字母。

  • 可以同一方式设置权限和继承标志。

有关使用详细 ACL 格式的信息,请参见以详细格式设置和显示 ZFS 文件的 ACL。

示例 7-11  以缩写格式设置和显示 ACL

在以下示例中,普通 ACL 存在于 file.1 中:

# ls -V file.1
-rw-r--r--   1 root     root      206695 Jul 20 14:27 file.1
owner@:rw-p--aARWcCos:-------:allow
group@:r-----a-R-c--s:-------:allow
everyone@:r-----a-R-c--s:-------:allow

在本示例中,为用户 joe 添加了对 file.1 的 read_data/execute 权限。

# chmod A+user:joe:rx:allow file.1
# ls -V file.1
-rw-r--r--+  1 root     root      206695 Jul 20 14:27 file.1
user:joe:r-x-----------:-------:allow
owner@:rw-p--aARWcCos:-------:allow
group@:r-----a-R-c--s:-------:allow
everyone@:r-----a-R-c--s:-------:allow

在以下示例中,通过使用缩写 ACL 格式向用户 joe 授予了在新创建文件和目录时会继承的读取、写入和执行权限。

# chmod A+user:joe:rwx:fd:allow dir.2
# ls -dV dir.2
drwxr-xr-x+  2 root     root           2 Jul 20 14:33 dir.2
user:joe:rwx-----------:fd-----:allow
owner@:rwxp-DaARWcCos:-------:allow
group@:r-x---a-R-c--s:-------:allow
everyone@:r-x---a-R-c--s:-------:allow

另外,还可以剪切 ls –V 输出中的权限和继承标志并将其粘贴到缩写的 chmod 格式中。例如,要将用户 joe 对 dir.2 的权限和继承标志复制给 dir.2 的用户 cindy,可将权限和继承标志 (rwx-----------:fd-----:allow) 复制并粘贴到您的 chmod 命令中。例如:

# chmod A+user:cindy:rwx-----------:fd-----:allow dir.2
# ls -dV dir.2
drwxr-xr-x+  2 root     root           2 Jul 20 14:33 dir.2
user:cindy:rwx-----------:fd-----:allow
user:joe:rwx-----------:fd-----:allow
owner@:rwxp-DaARWcCos:-------:allow
group@:r-x---a-R-c--s:-------:allow
everyone@:r-x---a-R-c--s:-------:allow
示例 7-12  ACL 继承模式设置为 Passthrough 时的 ACL 继承

将 aclinherit 属性设置为 passthrough 的文件系统会继承所有可继承 ACL 项,并且继承 ACL 项时不会对其进行任何修改。当此属性设置为 passthrough 时,会使用由可继承 ACE 确定的权限模式来创建文件。如果不存在影响权限模式的可继承 ACE,则会根据应用程序要求的模式设置权限模式。

以下示例使用缩写 ACL 语法来说明如何通过将 aclinherit 模式设置为 passthrough 来继承权限位。

在本示例中,对 test1.dir 设置了 ACL 以强制继承。该语法会为新创建的文件创建 owner@、group@ 和 everyone@ ACL 项。新创建的目录会继承 @owner、group@ 和 everyone@ ACL 项。

# zfs set aclinherit=passthrough tank/cindy
# pwd
/tank/cindy
# mkdir test1.dir
# chmod A=owner@:rwxpcCosRrWaAdD:fd:allow,group@:rwxp:fd:allow,
everyone@::fd:allow test1.dir
# ls -Vd test1.dir
drwxrwx---+  2 root     root           2 Jul 20 14:42 test1.dir
owner@:rwxpdDaARWcCos:fd-----:allow
group@:rwxp----------:fd-----:allow
everyone@:--------------:fd-----:allow

在此示例中,新创建的文件会继承指定继承到新创建的文件的 ACL。

# cd test1.dir
# touch file.1
# ls -V file.1
-rwxrwx---+  1 root     root           0 Jul 20 14:44 file.1
owner@:rwxpdDaARWcCos:------I:allow
group@:rwxp----------:------I:allow
everyone@:--------------:------I:allow

在本示例中,新创建的目录会继承用于控制对此目录访问权限的 ACE 以及用于将来传播到新创建目录的子级的 ACE。

# mkdir subdir.1
# ls -dV subdir.1
drwxrwx---+  2 root     root           2 Jul 20 14:45 subdir.1
owner@:rwxpdDaARWcCos:fd----I:allow
group@:rwxp----------:fd----I:allow
everyone@:--------------:fd----I:allow

fd----I 项用于传播继承,在访问控制期间不会被考虑。

在以下示例中,在不存在继承 ACE 的另一目录中使用普通 ACL 创建了一个文件。

# cd /tank/cindy
# mkdir test2.dir
# cd test2.dir
# touch file.2
# ls -V file.2
-rw-r--r--   1 root     root           0 Jul 20 14:48 file.2
owner@:rw-p--aARWcCos:-------:allow
group@:r-----a-R-c--s:-------:allow
everyone@:r-----a-R-c--s:-------:allow
示例 7-13  ACL 继承模式设置为 Passthrough-X 时的 ACL 继承

如果启用 aclinherit=passthrough-x,对于 owner@、group@ 或 everyone@ 设置,将使用执行 (x) 权限创建文件,但是只有在文件创建模式以及影响该模式的可继承 ACE 中设置执行权限才行。

以下示例说明了如何通过将 aclinherit 模式设置为 passthrough-x 来继承执行权限。

# zfs set aclinherit=passthrough-x tank/cindy

在 /tank/cindy/test1.dir 上设置了以下 ACL,以便为 owner@ 的文件提供可执行 ACL 继承。

# chmod A=owner@:rwxpcCosRrWaAdD:fd:allow,group@:rwxp:fd:allow,
everyone@::fd:allow test1.dir
# ls -Vd test1.dir
drwxrwx---+  2 root     root           2 Jul 20 14:50 test1.dir
owner@:rwxpdDaARWcCos:fd-----:allow
group@:rwxp----------:fd-----:allow
everyone@:--------------:fd-----:allow

使用请求的权限 0666 创建文件 (file1),但生成的权限为 0660。没有继承执行权限的原因是,创建模式未请求该权限。

# touch test1.dir/file1
# ls -V test1.dir/file1
-rw-rw----+  1 root     root           0 Jul 20 14:52 test1.dir/file1
owner@:rw-pdDaARWcCos:------I:allow
group@:rw-p----------:------I:allow
everyone@:--------------:------I:allow

接下来,在 testdir 目录下使用 cc 编译器来生成名为 t 的可执行文件。

# cc -o t t.c
# ls -V t
-rwxrwx---+  1 root     root        7396 Dec  3 15:19 t
owner@:rwxpdDaARWcCos:------I:allow
group@:rwxp----------:------I:allow
everyone@:--------------:------I:allow

生成的权限为 0770,这是因为 cc 请求了权限 0777,这导致从 owner@、group@ 和 everyone@ 条目继承了执行权限。

示例 7-14  ACL 与对 ZFS 文件的 chmod 操作的交互

以下示例展示了特定的 aclmode 和 aclinherit 属性值如何影响现有的 ACL 与 chmod 操作(更改文件或目录权限来减少或扩展现有的任何 ACL 权限以便与所属组一致)的交互。

在此示例中,aclmode 属性设置为 mask,aclinherit 属性设置为 restricted。此示例中的 ACL 权限以简写模式显示,这样可以更方便地展示权限更改。

原始的文件和组所有权以及 ACL 权限如下所示:

# zfs set aclmode=mask pond/whoville
# zfs set aclinherit=restricted pond/whoville

# ls -lV file.1
-rwxrwx---+  1 root     root      206695 Aug 30 16:03 file.1
user:amy:r-----a-R-c---:-------:allow
user:rory:r-----a-R-c---:-------:allow
group:sysadmin:rw-p--aARWc---:-------:allow
group:staff:rw-p--aARWc---:-------:allow
owner@:rwxp--aARWcCos:-------:allow
group@:rwxp--aARWc--s:-------:allow
everyone@:------a-R-c--s:-------:allow

一个 chown 操作更改了 file.1 的文件所有权,现在所属用户 amy 在查看输出。例如:

# chown amy:staff file.1
# su - amy
$ ls -lV file.1
-rwxrwx---+  1 amy      staff     206695 Aug 30 16:03 file.1
user:amy:r-----a-R-c---:-------:allow
user:rory:r-----a-R-c---:-------:allow
group:sysadmin:rw-p--aARWc---:-------:allow
group:staff:rw-p--aARWc---:-------:allow
owner@:rwxp--aARWcCos:-------:allow
group@:rwxp--aARWc--s:-------:allow
everyone@:------a-R-c--s:-------:allow

下面的 chmod 操作将权限更改为限制性更强的模式。在此示例中,sysadmin 组和 staff 组的修改后 ACL 权限未超出所属组的权限。

$ chmod 640 file.1
$ ls -lV file.1
-rw-r-----+  1 amy      staff     206695 Aug 30 16:03 file.1
user:amy:r-----a-R-c---:-------:allow
user:rory:r-----a-R-c---:-------:allow
group:sysadmin:r-----a-R-c---:-------:allow
group:staff:r-----a-R-c---:-------:allow
owner@:rw-p--aARWcCos:-------:allow
group@:r-----a-R-c--s:-------:allow
everyone@:------a-R-c--s:-------:allow

下面的 chmod 操作将权限更改为限制性更弱的模式。在此示例中,sysadmin 组和 staff 组的修改后 ACL 权限恢复为允许与所属组相同的权限。

$ chmod 770 file.1
$ ls -lV file.1
-rwxrwx---+  1 amy      staff     206695 Aug 30 16:03 file.1
user:amy:r-----a-R-c---:-------:allow
user:rory:r-----a-R-c---:-------:allow
group:sysadmin:rw-p--aARWc---:-------:allow
group:staff:rw-p--aARWc---:-------:allow
owner@:rwxp--aARWcCos:-------:allow
group@:rwxp--aARWc--s:-------:allow
everyone@:------a-R-c--s:-------:allow