Samba 简介
网络的全部意义在于允许计算机轻松共享信息。与其他 Linux 机器或任何 UNIX 主机共享信息很容易——FTP 和 NFS 等工具随时可用,并且通常很容易“开箱即用”地设置。不幸的是,即使是最顽固的 Linux 狂热者也必须承认,世界上大多数 PC 运行的操作系统是各种类型的 Windows 之一。除非您在特别隔离的环境中使用您的 Linux 机器,否则您几乎肯定需要与运行 Windows 的机器交换信息。假设您不打算使用软盘移动所有文件,那么您需要的工具就是 Samba。
Samba 是一套程序,使您的 Linux 机器能够说 SMB(服务器消息块)。SMB 是用于在运行 OS/2、Windows NT、Windows 95 和 Windows for Workgroups 的计算机之间实现文件共享和打印机服务的协议。该协议类似于 NFS(网络文件系统)、lpd(标准 UNIX 打印服务器)和分布式身份验证框架(如 NIS 或 Kerberos)的组合。如果您熟悉 Netatalk,Samba 对 Windows 所做的与 Netatalk 对 Macintosh 所做的事情相同。在运行 Samba 服务器程序时,您的 Linux 机器会像另一台 Windows 机器一样出现在“网上邻居”中。Windows 机器的用户可以“登录”到您的 Linux 服务器,并且根据他们被授予的权限,可以从 UNIX 文件系统的部分复制文件,提交打印作业,甚至向您发送 WinPopup 消息。如果您在几乎完全由 Windows NT 和 Windows 95 机器组成的环境中使用 Linux 机器,Samba 是一款非常宝贵的工具。

图 1. 网上邻居,显示 Samba 服务器
Samba 还具有执行通常需要 Windows NT 服务器充当 WINS 服务器并处理来自 Windows 95 机器的“网络登录”的功能。一个从 Samba 代码派生的 PAM 模块允许您使用 Windows NT 服务器验证 UNIX 登录。当前的一个 Samba 项目旨在逆向工程专有的 Windows NT 域控制器协议,并将其重新实现为 Samba 的组件。这段代码虽然仍处于实验阶段,但已经可以成功处理来自 Windows NT 工作站计算机的登录请求。不久之后,它将充当成熟的主域控制器 (PDC),存储用户帐户信息并与其他 NT 域建立信任关系。最重要的是,Samba 在 GNU 通用公共许可证下免费提供,就像 Linux 一样。在许多环境中,Windows NT 服务器仅需要为一组 Windows 95 机器提供文件服务、打印机后台处理程序和访问控制。Linux 和 Samba 的结合为典型的 Microsoft 解决方案提供了一个强大的低成本替代方案。
如果您对 Windows 网络的工作原理有所了解,那么理解 Samba 如何工作会更容易。Windows 客户端通过在 NetBIOS 会话上传输“服务器消息块”来使用服务器上的文件和打印机资源。NetBIOS 最初由 IBM 开发,用于定义在 MS-DOS 或 PC-DOS 上运行的软件的网络接口。它定义了一组网络服务和用于访问这些服务的软件接口,但没有指定用于在网络上移动位的实际协议。
自 NetBIOS 首次实施以来,已经出现了三种主要的 NetBIOS 变体,每种变体在使用的传输协议上都不同。最初的实现被称为 NetBEUI(NetBIOS 扩展用户接口),这是一种低开销的传输协议,专为单网段网络而设计。基于 IPX 的 NetBIOS,Novell 使用的协议,也很流行。Samba 使用基于 TCP/IP 的 NetBIOS,它具有多重优势。
TCP/IP 已经在每个有价值的操作系统上实现,因此将 Samba 移植到几乎所有 UNIX 版本、以及 OS/2、VMS、AmigaOS、Apple 的 Rhapsody(实际上是 NextSTEP)以及(令人惊讶地)像 CMS 这样的大型机操作系统相对容易。Samba 也用于嵌入式系统,例如独立打印服务器和 Whistle 的 InterJet 互联网设备。使用 TCP/IP 也意味着 Samba 可以很好地适应大型 TCP/IP 网络,例如互联网。认识到这些优势,Microsoft 已将 SMB 和基于 TCP/IP 的 NetBIOS 的组合重命名为通用互联网文件系统 (CIFS)。Microsoft 目前正在努力使 CIFS 被接受为互联网文件传输标准。

