本章介绍如何解决运行 NIS 的网络所遇到的问题。还介绍了在 NIS 客户机和 NIS 服务器中存在的问题。
在尝试调试 NIS 服务器或客户机之前,请先阅读第 4 章,网络信息服务 (Network Information Service, NIS)(概述),其中对 NIS 环境进行了介绍。然后,在本节中查找最能恰当描述您所遇到的问题的副标题。
NIS 服务由服务管理工具管理。可以使用 svcadm 命令对此服务执行启用、禁用或重新启动等管理操作。有关将 SMF 与 NIS 结合使用的更多信息,请参见NIS 和服务管理工具。有关 SMF 的概述,请参阅System Administration Guide: Basic Administration中的“Managing Services (Overview)”。另请参阅 svcadm(1M) 和 svcs(1) 手册页了解详细信息。
还可以使用 ypstart 和 ypstop 命令来启动和停止 NIS 服务。有关更多信息,请参见 ypstart(1M) 和 ypstop(1M) 手册页。
NIS 绑定问题包括以下常见症状。
客户机上的命令在背景模式下缓慢运行,或运行速度远低于正常情况
客户机上的命令崩溃,同时显示不明消息或根本不显示消息
如果只有一两台客户机出现表明存在 NIS 绑定问题的症状,则可能是这些客户机存在问题。如果许多 NIS 客户机都无法正确绑定,则可能是一台或多台 NIS 服务器存在问题。请参见影响许多客户机的 NIS 问题。
一台客户机中存在问题,但同一子网上的其他客户机运行正常。在存在问题的客户机上,在满足以下条件的目录中运行 ls -l:包含由许多用户拥有的文件,而这些用户又包括该客户机 /etc/passwd 文件中没有的一些用户,如 /usr。如果显示结果将不在本地 /etc/passwd 中的文件属主以数字形式列出,而不是名称,则表明 NIS 服务未在该客户机上运行。
这些症状通常意味着客户机 ypbind 进程未运行。请验证 NIS 客户机服务是否正在运行。
client# svcs network/nis/client STATE STIME FMRI disabled Sep_01 svc:/network/nis/client:default |
如果该客户机被禁用,请作为超级用户登录或承担等效角色,并启动 NIS 客户机服务。
client# svcadm enable network/nis/client |
一台客户机中存在问题,其他客户机运行正常,但 ypbind 正在出问题的客户机上运行。该客户机可能有一个域设置得不正确。
在该客户机上,运行 domainname 命令,以查看设置了哪个域名。
client7# domainname neverland.com |
将输出与 NIS 主服务器上 /var/yp 中的实际域名进行比较。实际 NIS 域显示为 /var/yp 目录中的子目录。
Client7# ls /var/yp... -rwxr-xr-x 1 root Makefile drwxr-xr-x 2 root binding drwx------ 2 root doc.com ... |
如果在计算机上运行 domainname 时返回的域名与在 /var/yp 中作为目录列出的服务器域名不同,则在计算机的 /etc/defaultdomain 文件中指定的域名不正确。作为超级用户登录或承担等效角色,并在计算机的 /etc/defaultdomain 文件中更正该客户机的域名。这样可以确保计算机每次引导时,域名都是正确的。立即重新引导计算机。
域名区分大小写。
如果域名设置正确,而且 ypbind 正在运行,但命令仍然挂起,则请通过运行 ypwhich 命令来确保客户机已绑定到服务器。如果刚刚启动 ypbind,则可多运行几次 ypwhich(通常,第一次运行时会报告域未绑定,第二次便会成功)。
如果域名设置正确,而且 ypbind 正在运行,但有消息指出客户机无法与服务器通信,则原因可能有多种:
客户机是否具有包含要绑定到的服务器列表的 /var/yp/binding/domainname/ypservers 文件?如果没有该文件,请运行 ypinit -c 并按优先级顺序指定客户机应绑定到的服务器。
如果客户机有 /var/yp/binding/domainname/ypservers 文件,则该文件中列出的服务器数是否足以应对一台或两台服务器不可用时的情况?如果没有足够多的服务器,请通过运行 yppinit -c 向列表中添加更多服务器。
如果在客户机的 ypservers 文件中列出的服务器都不可用,该客户机将使用广播模式搜索正在运行的服务器。如果在客户机的子网中存在运行正常的服务器,客户机也会找到它(尽管在搜索过程中可能会降低性能)。如果客户机的子网中没有运行正常的服务器,则可通过以下几种方式来解决问题:
出于安全和管理控制的原因,最好在客户机的 ypservers 文件中指定该客户机要绑定到的服务器,而不是让客户机通过广播来搜索服务器。广播将为不同客户机列出不同服务器,从而会降低网络和客户机的运行速度,并妨碍您平衡服务器负载。
在客户机的 ypservers 文件中列出的服务器在 /etc/hosts 文件中是否具有相应项?如果没有,请将这些服务器添加到 NIS 映射主机输入文件,并通过运行 yppinit -c 或 ypinit -s 来重建映射,如使用 NIS 映射中所述。
/etc/nsswitch.conf 文件是否设置为除了 NIS 外还查询计算机的本地 hosts 文件?有关该转换器的更多信息,请参见第 2 章,名称服务转换器(概述)。
/etc/nsswitch.conf 文件是否设置为先在 files 中查询 services 和 rpc?有关该转换器的更多信息,请参见第 2 章,名称服务转换器(概述)。
在同一客户机上多次使用 ypwhich 时,生成的显示会随 NIS 服务器的更改有所不同。这很正常。当网络或 NIS 服务器繁忙时,NIS 客户机到 NIS 服务器的绑定会随着时间而变化。网络总是尽可能趋向于在一个平衡点达到稳定,此平衡点指所有客户机从 NIS 服务器获得响应的时间都可以接受。只要您的客户机能够获得 NIS 服务,服务来源便无关紧要。例如,一台 NIS 服务器计算机可以从网络中的其他 NIS 服务器获取其 NIS 服务。
在无法进行本地服务器绑定的特殊情况下,使用 ypset 命令可以暂时允许绑定到其他网络或子网中的其他服务器(如果可用)。但是,为了使用 -ypset 选项,启动 ypbind 时必须使用 -ypset 或 -ypsetme 选项。
出于安全考虑,应将 -ypset 和 -ypsetme 选项的使用限制于在受控情况下的调试用途。使用 -ypset 和 -ypsetme 选项会严重破坏安全性,因为当这些守护进程运行时,任何人都可以更改服务器绑定,从而给其他用户造成麻烦,并允许对敏感数据进行未经授权的访问。如果必须以这些选项来启动 ypbind,等修复问题后,应立即中止 ypbind,并在不使用这些选项的情况下重新启动。
如果 ypbind 崩溃几乎都发生在每次启动后的瞬间,请查找系统其他某个部分中的问题。通过键入以下内容来检查是否存在 rpcbind 守护进程。
% ps -e | grep rpcbind |
如果 rpcbind 不存在、无法持续运行或行为异常,请查阅 RPC 文档。
您可以通过正常运行的计算机与存在问题的客户机中的 rpcbind 通信。从运行正常的计算机中,键入以下内容。
% rpcinfo client |
如果存在问题的客户机中的 rpcbind 正常,rpcinfo 将生成以下输出。
program version netid address service owner ... 100007 2 udp 0.0.0.0.2.219 ypbind superuser 100007 1 udp 0.0.0.0.2.219 ypbind superuser 100007 1 tcp 0.0.0.0.2.220 ypbind superuser 100007 2 tcp 0.0.0.0.128.4 ypbind superuser 100007 2 ticotsord \000\000\020H ypbind superuser 100007 2 ticots \000\000\020K ypbind superuser ... |
您的计算机将具有不同地址。如果未显示这些地址,则 ypbind 无法注册其服务。请重新引导计算机并再次运行 rpcinfo。如果存在 ypbind 进程并且这些进程在每次重新启动 NIS 服务时都会更改,那么请重新引导系统,即使 rpcbind 守护进程正在运行,也应如此。
如果只有一两台客户机出现表明存在 NIS 绑定问题的症状,则可能是这些客户机存在问题。请参见影响一台客户机的 NIS 问题。如果许多 NIS 客户机都无法正确绑定,则可能是一台或多台 NIS 服务器存在问题。
创建包含以下特殊字符串的 /etc/default/yppasswdd: "check_restricted_shell_name=1"。
如果将 "check_restricted_shell_name=1" 字符串注释掉,则不会进行 "r" 检查。
如果网络或 NIS 服务器过载,从而导致 ypserv 无法使响应在超时时间段内返回到客户机 ypbind 进程,则 NIS 将挂起。
在这些情况下,网络中的每台客户机都会遇到相同或相似的问题。在大多数情况下,这是暂时的。当 NIS 服务器重新引导并重新启动 ypserv 时或 NIS 服务器或网络自身的负载降低时,通常不会再显示消息。
确保服务器已启动并且正在运行。如果您的物理位置离服务器较远,请使用 ping 命令。
如果服务器已启动并且正在运行,请尝试找到行为正常的客户机计算机,并运行 ypwhich 命令。如果 ypwhich 不响应,请将其中止。然后作为 root 登录 NIS 服务器并通过输入以下内容来检查 NIS 进程是否正在运行。
# ps -e | grep yp |
不要将 -f 选项与 ps 结合使用,因为此选项会尝试将用户 ID 转换为名称,从而导致可能不会成功的更多名称服务查找。
如果 NIS 服务器 (ypserv) 和 NIS 客户机 (ypbind) 守护进程都未运行,请通过键入以下内容来使其重新启动。
# svcadm restart network/nis/server or # /usr/lib/netsvc/yp/ypstop # /usr/lib/netsvc/yp/ypstart |
如果 ypserv 和 ypbind 进程都在 NIS 服务器上运行,则请运行 ypwhich。如果 ypwhich 不响应,ypserv 可能已挂起,应重新启动。作为 root 登录服务器后,请通过键入以下内容来重新启动 NIS 服务。
# svcadm restart network/nis/server or # /usr/lib/netsvc/yp/ypstop # /usr/lib/netsvc/yp/ypstart |
由于 NIS 在服务器之间传播映射,有时您会在网络中的不同 NIS 服务器上发现同一映射的不同版本。如果差别持续的时间不长,则此版本差异正常并且可以接受。
引起映射差异的最常见原因是某些因素阻止了正常的映射传播。例如,NIS 服务器或 NIS 服务器之间的路由器关闭。当所有 NIS 服务器以及 NIS 服务器之间的路由器都在运行时,ypxfr 应该能成功运行。
如果服务器和路由器运行正常,请检查以下各项:
记录 ypxfr 输出(请参见记录 ypxfr 输出)。
检查控制文件(请参见检查 crontab 文件和 ypxfr Shell 脚本)。
检查主服务器上的 ypservers 映射。请参见检查 ypservers 映射。
如果特定从属服务器在更新映射时出现问题,请登录该服务器并以交互方式运行 ypxfr。如果 ypxfr 运行失败,则会指出失败原因,然后您可以针对原因解决问题。如果 ypxfr 运行成功,但您怀疑过程中可能曾出现问题,请创建一个日志文件以便记录消息。要创建日志文件,请在从属服务器上输入以下内容。
ypslave# cd /var/yp ypslave# touch ypxfr.log |
这将创建一个 ypxfr.log 文件,该文件会保存 ypxfr 的所有输出。
该输出与 ypxfr 在以交互方式运行时所显示的输出类似,但日志文件中的每行都带有时间标记。(您可能会发现时间标记排序不正常。这是正常情况-时间标记会指出 ypxfr 开始运行的时间。如果 ypxfr 的副本同时运行,但它们所用的时间不同,则它们实际上按照不同于调用顺序的顺序将摘要状态行写入日志文件。)日志中将显示任何形式的间歇性故障。
解决问题后,请通过删除日志文件来关闭记录功能。如果忘记删除该文件,它会继续无限制地增大。
检查根 crontab 文件,并检查该文件调用的 ypxfr shell 脚本。这些文件中的排字错误会引起传播问题。无法引用 /var/spool/cron/crontabs/root 文件中的 shell 脚本以及无法引用任何 shell 脚本中的映射也会引起错误。
此外,还要确保域的主服务器上的 ypservers 映射中列出该 NIS 从属服务器。否则,从属服务器仍可作为服务器正常运行,但 yppush 不会将映射更改传播至从属服务器。
如果 NIS 从属服务器的问题不明显,可在调试时解决这一问题,方法是使用 rcp 或 ftp 从运行状况良好的 NIS 服务器中复制不一致映射的最新版本。下面显示了如何传送有问题的映射。
ypslave# rcp ypmaster:/var/yp/mydomain/map.\* /var/yp/mydomain |
* 字符在命令行中进行了转义,这样它将在 ypmaster 中展开,而不是在 ypslave 本地展开。
如果 ypserv 进程几乎总是在启动后的瞬间崩溃,并且即使重复激活也无法持续运行,则基本上可遵照ypbind 崩溃中所述的过程进行调试。如下所示,检查是否存在 rpcbind 守护进程。
ypserver% ps -e | grep rpcbind |
如果找不到守护进程,请重新引导服务器。或者,如果守护进程正在运行,请键入以下内容并查找类似输出。
% rpcinfo -p ypserver |
% program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100068 2 udp 32813 cmsd ... 100007 1 tcp 34900 ypbind 100004 2 udp 731 ypserv 100004 1 udp 731 ypserv 100004 1 tcp 732 ypserv 100004 2 tcp 32772 ypserv |
您的计算机可能具有不同的端口号。表示 ypserv 进程的四个项如下所示。
100004 2 udp 731 ypserv 100004 1 udp 731 ypserv 100004 1 tcp 732 ypserv 100004 2 tcp 32772 ypserv |
如果没有任何项并且 ypserv 无法向 rpcbind 注册其服务,请重新引导计算机。如果存在这些项,请在重新启动 ypserv 之前从 rpcbind 取消注册服务。要从 rpcbind 中取消注册服务,请在服务器上键入以下内容。
# rpcinfo -d number 1 # rpcinfo -d number 2 |
其中,number 是 rpcinfo 报告的ID 号(在以上示例中,ID 号为 100004)。