Jeremy Allison 和 Andrew Tridgell 的虚拟访谈

作者:John Blair

Andrew Tridgell 和 Jeremy Allison 共同编写了 Samba 的大部分代码,Samba 是用于 UNIX 和类 UNIX 操作系统的流行的 SMB(Windows 网络)文件服务器。Andrew 是 Samba 的创建者,目前是澳大利亚国立大学的博士生。Jeremy 目前在位于加利福尼亚州山景城的 Whistle Communications Corporation 工作。Whistle 使用 Samba 从 InterJet 互联网设备提供 Windows 文件共享服务。Jeremy 在 Whistle 的部分工作是开发和维护 Samba,以确保它在 InterJet 上正常工作。在进行这次采访之前,当 Jeremy 和 Andrew 都为我的书《Samba:UNIX 和 Windows 集成》提供了宝贵的评论时,我通过电子邮件与他们“见过面”。

Virtual Interview with Jeremy Allison and Andrew Tridgell

Jeremy Allison

Virtual Interview with Jeremy Allison and Andrew Tridgell

Andrew Tridgell

这次采访被称为“虚拟”采访,因为它实际上并非以印刷形式进行。我通过电话采访了 Jeremy,他的评论几乎完全取自那次谈话的录音带,尽管为了可读性进行了一些修改。Andrew 的评论是在事后通过电子邮件添加的。

John:Samba 随附的“history”文件描述了 Andrew 如何通过使用数据包转储反向工程 DEC Pathworks 协议来编写 Samba 的前身。显然,他这样做的动机是因为他已经习惯于使用 PC-NFS 访问他在 Sun 机器上的主目录,但无法同时运行 DEC Pathworks 客户端和 PC-NFS 客户端。Jeremy,你是如何参与 Samba 的?

Jeremy:那时我在 Vantive 工作。我正在悄悄地将 Vantive 产品移植到 NT 上——他们没有要求我这样做,但我知道这是他们需要的。当时没有适用于 NT 的 PC-NFS 客户端,所以我实际上是使用 FTP 进行移植的。我会 ftp 源代码文件,编译它们,然后再 ftp 回去。这非常痛苦。大约在同一时间,Andrew 发布了 SMB 服务器 1.x——他的第二个版本。我下载下来看了一下。我记得他说这是 Andrew 的第一个网络程序,它有点粗糙。

Andrew:我没有意识到 Jeremy 这么早就关注它了。我从 Jeremy 收到的第一批电子邮件大约在 1993 年 12 月左右,版本大约是 1.5.20。那是在我或任何其他人对代码进行任何工作近两年空白期之后。0.1 版本大约在 1991 年 12 月发布。

Jeremy:我实际上正在移植一个网络服务,它的工作方式与 Samba 完全相同,所以我开始加强网络代码并添加一些东西。Andrew 仅仅通过嗅探线路就实现了 Samba,因为他非常聪明,而我如果没有规范就做不到那种事情。由于我有 X-Open 规范,我想,为什么不扩展它并实现 Core Plus 呢?所以,我基本上添加了 Core Plus 协议,它加入了文件锁定和一大堆其他操作。这对我来说效果很好。

然后 Andrew 再次超越了我,加入了 LanMan 1 协议。我们有点互相超越,但我们都想不出如何实现长文件名,我们被困在那里一段时间。

然后我在山景城的一家书店里浏览,拿起一本关于 OS/2 编程的书,我突然想到 OS/2 已经不得不处理这个问题了。然后我想,既然是微软,如果他们只是将长文件名结构线性化到线路上怎么办?好吧,可能会发生更糟糕的事情,所以我决定尝试一下。幸运的是,我得了流感一个星期,所以我坐在家里用我的电脑,那是我编程生涯中的一个禅宗时刻,你只是把它编码出来,尝试一下,它就奏效了——以前没有,以后也没有!后来我们发现了一些错误,但在很大程度上它起作用了。

Andrew:是的,规范只是说“特定于级别的结构”来描述这些结构。我们不熟悉 trans2 的东西,那是真正的绊脚石。一旦 Jeremy 编写了 trans2.c,事情就真正开始进展了,因为我们有了执行所有“现代”SMB 功能(如长文件名)所需的基础设施。我们在一段时间内与 OS/2 头文件进行了大量工作,这些文件确实很有帮助。Jeremy 在 1994 年 10 月为 1.8.0 版本贡献了 trans2 代码。这是一个巨大的进步。

John:那么,根据您的经验,官方 X-Open 规范的准确性如何?

Jeremy:实际的 Core 规范在您达到 OS/2 支持之前都非常准确。一旦您进入规范的 OS/2 区域,它就会消失,就像地图上的“此处有恶龙”。

Andrew:是的,它只是说“特定于级别的结构”,然后就到此为止了。您需要记住,当 X-Open 规范编写时,主要客户端(Windows)没有长文件名,因此不将其放入并非不合理,特别是由于完整的描述将是巨大的。

