Samba—Unix 与 PC 通话

作者:Andrew Tridgell

让主流 PC 操作系统与 Unix 友好通信的需求由来已久。最近,又出现了一种新的选择,它采用了与以前方法不同的策略。我指的是用于 Unix 的 SMB。

Unix 世界中占主导地位的文件共享协议是 NFS。在 DOS/Windows/NT 世界中占主导地位的协议是 Novell 和 SMB。SMB 也被称为 LanManager,尽管 LanManager 实际上只是众多实现方式之一。

如果您想让 Unix 与 DOS 通信,以便它们可以共享文件和打印资源,那么基本上有两种选择。第一种是让 PC 看起来像一个 Unix 盒子,使其使用 NFS 协议。第二种是让 Unix 盒子使用 PC 网络协议之一。

在 PC 上使用 NFS 的最佳选择是运行 PC Unix,例如 Linux。然而,对于许多 PC 用户来说,这还不是一个现实的选择。另一种选择是在 PC 上运行 NFS 客户端。这种方法的问题在于 NFS 协议的设计初衷并非面向 PC。基于 PC 的 NFS 客户端的安全性、管理和通用性远非理想。

安全性,老生常谈

仅仅意识到从 Unix 盒子向 PC 提供 NFS 服务允许 PC 处理身份验证,就应该让任何理智的系统管理员“火冒三丈”。NFS 协议要求 Unix 盒子完全信任 PC。在某些实现中,这隐藏在“登录”过程和密码保护的外表之下。不要被它愚弄了。正如我在多个场合证明的那样,任何半吊子只要能访问 PC 的控制台,就可以欺骗 Unix 盒子,使其在无需任何密码的情况下,向几乎任何人的文件授予写入权限。

如果这还不够,那就试试管理一大堆运行 NFS 客户端的 PC 吧。简直是噩梦!

那么另一种方法呢?你能让 Unix 盒子使用 PC 网络协议之一吗?简短的回答是肯定的。长期以来,已经有一些产品可以让某些 Unix 版本按照自己的方式与 PC 通信。问题是,软件供应商意识到这是一项非常有用的功能,因此收费也很高。一定有更好的方法。

Samba

确实有更好的方法。Samba 是 SMB 协议的免费 Unix 实现。SMB 协议是 Windows for Workgroups、LanManager、Windows NT 和 OS/2 的原生文件和打印机共享协议。SMB 协议是 X/Open 标准,在全球数百万台 PC 上使用。

在向您介绍 Samba 的当前版本及其功能之前,我想先回顾一下历史。许多其他免费软件包的背后可能都有类似的历史。它们都有一个起点。

一些历史

一切都始于 1991 年 12 月。当时(现在仍然是)我是在澳大利亚堪培拉的澳大利亚国立大学计算机科学实验室攻读博士学位的学生。我们刚刚获得 Digital 公司的 PC X 服务器 eXcursion 的 beta 版本,我正在我的 PC 上测试它。在这个阶段,我还是一个 MS-DOS 用户,涉足 Windows 领域。

eXcursion(当时)只能与 Dec 公司的“Pathworks”网络一起运行,用于 DOS 系统。在那之前,我一直使用 PC-NFS 连接到我们本地的 Sun 工作站,并且对此相当满意。为了运行 Pathworks,我不得不停止使用 PC-NFS,并尝试使用 Pathworks 来挂载磁盘空间。不幸的是,Pathworks 只适用于运行 VMS 或 Ultrix 的 Digital 工作站,所以我无法再从 Sun 工作站挂载磁盘空间。

我可以访问一台运行 Ultrix 的 DecStation 3100 工作站,我过去常常管理它,我产生了一个疯狂的想法,即 Pathworks 用于与 Ultrix 通信的协议应该不会太难,也许我可以弄清楚。我以前从未编写过网络程序,当然也不知道什么是套接字。

几天后,在查看了一些套接字示例代码后,我发现编写一个程序来“监视”文件共享协议非常容易。我编写并安装了这个程序(Samba 附带的 sockspy.c 程序),并捕获了 Pathworks 客户端向 Pathworks 服务器发送的所有内容。

