NIS 绑定问题具有以下常见症状。
客户机上的命令在后台模式下缓慢运行,或运行速度远低于正常情况
客户机上的命令崩溃,同时显示不明消息或根本不显示消息
如果只有一两台客户机出现了表明 NIS 绑定问题的症状,则可能是这些客户机存在问题。如果许多 NIS 客户机都无法正确绑定,则可能是一台或多台 NIS 服务器存在问题。请参见影响多台客户机的 NIS 问题。
一台客户机中存在问题,但同一子网上的其他客户机运行正常。在存在问题的客户机上,对满足以下条件的目录运行 ls –l:目录中的文件由许多用户拥有,并且其中一些用户不在该客户机的 /etc/passwd 文件中。例如 /usr 目录。如果显示结果将不在本地 /etc/passwd 中的文件所有者以数字形式(而非名称)列出,表明 NIS 服务未在该客户机上运行。
这些症状通常表示客户机的 ypbind 进程未运行。请验证 NIS 客户机服务是否正在运行。
client# svcs \*nis\* STATE STIME FMRI disabled Sep_01 svc:/network/nis/domain:default disabled Sep_01 svc:/network/nis/client:default
如果服务处于 disabled 状态,请以 root 身份登录或承担等效的角色,然后启动 NIS 客户机服务。
client# svcadm enable network/nis/domain client# svcadm enable network/nis/client
一台客户机中存在问题,其他客户机运行正常,但 ypbind 正在出问题的客户机上运行。该客户机的域可能设置不正确。
在该客户机上,运行 domainname 命令,查看它设置了哪个域名。
client7# domainname example.com
将输出与 NIS 主服务器上 /var/yp 中的实际域名进行比较。实际的 NIS 域显示为 /var/yp 目录中的子目录。
client7# ls -l /var/yp -rwxr-xr-x 1 root Makefile drwxr-xr-x 2 root binding drwx------ 2 root example.com
如果在计算机上运行 domainname 所返回的域名与 /var/yp 中作为目录列出的服务器域名不同,则计算机的 /etc/defaultdomain 文件中指定的域名不正确。请按如何设置计算机的 NIS 域名中所示重新设置 NIS 域名。
如果域名设置正确,并且 ypbind 正在运行,但命令仍然挂起,请运行 ypwhich 命令来确保客户机已绑定到服务器。如果您刚刚启动了 ypbind,可多运行几次 ypwhich(通常,第一次运行时会报告域未绑定,第二次便会成功)。
如果域名设置正确,并且 ypbind 正在运行,但有消息提示客户机无法与服务器通信,则表示问题可能有多种:
客户机是否具有 /var/yp/binding/domainname/ypservers 文件(该文件包含要绑定到的服务器的列表)?如果没有该文件,请运行 ypinit –c 并按优先级顺序指定客户机应绑定到的服务器。
如果客户机具有 /var/yp/binding/domainname/ypservers 文件,该文件中列出的服务器数量是否足以应对一台或两台服务器不可用时的情况?如果没有足够多的服务器,请运行 ypinit –c 向列表中添加更多服务器。
选定的 NIS 服务器在 /etc/inet/hosts 文件中是否有相应项?要查看选定的 NIS 服务器,请使用 svcprop –p config/ypservers nis/domain 命令。如果这些主机不在本地 /etc/inet/hosts 文件中,请将服务器添加到 hosts NIS 映射并通过运行 ypinit – c 或 ypinit –s 命令重新生成您的映射,如使用 NIS 映射中所述。
是否已将名称服务转换设置为除了检查 NIS 外还检查计算机的本地 hosts 文件?有关该转换的更多信息,请参见关于名称服务转换。
是否已将名称服务转换设置为首先在 files 中检查 services 和 rpc?有关该转换的更多信息,请参见关于名称服务转换。
在同一客户机上多次使用 ypwhich 时,所显示的结果会随 NIS 服务器的更改而有所不同。这是正常的。当网络或 NIS 服务器繁忙时,NIS 客户机到 NIS 服务器的绑定会不时发生变化。只要可以进行绑定,网络便会在某一时间稳定,所有客户机在此期间从 NIS 服务器获取可接受的响应时间。只要您的客户机能够获得 NIS 服务,服务来源无关紧要。例如,一台 NIS 服务器计算机可以从网络中的其他 NIS 服务器获取其 NIS 服务。
在无法进行本地服务器绑定的特殊情况下,使用 ypset 命令可以暂时允许绑定到其他网络或子网中的另一台服务器(如果可用)。但是,为了使用 –ypset 选项,必须使用 –ypset 或 –ypsetme 选项启动 ypbind。有关更多信息,请参见 ypbind(1M) 手册页。
# /usr/lib/netsvc/yp/ypbind -ypset
有关其他方法,请参见绑定到特定 NIS 服务器。
注意 - 出于安全原因,建议不要使用 –ypset 和 –ypsetme 选项。请仅在可控情况下将这些选项用于调试用途。使用 –ypset 和 –ypsetme 选项可能会导致严重的安全违规,因为在守护进程运行时,任何人都可以更改服务器绑定,这会给其他人带来麻烦,并将允许未经授权的用户访问敏感数据。如果您必须使用这些选项启动 ypbind 守护进程,则在修复问题后,您必须中止 ypbind 进程并在不使用这些选项的情况下将其重新启动。要重新启动 ypbind 守护进程,请按以下方式使用 SMF: # svcadm enable -r svc:/network/nis/client:default |
如果 ypbind 守护进程几乎每次在启动后都会立即崩溃,请在 svc:/network/nis/client:default 服务日志中查找问题。键入以下内容检查是否存在 rpcbind 守护进程:
% ps -e |grep rpcbind
如果 rpcbind 不存在或者没有保持运行或行为奇怪,请检查 svc:/network/rpc/bind:default 日志文件。有关更多信息,请参见 rpcbind(1M) 和 rpcinfo(1M) 手册页。
您也许能够从正常运行的计算机上与存在问题的客户机中的 rpcbind 通信。从正常运行的计算机中,键入以下内容:
% rpcinfo client
如果存在问题的计算机中的 rpcbind 正常,rpcinfo 将生成以下输出内容:
program version netid address service owner ... 100007 3 udp6 ::.191.161 ypbind 1 100007 3 tcp6 ::.135.200 ypbind 1 100007 3 udp 0.0.0.0.240.221 ypbind 1 100007 2 udp 0.0.0.0.240.221 ypbind 1 100007 1 udp 0.0.0.0.240.221 ypbind 1 100007 3 tcp 0.0.0.0.250.107 ypbind 1 100007 2 tcp 0.0.0.0.250.107 ypbind 1 100007 1 tcp 0.0.0.0.250.107 ypbind 1 100007 3 ticlts 2\000\000\000 ypbind 1 100007 2 ticlts 2\000\000\000 ypbind 1 100007 3 ticotsord 9\000\000\000 ypbind 1 100007 2 ticotsord 9\000\000\000 ypbind 1 100007 3 ticots @\000\000\000 ypbind 1 ...
您的计算机将具有不同地址。如果未显示这些地址,则 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 也可能会挂起。
在这些情况下,网络中的每台客户机都会遇到相同或相似的问题。在大多数情况下,这种问题是暂时的。在重新引导 NIS 服务器并重新启动 ypserv 时,NIS 服务器或网络自身的负载降低时,或者当网络恢复正常运行时,这些消息通常会消失。
确保服务器已启动并且正在运行。如果您的物理位置离服务器较远,请使用 ping 命令。
如果服务器已启动并且正在运行,请尝试找一台能够正常工作的客户机,然后运行 ypwhich 命令。如果 ypwhich 不响应,请将其中止。然后以 root 身份登录 NIS 服务器,并键入以下命令检查 NIS 进程是否正在运行:
# ptree |grep ypbind 100759 /usr/lib/netsvc/yp/ypbind -broadcast 527360 grep yp
如果 ypserv(NIS 服务器)或 ypbind(NIS 客户机)守护进程都未运行,请通过键入以下命令重新启动它们:
# svcadm restart network/nis/client
如果 ypserv 和 ypbind 进程都在 NIS 服务器上运行,请运行 ypwhich 命令。如果该命令没有响应,则表明 ypserv 守护进程可能已挂起并应当重新启动。在以 root 身份登录到服务器后,请键入以下命令重新启动 NIS 服务:
# svcadm restart network/nis/server
因为 NIS 在服务器之间传播映射,所以有时您可能会在网络中的不同 NIS 服务器上找到同一个映射的不同版本。如果差别持续的时间不长,则此版本差异正常并且可以接受。
导致映射差异最常见的原因是某些因素阻止了正常的映射传播。例如,NIS 服务器或 NIS 服务器之间的路由器关闭。当所有 NIS 服务器以及它们之间的路由器都在运行时,ypxfr 应该会成功。
如果服务器和路由器运行正常,请检查以下各项:
检查 ypxfr 日志输出:请参见记录 ypxfr 输出。
检查 svc:/network/nis/xfr:default 日志文件以查找错误。
检查控制文件。请参见检查 crontab 文件和 ypxfr Shell 脚本。
检查主服务器上的 ypservers 映射。请参见检查 ypservers 映射。
如果特定从属服务器在更新映射时出现问题,请登录该服务器并以交互方式运行 ypxfr 命令。如果该命令失败,则它将指明为何失败,并且您可以修复问题。如果此命令运行成功,但您怀疑运行有时失败,请创建一个日志文件以便记录消息。要创建日志文件,请在从属服务器上键入以下命令。
ypslave# cd /var/yp ypslave# touch ypxfr.log
这将创建一个 ypxfr.log 文件,该文件会保存 ypxfr 的所有输出。
该输出与 ypxfr 以交互方式运行时所显示的输出类似,但日志文件中的每行都带有时间戳。(您可能会在时间戳中看到异常的排序。这是正常情况-时间戳会告诉您 ypxfr 开始运行的时间。如果 ypxfr 的多个副本同时运行,但所用的时间不同,则它们可能实际上按照不同于调用顺序的顺序将摘要状态行写入日志文件。)任何形式的间歇性故障都会在日志中显示。
检查 root crontab 文件,并检查它调用的 ypxfr shell 脚本。这些文件中的排字错误可能会引起传播问题。在 /var/spool/cron/crontabs/root 文件中引用 shell 脚本失败,或者在任何 shell 脚本中引用映射失败,也可能会导致错误。
另外,请确保 NIS 从属服务器已列在域中主服务器的 ypservers 映射中。否则,从属服务器虽然仍可作为服务器正常运行,但 yppush 不会将映射的更改传播至从属服务器。
如果 NIS 从属服务器问题不明显,则您可以采用以下解决方法来纠正问题:使用 scp 或 ssh 命令从正常运行的 NIS 服务器复制不一致映射的最新版本。下面显示了如何传送有问题的映射:
ypslave# scp ypmaster:/var/yp/mydomain/map.\* /var/yp/mydomain
命令行中的 * 字符已转义,以便它将在 ypmaster 上展开,而不是在 ypslave 本地展开。
如果 ypserv 进程几乎总是在启动后的瞬间崩溃,并且即使重复启动也无法持续运行,则基本上可按照ypbind 崩溃中所述的过程进行调试。首先,运行以下命令来查看是否会报告任何错误:
# svcs -vx nis/server
如下所示,检查是否存在 rpcbind 守护进程:
# ptree |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)。