为什么需要映射层
Windows 侧期望用条目式 ACL 描述「谁能做什么」,Linux 文件系统最基础的形态只有九个权限位。Samba 若不做额外处理,Windows 客户端设置的细粒度权限在落盘时会被压缩成权限位,返回给客户端时再展开成一套推断出来的条目:看起来有权限,实际语义已经丢失,继承也基本失效。解决方法是用扩展属性保存完整的 ACL,并在两侧做语义翻译。
基本信息
| 适用平台 | Linux/Samba 服务端 + Windows 客户端 |
|---|---|
| 核心模块 | vfs objects 中的 acl_xattr(或用 acl_tdb 存放在数据库) |
| 继承相关参数 | map acl inherit、inherit acls、inherit permissions |
| 前提条件 | 服务端文件系统启用 ACL 与扩展属性,并保留挂载选项 |
| 影响 | 权限语义是否完整、复制文件时权限是否跟着走 |
常用配置项与作用
| 配置项 | 作用 | 要注意什么 |
|---|---|---|
| acl_xattr | 把 Windows ACL 存入扩展属性 | 复制与备份必须保留扩展属性 |
| map acl inherit | 让继承语义在两侧对应 | 需与上层目录设计一起考虑 |
| inherit acls | 新建文件继承目录上的 ACL | 与默认 ACL 配合检查 |
| inherit permissions | 新条目继承父目录权限位 | 与上一项同时启用时结果需实测确认 |
Samba 侧配置片段
Samba 侧配置片段
[global]
# 保存并正确解释 Windows ACL 语义
vfs objects = acl_xattr
map acl inherit = yes
# 让新建内容带上目录上的 ACL
inherit acls = yes
[data]
path = /srv/data
read only = no
# 具体参数含义以所装 Samba 版本的官方文档为准复制与验证要点
复制与验证要点
# 复制时必须保留扩展属性,否则 ACL 会丢
rsync -aHAX /srv/data/ /backup/data/
tar --xattrs --acls -czf data.tgz -C /srv data # 归档同样要带扩展属性
# 验证服务端 ACL 是否真的落在扩展属性上
getfacl /srv/data/sample.txt
getfattr -d -m - /srv/data/sample.txt | head -n 20
testparm -s /etc/samba/smb.conf # 确认配置生效启用扩展属性保存 ACL 之后,权限的载体就不只是权限位了:用普通复制、普通压缩包或无 xattr 支持的存储搬迁数据,都会把 ACL 丢掉,而权限位看上去仍在。因此备份与迁移流程必须同步升级,否则恢复出来的共享权限与原始状态不同。
权限模型不宜来回切换:从权限位模式改为 ACL 模式(或反向)时,已有文件的权限表示方式不一致,同一目录下不同时期创建的文件可能表现出完全不同的权限行为,排查成本很高。切换前应先确认全量数据的处理方案。