然后,我尝试编写简短的 C 程序(使用 DOS 下的 Turbo C)来对网络驱动器执行简单的文件操作(打开、读取、cd 等),并查看服务器和客户端交换的数据包。由此,我弄清楚了数据包中某些字节的含义,并开始编写自己的程序,以便在 Sun 工作站上执行相同的操作。

又过了一天左右,我取得了最初的成功,实际上成功建立了连接并读取了一个文件。从那以后,一切都变得容易了,一周后,我很高兴(如果有点不可靠)地将 Sun 工作站上的磁盘空间挂载到运行 Pathworks 的 PC 上。服务器代码中有很多“魔法”值,这些值似乎总是与 Ultrix 服务器一起出现。直到两年后,我才弄清楚所有这些值的含义。

我认为其他人可能对我的

成果感兴趣,所以我问了大学里的几个人,但似乎没有人太感兴趣。我还与 Digital 公司在堪培拉的一位人士(组织 eXcursion beta 测试的人)交谈,询问我是否可以分发我所做的工作,或者这是否违法。那时我第一次听到了“netbios”这个词,他告诉我他认为这一切都包含在某种规范中(netbios 规范),因此我所做的事情不仅合法,而且很傻。

在四处询问后,我找到了 netbios 规范(RFC1001 和 RFC1002 规范),发现它们看起来与我编写的代码完全不同,所以我认为 Digital 公司的那个人可能弄错了。我没有意识到 RFC 指的是 TCP/IP 上的名称协商和数据包封装,而我编写的实际上是一个 SMB 实现。

无论如何,他鼓励我发布它,所以我在 1992 年 1 月发布了“Server 0.1”。我收到了很多人的良好反响,他们希望将 Pathworks 与非 Digital Unix 工作站一起使用,我很快修复了一些错误,并发布了“Server 0.5”,紧接着又发布了“Server 1.0”。

这三个版本都在大约一个月内相继发布。

此时,我的办公桌上放了一台 X 终端,不再需要 eXcursion,并且很快就忘记了整个项目,除了偶尔有人通过电子邮件向我询问。

一年过去了,只有零星的电子邮件询问新版本和错误。我甚至在 ftp 站点上添加了一条注释,请求志愿者接管代码,因为我不再使用它了。没有人自愿。

在此期间,我确实收到了一些人的来信,他们说应该可以将我的代码与 LanManager 一起使用,但我从未得到任何明确的确认。

然而,我收到的一封关于代码的电子邮件给我留下了深刻的印象。这封邮件来自南澳大利亚大学的 Dan Shearer,他说:

我在 Linux 列表的 Net 频道中听到了关于免费 Unix Pathworks 服务器的提示。经过一番追查(以及许多其他 Linux 用户的感兴趣的跟进),我从英国的某个人那里得到了您在 92 年 1 月发布的新闻稿。

您能告诉我最新情况吗?我认为您可能会突然发现 Linux 世界中至少有一大批感兴趣的黑客,这是一个事情往往发生得很快的地方(甚至编写出一些可靠的代码,BION!)。

我问他 Linux 是什么,他告诉我这是一个用于 PC 的免费 Unix 系统。那是在 1992 年 11 月,几个月后我就成为了 Linux 的拥护者!不过,我仍然不需要 Pathworks 服务器,所以我没有进行移植,但我认为 Dan 进行了移植。

大约在这个时候,我收到了 Digital 公司的电子邮件,发件人是一位从事 DEC-Alpha 软件分发工作的人。他问我是否介意他们将我的服务器包含在“contributed”CD-ROM 中。这让我有点震惊,因为我从未期望 DEC 会问我是否可以使用我的代码!我回复说没问题,但之后就再也没有收到他的消息。我不知道它是否被放到了 CD-ROM 上。

无论如何,下一个重大事件发生在 1993 年 12 月,当时 Dan 再次发邮件告诉我,我的服务器在 comp.protocols.tcpip.ibmpc 上“露出了丑陋的头”。我在群组中快速浏览了一下,惊讶地发现有人对这个东西感兴趣。

