Oracle Solaris ZFS 管理指南

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

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

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


# ls -V file.1
-rw-r--r--   1 root     root      206663 Jun 17 10:07 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

以下介绍此缩写 ACL 输出:

owner@

拒绝属主对文件的执行权限 (x=execute)。

owner@

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

group@

拒绝组对文件的修改和执行权限 (write_data、p=append_data 和 x=execute)。

group@

授予组对文件的读取权限 (r=read_data)。

everyone@

拒绝非文件属主或非文件所属组成员执行或修改文件内容以及修改文件任何属性的权限(w=write_data、x=execute、p=append_data、A=write_xattr、W=write_attributes、C=write_acl 和 o=write_owner)。

everyone@

授予非文件属主或非文件所属组成员读取文件和文件属性的权限 (r=read_data、a=append_data、R=read_xattr、c=read_acl 和 s=synchronize)。synchronize 访问权限当前未实现。

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

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


示例 8–10 以缩写格式设置和显示 ACL

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


# ls -V file.1
-rw-r--r--   1 root     root      206663 Jun 17 10:07 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

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


# chmod A+user:gozer:rx:allow file.1
# ls -V file.1
-rw-r--r--+  1 root     root      206663 Jun 17 10:07 file.1
        user:gozer:r-x-----------:------:allow
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

为用户 gozer 添加相同权限的另一种方法是在特定位置(例如 4)插入新 ACL 项。这样,位于位置 4-6 的现有 ACL 将被下推。例如:


# chmod A4+user:gozer:rx:allow file.1
# ls -V file.1
-rw-r--r--+  1 root     root      206663 Jun 17 10:16 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
        user:gozer:r-x-----------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

在以下示例中,向用户 gozer 授予了继承用于新创建的文件和目录的读取、写入和执行权限。


# chmod A+user:gozer:rwx:fd:allow dir.2
# ls -dV dir.2
drwxr-xr-x+  2 root     root           2 Jun 17 10:19 dir.2
        user:gozer:rwx-----------:fd----:allow
            owner@:--------------:------:deny
            owner@:rwxp---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow

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


# chmod A+user:cindys:rwx-----------:fd----:allow dir.2
# ls -dV dir.2
drwxr-xr-x+  2 root     root           2 Jun 17 10:19 dir.2
       user:cindys:rwx-----------:fd----:allow
        user:gozer:rwx-----------:fd----:allow
            owner@:--------------:------:deny
            owner@:rwxp---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow


示例 8–11 aclinherit 属性设置为 passthrough 时的 ACL 继承

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

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

在本示例中,对 test1.dir 目录设置了 ACL 以强制继承。该语法会为新创建的文件创建 owner@、group@ 和 everyone@ ACL 项。新创建的目录会继承 @owner、group@ 和 everyone@ ACL 项。此外,目录会继承六个其他将 ACE 传播至新创建的目录和文件的 ACE。


# zfs set aclinherit=passthrough tank/cindys
# pwd
/tank/cindys
# 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 Jun 17 10:37 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 Jun 17 10:38 file.1
            owner@:rwxpdDaARWcCos:------:allow
            group@:rwxp----------:------:allow
         everyone@:--------------:------:allow

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


# mkdir subdir.1
# ls -dV subdir.1
drwxrwx---+  2 root     root           2 Jun 17 10:39 subdir.1
            owner@:rwxpdDaARWcCos:fdi---:allow
            owner@:rwxpdDaARWcCos:------:allow
            group@:rwxp----------:fdi---:allow
            group@:rwxp----------:------:allow
         everyone@:--------------:fdi---:allow
         everyone@:--------------:------:allow

-di-- 和 f-i--- 项用于传播继承,在访问控制期间不会被考虑。在本示例中,会使用继承 ACE 不存在的另一目录中的普通 ACL 创建文件。


# cd /tank/cindys
# mkdir test2.dir
# cd test2.dir
# touch file.2
# ls -V file.2
-rw-r--r--   1 root     root           0 Jun 17 10:40 file.2
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow


示例 8–12 aclinherit 属性设置为 passthrough-x 时的 ACL 继承

当 aclinherit 属性设置为 passthrough-x 时,对于 owner@、group@ 或 everyone@ 设置,将使用执行 (x) 权限创建文件,但前提是在文件创建模式以及影响该模式的可继承 ACE 中设置了执行权限。

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


# zfs set aclinherit=passthrough-x tank/cindys

对 /tank/cindys/test1.dir 设置以下 ACL,以便针对 owner@、group@ 和 everyone@ 设置为文件提供可执行 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 Jun 17 10:41 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 Jun 17 10:42 test1.dir/file1
            owner@:rw-pdDaARWcCos:------:allow
            group@:rw-p----------:------:allow
         everyone@:--------------:------:allow

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


# cc -o t t.c
# ls -V t
-rwxrwx---+  1 root     root        7396 Jun 17 10:50 t
                 owner@:rwxpdDaARWcCos:------:allow
                 group@:rwxp----------:------:allow
              everyone@:--------------:------:allow

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