摘要
本文包括了在IBM Rational ClearCase协作开发环境中编译、安装、配置和修改Samba,包括一些常见错误的深入解决方法。本文描述基于标准模板的配置,这种配置在世界上大多数Nortel 网站使用。
回页首
相关的文章
下面的zip文件包括模板样例,详细的指导和其它的资源。要想查看这些文件,下载zip文件到本地,解压缩,然后打开文件 samba.html
.
下载
回页首
IBM Rational ClearCase-Samba 协同环境的设置和问题解决
本文包括以下主题:
- 什么是协同环境?
- 如何从源代码构建Samba
- 如何配置Samba
- 从Samba 2.0.X升级到Samba 2.X
- Samba和Rational ClearCase问题解决
我非常愿意告诉你一点背景,关于我为什么关心更有效地设置和配置Samba这个主题。我从1999年3月开始使用Samba,配置几个服务器。每个服务器都需要手工配置,这一点是很痛苦的。此外,我们有多种不同的环境:从拥有500个VOB的8个VOB服务器到只有22个VOB的一个VOB服务器。另外,我们的环境是分布的,在美国和加拿大有几个工作场所,还在巴西、英国、法国有工作地点。因此,我一直努力工作以使得配置和设置过程变得更容易。
ClearCase 协同环境
为了更好地理解本文的内容,回答下面的问题是有帮助的:
- 什么是ClearCase协同环境?ClearCase支持UNIX和Microsoft Windows客户端混合环境。
- 为什么我们需要它?你必须使用NFS或者SMB服务器产品来得到客户端的数据。
- 为什么我们要使用Samba?
- 它是开源的,也就意味着是免费的。
- 它的配置是以服务器为中心的--我仅仅需要在很少的地方进行配置(我可不愿意出去配置每个客户端)。
我已经试过TAS、Hummingbird Maestro、和其它NFS客户端产品,但是我已经在使用Samba上有最少的麻烦和最好的成果。
构建Samba
得到源代码是很容易的。当前的版本是2.2.8a,它已经被证实可以用在ClearCase上。你可以从 Samba website得到源代码。注意它有一个优势是源代码可以编译为64位的应用程序。我在2001年遇到的问题是我不能够Build。即使我限制了mnode设置,它仍然不能工作。我给出了一个补丁可以让我打开更多的文件,并把它提交给了Samba开发组。64-Bit 编译可以让你打开更多的文件而不用限制 mnodes
的个数(稍后讨论)。一些操作系统可能不需要编译成64-bit。图1描述了在Solaris环境中构建Samba。
|
图 1: 在Solaris中构建Samba |
如果你想要关于这个patch的更多详细信息,我可以提供下面的链接:
在32-bit环境中,有与使用系统调用 fopen
有关的另一个限制。Samba使用这个系统调用来打开一些文件,通常是log文件。当打开超过256个文件时,Samba服务器将出现错误。这时,将终止Samba的安装,Samba将不可用。
图 2 显示你可以使用不同的编译器把Samba编译成64-bit的应用程序。Forte编辑器是你可以从Sun买到的一种编译器。你也可以使用GCC (GCC 3.x流需要进行64-bit编译).
|
图 2: 使用Sun Forte或者GCC Build Samba |
你也可以在HP-UX 上构建(图 3),HP-UX 11.x 是一个64-bit的操作系统。此外,在图3的第2小节中,有一些可以更改的设置,这些设置可以用来改善性能。
|
图 3: 在HP-UX上构建Samba |
一个附加的编译步骤可以编译两个运行Samba时很有用的实用程序,如图4所示。缺省时,常规的编译并不构建这些程序。它们可以帮助你管理数据库密码和其它一些对操作Samba很重要的参数。
|
图 4: 安装附加的Samba实用程序 |
图5显示在你使用 SWAT--一种基于Web的管理Samba的工具--时可能出现的编译问题。
|
图 5: 可能的编译问题 |
问题的现象是:在你输入你的用户名和密码准备访问SWAT时,它返回一个空的页面或者什么也不返回。这应该是 SWAT返回了一个SEGV信号。问题的原因是有坏的文件头,但是如果你使用最新的发布版本的话,这个问题应该已经解决,他们修正了这个问题。如果在你试图使用SWAT时出现这个问题,运行:
CPPFLAGS=' -D_EXTENSIONS_'; export CPPFLAGS
最常见的原因是,在有人试图使用GCC 2.x代替3.x时GCC 64-bit编译失败,前面已经讨论过,你必须使用GCC 3.x或者以后的版本。最后,在2.2的Stream中有一个中间的Bug:如果你试图构建一个共享库时,共享库会失败,因为它不能通过所有的编译器修正标志。这个问题可以通过定义一个特殊的SHLD宏来解决:
make SHLD=' ${CC} ${CFLAGS} ' |
在HP-UX 11中,如果你使用这个选项构建 libsmbclient
,它似乎失败,但是它对正常操作是没有必要的(它是一个实用程序库,你可以在你自己的程序中使用)。我不能够确定它为什么失败和如何修复它,因此当前的工作很简单,不包括它就可以了。最后,在使用Sun编译器构建64-bit的一些附加选项(图6):
|
图 6: HP-UX 编译问题和Sun Forte选项 |
配置 Samba
关于配置文件的结构,我进行了一些修改以便使得可以更加容易地把配置文件发布到很多个服务器,而不需要在每个服务器上进行更多的配置工作。缺省时,配置文件的名字为 smb.conf
。我仍然有这个文件,但是我增加的两个Hook配置 smb.conf.global.<hostname>
和 smb.conf.shares.<hostname>
。Global文件维护一些与系统相关的参数。你只需要在初始设置服务器时配置它,以后不需要进行修改。
The smb.conf.shares.<hostname>
是用来配置你的Samba服务器可用共享的文件。这个配置文件你可以随着时间的推移进行修改,因为共享将被不断地创建、删除和修改。
Example templates 是这些文件的示例模板--它们是机器可读的格式。初始文件, smb.conf
,不需要进行任何修改。你仅仅需要做的事情就是,如果你的操作系统是32-bit的,你要设置 max open files一个较小的数值。但是,我仍然建议你尽可能不使用32-bit操作系统。
如果在系统有多个网络接口时,你想要独立运行 smbd
和 nmbd
daemons,你必须修改 smb.conf
文件。我们下面再讨论为什么你要有分开的daemon。如果你正在使用多个daemon,你要分开保存你的Log文件。注意log文件是很重要的文件,因为它们可以帮助你跟踪调试问题。我使用的缺省配置是每个客户端有独立的log文件:如果你仅仅使用一个Log文件来处理数千个客户端,要想在文件中找到你所需要的信息是非常困难的。这种情况下Log文件一般有10M左右。如果你有上千个客户端,每个都有10M的Log文件,它将占有大量的空间。当然一般情况下,事情不会这么糟,但是你一定要记住这一点。
如果你使用多个daemons,需要在 smb.conf.global.<hostname>
中用主要的主机名代替 include directive %h参数。这将使你对每个主机/接口有一个独立的文件。
转到下一个文件, smb.conf.global.<hostname>
,你需要考虑的第一步是你要如何处理认证。认证指令有:安全、工作组和口令服务器。安全指令有四个选项,但是我不准备详细描述它们的意义。如果你想要详细了解这些选项的意义,可以参考 Samba 的文件: DOMAIN_MEMBER.txt
。首要的选项是 security=domain
,它提供最好的性能。主要的一点是在设置 security=domain
时,Samba服务器完全在域中共享。它有一个机器帐号,可以通过域控制器的认证请求,以及可以让域控制器处理认证。
继续下去,口令服务器指令是在你认证时需要的域控制器的名字。在Nortel中有些变化:前面我们有分离的机器资源域和用户资源域。你必须能够指定两个域控制器,因为Samba服务器必须使用 机器域进行认证,而用户必须使用 用户域进行认证。我不知道其它组织是怎么做的,但是我们把机器和用户域合并为一个单独的域,我们也移动到Active Directory。
你在多子网环境下需要使用WINS服务器,也为了进行浏览。你并不需要真的使Samba服务器支持浏览,但是口令服务器指令处理IP地址。注意到这一点很重要:即使你提供了多个IP,它只使用第一个IP,从来不会使用其余的。
配置多网络接口
为什么你要这么做?一个原因是管理每个独立网络接口的性能。 The ClearCase Administrator's Guide 讨论了在不同的子网管理不同的ClearCase区域,这里隐含了不同的网络接口。你可以限制Samba到服务器的一个可用的子网接口。在我们的实例中,我们使用不同的网络接口进行备份,因此没有理由在备份接口上运行Samba -- 没有人愿意从那个位置访问
示例
下面给出一些例子,以显示你可以如何修改配置文件。例如,你可能想要在一些接口上运行Samba,而不是在全部接口上运行。在这个例子中,我选择两个私有地址,并使用 interfaces
指令来列出你想要访问的接口。你需要第二个指令, bind interfaces only=yes
,来完成配置。Samba监听所有接口,因此你必须指定 bind interfaces only=yes
来限制它只监听在接口指令中列出的接口。
前面的例子仅仅需要在一些接口上有 smbd/nmbd
daemon,而不是全部。如果你正在使用多个daemon,一个(只有一个) smb.conf.global.<hostname>
文件必须在接口指令中包括loopback接口。使用与首要主机名对应的 smb.conf.global.<hostname>
文件。其它的 smb.conf.global.<hostname>
文件需要 netbios
命名指令设置到主机的其它接口。图7更加清楚地显示,这里有一个主机名alpha,是首要的主机名,我们在接口指令中包括loopback接口。主机名beta是另外一个接口,它不是首要主机名,因此我们必须包括 netbios
命名指令beta.
|
图 7: 配置 smb.conf.global.<hostname> |
如果你有 security=domain
,有多个接口,并且你运行多个daemon,你需要对每个接口有一个机器帐号。你不能对于机器只使用一个帐号,因为 每个daemon都是独立的,需要它们自己的机器帐号。问题是加入域的命令不允许你指定其它的配置文件。这里我提供了一些解决的例子,你可以通过重命名文件和使用符号链接来解决这个问题。一旦你加入了域,你就不需要维护主机的文件,因为实际运行的daemons可以让你指定其它的配置文件。
配置共享
现在转到你如何配置共享上, smb.conf.shares.<hostname>
文件包括一个单个共享的模板。很多参数不必要修改,因为它们已经设置为缺省值或者推荐值。仅仅需要考虑的是 共享名 和 共享目录路径。下面是一些特殊的限制:
- 共享名要符合NetBIOS 命名限制,这意味着你只能使用字母和下划线,并且最多14个字符。
- 如果你仍然使用Windows NT的话有一个Bug -- 如果共享名超过11个字符它将不会工作。
在进行配置时要牢记这一点,并考虑你的环境。
图8列出了其它常用的各种指令。它们基本上都是自解释的。如果你想要限制特定的机器或者特定的用户访问一个共享,可以使用 valid users
指令。我在实际中发现 hosts allow
指令工作的不是很好,特别是在你使用DHCP或者是远程用户的主机名变更时。 最好使用valid users,因为这样的话,如果用户挪到不同的机器上时,用户仍然可以访问数据。
|
图 8: 配置 smb.conf.shares.<hostname> 文件 |
与用户名和密码相关问题
现在我要扯得远一点。我在这里假定你已经设置了一个类似的协同环境。保证在Windows下和UNIX下有相同的用户名是很重要的。另外一个重要的考虑是 lmhosts
文件。这个文件Samba用来解析NetBIOS名。正常情况下,WINS服务器可以用来进行这个工作,但是根据我们的经验, WINS服务器的架构并不是很稳定和可靠。事实上,我们经常能够碰到WINS服务器出问题给我们带来的麻烦。一个解决这个问题的方法就是在 Samba 服务器上使用 lmhosts
文件。 lmhosts
主要列出你要访问的域控制器。这也许相当安全,因为域控制器并不经常修改主机名或者IP地址。修改域控制器的主机名和IP地址会导致Windows环境的崩溃。在客户端创建同样的 lmhosts
文件以避免类似问题也是值得的。我给出Windows下的 lmhosts
文件的路径(在问题解答节有更详细的讨论)。
username.map
文件是一个把Windows帐号映射到UNIX中不同的名字的一种方法。它的首要用途是把Windows的ClearCase ALBD服务帐号映射到UNIX的有效帐号。缺省的ALBD用户是clearcase_albd,它的名字很长,你不能在UNIX环境下看到。在过去,用户名超过8个字符将导致问题。在现在的很多系统中,它一点也不会导致问题,但是这一点你要记住。一个可能的解决方案是把clearcase_albd帐号映射成VOB所有者帐号,因为你知道,VOB所有者有权访问VOB对象和VOB元素。
另一个方法是创建一个与VOB所有者帐号同名的ALBD服务帐号,但是我不建议这样做,因为可能导致安全问题。如果有人能够作为VOB所有者帐号登陆到Windows,那么他就可以进入VOB做任何VOB所有者想做的事情,这可能是一个很不好的事情。
最后一个选择的方法是我们使用的方法:创建一个与VOB所有者帐号类似的ALBD服务帐号。例如,如果VOB所有者帐号是vobadm,你可以使用vobadm01。如果 有人以vobadm01登陆,他不能做任何事情,因为他不是VOB所有者帐号。
要记住的一点是,这种映射仅仅用于访问cleartext 和source containers,这就是ALBD 服务为你做的事情。它并不处理正常的 ClearCase访问控制。如果有人以vobadm01登陆并试图check out文件,它并不映射为vobadm帐号,仍然是vobadm01帐号。
很多组织正在转到大的、合并的环境,就像我们那样。我们把几个拥有他们自己服务器的组合并成一个单一的一组服务器。在这种情况下,可能有多个VOB所有者帐号、多个开发环境和多个项目。这时进行帐号映射有一点困难。记住你可以把多个帐号映射到一个单一的UNIX帐号。
你不能把一个ALBD服务帐号映射到多个VOB所有者帐号。在下面的例子中我试图把albd1映射到三个不同的帐号,只有最后一个被映射。在图9的例子中,我试图把ALBD帐号albd1 映射到vobadmin、ccadmin和 vobadmcc。然而,albd1帐号只能映射到vobadmincc (最后一个定义)。使用vobadmin和ccadmin访问将出现问题,因为albd1映射到vobadmcc。
|
图 9: 你不能把多个VOB所有者帐号映射到单个ALBD服务帐号 |
关于ALBD服务帐号的密码更新有一些附加的考虑。在我们的环境中,公司的安全策略需要所有帐号的口令每6个月就到期。我们不能得到豁免。当然,如果你的ALBD服务帐号不工作将会出现问题,你的用户都会down掉。因此我们不得不找到一种处理这个策略的方法。如果你的ALBD帐号永不过期,那当然很好。如果你做不到,那你就应该知道,如果ALBD帐号过期或者被锁定,将有很多用户 down掉。
按照规定,我们必须面对ALBD密码过期的限制。我们使用ALBD服务帐号索引的方法来保持跟踪ALBD服务帐号。当密码快要到期时,我们准备了第二个帐号,这个帐号的密码是新的,再过6个月才会到期。然后我们在旧的帐号密码还 有效的时候,把帐号切换到新的ALBD服务帐号上。这样做的好处是,如果我们切换过去后,其它帐号过期后只会影响很少的用户,带来最小的损失。然后,你可以告诉受到影响的用户:“你需要更新你的ALBD服务帐号”。帐号过期只会给没有更新的人带来一点影响。
如果你使用了帐号索引,记住需要重新配置 username.map
文件。在你切换帐号的时候这一点很重要,你也必须更新Samba。如果你忘记更新 username.map
文件。你将出现访问的问题。
从Samba 2.0.x升级到Samba 2.2.x
Samba 2.0.7是上一个稳定版本,现在2.2 stream已经发布。2.2 stream有几个性能的问题,直到2.2.7。一个问题是Solaris平台的,即使当前的发布版本仍有问题,你需要一些补丁来避免CPU高利用率的问题。这个问题的原因是他们修改了他们管理锁的方法。从使用共享内存改为了使用他们自己的文本数据库。这个文本数据库使用 fcntl
系统调用和 F_SETLK
来管理锁。在锁的数量增加时性能呈指数降低。我没有实际碰到这个问题,因为我从来没有使用过Samba 2.2.2,但是我曾经在mailing list中看到过有人碰到过CPU利用率非常高的问题。一旦你的CPU利用率超过75%,一定是一个问题。所有的Solaris版本都有解决这个问题的补丁,因此我建议你使用这些补丁。
我应该使用哪个版本的Samba? 除了Solaris,你应该使用最新的稳定版本,目前是2.2.8a。如果你使用了图10的补丁,可以继续使用2.2.8。如果基于某种原因你不能使用这些补丁,你可以选择2.0.10a。
|
图 10: Samba Solaris 补丁 |
2.2.8a的配置有一些不同,一些以前独立的文件被合并成一个新的文件。有两个文件,机器帐号密码文件(类似于 <domain name>.<hostname>.mac)和 machine.SID
文件(包含安全标识符)。在我的附加文章, SCM04.pdf,中给出了关于如何安装新版本的Samba、创建新的目录结构和拷贝旧的配置文件的指导。私有目录包括机器帐号密码和机器SID文件。如果你使用共享的 mem size
指令的话,你也需要修改配置文件。这个指令在 2.2中取消了,因此你必须注释掉这个指令。如果你不修改也没有任何问题,只是会在日志中收到一个错误信息。
你需要做的其它事情是--因为在2.2.x日志的行为改变了-设置调试级别为1以便你得到更多的日志信息。如果你没有设为1,你只能在你的日志中看到错误信息。有时在你想详细跟踪问题时,你可能需要有关连接和用户如何登陆的信息。你当然可以在错误发生后设置这个级别,但是你就失去了得到信息的机会。你不得不等到错误再次出现或者有用户试图登陆。如果你先进行设置,将很容易得到信息。
在你准备切换Samba时,完成以下步骤:
- 停止 Samba.
- 重命名目录
- 最后更新私有目录。(香我说得那样,这个机器帐号密码每周更新,但你不知道它什么时候更新,即使你十分钟前拷贝了,它有可能十分钟后更新。你只能确保它尽可能的新)
- 重起 Samba.
这个切换过程小于5分钟,很容易换回来。
一旦完成切换,你最好验证一下是否工作正常。你可以登陆到客户端,连接VOB。更容易的方法是在UNIX机器上使用 smbclient
命令(它是Samba发布的一部分)来连接一个共享UNIX。在Windows机器上,可以在命令行输入net use命令。如果连接失败,你可以切换回来,查看日志文件以确认问题的原因。
我们在升级时发现了三个问题。第一个问题是在日志消息中显示Samba试图修改信任帐号密码失败。问题是在 2.0.7的配置移植到2.2.x时,它并不在文本数据库中创建用来改变密码的key。Samba服务器仍然继续工作,也不影响性能。这是一个潜在的安全问题,因为你的机器帐号密码没有改变,但它并不是一个严重的问题。一个解决的方法是删除和重建机器帐号,然后重新加入服务器。这将是破坏性的,因为所有的认证在你删除帐号时都将失败,你的用户都会中断。然后,你必须重新创建一个机器帐号,并重新把Samba服务器加入到域。我的替代方法是在一个测试服务器上创建了一个 secrets.tdb
文件,包括那个key。文件中有其它数据,但是在服务器移植数据时将覆盖。这个方法似乎更容易一些。
我们看到的第二个问题是在从2.2.5升级时。你启动服务器,但是你不能连接。当你查看日志文件时,你看到不能取得信任帐号密码的消息。这个问题是Key的储存信息被破坏了。这是一个二进制文件,因此你不能编辑和修复它。最容易的方法是停止Samba。你也可以把信息转储到 secrets.tdb
文件,或者从旧的安装复制数据以创建 <domain>.<hostname>.mac
文件。在CD上,我也提供了一个小程序用来更容易地转储 secrets.tdb
文件。一旦你重新创建了 <domain>.<hostname>.mac
文件,Samba服务器将把它合并到 secrets.tdb
并创建正确的key。这个问题可能只有少数人会遇见。
最后一个问题更加困难一些。在升级后,Samba 不能够正确的解析UNIX文件系统的符号连接。不幸的是,我们只在一台机器上看到这个问题,并且我不能重现这个错误。我用同样的补丁和相同的配置,但是没有一点问题。你可以看到一个错误"not a valid win32 application" 或者"unable to run exec format error"。在这个例子中,我们试图访问文件 syee_test1.bat
,因为日志文件中的错误消息显示遗漏了部分路径。这个问题极其罕见,但是你在升级时要记住。在升级后你需要检查一下符号连接是否正常工作。
Samba 和 Rational ClearCase的问题与解决
日志文件是你的好朋友;你可以从那里得到大量信息,因此你显然应该知道如何增加调试的级别。调试级别可以从0设到10。0表示几乎没有细节信息,10表示有最多的细节。有两种方法改变调试级别。一种方法是修改 smb.conf
文件,改变指令,然后停止再重起Samba。另一种方法是传递 HUP信号到Samba daemon。如果你传递了一个HUP信号,只有新的连接才能有新的调试级别。我不经常使用这个方法,因为它影响所有的 Samba 客户端。在你调试时,你通常只想调试特定的客户端。要想调试一个客户端,我就进入日志找到特定客户端的进程ID
我使用一个配置文件进行设置,模板中有日志文件中包括的进程ID。这个配置文件已经使用了很长时间,大约进行了7、8次修改。我增加信息和选项以便对任何类型的问题都能很容易地调试。在图11的例子中,PID 是 4539,对2.0 stream,你给进程发一个信号。你发一次信号只能增加一个调试级别。如果你想增加2或3个级别,你只能发2到3次信号。对于 2.2.x,他们包括一个实用程序可以让你设置任何级别,这会更容易一些。
|
图 11: 调试Samba |
图12显示我经常碰到的错误。我曾经在一个ClearCase 用户组看到这个问题。这大概是你最常碰见的问题:你得到一个信息:"Unable to construct cleartext for object X in VOB Error: Type manager 'text_file_delta' failed construct_version operation." 这几乎都归结为许可问题。有意思的是你能够碰到多少种许可问题。另一个用户经常碰到的问题是,错误消息:"incorrect function",经常可以在视图日志和视图主机上看到。这个信息也可以在弹出式对话框中出现。
|
图 12: 最常见的错误 |
我们怎么样才能跟踪到问题在什么地方?你需要做的第一件事情就是,你需要知道ALBD 服务帐号名。你可以通过services控制面板找到它。然后你问自己, 这个服务帐号是否有相应的UNIX帐号? 如果是,你可以进行下一步。如果没有,它大概被映射了,因此你要查看 username.map
文件。如果那里没有,你要加上它。在你加上以后,新的连接将使用新的值,但是已经存在的连接则不会。有问题的客户端应该与VOB断开,等几分钟到Samba连接删除,然后再连接到VOB。让用户启动一次很容易。当然你也可以停止然后重新启动Samba,但是这样要影响所有用户,而不是只影响有问题的用户。
UNIX帐号是否有权限?这里假定ALBD服务有一个UNIX帐号,或者映射了合适的帐号。 这个帐号能否访问VOB存储目录和子目录? 我看过很多次,他们的VOB目录的UNIX权限类似700或者 750,这将使得只有很少的用户可以访问VOB中的数据。解决的方法很简单,给VOB目录设置正确的权限。如果问题在pool自己身上,你必须使用 cleartool protectvob
命令来修正。你一定不想用UNIX命令来修改这一堆权限。
其它的事情也会发生,比如你基于某种原因,你限制了某些组的权限。你必须保证由ALBD使用的UNIX帐号在正确的组中。如果你遇见了问题,你要修改权限或者把用户添加到正确的组中。
访问VOB或者访问共享的难点
即使上面的都可以通过,你仍然会遇到不能访问VOB数据的问题。有很多其它的因素会导致错误。典型地,你下一步需要做的是,增加调试级别,以便得到更多的相关信息。我通常做的第一步是不通过ClearCase,试着访问共享目录,以保证网络部分工作正常。我使用net use命令试着访问共享。在这里你肯定希望看到错误。如果用户指定了错误的密码,你可以在Samba日志中清楚地看到。它说:"NT_STATUS_WRONG_PASSWORD"。这经常发生在用户刚刚修改了密码但是没有重新登陆时。解决方法很简单,退出并重新登陆。
如果用户修改了密码并用错误的密码试图登陆很多次后,用户帐号可能被锁定。日志中的错误消息也很明显地指出,帐号被锁定。你只需要等几分钟,到帐号释放,或者如果它不工作你问用户是否重设了他们的密码。
一个很难调试的权限的限制是,如果你使用了 valid users
或者hosts allow 指令,这些指令我在前面提过,它们只允许特定的用户或者主机连接。如果你在使用net use命令要求输入密码时输入了正确的密码,但是命令仍然失败,你就必须查看共享配置文件,看是否限制了共享。如果有共享的限制,你就需要研究哪些用户或者机器有权限。你必须增加调试级别到5级才能看到这个错误。
在图13的例子中, smbd
daemon 在SUPPORT_USERS中寻找我的userid, boehm。我的userid没有在组中,因此我没有访问共享的权限。
|
图 13: VOB 和共享访问权限 |
其它可能发生的事情有-- 有意或者无意的 -- 用户帐号被删除或者不存在。这时我试图访问一个共享时,他们将做为用户 "nobody",没有访问共享的权限,然后操作将失败。你可以在日志中看到错误指示(图14),boehm-1做为nobody连接到服务器ccaserls。代替用户boehm,它用nobody。这就是一个UNIX帐号丢失的例子。
|
图 14: 用户帐号不存在或者被删除 |
我们在使用WINS服务器时仍然会遇到其它问题。用户可能访问VOB,工作得很好,突然,他们不能访问VOB了。我们发现这时WINS服务器可能出问题了,或者我们从WINS服务器中得到错误的VOB服务器的入口。这一点很糟糕,我们的解决方法是,虽然不是很好的方法, 在客户端创建包括VOB 服务器入口的 lmhosts
文件。这可以帮助加速访问VOB服务器,因为客户端不需要等待WINS告诉它VOB服务器的地址。另外,这时不应该频繁改变VOB服务器的主机名或者IP地址。这个方法的不利之处就是如果你在每个客户端都创建文件的话,工作量将会很大,而且你必须保证新的客户端也能很好地更新。我们可以把这个问题放到ClearCase的安装过程中,作为其中的一步。在安装时创建正确的入口文件。
你需要创建的文件位于 %SystemRoot%\SYSTEM32
目录。这个目录下有一个示例 lmhosts.sam
文件。在图15中,我给出了我以前用过的 lmhosts
文件,#PRE 告诉机器把主机名预先加载到缓存中,这样可以更快一点。
|
图 15: 一个lmhosts文件的示例 |
另外一个你可能遇见的错误是Samba服务器机器帐号损坏。这时,如果你使用 net use
命令登陆,你输入正确的密码,但是仍然不工作,你可以在日志文件中看到类似"NT_STATUS_NO_TRUST_SAM_ACCOUNT" 或者 "NT_STATUS_ACCESS_DENIED"的信息。这个问题稍微大一些,因为它影响所有的用户,不仅仅影响一个客户端。这时你一般在域控制器上没有任何权限来修复机器帐号,这时必须设置'security=server'直到你可以得到一个修复的帐号。一旦修复,你可以重新加入域,然后重起Samba。这一般需要导致2-3分钟的不可用。
最后一个错误是你不应该看见的。"Out of file structures" 错误在使用32-bit Samba时试图打开太多文件时经常发生。如果你使用了64-bit Samba 和版本2.2.x的话,你不应该看到这个错误。
需要注意的一点是Rational的文档仍然设置mnodes到800。我曾经设置过更多的值没有任何问题。
解决这个问题的方法是增加'max open files' 并使用64-bit Samba。如果你使用32-bit Samba,增加'max open files'的值没有用处。如果你不能使用64-bit Samba,那你就不得不减少mnode设置。在ClearCase 控制面板下的 MVFS performance可以修改。你可以从800开始。你甚至可以减少到200。如果你仍然有问题,就像我最初开发这个补丁时那样,你就必须使用64-bit版本的Samba。
最后一个问题更加罕见,或者应该罕见。Samba 2.0使用共享内存表管理锁。在有100-200个客户端时很容易超出这个表的大小。缺省的大小大约是1M。在我使用的配置文件中,我把它设置为4M。即使这样,一旦你超过了100个客户端或者更多,它很容易超出4M的水平,然后你将会看到类似"panic error, delete share mode hash bucket empty"的信息。这特别令人沮丧,因为用户将会发现他们前面还能读的文件现在不能读了。他们可能重起他们的机器或者重起他们的视图。然后他们可以读这个文件,但是他们又不能读以前可以读的其它文件了。这依赖于共享内存多快地填满,以及他们在填满的时刻访问哪个文件。
解决的方法是增加共享 mem size
指令。当然这是在2.0,在2.2中应该没有这个问题。如果你增加了这个参数,你或许必须增加kernel参数。Solaris的kernel参数是 shmsys:shminfo_shmmax
。HP-UX有类似的设置。为了让改变的kernel参数生效,你必须重起系统,这将更糟糕。
如果由于某些原因,你设置kernel参数足够高,你需要知道的一件事情是,如果你修改了它的大小,你必须删除存在的共享内存。这是由于Samba代码会看内存表是否在,如果找到共享内存,它将试图使用错误的大小。图16显示移去共享内存的命令。
|
图 16: 增加共享内存大小的指令 |
回页首
问题与解答
如果你不能使用64-bit Samba的话该怎么办?
解决方法是打开Rational ClearCase 控制面板。有一个名为 MVFS Performance的tab,有两个检查框( maximum number of mnodes to keep in the VOB free list 和 maximum number of mnodes to keep for the cleartext free list)。你可以手工把它们改为800,你必要时可以减少到200。
你的Samba配置的例子是Windows NT-centric。在Active Directory环境下有什么变化?
问题是关于在Active Directory 环境下的PDC (主域控制器) 和 BDC (后备域控制器)的。
我不知道你需要的改变 -- 我的意思是,你在Active Directory中仍然有域控制器,因此你仍然需要有密码服务器,不管你的active directory服务器在哪里。我不知道Active Directory中是否仍然使用WINS服务器。但我相信它仍然使用。因此你即使在active directory环境下仍然需要这些信息。
Samba日志保存在什么目录?
如果安装在/usr/local/samba,日志文件在/usr/local/samba/var。日志文件名为 log.<machine name>
.
在多个ALBD帐号时我们如何处理密码过期?
我们有我们自己的工具更新客户端,但是最容易通用安装方法是到发布区域更新 sitedefs.dat
文件,这个文件包含加密的密码。你也可以再次运行 siteprep.exe
,提供一个新的密码。它会更新文件,然后用户重新安装ClearCase以更新密码
64-bit Samba 是否需要64-bit 操作系统?
是的。你必须运行在Solaris 7 (64-bit)及以上,或者HP-UX 11.
如果你运行64-bit Linix 是否会出现问题?
不会,因为Linux不会碰见这个问题。它们的设置不同,在LINUX下使用 fopen
系统调用时不会遇到这个问题,有一些kernel调整可以让你设置Linux 允许打开足够的文件。
缓存问题 -- 服务器数据已经变更,但是客户端几分钟后才能看到
问题是有人在Solaris服务器上进行了变更,但是客户端直到几分钟后才能看到。这个问题可能是配置文件的问题,在我的配置文件中有一个选项op locks,ClearCase使用 op locks=Off
。它会缓存一些东西,有可能导致问题。我不知道你的设置是什么,但这是我要解决问题的第一个猜想。
如果你有用户登陆到多个windows域,多daemons是否需要考虑这个问题?
可以有一种方法处理。我们在我们的环境中有多个daemons,但是我们不需要寻址它们因为在不同的域之间有信任关系。你的问题可能是一个域中的人试图登陆,但他们不能认证,如果他们引用了错误的域控制器(那里他们的帐号不存在,即使有信任关系)。一个解决方法是在一个域中有一个机器帐号接口,另一个域中有另外一个机器帐号接口。
我怎么处理UNIX帐号同步?
这不是一个问题,因为所有的UNIX帐号都通过NIS处理。如果一个UNIX改变了,它由NIS处理。认证并不真正发生在UNIX一边。如果我做为用户boehm连接到Samba服务器,它只是在UNIX边看用户是否存在。如果存在,它就通过域控制器的认证请求,从来不会涉及UNIX一边。
有人看到这样的Samba问题,在用户增加是,他们不得不停止并重起Samba?
我从来没有见到这样的问题。我知道在早于2.2的版本会有一些问题。我相信在2.2.8a版本已经修正了问题。如果你仍然有这样的问题,我不知道如何帮你。它可能与操作系统有关,但我知道在早于2.2的版本有内存泄漏。
你是否认为Samba比TAS要好?
是的。我考虑过TAS。我想我不喜欢license费用。我们的组织有其它部门是用过TAS,其中一个站点出现问题。他们不能正确地认证用户,因为他们没有权限。我们联系技术支持,但是我们没有从他们那里得到满意的结果。上千个用户不能正常工作。幸运的是,我们能够在几分钟内切换到Samba。我花时间创建了配置文件。我们切换过去,他们很高兴。我们最近在巴西也遇到类似的事情,那里的TAS也不能正常工作,出一些奇怪的现象。我们又一次不能从技术支持那里得到结果,因此我们切换到Samba,然后就很好了。
在我的观点中Samba好一点的另一件事情是: valid users
和 hosts
。我可以使用NIS netgroups确定谁可以访问我的服务器。在TAS中你不得不在每个TAS服务器上手工编辑所有用户ID的列表。在RTP,我有8台服务器。我不想早服务器上编辑8个文件,并保持他们的同步。
在客户端使用PC NFS 并确定哪个协议用来访问VOB服务器时是否会有问题?
不会的,ClearCase文档中写的很清楚。我相信它能够告诉你如何确定。你要做的是进入服务控制面板,找到properties,那里有服务提供的瞬息。它看起来可能是"Microsoft Windows Network", "Hummingbird Network",如果你使用Hummingbird Maestro,会有一些其它选项。你可以改变协议的顺序,以便你可以把"Microsoft Windows Network"放在NFS协议前面,这样将使用Samba代替NFS。我在调试问题的时候做过类似的事情:我想要强制使用NFS,因此我改变顺序,把NFS放在Microsoft Windows Network前面。
Samba服务器的容量如何?
我们有的最大的一个前面已经讲过。我们在加拿大有一个单一的机器为大约上千人服务。大概600或者更多的人是Samba 或者PCs 或者Samba 用户。它是一台Enterprise 6500,拥有8个处理器。我从来没有碰见用户数太多不能支持的Samba问题。我倾向于使用多个VOB服务器因为我喜欢配置更好的性能。这样我通常有2-4个服务器每个支持几百个用户。我在使用这个配置的时候从来没有遇见Samba的性能或者容量问题。
我可以把Samba放到VOB服务器上吗?
是的,你可以这么做。
关于作者
Stephen Beneteau 是Rational软件的软件开发人员, Rational软件是IBM Software Group 的几个品牌之一。IBM 是世界上最大的信息技术公司和最大的商业和技术服务供应商。Rational 软件在开放的业界标准工具,最佳实践和商业应用开发服务,软件产品和系统构建,包括嵌入式设备软件如蜂窝电话和医疗器械等方面每年提供$90亿的收益。