> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/man/man9/acl.9.md).

# acl.9

`acl` — 虚拟文件系统访问控制列表

## 名称

`acl`

## 概要

```c
#include <sys/param.h>

#include <sys/vnode.h>

#include <sys/acl.h>
```

在内核配置文件中：

```sh
options UFS_ACL
```

## 描述

访问控制列表（Access Control List，ACL）允许对表示文件和目录的 vnode 进行细粒度的权限指定。然而，由于存在大量具有不同 ACL 语义的文件系统，vnode 接口仅了解 ACL 的语法，而依赖底层文件系统实现细节。根据底层文件系统的不同，每个文件或目录可能关联零个或多个 ACL，通过相应 vnode ACL 调用的 `type` 字段命名：[VOP\_ACLCHECK(9)](https://github.com/FreeBSD-Ask/freebsd-man-sc/tree/main/man9/vop_aclcheck.9.md)、[VOP\_GETACL(9)](https://github.com/FreeBSD-Ask/freebsd-man-sc/tree/main/man9/vop_getacl.9.md) 和 [VOP\_SETACL(9)](https://github.com/FreeBSD-Ask/freebsd-man-sc/tree/main/man9/vop_setacl.9.md)。

目前，每个 ACL 在内核中由固定大小的 `acl` 结构表示，定义如下：

```c
struct acl {
        unsigned int            acl_maxcnt;
        unsigned int            acl_cnt;
        int                     acl_spare[4];
        struct acl_entry        acl_entry[ACL_MAX_ENTRIES];
};
```

ACL 由固定大小的 ACL 条目数组构成，每个条目包含一组权限、主体命名空间和主体标识符。在本实现中，`acl_maxcnt` 字段始终设置为 `ACL_MAX_ENTRIES`。

每个单独的 ACL 条目类型为 `acl_entry_t`，这是一个包含以下成员的结构：

**`ACL_UNDEFINED_FIELD`** 未定义的 ACL 类型。

**`ACL_USER_OBJ`** 有效用户 ID 与文件所有者用户 ID 匹配的进程的自由访问权限。

**`ACL_USER`** 有效用户 ID 与 ACL 条目标识符匹配的进程的自由访问权限。

**`ACL_GROUP_OBJ`** 有效组 ID 或任意补充组与文件所有者组 ID 匹配的进程的自由访问权限。

**`ACL_GROUP`** 有效组 ID 或任意补充组与 ACL 条目标识符匹配的进程的自由访问权限。

**`ACL_MASK`** 可授予文件组类中进程的最大自由访问权限。仅对 POSIX.1e ACL 有效。

**`ACL_OTHER`** 不被任何其他 ACL 条目覆盖的进程的自由访问权限。仅对 POSIX.1e ACL 有效。

**`ACL_OTHER_OBJ`** 与 `ACL_OTHER` 相同。

**`ACL_EVERYONE`** 所有用户的自由访问权限。仅对 NFSv4 ACL 有效。

**`ACL_EXECUTE`** 进程可执行关联的文件。

**`ACL_WRITE`** 进程可写入关联的文件。

**`ACL_READ`** 进程可读取关联的文件。

**`ACL_PERM_NONE`** 进程对关联的文件没有读、写或执行权限。

**`ACL_READ_DATA`** 进程可读取关联的文件。

**`ACL_LIST_DIRECTORY`** 与 `ACL_READ_DATA` 相同。

**`ACL_WRITE_DATA`** 进程可写入关联的文件。

**`ACL_ADD_FILE`** 与 `ACL_WRITE_DATA` 相同。

**`ACL_APPEND_DATA`**

**`ACL_ADD_SUBDIRECTORY`** 与 `ACL_APPEND_DATA` 相同。

**`ACL_READ_NAMED_ATTRS`** 忽略。

**`ACL_WRITE_NAMED_ATTRS`** 忽略。

**`ACL_EXECUTE`** 进程可执行关联的文件。

**`ACL_DELETE_CHILD`**

**`ACL_READ_ATTRIBUTES`**

**`ACL_WRITE_ATTRIBUTES`**

**`ACL_DELETE`**

**`ACL_READ_ACL`**

**`ACL_WRITE_ACL`**

**`ACL_WRITE_OWNER`**

**`ACL_SYNCHRONIZE`** 忽略。

**`ACL_ENTRY_TYPE_ALLOW`**

**`ACL_ENTRY_TYPE_DENY`**

**`ACL_ENTRY_FILE_INHERIT`**

**`ACL_ENTRY_DIRECTORY_INHERIT`**

**`ACL_ENTRY_NO_PROPAGATE_INHERIT`**

**`ACL_ENTRY_INHERIT_ONLY`**

**`ACL_ENTRY_INHERITED`**

**`acl_tag_t`** `ae_tag` 以下是在 `ae_tag` 中设置的 ACL 类型定义列表：每个 POSIX.1e ACL 必须恰好包含一个 `ACL_USER_OBJ`、一个 `ACL_GROUP_OBJ` 和一个 `ACL_OTHER`。如果存在 `ACL_USER`、`ACL_GROUP` 或 `ACL_OTHER` 中的任何一个，则应恰好存在一个 `ACL_MASK` 条目。

**`uid_t`** `ae_id` 此 ACL 为其描述访问权限的用户 ID。对于 `ACL_USER` 和 `ACL_GROUP` 以外的条目，此字段应设置为 `ACL_UNDEFINED_ID`。

**`acl_perm_t`** `ae_perm` 此字段定义匹配此 ACL 的进程对关联文件的访问类型。对于 POSIX.1e ACL，以下值有效：对于 NFSv4 ACL，以下值有效：

**`acl_entry_type_t`** `ae_entry_type` 此字段定义 NFSv4 ACL 条目的类型。不用于 POSIX.1e ACL。以下值有效：

**`acl_flag_t`** `ae_flags` 此字段定义 NFSv4 ACL 条目的继承标志。不用于 POSIX.1e ACL。以下值有效：`ACL_ENTRY_INHERITED` 标志设置在从父项继承的 ACE 上。它也可以通过编程方式设置，在文件和目录上都有效。

## 参见

acl(3), [vaccess(9)](/man/man9/vaccess.9.md), [vaccess\_acl\_nfs4(9)](/man/man9/vaccess_acl_nfs4.9.md), [vaccess\_acl\_posix1e(9)](/man/man9/vaccess_acl_posix1e.9.md), [VFS(9)](https://github.com/FreeBSD-Ask/freebsd-man-sc/tree/main/man9/vfs.9.md), [VOP\_ACLCHECK(9)](https://github.com/FreeBSD-Ask/freebsd-man-sc/tree/main/man9/vop_aclcheck.9.md), [VOP\_GETACL(9)](https://github.com/FreeBSD-Ask/freebsd-man-sc/tree/main/man9/vop_getacl.9.md), [VOP\_SETACL(9)](https://github.com/FreeBSD-Ask/freebsd-man-sc/tree/main/man9/vop_setacl.9.md)

## 作者

本手册页由 Robert Watson 编写。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/man/man9/acl.9.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