图 2. SMB 的网络视图与 OSI 网络参考模型比较
Samba 服务器实际上由两个服务器程序组成:smbd 和 nmbd。smbd 是 Samba 的核心。它建立会话、验证客户端身份并提供对文件系统和打印机的访问。nmbd 实现了“网络浏览器”。它的作用是宣传 Samba 服务器必须提供的服务。nmbd 使 Samba 服务器出现在 Windows NT 和 Windows 95 机器的“网上邻居”中,并允许用户浏览可用资源的列表。在没有 nmbd 的情况下运行 Samba 服务器是可能的,但是用户需要提前知道服务器的 NetBIOS 名称以及他们希望访问的资源。nmbd 实现了 Microsoft 网络浏览器协议,这意味着它参与浏览器选举(有时称为“浏览器战争”),并且可以充当主浏览器或备份浏览器。nmbd 还可以充当 WINS(Windows 互联网名称服务)服务器,这在您的网络跨越多个 TCP/IP 子网时是必要的。
Samba 还包括其他工具的集合。smbclient 是一个 SMB 客户端,具有基于 shell 的用户界面,类似于 FTP,它允许您与其他 SMB 服务器之间复制文件,以及允许您访问 SMB 打印机资源并发送 WinPopup 消息。对于 Linux 用户,还有一个 SMB 文件系统,允许您将从 Windows 机器共享的目录附加到您的 Linux 文件系统中。smbtar 是一个 shell 脚本,它使用 smbclient 将远程 Windows 文件共享存储到标准 UNIX tar 文件,或从标准 UNIX tar 文件恢复远程 Windows 文件共享。
testparm 命令解析并描述您的 smb.conf 文件的内容,因此特别有用,因为它提供了一种检测配置错误的简便方法。其他命令用于管理 Samba 的加密密码文件、为国际使用配置备用字符集以及诊断问题。
像往常一样,解释程序功能的最佳方法是展示一些示例。出于两个原因,这些示例假设您已经安装了 Samba。首先,解释如何构建和安装 Samba 将足以写一篇单独的文章。其次,由于 Samba 在每个新的稳定版本发布后不久就作为 Red Hat 和 Debian 软件包提供,因此在 Linux 下安装非常容易。此外,大多数流行的发行版的“基本”安装已经自动安装了 Samba。
在 Samba 1.9.18 版本之前,如果您希望使用加密密码身份验证,则必须自己编译 Samba。这是因为 Samba 使用 DES 库来实现加密,使其在技术上被美国政府归类为军需品。支持加密密码的 Samba 二进制版本在美国境外合法出口受到限制,这导致镜像站点避免分发启用加密的 Samba 预编译副本。从 1.9.18 版本开始,Samba 使用修改后的 DES 算法,不受出口限制。现在,自己构建 Samba 的唯一原因是如果您喜欢测试最新的 alpha 版本,或者您希望构建具有非标准功能的 Samba。
由于 SMB 是一个庞大而复杂的协议,因此配置 Samba 可能会让人望而生畏。smb.conf 文件(Samba 的配置文件)中可能会出现 170 多个不同的配置选项。尽管如此,请不要害怕。像 UNIX 的几乎所有方面一样,启动并运行一个简单的配置非常容易。然后,随着您了解每个参数的功能,您可以随着时间的推移改进此配置。最后,当本文于 1 月下旬撰写时,Samba 的最新版本是 1.9.18p1。这些选项中的某些选项的行为在本文印刷时可能会发生变化。像往常一样,Samba 发行版随附的文档(尤其是 README 文件)是权威的信息来源。
smb.conf 文件由 Red Hat 和 Debian 发行版存储在 /etc 目录中。如果您自己构建了 Samba 并且没有修改任何安装路径,它可能存储在 /usr/local/samba/lib/smb.conf 中。Samba 套件中的所有程序都读取这一个文件,该文件的结构类似于 Windows *.INI 文件,以获取配置信息。文件中的每个部分都以方括号括起来的名称开头,并且可以是服务名称或特殊部分之一:[global]、[homes] 或 [printers]。
每个配置参数要么是全局参数,这意味着它控制影响整个服务器的某些内容,要么是服务参数,这意味着它控制特定于每个服务的内容。[global] 部分用于设置所有全局配置选项以及默认服务设置。[homes] 部分是一个特殊的服务部分,动态映射到每个用户的家目录。[printers] 部分提供了一种轻松共享系统中 printcap 文件中定义的每个打印机的方法。
以下 smb.conf 文件描述了一个简单而有用的 Samba 配置,该配置使网络上可以访问每个用户的 Linux 机器上的家目录。
[global] netbios name = FRODO workgroup = UAB-TUCC server string = John Blair's Linux Box security = user printing = lprng [homes] comment = Home Directory browseable = no read only = no
[global] 部分中的设置设置主机名、主机的工作组以及显示在浏览列表中主机旁边的字符串。security 参数告诉 Samba 使用“用户级别”安全。SMB 有两种安全模式:share(将密码与特定资源关联)和 user(为特定用户分配访问权限)。这里没有足够的空间来描述这两种模式的微妙之处,但在几乎所有情况下,您都希望使用用户级别安全。
printing 命令描述了本地打印系统类型,它告诉 Samba 如何准确地提交打印作业、显示打印队列、删除打印作业和其他操作。如果您的打印系统是 Samba 尚不知道如何使用的系统,您可以指定为每个打印操作调用的命令。
由于未指定加密模式,Samba 将默认使用明文密码身份验证来验证使用标准 UNIX 密码实用程序的每个连接。请记住,如果您的 Linux 发行版使用 PAM,则必须修改 PAM 配置以允许 Samba 针对密码数据库进行身份验证。Red Hat 软件包会自动处理此问题。显然,在许多情况下,使用明文身份验证是愚蠢的。配置 Samba 以支持加密密码超出了本文的范围,但并不困难。有关详细信息,请参阅 Samba 发行版的 /docs 目录中的 ENCRYPTION.txt 文件。
[homes] 部分中的设置控制每个用户家目录共享的行为。comment 参数设置显示在浏览列表中资源旁边的字符串。browseable 参数控制服务是否会出现在浏览列表中。关于 [homes] 部分的一个非直观之处是,设置 browseable = no 仍然意味着用户的家目录将显示为一个目录,其名称设置为已验证用户的用户名。例如,使用 browseable = no,当我浏览此 Samba 服务器时,我将看到一个名为 jdblair 的共享。如果 browseable = yes,则名为 homes 和 jdblair 的共享都将出现在浏览列表中。设置 read only = no 意味着如果用户已正确身份验证,则应该能够写入其家目录。但是,如果其家目录上的 UNIX 访问权限阻止他们这样做,他们将无法写入其家目录。设置 read only = yes 意味着无论实际的 UNIX 权限如何,用户都将无法写入其家目录。
以下配置部分将授予对 printcap 文件中出现的每个打印机的访问权限,给任何可以登录到 Samba 服务器的用户。请注意,当服务器使用用户级别安全时,guest ok = yes 通常不会授予每个用户访问权限。每个打印服务都必须定义 printable = yes。
[printers] browseable = no guest ok = yes printable = yes
最后一个配置代码段添加了一个名为 public 的服务器共享,该共享授予对匿名 ftp 目录的只读访问权限。您必须在客户端机器上设置打印机驱动程序。您可以使用 printer name 和 printer driver 命令来自动化在 Windows 95 和 Windows NT 客户端上设置打印机客户端的过程。
[public] comment = Public FTP Directory path = /home/ftp/pub browseable = yes read only = yes guest ok = yes
请注意,此描述并未解释一些细微的问题,例如用户级别安全和共享级别安全之间的差异以及其他身份验证问题。它也只是略微触及了 Samba 可以做的事情的表面。另一方面,这是一个关于创建简单但可用的 smb.conf 文件有多么容易的好例子。
Samba 是弥合 UNIX 和 Windows 系统之间差距的首选工具。本文特别讨论了在 Linux 上使用 Samba,但它也是为更传统的 UNIX 系统(如 Sun 和 RS/6000 服务器)提供访问权限的绝佳工具。此外,与商业产品相比,Samba 体现了自由软件的最佳特性。Samba 功能强大、支持良好,并且 Samba 团队正在不断积极改进。