此时,我们计算机中心的一位人士向我提供了几块廉价的以太网卡(3c505,每块 15 美元),巧合的是,有人在一个 Linux 频道上宣布,他为 Linux 编写了一个 3c505 驱动程序。我购买了这些网卡,稍微修改了一下驱动程序,并在我妻子的 PC 和我的 Linux 盒子之间建立了一个家庭网络。然后我需要某种方法将两者连接起来,而我家里没有 PC-NFS,所以我认为我的服务器可能有用。在新闻组中,在关于我的服务器的讨论中,有人提到 Microsoft 已经发布了一个免费客户端,可能与我的服务器一起工作,可以通过 ftp 下载。我下载了它,惊讶地发现它第一次就与我的 Pathworks 服务器配合工作了!

好吧,然后我进行了一些修改,四处询问了一下,发现(我想是从 Dan 那里)我需要的规范是“SMB”协议,并且可以通过 ftp 获取。我抓取了它,并开始从代码中删除所有那些丑陋的常量,现在一切都解释清楚了。看到 SMB 的真正规范真是令人震惊,它让我意识到我的原始代码能够工作是多么幸运。

Samba 资源

1993 年 12 月 1 日,我宣布启动“Netbios for Unix”项目,并将多年来通过电子邮件向我询问服务器的所有人都添加到邮件列表中。

在这个阶段,我将软件包命名为 smb-server。在一个周末,当我收到一家制作商业 Unix SMB 服务器的公司的电子邮件时,这个名称很快就改变了。显然他们已经为这个名称注册了商标。我需要快速找到一个新名称,于是 Samba 诞生了。

这个列表现在已经增长到 600 多人,并且刚刚启动了一个新闻组 (comp.protocols.smb),这主要是因为人们对 Samba 感兴趣。我每天大约收到 100 次 Samba ftp 站点的连接,并且有数十名敬业的黑客为代码做出了贡献。Samba 现在已在全球许多站点用作生产 PC 文件服务器。

Samba 的几乎所有开发工作都是在我的家用 Linux 盒子上完成的。Linux 一直是一个出色的开发平台。如果没有 Linux,Samba 肯定不会有今天的成就。

它能做什么?

现在我已经把心里话说完了,我最好告诉您 Samba 能做什么。当然,我不指望在像刚才那样滔滔不绝之后还有人会继续阅读。

Samba 为 SMB 客户端提供文件和打印服务。这些客户端包括 LanManager、Windows for Workgroups、Windows NT 和 OS/2。Microsoft 还发布了一个免费的 DOS 客户端,但它非常占用内存。

Samba 还提供 Netbios 名称服务器,以便 PC 可以找到服务器,以及一个 Unix SMB 客户端程序。SMB 客户端只有一个原始的类似 ftp 的界面,但适用于 Linux 的可挂载 SMB 文件系统正在开发中。

Samba 使用了 Karl Auer 编写的相当全面的配置文件机制。Karl 还完成了 Samba 的所有文档,我认为这对于 Samba 的成功非常重要。

Samba 服务器的一些功能包括:

  • GPL 下可自由分发的源代码

  • 支持 20 多种 Unix 版本

  • 易于配置

  • 支持保留根名称的乱码文件名

  • 比 NFS 快得多

  • 比 NFS 安全得多

  • 客户端预装在许多平台上

  • 大多数客户端具有自动重新连接功能

  • 按用户名/密码、IP 地址或网络组限制访问

还有很多其他功能。Samba “受益于” Karl 的代码,这使我可以轻松添加新选项。现在服务器中有 60 多个可配置选项,可以为每个导出的文件或打印服务进行无数组合。感谢上帝赐予 Karl 的手册页。

Samba 一直在不断改进。它现在是一项分布式开发工作,有许多积极的贡献者。即将推出的版本可能会包括对可以处理长文件名的客户端(例如 Windows NT 和 Chicago)的完整长文件名支持、浏览支持和一个可挂载的 SMB 文件系统。更完整的 RFC1001/1002 netbios 名称服务器实现工作也在进行中。

获取并使用它。如果它对您不起作用,请记住它的成本有多低。也请记住向我发送错误报告。

现在我想我该去吃午饭了。

Andrew Tridgell 是澳大利亚国立大学计算机科学系的副讲师。他还在同一所大学的计算机科学实验室完成自动语音识别博士学位。

加载 Disqus 评论