在实际生产环境里,NFSv4 ACL 是个很容易被低估的东西。RHEL 8 默认已经支持 NFSv4.2,很多管理员却还在用老一套的 POSIX ACL 挂载共享,等到出现“能删别人文件但看不到列表”“子目录权限怎么都继承不下去”这类问题时,才回头来找 NFSv4 ACL 的解法。这篇文章不是给你抄一条命令就完事,而是把 RHEL 8 上配置和优化 NFSv4 ACLs 的完整链路过一遍,包括为什么选它、ID 映射怎么处理、权限表达式怎么写、服务端和挂载参数怎么调、以及权限不生效时怎么一步步排查。
如果你正在搭一个多用户文件共享系统,或者想把现有 NFS 共享的权限控制升级到更细粒度,这篇文章可以直接照着做。我会以 RHEL 8 为环境,覆盖服务端和客户端两端操作,也包含不少我实际维护中踩过的坑。
1. 为什么生产环境要切换到 NFSv4 ACL 而不是继续用 POSIX ACL
1.1 POSIX ACL 在 NFS 共享场景下的表达力瓶颈
传统 NFS 共享大多依赖 POSIX ACL,也就是 setfacl 设置的那类权限。POSIX ACL 的模型其实只有三条基本规则:一个 owner、一个 owning group、一组其他人,再加上若干命名用户和命名组。它的最大问题是权限位不够语义化,比如”能往目录里创建文件但不允许删别人的文件”这种需求,POSIX ACL 很难干净地表达出来。目录的“写”权限在 POSIX 模型里同时决定了创建、删除和改名,你给了用户某个目录的写权限,就基本等于给了他在这目录里“横冲直撞”的资格,想用 ACE 去阻止删除操作?对不起,POSIX ACL 里根本没有 DELETE_CHILD 这种权限位。
NFSv4 ACL 则完全是另一套模型。它参照 Windows 的 ACL 设计,把权限拆成了 READ_DATA、WRITE_DATA、APPEND_DATA、DELETE_CHILD、DELETE、READ_ACL、WRITE_ACL、WRITE_OWNER 等十几类操作,并且每个 ACE 可以明确是 allow 还是 deny。也就是说,你可以允许一个开发组往共享目录里写文件,同时单独拒绝某个人执行删除子目录内文件的操作。放到文件共享场景里,这种控制粒度才是真正够用的。
1.2 NFSv4 ACL 的 ACE 结构与权限位详解
NFSv4 ACL 的基本单位是 ACE(Access Control Entry),格式大致如下:
text复制type:flags:principal:permissions
type 是 A 表示允许,D 表示拒绝。principal 可以是 OWNER@、GROUP@、EVERYONE@,也可以是具体的 user@domain 或 group@domain。permission 部分是 NFSv4 权限位的组合,我在配置时会高频用到下面这几个:
| 短权限位 | 对应权限 | 典型用途 |
|---|---|---|
| r | READ_DATA | 读取文件内容,列目录 |
| w | WRITE_DATA | 创建/覆盖文件 |
| a | APPEND_DATA | 追加写文件,创建子目录 |
| x | EXECUTE | 执行文件,进入目录 |
| D | DELETE_CHILD | 删除目录内子项 |
| d | DELETE | 删除文件本身 |
| t | READ_ATTRIBUTES | 查看基本属性 |
| T | WRITE_ATTRIBUTES | 修改属性 |
| n | READ_NAMED_ATTRS | 读扩展属性 |
| N | WRITE_NAMED_ATTRS | 写扩展属性 |
| c | READ_ACL | 读取 ACL |
| C | WRITE_ACL | 修改 ACL |
| o | WRITE_OWNER | 变更属主 |
这套结构的优势在于“控制权限本身”的权限也被单独拆开了。比如你可以给一个管理员 C(写ACL)和 o(改属主)权限,但不需要给他文件内容读写的权限,这在 POSIX ACL 下几乎不可能优雅实现。
1.3 RHEL 8 上 NFSv4 ACL 的实际状态
RHEL 8 默认使用 NFSv4.2,服务端内核已经支持 NFSv4 ACL,不需要额外编译内核模块。也就是说,只要你在 /etc/exports 里导出目录,并且客户端用 nfs4 挂载,就天然具备 NFSv4 ACL 能力。但有个容易忽略的点:RHEL 8 的命令行工具 nfs4_getfacl 和 nfs4_setfacl 归属于 nfs4-acl-tools 包,默认是不一定装的,需要用 dnf install nfs4-acl-tools 提前装好。
另外要注意,NFSv4 ACL 在服务器上真正生效时,会和传统的 Unix mode bi
