安装 NIS 之后,您可能会发现,有些映射需要频繁更新,而其他映射则从来不需要更改。例如,在大公司的网络中,passwd.byname 映射可能会频繁更改,而 auto_master 映射则只进行少量更改,甚至不进行任何更改。
如缺省 NIS 映射中所述,缺省 NIS 映射的缺省位置是在主服务器上的 /var/yp/domainname 中,其中 domainname 是 NIS 域的名称。需要更新映射时,可以根据该映射是否为缺省映射来使用两个更新过程之一。
以下各部分介绍如何使用各种更新工具。实际上,您可能决定只在系统已启动并运行后添加非缺省映射或更改 NIS 服务器集时才使用这些工具。
使用以下过程可以更新随缺省集提供的映射。
成为主服务器上的超级用户。
请始终只在主服务器上修改 NIS 映射。
无论要更改的映射的源文件位于 /etc 中还是位于您选择的其他某个目录中,都对该文件进行编辑。
键入以下命令。
# cd /var/yp # make mapname |
更改映射后,Makefile 将使用 yppush 向从属服务器传播新映射(除非在 Makefile 中设置了 NOPUSH
。)它通过通知 ypserv 守护进程和发送映射传送请求来完成此操作。然后,从属服务器上的 ypserv 守护进程会启动 ypxfr 进程,该进程反过来与主服务器上的 ypxfrd 守护进程联系。在进行一些基本检查(例如,映射是否真的发生了更改?)后,便会传送映射。然后,从属服务器上的 ypxfr 将向 yppush 进程发送响应,指明传送是否成功。
上述过程不适用于新创建的、但从属服务器中尚不存在的映射。必须通过在从属服务器上运行 ypxfr 将新映射发送给从属服务器。
有时候,映射无法传播,必须使用 ypxfr 手动发送新映射信息。可以选择以两种不同方法使用 ypxfr:通过根 crontab 文件定期使用,或在命令行中交互使用。这些方法将在以下各节中进行讨论。
不同的映射具有不同的更改速率。例如,有些映射有时候几个月都不更改一次(如缺省映射中的 protocols.byname 以及非缺省映射中的 auto_master);但 passwd.byname 可能一天就会进行多次更改。使用 crontab 命令调度映射传送可为各映射设置特定的传播时间。
要以适合于映射的速率定期运行 ypxfr,每台从属服务器中的根 crontab 文件都应包含相应的 ypxfr 项。ypxfr 将与主服务器联系,并仅在主服务器中的副本比本地副本更新时才传送映射。
如果主服务器运行带有缺省 -m 选项的 rpc.yppasswdd,则每次有人更改 yp 口令时,passwd 守护进程都会运行 make,以重新生成 passwd 映射。
作为为每个映射创建单独的 crontab 项的备选方法,您可能更喜欢让根 crontab 命令运行可定期更新所有映射的 shell 脚本。用于更新映射的 shell 脚本样例位于 /usr/lib/netsvc/yp 目录中。这些脚本名为 ypxfr_1perday、ypxfr_1perhour 和 ypxfr_2perday。您可以修改或替换这些 shell 脚本以满足站点需要。实例 6–1 显示了缺省 ypxfr_1perday shell 脚本。
#! /bin/sh # # ypxfr_1perday.sh - Do daily yp map check/updates PATH=/bin:/usr/bin:/usr/lib/netsvc/yp:$PATH export PATH # set -xv ypxfr group.byname ypxfr group.bygid ypxfr protocols.byname ypxfr protocols.bynumber ypxfr networks.byname ypxfr networks.byaddr ypxfr services.byname ypxfr ypservers |
如果根 crontab 每天执行一次,此 shell 脚本可以每天更新一次映射。还可以使脚本以其他频率更新映射(如每周一次、每月一次、每小时一次等等)。但请注意,频繁传播映射会降低性能。
在为 NIS 域配置的每台从属服务器上,以超级用户的身份运行相同的 shell 脚本。逐台服务器更改确切的执行时间,以避免使主服务器陷入停顿状态。
如果要从特定的从属服务器中传送映射,请在 shell 脚本中使用 ypxfr 的 -h machine 选项。放入脚本中的命令的语法如下所示。
# /usr/lib/netsvc/yp/ypxfr -h machine [ -c ] mapname |
其中,machine 是要传送的映射所在服务器的名称,mapname 是所请求的映射的名称。如果使用 -h 选项而不指定计算机,ypxfr 将尝试从主服务器中获取映射。如果执行 ypxfr 时 ypserv 未在本地运行,则必须使用 -c 标志,以使 ypxfr 不向本地 ypserver 发送清除当前映射的请求。
可以使用 -s domain 选项从其他域向本地域传送映射。这些映射在各个域中应该相同。例如,两个域可能共享相同的 services.byname 和 services.byaddr 映射。或者,也可以使用 rcp 或 rdist 来获取更多控制,以便跨域传送文件。
另一种调用 ypxfr 的方法是将其作为命令来运行。通常,只在异常情况下使用此方法-例如,通过设置临时 NIS 服务器来创建测试环境时或在尝试使断开服务的 NIS 服务器快速与其他服务器保持一致时。
可在日志文件中捕获 ypxfr 的传送尝试和结果。如果存在名为 /var/yp/ypxfr.log 的文件,则会向该文件中附加结果。对于该日志文件的大小没有任何限制。为防止日志文件无限制地增大,请通过键入以下命令不断清空该文件。
# cd /var/yp # cp ypxfr.log ypxfr.log.old # cat /dev/null > /var/yp/ypxfr.log |
可让 crontab 一周执行一次上述命令。要禁用日志记录,请删除日志文件。
要更新非缺省映射,必须执行下列操作。
创建或编辑对应的文本文件。
生成(或重新生成)新映射或更新的映射。有两种方法可以生成映射。
使用 Makefile。使用 Makefile 是生成非缺省映射的首选方法。如果映射在 Makefile 中具有一项,请运行 make name,其中 name 是要生成的映射的名称。如果映射没有 Makefile 项,请尝试根据修改和使用 Makefile中的说明创建一项。
使用 /usr/sbin/makedbm 程序。makedbm(1M) 全面介绍了此命令。
如果没有输入文件,则可通过两种不同的方法使用 makedbm 来修改映射:
将 makedbm -u 输出重定向到一个临时文件中,修改该文件,然后使用修改过的文件作为 makedbm 的输入。
在为 makedbm 提供输入的流水线中对 makedbm -u 的输出执行操作。如果可以用附加的 awk、sed 或 cat 更新反编译的映射,则这种方法适用。
假设使用编辑器或 shell 脚本在主服务器上创建了一个文本文件 /var/yp/mymap.asc。您要从此文件中创建一个 NIS 映射,并使其位于 homedomain 子目录中。为此,请在主服务器上键入以下命令。
# cd /var/yp # makedbm mymap.asc homedomain/mymap |
mymap 映射现在存在于主服务器上的 homedomain 目录中。要向从属服务器分发新映射,请运行 ypxfr。
向 mymap 中添加项很简单。首先,必须修改文本文件 /var/yp/mymap.asc。如果修改实际的 dbm 文件而不修改对应的文本文件,则修改会丢失。然后,按上面所示运行 makedbm。
如果不存在原始文本文件,请通过键入 makedbm 的输入从键盘创建 NIS 映射,如下所示(以 Ctrl-D 组合键结束)。
ypmaster# cd /var/yp ypmaster# makedbm -homedomain/mymapkey1 value1 key2 value2 key3 value3 |
如果以后需要修改映射,可以使用 makedbm 反编译映射,并创建一个临时的中间文本文件。要反编译映射并创建临时文件,请键入以下命令。
% cd /var/yp % makedbm -u homedomain/mymap > mymap.temp |
在生成的临时文件 mymap.temp 中,每行包含一项。根据需要,可以使用任何文本编辑器编辑此文件。
要更新映射,请通过键入以下命令将修改过的临时文件的名称提供给 makedbm。
% makedbm mymap.temp homedomain/mymap % rm mymap.temp |
然后,成为超级用户并键入以下命令,以将映射传播给从属服务器。
# yppush mymap |
前面几段介绍了如何使用 makedbm 创建映射;但是,您实际必须执行的每项操作都可以通过 ypinit 和 Makefile 来完成,除非在系统启动并运行后向数据库中添加了非缺省映射或更改了 NIS 服务器集。
无论在 /var/yp 中使用 Makefile 还是其他某个过程,目标都是相同的。格式正确的新 dbm 文件对必须在主服务器上的映射目录中结束。