John:所以协议只是他们能让它工作的任何东西?

Jeremy:是的,基本上是这样。协议真的很糟糕。它像疣一样生长。你可以通过观察它来判断。所以,发生的事情是,一旦我们让长文件名支持工作起来,我们接下来想要让它工作的是加密密码支持。我们讨厌必须输出明文密码。微软实际上拒绝向任何人透露一个“魔术常量”。它用于 LanMan 密码支持的 DES 加密。他们拒绝在没有 NDA(保密协议)的情况下将其透露给我们。我们回复说“我们不会给你 NDA,因为我们正在发布源代码。”

这件事搁置了一段时间,直到我去西雅图参加微软 NT 会议,并与一位,呃,有点智力障碍的微软人士交谈,她基本上说“你们为什么要破坏我们所有的 LanMan 系统?”,我说“我没有,我想与他们互操作”,我想这对她来说是一回事。所以,她让我与一位微软程序员 Richard Ward 联系,他负责他们的一些安全工作。我和他聊了聊,他不能告诉我那是什么,但他说,如果你转发给我一条消息,我会让你与更了解它的人联系。

现在发生的事情——这真的很有趣——他让我联系的程序员基本上说,“好吧,你需要知道什么?” 我想,好吧,如果我直接问他这个问题,我就不会得到答案。他会说,“我不能告诉你那个。” 所以,我换了一种方式提问。LanMan 加密是一个两阶段操作,我们需要中间部分。我以这样一种方式提出问题,我们可以从他告诉我们的内容中倒推。我问,如果我们加密这个密码,第二阶段会是什么?一旦他告诉我们,倒推它就很简单了,魔术常量就出来了。一旦我有了这个常量,我实际上查看了微软重定向器的 hexdump,魔术常量明明白白地包含在一个零字段中。

Andrew:我们实际上花了一两天时间才意识到他发送的信息给了我们我们需要的东西。Jeremy 和我在几个小时内都独立地意识到了这一点。这是一个意想不到的惊喜!

