Samba与Linux本地ACL联动生效的核心是配置文件系统支持ACL、启用vfs objects = acl_xattr、设置默认ACL并确保权限继承。需确认挂载含acl选项,smb.conf中配置map acl inherit = yes、create mask = 0664等,并用setfacl -d设置目录默认ACL。

Linux系统中Samba共享文件夹若需与本地ACL(Access Control List)联动生效,核心在于:Samba本身不直接管理ACL,但可通过正确配置其文件创建掩码、继承策略及底层文件系统支持,使客户端操作(如Windows写入)触发的权限变更同步反映在Linux本地ACL上,同时确保ACL规则对Samba访问也实际生效。
确保文件系统支持ACL并已启用
Ext4/XFS等主流文件系统默认支持ACL,但需确认挂载选项包含acl:
- 检查:
mount | grep " /path/to/share ",输出中应含acl(如rw,relatime,acl) - 若无,临时启用:
sudo mount -o remount,acl /path/to/share - 永久生效:编辑/etc/fstab,在对应分区行的挂载选项中加入acl,例如:
/dev/sdb1 /srv/samba/share ext4 defaults,acl 0 2
配置Samba服务以尊重并触发ACL行为
关键不是让Samba“读取”ACL,而是让它创建文件时遵循ACL默认规则,并允许ACL继承生效:
- 在smb.conf共享段中设置:
vfs objects = acl_xattr(推荐)或vfs objects = acl_xattr fruit(macOS兼容场景)
此项启用POSIX ACL元数据存储于扩展属性(xattr),是Samba与Linux ACL联动的基础 - 关闭Samba自建权限映射干扰:
map acl inherit = yes
store dos attributes = yes - 控制新建文件权限,使其能被默认ACL捕获:
create mask = 0664
directory mask = 0775
避免使用0777或0666等过于宽松值,否则ACL默认规则可能被覆盖
在共享目录上设置有效的默认ACL(Default ACL)
只有设置了default ACL,新创建的子文件/目录才会自动继承权限,实现真正的“联动”:
- 为目录设置默认ACL(示例:允许组sambashare读写执行):
sudo setfacl -d -m g:sambashare:rwx /srv/samba/share - 同时设置当前目录的访问ACL(Access ACL),保证已有权限一致:
sudo setfacl -m g:sambashare:rwx /srv/samba/share - 验证:
getfacl /srv/samba/share应同时显示user::、group::、group:sambashare:及default:相关条目 - 注意:若后续新增用户或组,只需更新default ACL,新文件自然继承
验证与排错要点
常见问题多源于配置断点,按顺序排查:
- Samba服务重启后测试:
sudo systemctl restart smbd nmbd - 从Windows挂载共享,新建文件/文件夹,然后在Linux端运行
getfacl查看是否自动拥有预期ACL条目 - 若ACL未继承:确认vfs objects = acl_xattr已启用且无拼写错误;检查SELinux是否拦截(临时设为permissive测试:
sudo setenforce 0) - 若Windows用户无法写入:检查Samba用户是否属于ACL中授权的组(如sambashare),且该组在Linux中存在(
getent group sambashare)

















