当需求被写成“在 Linux 机器上放一个 Windows 共享”时,Samba 看起来很简单。这个表述遮住了真正的迁移。难点不在于让 SMB 客户端看见一个文件夹。难点在于决定由哪一套系统拥有身份,Windows SID 如何变成 Unix UID 与 GID,哪只 daemon 回答哪一类请求,以及底层 Linux 文件系统能够真实承载多少 Windows 文件服务行为。[1][2][3][4]
对小型实验室共享来说,Samba 仍然可以很轻。一台独立服务器、本地用户、少量明确共享,再加上收窄的防火墙暴露面,已经足够。在企业域里,形状会改变。Samba 可以作为 Active Directory 域成员、AD 域控制器、文件服务器、打印服务器,或集群服务的一部分。这些角色不能互换。SambaWiki 的域成员指南把区别说得很直接:域成员是一台加入某个域的 Linux 机器,它自身不提供域控制器服务,却可以在 ACL 中使用域用户与组、暴露共享、支持打印,并为本地服务启用域认证。[1]
这就是采用层面的教训。Samba 应当先作为角色决策进入团队,再作为软件包进入系统。若团队还说不清这台机器究竟是成员服务器、AD DC,还是集群文件服务节点,此时讨论共享名称还太早。
从身份计划开始
迁移里最常被推迟的决定,恰恰应当最先完成:ID mapping。Windows 用 SID 标识用户与组。Unix 权限检查需要数字 UID 与 GID。Samba 的工作,是让这两套身份模型相遇,并避免它们滑向意外授权或难以排查的拒绝访问。[1][2][3]
官方域成员指南把现实选择列得很清楚。Samba 可以使用多种 winbind idmap 后端,其中 ad、rid 与 autorid 被点名为域成员部署的主要路径。[1] 更完整的 identity-mapping 页面列出了受支持后端,包括面向 RFC2307 属性的 ad、rid、autorid、ldap 与 nss,同时警告说,在 Samba AD 域控制器上的 smb.conf 中不支持 idmap 后端。[2] 这条警告并非琐碎细节;它划出了一条角色边界。一份配置在 Unix 域成员上成立,放到域控制器上就会出错。
有用的运维测试很直接:另一位管理员能否在每一台相关文件服务器上,为同一个域用户预测出同一个 Unix ID。若答案取决于安装顺序、缓存历史,或第一份被复制的 how-to,这场迁移还没有稳定下来。域成员指南用结果描述了选择:当你需要显式 Unix 属性,例如 login shell、home directory 与一致 ID 时,ad 使用 RFC2307 属性;rid 与 autorid 则从 Windows RID 计算 ID,并且不要求向 AD 添加 Unix 属性。[1]
对正在替换旧 Windows 文件服务器的团队来说,迁移计划在这里应当放慢。既有 NTFS ACL、组嵌套、继承权限、服务账号、备份任务,以及扫描仪或复印机工作流,都会把关于身份的假设写入现场。Samba 可以桥接其中很多部分,却无法挽救一套无人说得清的身份模型。
把 winbindd 当成基础设施,可选助手的心态要退场
很多 Samba 部署正是在 winbindd 这里,从“文件共享”进入真正的域集成。它的 man page 把它描述为一只 daemon,负责提供 Name Service Switch 服务,通过关联模块提供 PAM 相关认证支持,并为 Samba 自身管理到域控制器的连接。[3] 用普通工程语言说,它就是让 Unix 侧进程能够解析并认证 Windows 域身份,并把这些身份转成系统本地可使用形式的那一层。
这会带来两项采用要求。第一,nsswitch.conf 与 PAM 集成必须纳入同一份变更计划。SambaWiki 指南展示了常见 NSS 模式:本地 files 在前,winbind 加入 passwd 与 group 查询。[1] 这个顺序很重要,因为本地 root、服务用户与域用户来自不同身份源。第二,域连接、DNS、Kerberos、时间同步与机器账号健康状态都不能被放进背景细节。若 winbindd 不能可靠触达域,文件服务器看起来会像一次存储故障,即便磁盘、网络与 smbd 都没有问题。[1][3]
故障模式很容易预见:团队在调试共享权限,底层问题却是身份解析。更干净的推出流程,会在任何用户试点开始前放入明确检查:wbinfo --ping-dc、域用户与组查询、测试 ACL 应用,以及当域控制器不可用时服务将如何表现的书面答案。[1][3]
让文件服务层窄到可以推理
smbd daemon 是多数人联想到 Samba 时想到的部分,因为它提供 SMB 客户端实际使用的文件与打印服务表面。[4] 这层表面仍然应当被视为一份边界收紧的合同。Samba 共享不只是一个路径。它是文件系统语义、共享参数、认证、锁定、ACL 转换、命名行为、客户端预期,以及任何已加载 VFS 模块的组合。[4][6]
从旧 NAS 设备或 Windows 文件服务器迁移时,纪律就在这里体现出来。先从一组共享开始,不要一次搬完整个资产面。测量实际用到的特性:Office 文档锁定、大小写敏感假设、macOS 元数据行为、shadow-copy 预期、durable handles、备份代理访问,以及权限继承。然后把这些要求映射到 smb.conf 与承载文件系统上,而不要期待默认包配置自动模拟过去的一切行为。
Samba 的 Virtual File System 模块系统很有用,因为它给管理员提供了扩展共享行为的入口。SambaWiki 的 VFS 页面把 VFS 模块描述为通过模块扩展 Samba 功能的方式。[6] 这是能力,也会带来隐藏耦合。若一场迁移依赖模块来完成 ACL 存储、回收站行为、审计日志、macOS 兼容、快照,或文件系统特定加速,就应当逐个共享写下这些依赖。否则,未来一次包升级或共享拆分,就会静默丢掉用户以为属于服务本体的行为。
边界条件很简单:当团队能够同时看见 SMB 合同与底层 Unix 存储合同时,Samba 是很强的适配对象。若组织想要黑箱 appliance 体验,却不愿共同承担 Linux 身份、文件系统权限与域健康状态,Samba 的适配度就会下降。
单节点模型变得平常之后,再加入集群
Clustered Samba 是另一档采用层级,也不能被理解成“更可靠”的默认版本。CTDB 正是为这一层存在。SambaWiki 页面把 CTDB 描述为 clustered Samba 的集群数据库组件,用来提供高可用负载共享 CIFS server cluster、节点监控、public-IP 管理,以及其所管理集群数据库的自动恢复或修复。[5] 页面还说明,CTDB 与集群文件系统结合,可以为 clustered Samba、NFS 与相关服务提供高可用环境。[5]
这是一套严肃的运行模型。它意味着 public address、集群状态、共享存储、恢复行为与客户端重连都会进入文件服务设计。对于已经运营集群文件系统并且需要 active file-service continuity 的团队,CTDB 可以成为正确答案。对于仍然说不清 idmap config 范围是否重叠、所有成员服务器是否以同样方式解析用户的团队,它通常不该成为第一个答案。[1][2][5]
迁移顺序应当保守。先让一个域成员表现可预测。再让权限在第二台服务器上表现可预测。随后在真实客户端行为下测试故障场景。只有到这个阶段,CTDB 才适合进入讨论。高可用不会简化 Samba;它会让同一时间必须保持正确的边界数量成倍增加。[5]
一种务实的采用形状
健康的 Samba 试点应当有很小的影响半径。选择一个部门共享或一个应用共享,用户已知,组已知,ACL 规则已知,回滚方式已知。用正确角色加入服务器。迁移数据之前先选择 idmap 后端。确认 winbindd 可以解析域身份。对复制后的数据应用 ACL。再从 Windows、相关场景下的 macOS,以及存在于环境中的 Linux 客户端进行测试。随后演练那些难看的情况:禁用账号、重命名用户、嵌套组、离线域控制器、被锁定的 Office 文件、长路径、备份恢复与 ownership preservation。[1][3][4]
对一两名通用型管理员组成的团队来说,Samba 在范围收窄、文档严格时效果最好。对平台或基础设施团队来说,它可以支撑更大的迁移,但前提是身份、文件系统、备份、监控与域管理共同归属。这个项目已经足够成熟,软件本身很少是第一个风险。第一个风险通常是组织把 SMB 访问当成一个共享勾选框,而底层真实系统其实是身份翻译、权限保全与 Windows-Unix 语义协商。[1][2][3][4]
反证条件很清楚。若目标环境不能容忍对 AD membership、idmap 策略、Linux 文件系统权限与 share-level 行为的明确归属,无论代码多稳定,Samba 都会显得脆弱。若这些边界有人承担,Samba 仍然是开源世界里最持久的翻译层之一:它的价值来自一条清楚边界:Linux 可以参与 Windows 环境,但这种参与必须在可见的位置停下。
来源
- SambaWiki,《Setting up Samba as a Domain Member》——域成员角色、AD 准备、idmap 选择、NSS 集成与 SMBv1 警告。
- SambaWiki,《Identity Mapping Back Ends》——受支持的 idmap 后端,以及 AD 域控制器相关注意事项。
- Samba,
winbindd(8)man page——NSS、PAM、域控制器连接管理,以及用户/组解析行为。 - Samba,
smbd(8)man page——文件与打印服务 daemon 范围,以及它与smb.conf的关系。 - SambaWiki,《CTDB and Clustered Samba》——CTDB 在 clustered Samba 中的角色、节点监控、public-IP 管理与恢复行为。
- SambaWiki,《Virtual File System Modules》——VFS 模块作为 Samba 共享行为扩展点的说明。
- Wikimedia Commons,《Andrew Tridgell at Linux.conf.au 2011 -- Day 5 (5396748526) (cropped).jpg》——本文题图来源页。