John:所以一旦你知道在哪里看,就很容易看到魔术常量?[注意:魔术常量是 KGS!@#$%。]

Jeremy:是的,一旦你知道在哪里看,但它确实证实我们完全知道它是什么。所以,加密密码的东西花了一段时间才弄好。我做了所有的 SMB 密码 stuff,对此我有点紧张,因为它是一个 setuid 程序,我从来都不喜欢编写 setuid 程序。在那之后,我基本上有一段时间没有管 Samba 了,最终去了 Cygnus 工作,从事 Kerberos 工作。这时 Volker(另一位 Samba 团队成员和 Linux 的 SMB 文件系统的作者)加入了,当我最终回到它时,Volker 问“这家伙是谁?”,因为我已经有一段时间没有在 Samba 上工作了。

我们去参加了一个 CIFS(通用互联网文件系统)会议,Roger Binns,他编写了 VisionFS(SCO 编写的另一个用于某些 UNIX 系统的 SMB 文件服务器),对我说“你的共享模式支持完全坏了,你知道吗?” 我回答说,“是吗?” 在那次谈话之后,SGI 的 Herb Lewis 开始进行一些基准测试,甚至去犹他州将 Samba 与其他程序(如 Syntax(VisionFS)代码)进行基准测试。Herb 评论说,“我无法运行 NetBench,因为我一直遇到共享模式冲突。” 我想起了 Roger Binns 告诉我的话,所以我开始查看共享模式代码。这段代码是一项巨大的工作,但它并不完全安全——它只为每个打开的文件存储一个共享模式。我们现在有一个完全正确的共享模式实现。所以,换句话说,我们可以为每个打开的文件设置多个共享模式条目。一旦我把所有这些代码都放进去——这大约是 1.9.17 版本,我们就可以运行 NetBench 了。我们得到了合理的结果——它们还可以——可能和 Syntax 的一样好。

这时我意识到,我们提高性能需要的是 oplocks(“机会锁”)。大约在同一时间,Herb,他对至少我部分的 Samba 代码产生了很大的影响,开始抱怨他的浏览坏了——他无法让他的浏览列表在子网中可见。Luke(Luke Kenneth Casson Leighton——另一位 Samba 团队成员)编写了所有这些东西,我一直认为它起作用。基本上,我去了 SGI 的网络上玩,我意识到浏览方面存在一些问题。所以那时我开始参与浏览器的东西——我开始修复 Luke 的代码。

现在已经有三种浏览器代码的实现。第一个是 Andrew 完成的单线程完全阻塞的版本,它基本上使它启动并运行。然后 Luke 接手并将其变成一个事件驱动的模型,这真是一项了不起的工作,做得非常好。但他同时仍在学习协议。所以,我修改了该代码部分的一些内容,它在某种程度上起作用了,但我意识到,为了使其完全稳健,我必须保持相同的事件模型和数据结构,但完全重写代码。所以这就是我最终做的事情。这项努力实际上是由 Whistle 需要浏览在半可靠链接(即,会定期断开的链接)上正确工作这一事实推动的。我一开始并没有重写它——只是修复了那一部分,但我最终完全重写了它。这是其中一件事情,你知道,过了一段时间,你就会发现你已经完全重写了一些东西,而没有意识到。

Andrew:实际上,第一个版本并不是完全阻塞的——它使用递归来模拟线程的一些属性(一个 真的 很糟糕的想法)。它可以工作,但很容易耗尽堆栈。Luke 的实现解决了这个问题,并添加了许多新代码。

Jeremy:所以,然后,我知道 oplock 实现是可能的。我有一个设计方案,但在我真正有时间坐下来做它之前,大约过去了六个月。oplock 代码可能是 Samba 现在最复杂的部分。

John:它可能是 Windows 网络中最复杂的部分。

Jeremy:嗯,是的。这花了很多时间才弄对。典型的 SMB,有很多规范中没有的丑陋的实现细节。例如,当有人执行需要中断 oplock 的打开操作时,您是否先检查拒绝模式?现在,逻辑会指示您这样做,因为如果拒绝模式不允许您打开文件,则无需检查 oplock。事实证明,如果您这样做,一切都会崩溃。我的第一个实现将其作为一种优化,因为我认为,好吧,这将非常快。事实证明,如果您这样做,很多程序都会崩溃,因为很多 Windows 95 重定向器内部结构都期望一个文件可以打开两次,第二次打开会导致 oplock 中断,即使它仍然会遇到共享模式冲突。

John:您认为编写它的人是在为他们自己的服务器代码进行优化吗?

Jeremy:我不知道。以前他们只针对自己的服务器进行过测试。可能有很多非常奇怪的 hack 在那里,它们针对他们自己的服务器工作,我们必须模拟它们。当然,每当重定向器坏了,并且它不能与 Samba 一起工作时,人们就会说 Samba 坏了。

John:稍微改变一下话题,您在 Whistle 工作仅仅是为了 Samba 还是您有其他职责?

Jeremy:我有其他职责,尽管让 Samba 工作一直是我的工作的重要组成部分。目前的一个问题是 Samba 对 Whistle 来说已经足够好了,所以我实际上可能不得不从事其他一些程序。但是,我真的很喜欢扩展 Samba。我目前对 1.9.19 的计划是做 NT SMB,它将实现 change notify 和许多其他选项。Whistle 所做的实际上非常好的一件事是,他们推动我为 Samba 做了动态国际化支持。

John:还有什么最后的评论吗?

Jeremy:还有一件事你应该包括——我的妻子是 Network Appliance 的产品营销经理,Network Appliance 是一家 SMB 实现公司。所以,我和我的妻子与 Samba 和 Network Appliance 一起直接竞争,这真的很有趣。她进行销售培训,其中包括对 Samba 的竞争分析。她说人们总是问,“是什么样的怪人编写了这些东西然后免费赠送?”

John:这让我想起了一些对话,在这些对话中我试图解释 GPL。我花了一段时间才完全理解它并理解其含义,而解释它是一次漫长的对话——有点像解释一种政治理论。

Jeremy:是的,这是一个革命性的想法。像大多数革命性的想法一样,它最终将改变世界,并且需要一段时间才能理解。我现在不会在任何其他许可证下发布软件。我以前这样做过,我一直认为这是一个错误,并对此感到后悔。我以 BSD 许可证发布了 pwdump stuff,我现在希望我没有这样做。我看到其他人重用了该代码,但由于许可证的原因,我看不到他们是如何使用它的——他们不必回报。

John:Andrew,你为什么选择在 GPL 下发布 Samba?

Andrew:我一开始没有!Server-0.1 和 1.5 之前的所有版本都使用“如果您想将此用于商业目的,请与我联系”许可证。

1.5 版本是在 2 年的空白期之后以及在我开始使用 Linux 之后发布的。我对 Linux 印象深刻,并选择了 GPL,不是因为我理解它(我没有),而是因为它 Linux 使用了它。现在我理解了 GPL,我很高兴我选择了它。它鼓励了 Samba 所需的那种开发努力。

Virtual Interview with Jeremy Allison and Andrew Tridgell
John Blair 目前是阿拉巴马大学伯明翰分校大学计算机中心的系统管理员,他在那里管理着几台 UNIX 和(震惊,恐怖)Windows NT 服务器。到本文发表时,他可能在其他地方工作。John 也是 SAMBA: Integrating UNIX and Windows 的作者,该书由为您带来 Linux Journal 的同一批人出版。欢迎通过电子邮件 jdblair@uab.edu 与他联系。
加载 Disqus 评论