系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)

更新和修改现有映射

安装 NIS 之后,您可能会发现,有些映射需要频繁更新,而其他映射则从来不需要更改。例如,在大公司的网络中,passwd.byname 映射可能会频繁更改,而 auto_master 映射则只进行少量更改,甚至不进行任何更改。

缺省 NIS 映射中所述,缺省 NIS 映射的缺省位置是在主服务器上的 /var/yp/domainname 中,其中 domainname 是 NIS 域的名称。需要更新映射时,可以根据该映射是否为缺省映射来使用两个更新过程之一。

以下各部分介绍如何使用各种更新工具。实际上,您可能决定只在系统已启动并运行后添加非缺省映射或更改 NIS 服务器集时才使用这些工具。

如何更新随缺省集提供的映射

使用以下过程可以更新随缺省集提供的映射。

  1. 成为主服务器上的超级用户。

    请始终只在主服务器上修改 NIS 映射。

  2. 无论要更改的映射的源文件位于 /etc 中还是位于您选择的其他某个目录中,都对该文件进行编辑。

  3. 键入以下命令。


    # cd /var/yp
    
    # make mapname
    

    然后,make 命令将根据您在其相应文件中所做的更改来更新映射。该命令还会在其他服务器中传播更改。

传播 NIS 映射

更改映射后,Makefile 将使用 yppush 向从属服务器传播新映射(除非在 Makefile 中设置了 NOPUSH。)它通过通知 ypserv 守护进程和发送映射传送请求来完成此操作。然后,从属服务器上的 ypserv 守护进程会启动 ypxfr 进程,该进程反过来与主服务器上的 ypxfrd 守护进程联系。在进行一些基本检查(例如,映射是否真的发生了更改?)后,便会传送映射。然后,从属服务器上的 ypxfr 将向 yppush 进程发送响应,指明传送是否成功。


注意 –

上述过程适用于新创建的、但从属服务器中尚不存在的映射。必须通过在从属服务器上运行 ypxfr 将新映射发送给从属服务器。


有时候,映射无法传播,必须使用 ypxfr 手动发送新映射信息。可以选择以两种不同方法使用 ypxfr:通过根 crontab 文件定期使用,或在命令行中交互使用。这些方法将在以下各节中进行讨论。

cron 用于映射传送

不同的映射具有不同的更改速率。例如,有些映射有时候几个月都不更改一次(如缺省映射中的 protocols.byname 以及非缺省映射中的 auto_master);但 passwd.byname 可能一天就会进行多次更改。使用 crontab 命令调度映射传送可为各映射设置特定的传播时间。

要以适合于映射的速率定期运行 ypxfr,每台从属服务器中的根 crontab 文件都应包含相应的 ypxfr 项。ypxfr 将与主服务器联系,并仅在主服务器中的副本比本地副本更新时才传送映射。


注意 –

如果主服务器运行带有缺省 -m 选项的 rpc.yppasswdd,则每次有人更改 yp 口令时,passwd 守护进程都会运行 make,以重新生成 passwd 映射。


将 Shell 脚本用于 cronypxfr

作为为每个映射创建单独的 crontab 项的备选方法,您可能更喜欢让根 crontab 命令运行可定期更新所有映射的 shell 脚本。用于更新映射的 shell 脚本样例位于 /usr/lib/netsvc/yp 目录中。这些脚本名为 ypxfr_1perdayypxfr_1perhourypxfr_2perday。您可以修改或替换这些 shell 脚本以满足站点需要。实例 6–1 显示了缺省 ypxfr_1perday 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 将尝试从主服务器中获取映射。如果执行 ypxfrypserv 未在本地运行,则必须使用 -c 标志,以使 ypxfr 不向本地 ypserver 发送清除当前映射的请求。

可以使用 -s domain 选项从其他域向本地域传送映射。这些映射在各个域中应该相同。例如,两个域可能共享相同的 services.bynameservices.byaddr 映射。或者,也可以使用 rcprdist 来获取更多控制,以便跨域传送文件。

直接调用 ypxfr

另一种调用 ypxfr 的方法是将其作为命令来运行。通常,只在异常情况下使用此方法-例如,通过设置临时 NIS 服务器来创建测试环境时或在尝试使断开服务的 NIS 服务器快速与其他服务器保持一致时。

记录 ypxfr 活动

可在日志文件中捕获 ypxfr 的传送尝试和结果。如果存在名为 /var/yp/ypxfr.log 的文件,则会向该文件中附加结果。对于该日志文件的大小没有任何限制。为防止日志文件无限制地增大,请通过键入以下命令不断清空该文件。


# cd /var/yp

# cp ypxfr.log ypxfr.log.old

# cat /dev/null > /var/yp/ypxfr.log

可让 crontab 一周执行一次上述命令。要禁用日志记录,请删除日志文件。

修改缺省映射

要更新非缺省映射,必须执行下列操作。

  1. 创建或编辑对应的文本文件。

  2. 生成(或重新生成)新映射或更新的映射。有两种方法可以生成映射。

    • 使用 Makefile。使用 Makefile 是生成非缺省映射的首选方法。如果映射在 Makefile 中具有一项,请运行 make name,其中 name 是要生成的映射的名称。如果映射没有 Makefile 项,请尝试根据修改和使用 Makefile中的说明创建一项。

    • 使用 /usr/sbin/makedbm 程序。makedbm(1M) 全面介绍了此命令。

使用 makedbm 修改非缺省映射

如果没有输入文件,则可通过两种不同的方法使用 makedbm 来修改映射:

从文本文件中创建新映射

假设使用编辑器或 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 创建映射;但是,您实际必须执行的每项操作都可以通过 ypinitMakefile 来完成,除非在系统启动并运行后向数据库中添加了非缺省映射或更改了 NIS 服务器集。

无论在 /var/yp 中使用 Makefile 还是其他某个过程,目标都是相同的。格式正确的新 dbm 文件对必须在主服务器上的映射目录中结束。