Solaris 操作系统中的通用网际文件系统(CIFS):这是一个非常有趣的概念;一直以来激发着 Sun 开发人员创新的激情。
4 年前我接受尝试向 Solaris 添加 CIFS 服务的请求。“确实,这种尝试是可能的,但可能比您想象的更为冒然。您明白您要完成的这项任务吗?”
几年来我们一直从事独立的 CIFS 实现方面的工作,我们使用它作为 Solaris CIFS 项目的基础,但这需要时间将各项事宜搞定:在 Sun 公司的管理方面可能发生的事情和 Sun 工程师正式认可的事情之间存在巨大的差异。获得必要的支持需要花费一定时间,而且在 Solaris CIFS 服务器项目真正立项还需两年的时间。
尽管当时我并不了解这一情况,但 16 年前当我正从事多操作系统、分布式、事务处理系统方面的工作时(当时似乎我永远要将 ONC RPC 移植到另一个操作系统上) 这项工作全面展开。我偶然接触到称作 OSF DCE 的分布式计算环境,它将 DCE RPC 应用于客户机服务器通信、X.500 名称服务和 Kerberos 安全性。我们在各种不同的 UNIX 操作系统之间使用 DCE 构建一个原型,但创建产品决定使用不同的技术。人们正在探讨将 DCE 应用于 CORBA(对象请求代理)服务器,我们也采用了基于事务处理监视器的 DCE,但我们并不认为 DCE 会流行,而且,我想我再也不会听到关于它的进展信息了 ---- 对它我没有什么印象。
大约 10 年前,我接受一个小的网络附加存储(NAS)公司的请求,帮助设计并实现面向新事务、日志文件系统(而非 ZFS)。我们开始从事这方面的工作,但是大量的 OEM 交易随之而来,为了将最终成为 StorageTek 5320 NAS 实现生产化,文件系统被搁置在一边。在这一过程中要全盘考虑许多事情,但主要问题之一是缺乏综合的 CIFS 服务。开发团队中没有人精通 Windows 或 CIFS,因此我承担了此项重任,没有多久我就意识到我不得不转到 DCE 中直接运行。CIFS 已经有所发展:MSRPC 从本质上是 DCE RPC,且 Active Directory 建立在 LDAP 和 Kerberos 的基础上。哇,太棒了!
10 年了......
许多人会假设或者想要 Solaris CIFS 服务器项目像 Samba 那样,但那样会是什么结果呢?诚然,要避免对 Solaris 做重大改动,但是目前 Samba 在 Solaris 上仍可用。创建另一个 Samba 没有太多意义。如果您真想要一个可以在基础层与 Windows 真正互操作的集成 CIFS 实现,操作系统必须支持一定核心功能。那么就不得不对 Solaris 做重大改动。
这并不奇怪,最有争议的话题似乎是将大小写不敏感性引入 Solaris 文件系统内的可能性。导致反反复复讨论的许多问题是十分讨厌的事情而且也很是令人分心,因为这不是我真正关心的事情。大小写不敏感性对于与 Windows 的透明互操作性很重要,因为它能确保文件名称由使用完全不同的字符编码体系的应用程序和协议所共享,但是对于解决方案不危及 POSIX 的一致性,我会将解决方案实现可视化。我真正关心的是,假设 UNIX 和 Windows 凭证不匹配,在文件系统内如何支持集成文件访问控制。不惟一 UID 和 GID 的想法在 UNIX 内是非常盛行,以至于我不能确信有可能影响对获得 CIFS 集成进行修改的水平。CIFS 访问控制依赖于访问标记(Windows 凭证)和安全描述符,其中用户和用户组由惟一的、长度可变的安全标识符 (SID)表示。NFSv4 和 ZFS 通过 NFSv4 访问控制列表(Access Control List,ACL)提供部分兼容性,但是这些 ACL 和 Solaris 凭证在大小固定且在 NIS 域之间惟一的 UID 和 GID 上仍可找到。
Afshin(CIFS 项目团队的高级成员)和我花了大量时间进行讨论并做出结论,我们不能设法回避证书问题。结果,在 2006 年 12 月 -- 也就是我提交 CIFS Service 项目建议书(PSARC case 2006/715)的当月,Afshin 撰写并分发了题为“CIFS/NFSv4 统一授权” 的白皮书,文中提出针对 CIFS、NFSv4、局部用户和 ZFS 建立统一访问控制模型的建议,并引入了现在在 ZFS 中使用的 FUID 概念。该文章引发了相当广泛的讨论,但困难尚未克服;如何将如此巨大变动变为现实?
我们继续在其他方面展开研究,其他方面没有不足之处,但是很难看到通往胜利的曙光,直到 2007 年 2 月,当与 Jeff Bonwick 和 Mike Shapiro 一起喝咖啡时的一次偶然讨论,Sun 公司的这两名杰出工程师(在此不必介绍) 改变了 CIFS 项目的未来。他们问及项目的进展情况,我向他说明想要改动的数量。经过简短的讨论和白板辩论后我们达成一致意见,Mike 说本周要阅读一下相关资料然后写出一些东西。该详细描写内容成为 PSARC case 2007/064(用于 Solaris 的统一 POSIX 和 Windows 凭证),我们的 Solaris CIFS 服务开始有所进展。
我们已经具备了在 Solaris 上构建基本的 CIFS 服务,但是这还需要多花 8 个月,22 个 ARC 案例以及大量人手帮助和许多天来提交项目。2007 年 10 月 25 日,CIFS 服务项目将 800 多个文件、大约 370,000 行代码 (包括 180,000 行新代码)放回到 Solaris 操作系统。
这是一个庞大而又复杂的项目(包括最后一年紧锣密鼓工作在内的几年研制),它将一些根本性的更改融合到 Solaris。
这就是 CIFS 的真实情况、为什么向 Solaris 添加支持以及我们做了哪些更改?
通用网际文件系统(CIFS),也称作服务器信息块(SMB),是用于 Windows 文件共享服务的标准,对于 Solaris 而言,基本目标之一是继续提高和增强其作为存储操作系统和平台的作用。通过添加 CIFS,对于 CIFS (Windows、MacOS 等)客户机和 NFS,提供无缝、广为应用的共享文件是实现该目标的主要步骤。与同样是 OpenSolaris 项目的 CIFS 客户机结合使用,CIFS 服务器帮助在 Solaris 上提供综合、集成的本机 Windows 互操作性。
在 Solaris 上 Samba 意味着什么呢 ?实际上不多。Samba 是一个良好的多平台应用服务,为 Windows 和 CIFS 客户机提供文件和打印服务。它是一个可移植的用户空间应用程序,并在 Solaris 上受到积极支持。Solaris CIFS 服务是本机的内核实现;也是 Solaris 操作系统的一级用户,已经与 NFS、ZFS 和许多操作系统功能增强进行集成以便提供无缝、广为应用的跨协议文件共享。
目前存在一个普遍的错误概念,即 Windows 的互操作性仅仅是使用 CIFS 协议实现文件传输的一种情况。不幸的是,那种理解并不深入。Windows 的互操作性也要求服务器支持各种 Windows 服务,通常是 MSRPC 服务,并且它对服务行为方式很敏感:Windows 的互操作性要求使 CIFS 服务器确保是 Windows 客户机或“是 Windows”的服务器。如果操作系统在基础层支持那些服务,上述情况才真正有可能。
除了 CIFS/SMB 和 MSRPC 协议和服务之外:
我们向 Solaris 凭证添加对 SID 的支持。这一做法解决了集中访问控制问题:CIFS 可以根据 SID 指定用户,并且 ZFS 可以使用该信息执行本机文件系统访问控制。
目前存在各种各样支持新属性、共享预留空间和强制锁定的 VFS 更新和增强。随着凭证的更改,这也是影响在 Solaris 中每个文件系统接口的重要作用力。
ZFS 增强包括:
对 DOS 属性(归档、隐藏、只读和系统)的支持
大小写不敏感文件名称操作。
存在三种模式:区分大小写模式、大小写不敏感模式和混合模式
通过选项对广为应用的的跨协议文件共享加以支持以便确保仅采用 UTF-8 进行名称编码。
原子 ACL-on-create 语义。
增强的 ACL 对 Windows 兼容性的支持
类似于 sharenfs 的 sharesmb。
我们项目的目标之一是最大限度减少引入新命令的数量。为此,被用于管理 NFS 共享和 NFS 配置的 sharemgr(1M) 和 sharectl(1M) 已经得到进一步增强从而支持 CIFS。Sharemgr 现在支持指定的共享资源且目录可以被多次共享。Sharectl 已经得到进一步增强以便支持 CIFS 配置。
各种文件系统实用程序已经或正在被更新以便支持新属性和功能:chmod、(un)compress、cp、cpio、ls、(un)pack、pax 和 tar。绝大多数文件系统命令已经得到修改以便适应所做的更改。pax 和 cpio 命令尚未进行修改并将简单地忽略新属性。
已经引入一项与 sys_nfs 类似的新权限 sys_smb,来限制对 NetBIOS 和 SMB 端口的访问。sys_smb 权限要求对端口 137、138、139 和/ 或 445 进行绑定。因为这些端口作为根运行 Samba,使得这些端口之间没有什么差别。否则,将需要对进程权限设置使用 ppriv 进行修改,以便运行带有 sys_smb 权限的进程。privileges(5) 手册页被更新以便包括 PRIV_SYS_SMB。
Solaris CIFS 服务的初始集成支持工作组和域模式,并提供综合的 CIFS 文件共享服务实现。对于 CIFS 互操作性的最高水平,以混合的区分大小写模式使用 ZFS。这将保留对本地和 NFS 访问的预期行为,同时最大限度增加与 Windows、MacOS 和其他 CIFS 客户机的互操作性。请注意,必须在ZFS 文件系统创建时设置区分大小写模式,在创建后不得修改该模式。
尽管项目尚未完成,但这是一段漫长而又有趣的旅程。在从事 CIFS 的研究时使用“有趣”一词当然是不错的委婉说法 ---- 其实质出于幽默。该现行项目正处于进行阶段,在我们稍作休息之后还有更多工作要做。

