在CentOS系统中,基础的Linux权限模型依靠所有者、所属组和其他人三种身份来控制文件与目录的访问,但在实际运维里经常会碰到更细粒度的需求。比如某台服务器上有一个共享目录,原本属于开发组,现在需要让测试组的个别成员也能写入,却又不能把整个测试组拉进开发组,否则权限会扩散。这时候传统的chmod和chown就不够用了,必须借助文件系统层面的访问控制列表,也就是ACL,来给具体的用户或组附加独立权限规则。

一、确认文件系统与挂载选项对ACL的支持
并不是所有CentOS环境下的文件系统都默认开启ACL功能。早期 ext3、ext4 在挂载时如果没有指定 acl 选项,使用 setfacl 命令就会报错提示操作不支持。你可以通过 mount 命令查看当前分区挂载参数,或者检查 /etc/fstab 文件中的配置项。如果某个分区没有 acl 标记,需要手动添加并重新挂载,否则后面所有的ACL设置都无法生效。
以 ext4 文件系统为例,假设根分区对应的设备是 /dev/sda1,我们可以在 /etc/fstab 里将对应行的挂载选项改为 defaults,acl,随后执行 mount -o remount / 使其生效。对于 XFS 文件系统,CentOS 7 及之后版本默认就支持ACL,无需额外挂载参数,但确认一下总没有坏处。只有底层文件系统真正支持,用户态的 acl 工具包才能把权限记录写进磁盘inode的扩展属性中。
安装ACL工具也很简单,CentOS 自带 yum 包管理器,执行 yum install acl 即可获得 setfacl 与 getfacl 两个核心命令。前者用于设置和修改ACL规则,后者用于查看已有规则。缺少这两个命令时,系统虽然内核支持ACL,但管理员无法便捷操作,因此这一步是基础环境准备中不可省略的环节。
二、setfacl与getfacl命令的实战用法
设置ACL最常用的命令是 setfacl,其基本语法为 setfacl -m 规则 文件或目录。规则格式通常是 u:用户名:权限 或 g:组名:权限,权限部分用 r、w、x 组合表示。例如要让用户 zhangsan 对 /data/share 目录有读写执行权限,可以运行 setfacl -m u:zhangsan:rwx /data/share。这条命令不会影响原所有者和组的权限,只是额外附加了一条针对 zhangsan 的允许规则。
若希望ACL递归应用到目录下所有已存在的子文件和子目录,需要加上 -R 参数,写成 setfacl -R -m u:zhangsan:rwx /data/share。但要注意,递归仅对执行命令时已有的内容生效,后续新建的文件不会自动继承,除非设置默认ACL。默认ACL通过 d: 前缀来声明,例如 setfacl -m d:u:zhangsan:rwx /data/share,这样之后在该目录里创建的任何文件都会带上对应的继承权限。
查看规则使用 getfacl 命令,直接跟上文件路径即可。输出内容里除了标准的 owner、group、other 权限行,还会出现 user:zhangsan:rwx 这样的额外条目,以及 default: 开头的继承项。当我们怀疑某个用户访问被拒时,第一反应应是 getfacl 核对实际生效规则,而不是反复改 chmod。下面是一段查看与设置的示例:
# 查看目录现有ACL getfacl /data/share # 给用户 lisi 添加读和执行权限 setfacl -m u:lisi:rx /data/share # 设置默认ACL让新建文件继承读权限 setfacl -m d:u:lisi:r /data/share
删除某条ACL规则可以用 -x 参数,例如 setfacl -x u:zhangsan /data/share 会移除 zhangsan 的附加权限。如果要清空全部扩展ACL恢复成传统权限模样,则使用 setfacl -b /data/share。在批量维护脚本里,先 -b 再重新 -m 是一种安全的重置思路,能避免旧规则残留造成权限混乱。
三、ACL与传统权限及umask的相互影响
很多人误以为ACL是一条独立平行的权限系统,其实它是在传统权限检查之后做更细的判断。当一个进程访问文件时,内核先按所有者、组、其他人的顺序匹配,若命中则以此为准;若未命中但存在对应ACL条目,则按ACL条目裁决。因此如果文件其他人位设为无权限,而ACL明确给了某用户读权限,该用户依然可读,这是因为ACL条目优先级在具体匹配身份时高于 other 类别。
umask 也会影响ACL继承效果。默认ACL里的掩码(mask)条目决定了最大有效权限,如果 mask 是 r-x,那么即便给用户设了 rwx,实际生效也只有 r-x。setfacl 在设置用户权限时通常会自动计算并更新 mask,但手动修改或递归操作偶尔会让 mask 收缩,导致意料之外的拒绝访问。用 setfacl -m m:rwx 路径 可以显式放宽掩码,这条在排错时非常关键。
另外,使用 cp、mv 等命令时ACL处理行为不同。mv 在同一文件系统内移动文件会保留ACL,跨文件系统则丢失;cp 默认不保留,需加 --preserve=acl 参数。打包工具 tar 在CentOS较新版本里加上 --acls 选项也能备份扩展权限。忽视这些差异,往往在迁移数据后发现权限控制失效,却又查不出原因,所以制定备份和同步方案时必须把ACL纳入考虑。
# 跨目录复制并保留ACL cp --preserve=acl /data/share/file.txt /backup/file.txt # 用tar归档时包含ACL tar --acls -czf share.tar.gz /data/share
综合来看,CentOS的ACL机制是传统权限极好的补充,它解决了多用户多组场景下精细化管控的难题。只要理清挂载支持、命令语法以及和umask掩码的关系,就能在共享目录、临时授权、应用隔离等场景中既保证协作顺畅又守住安全边界。日常运维中建议将关键路径的 getfacl 输出纳入配置审计,防止人员变动后废弃权限长期悬挂。