本章介绍名称服务转换器。名称服务转换器可用于协调各个名称服务的使用。
名称服务转换器是一个名为 nsswitch.conf 的文件,用于控制客户机或应用程序获取网络信息的方式。客户机应用程序使用名称服务转换器来调用类似如下的任何 getXbyY() 接口:
每台计算机的 /etc 目录中都有一个转换器文件。该文件中的每一行都标识特定类型的网络信息(如主机、口令和组),其后面是该信息的一个或多个位置。
客户机可以从一个或多个转换器的源获取名称信息。例如,NIS+ 客户机可以从 NIS+ 表获取其主机信息,从本地 /etc 文件获取其口令信息。另外,客户机可以指定转换器在哪些条件下必须使用每个源。请参见表 2–1。
在安装过程中,Solaris 系统会自动将 nsswitch.conf 文件加载到每台计算机的 /etc 目录中。对于 LDAP、NIS、NIS+ 或文件,还可以将四个备用(模板)版本的转换器文件加载到 /etc 中。请参见nsswitch.conf 模板文件。
这四个文件是备用的缺省转换器文件。每个文件旨在处理不同的主名称服务:/etc 文件、NIS、NIS+ 或 LDAP。将 Solaris 软件首次安装到计算机上时,安装程序会选择计算机的缺省名称服务:NIS+、NIS、本地文件或 LDAP。在安装过程中,会将相应的模板文件复制到 nsswitch.conf 中。例如,对于使用 LDAP 的客户机,会在安装过程中将 nsswitch.ldap 复制到 nsswitch.conf 中。除非您拥有特殊的名称空间,否则复制到 nsswitch.conf 中的缺省模板文件应该能够满足正常的操作。
系统没有为 DNS 提供缺省文件,但是可以编辑其中的任何文件以使用 DNS。有关更多信息,请参见DNS 和 Internet 访问。
如果以后要更改计算机的主名称服务,则可以将相应的备用转换器文件复制到 nsswitch.conf 中。请参见nsswitch.conf 模板文件。还可以通过编辑 /etc/nsswitch.conf 文件中的相应行来更改客户机所用特定网络信息类型的源。下面的内容介绍语法,如何修改名称服务转换器中提供了其他说明。
nsswitch.conf 文件实质上就是一个列表,其中包含 16 种信息和 getXXbyYY() 例程在其中搜索这些信息的源。下面是这 16 种信息(并非必须按此顺序):
aliases
bootparams
ethers
group
hosts
ipnodes
netgroup
netmasks
networks
passwd(包括阴影信息)
protocols
publickey
rpc
services
automount
sendmailvars
下表说明了可以列在上述信息类型的转换器文件中的源的种类。
表 2–1 转换器文件中的信息源
信息源 |
说明 |
---|---|
files |
存储在客户机的 /etc 目录中的文件。例如,/etc/passwd。 |
nisplus |
一个 NIS+ 表。例如,hosts 表。 |
nis |
一个 NIS 映射。例如,hosts 映射。 |
compat |
compat 可用于口令和组信息,从而支持 /etc/passwd、/etc/shadow 和 /etc/group 文件中的旧式 + 或 - 语法。 |
dns |
可用于指定从 DNS 获取主机信息。 |
ldap |
可用于指定从 LDAP 目录获取项。 |
单个源。如果某个信息类型只有一个源(如 nisplus),则使用转换器的例程将只在该源中搜索信息。如果该例程找到了此信息,则返回 success 状态消息。如果该例程未找到此信息,则会停止搜索并返回不同的状态消息。对错误消息的处理方式因例程而异。
多个源。如果表中包含给定信息类型的多个源,则该转换器会指示此例程在列出的第一个源中搜索。如果该例程找到了此信息,则返回 success 状态消息。如果该例程未在第一个源中找到此信息,将尝试在下一个源中进行搜索。该例程将依次搜索所有的源,直到找到此信息或者该例程由于指定了 return 而停止。如果在搜索了列出的所有源之后仍未找到此信息,该例程将停止搜索并返回 non-success 状态消息。
如果该例程找到了此信息,则返回 success 状态消息。如果该例程未找到此信息,则会返回下面的三个错误状态消息之一。下表列出了可能的状态消息。
表 2–2 转换器搜索状态消息
状态消息 |
消息的含义 |
---|---|
SUCCESS |
在指定的源中找到了所请求的项。 |
UNAVAIL |
该源不响应或者不可用。换言之,NIS+ 表、NIS 映射和 /etc 文件均无法找到或访问。 |
NOTFOUND |
该源用“该项不存在”响应。换言之,已经访问该表、映射或文件,但是未找到必需的信息。 |
TRYAGAIN |
该源正忙。该源下次可能会响应。换言之,找到了该表、映射或文件,但是此时无法响应查询。 |
可以指示转换器用下表中显示的两个操作之一来响应状态消息。
表 2–3 对转换器状态消息的响应
操作 |
含义 |
---|---|
return |
停止查找信息。 |
continue |
尝试在下一个源中查找。 |
nsswitch.conf 文件状态消息和操作选项一起决定例程在每个步骤执行的操作。状态和操作的组合构成了搜索条件。
对于每个源来说,转换器的缺省搜索条件完全相同。有关上面列出的状态消息的说明,请参见以下内容:
UNAVAIL=continue。转至下一个 nsswitch.conf 文件源并继续搜索。如果该源是最后一个源或唯一的源,则返回 NOTFOUND 状态。
NOTFOUND=continue。转至下一个 nsswitch.conf 文件源并继续搜索。如果该源是最后一个源或唯一的源,则返回 NOTFOUND 状态。
TRYAGAIN=continue。转至下一个 nsswitch.conf 文件源并继续搜索。如果该源是最后一个源或唯一的源,则返回 NOTFOUND 状态。
可以通过使用上面显示的 STATUS=action 语法明确指定某个其他条件来更改缺省搜索条件。例如,NOTFOUND 条件的缺省操作是继续搜索下一个源。例如,要指定 networks 在遇到 NOTFOUND 条件时停止搜索,请编辑转换器文件的 networks 行。 该行应如下所示:
networks: nis [NOTFOUND=return] files |
networks: nis [NOTFOUND=return] files 一行为 NOTFOUND 状态指定非缺省条件。非缺省条件由方括号分隔。
在本示例中,搜索条件按如下方式工作:
如果 networks 映射可用且包含需要的信息,搜索例程将返回 SUCCESS 状态消息。
如果 networks 映射不可用,搜索例程将返回 UNAVAIL 状态消息。缺省情况下,搜索例程会继续搜索相应的 /etc 文件。
如果 networks 映射可用且已找到,但是不包含需要的信息,搜索例程将返回 NOTFOUND 消息。但是,搜索例程将停止搜索,而不是像缺省行为那样继续搜索相应的 /etc 文件。
如果 networks 映射正忙,搜索例程将返回 TRYAGAIN 状态消息,而且会继续搜索相应的 /etc 文件(缺省操作)。
在 nsswitch.conf 文件中的查找是按照项的列出顺序进行的。但是,口令更新将以相反的顺序进行,除非使用 passwd -r repository 命令另行指定了更新顺序。有关更多信息,请参见转换器文件和口令信息。
客户机库例程中包含经过编译的缺省项,如果 nsswitch.conf 文件中缺少某项或者其语法有误,则会使用这个缺省项。这些项与转换器文件的缺省值相同。
名称服务转换器假设表名和源名的拼写正确无误。如果表名或源名的拼写有误,转换器将使用缺省值。
auto_home 和 auto_master 表和映射的转换器搜索条件组合成一个名为 automount 的类别。
timezone 表不使用转换器,因此该表不包含在转换器文件的列表中。
nsswitch.conf 文件中任何以注释字符 (#) 开头的行都被解释为注释行。搜索该文件的例程会忽略注释行。
注释标记前面的字符会由搜索 nsswitch.conf 文件的例程进行解释。注释标记右侧的字符会被解释为注释并被忽略。
表 2–4 转换器文件的注释示例
行的类型 |
示例 |
---|---|
注释行。 |
# hosts: nisplus [NOTFOUND=return] files |
解释行。 |
hosts: nisplus [NOTFOUND=return] file |
部分解释的行。不对 files 元素进行解释。 |
hosts: nisplus [NOTFOUND=return] # files |
对 nsswitch.conf 进行更改之后必须重新启动密钥服务器。
只有启动了密钥服务器后,密钥服务器才会读取名称服务转换器配置文件中的 publickey 项。如果更改转换器配置文件,则只有重新启动密钥服务器后,才会在密钥服务器上注册所做的更改。
随 Solaris 系统提供了四个可以适用于不同名称服务的转换器模块文件。每个文件都提供一组不同的缺省信息源。
下面列出了这四个模板文件:
LDAP 模板文件。nsswitch.ldap 配置文件指定 LDAP 目录作为计算机的主要信息源。
为了使用 LDAP 名称服务,除了修改 nsswitch.conf 以外,还必须正确地配置所有的 LDAP 客户机。有关更多信息,请参见第 12 章,设置 LDAP 客户机(任务)。
NIS+ 模板文件。nsswitch.nisplus 配置指定 NIS+ 作为所有信息(passwd、group、automount 和 aliases 除外)的主要源。对于那四个例外文件,主要信息源是本地 /etc 文件,次要信息源是 NIS+ 表。[NOTFOUND=return] 搜索条件指示转换器在获得“该项不存在”消息时停止在 NIS+ 表中搜索。只有当 NIS+ 服务器不可用时,转换器才在本地文件中进行搜索。
NIS 模板文件。nsswitch.nis 配置文件与 NIS+ 配置文件几乎完全相同,唯一的区别在于 NIS 文件指定 NIS 映射(而非 NIS+ 表)。因为 passwd 和 group 的搜索顺序是 files nis,所以您不必将 + 项放在 /etc/passwd 和 /etc/group 文件中。
文件模板文件。nsswitch.files 配置文件指定本地 /etc 文件作为计算机的唯一信息源。netgroup 没有“文件”源,因此客户机在转换器文件中不使用该项。
将最符合要求的模板文件复制到 nsswitch.conf 配置文件中,然后根据需要修改该文件。
例如,要使用 LDAP 模板文件,可键入以下命令:
mymachine# cp /etc/nsswitch.ldap /etc/nsswitch.conf |
下面列出了随 Solaris 产品提供的四个转换器文件。
# # # /etc/nsswitch.nisplus: # # # An example file that could be copied over to /etc/nsswitch.conf; # it uses NIS+ (NIS Version 3) in conjunction with files. # # "hosts:" and "services:" in this file are used only if the # /etc/netconfig file has a "-" for nametoaddr_libs of "inet" # transports. # the following two lines obviate the "+" entry in /etc/passwd # and /etc/group. passwd: files nisplus group: files nisplus # consult /etc "files" only if nisplus is down. hosts: nisplus [NOTFOUND=return] files # Uncomment the following line, and comment out the above, to use # both DNS and NIS+. You must also set up the /etc/resolv.conf # file for DNS name server lookup. See resolv.conf(4). # hosts: nisplus dns [NOTFOUND=return] files services: nisplus [NOTFOUND=return] files networks: nisplus [NOTFOUND=return] files protocols: nisplus [NOTFOUND=return] files rpc: nisplus [NOTFOUND=return] files ethers: nisplus [NOTFOUND=return] files netmasks: nisplus [NOTFOUND=return] files bootparams: nisplus [NOTFOUND=return] files publickey: nisplus netgroup: nisplus automount: files nisplus aliases: files nisplus sendmailvars: files nisplus |
# # /etc/nsswitch.nis: # # An example file that could be copied over to /etc/nsswitch.conf; # it uses NIS (YP) in conjunction with files. # # "hosts:" and "services:" in this file are used only if the # /etc/netconfig file has a "-" for nametoaddr_libs of "inet" # transports. # # the following two lines obviate the "+" entry in /etc/passwd # and /etc/group. passwd: files nis group: files nis # consult /etc "files" only if nis is down. hosts: nis [NOTFOUND=return] files networks: nis [NOTFOUND=return] files protocols: nis [NOTFOUND=return] files rpc: nis [NOTFOUND=return] files ethers: nis [NOTFOUND=return] files netmasks: nis [NOTFOUND=return] files bootparams: nis [NOTFOUND=return] files publickey: nis [NOTFOUND=return] files netgroup: nis automount: files nis aliases: files nis # for efficient getservbyname() avoid nis services: files nis sendmailvars: files |
# # /etc/nsswitch.files: # # An example file that could be copied over to /etc/nsswitch.conf; # it does not use any naming service. # # "hosts:" and "services:" in this file are used only if the # /etc/netconfig file has a "-" for nametoaddr_libs of "inet" # transports. passwd: files group: files hosts: files networks: files protocols: files rpc: files ethers: files netmasks: files bootparams: files publickey: files # At present there isn't a 'files' backend for netgroup; # the system will figure it out pretty quickly, and will notuse # netgroups at all. netgroup: files automount: files aliases: files services: files sendmailvars: files |
# # /etc/nsswitch.ldap: # # An example file that could be copied over to /etc/nsswitch.conf; it # uses LDAP in conjunction with files. # # "hosts:" and "services:" in this file are used only if the # /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports. # the following two lines obviate the "+" entry in /etc/passwd and /etc/group. passwd: files ldap group: files ldap hosts: ldap [NOTFOUND=return] files networks: ldap [NOTFOUND=return] files protocols: ldap [NOTFOUND=return] files rpc: ldap [NOTFOUND=return] files ethers: ldap [NOTFOUND=return] files netmasks: ldap [NOTFOUND=return] files bootparams: ldap [NOTFOUND=return] files publickey: ldap [NOTFOUND=return] files netgroup: ldap automount: files ldap aliases: files ldap # for efficient getservbyname() avoid ldap services: files ldap sendmailvars: files |
随 Solaris 软件安装的缺省 nsswitch.conf 文件由安装过程中选择的名称服务确定。每一行都标识特定类型的网络信息(如主机、口令和组)以及信息源(如 NIS+ 表、NIS 映射、DNS 主机表或本地 /etc)。在选择某个名称服务时,会复制该服务的转换器模板文件以创建新的 nsswitch.conf 文件。例如,如果选择 NIS+,则会复制 nsswitch.nisplus 文件以创建新的 nsswitch.conf 文件。
Solaris 9 发行版软件会自动将 nsswitch.conf 文件与下列备用(模板)版本一起加载到每台计算机的 /etc 目录中。
这些备用模板文件中包含由 NIS+ 服务、NIS 服务、本地文件和 LDAP 使用的缺省转换器配置。系统没有为 DNS 提供缺省文件,但是可以编辑其中的任何文件以使用 DNS。在将 Solaris 软件首次安装到计算机上时,安装程序会选择计算机的缺省名称服务。在安装过程中,会将相应的模板文件复制到 /etc/nsswitch.conf 中。例如,对于使用 NIS+ 的客户机,会在安装过程中将 nsswitch.nisplus 复制到 nsswitch.conf 中。
如果网络连接到 Internet,而且用户必须使用 DNS 访问 Internet 主机,则必须启用 DNS 转发。
除非您拥有特殊的名称空间,否则复制到 nsswitch.conf 中的缺省模板文件应该能够满足正常的操作。
更改计算机的名称服务时,需要相应地修改计算机的转换器文件。例如,如果将计算机的名称服务从 NIS 更改为 NIS+,则需要安装适用于 NIS+ 的转换器文件。可通过将相应的模板文件复制到 nsswitch.conf 中来更改转换器文件。
如果要使用 NIS+ 安装脚本在计算机上安装 NIS+,系统会将 NIS+ 模板脚本复制到 nsswitch.conf 中。在这种情况下,除非您希望进行自定义,否则不必对转换器文件进行配置。
继续更改转换器文件之前,请确保正确设置了列在该文件中的源。换言之,如果打算选择 NIS+ 版本,客户机必须最终能够访问 NIS+ 服务。如果打算选择本地文件版本,则必须在客户机上正确设置这些文件。
要更改转换器文件,请执行以下步骤。
为了使用 LDAP 名称服务,除了修改 nsswitch.conf 以外,还必须正确地配置所有的 LDAP 客户机。有关更多信息,请参见第 12 章,设置 LDAP 客户机(任务)。
成为超级用户或承担等效角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见 System Administration Guide: Security Services中的“Using Role-Based Access Control (Tasks)”。
将适用于计算机名称服务的相应备用文件复制到 nsswitch.conf 文件中。
NIS+ 版本(由 NIS+ 脚本自动完成)
client1# cd /etc client1# cp nsswitch.nisplus nsswitch.conf |
NIS 版本
client1# cd /etc client1# cp nsswitch.nis nsswitch.conf |
本地 /etc 文件版本
client1# cd /etc client1# cp nsswitch.files nsswitch.conf |
重新引导计算机。
nscd 守护进程对转换器信息进行缓存。 有关相应的信息,请参见 nscd(1M) 手册页。
某些库例程不会通过定期检查 nsswitch.conf 文件来查看该文件是否经过更改。必须重新引导计算机以确保此守护进程和这些例程具有该文件中的最新信息。
nsswitch.conf 文件还控制客户机的 DNS 转发,如以下各小节中所述。DNS 转发允许客户机访问 Internet。有关如何为 NIS 和 NIS+ 设置 DNS 转发的信息,请参见System Administration Guide: Naming and Directory Services (NIS+)。
NIS、NIS+ 和 LDAP 支持存储 IPv6 数据,还支持将 IPv6 传输机制用于协议通信。从 BIND 8.3.3 版开始,Solaris 上的 DNS 支持在客户端使用 IPv6 传输机制。从 BIND 8.4.2 版开始,Solaris 上的 DNS 为 IPv6 网络提供了完整的客户机/服务器解决方案。
nsswitch.conf 文件控制 IPv6 地址的搜索条件。IPv6 将 IP 地址的大小从 32 位增加到 128 位,从而可以支持更多层的寻址分层结构。地址大小越大,提供的可寻址节点越多。有关 IPv6 及其配置和实现的更多信息,请参见System Administration Guide: IP Services。
将新的 ipnodes 源用于 IPv6 地址。/etc/inet/ipnodes 文件同时存储 IPv4 和 IPv6 地址。/etc/inet/ipnodes 文件与 /etc/hosts 文件使用相同的格式约定。
能够识别 IPv6 的名称服务将新的 ipnodes 源用于搜索转发。例如,如果 LDAP 能够识别 IPv6 地址,请指定以下内容:
ipnodes: ldap [NOTFOUND=return] files |
潜在的延迟问题:
ipnodes 的缺省值为 files。在将 IPv4 转换为 IPv6 的过程中,由于并非所有的名称服务都能够识别 IPv6 地址,因此将接受 files(这是缺省值)。否则,在地址的解析过程中可能出现不必要的延迟(如引导计时延迟)。
应用程序会先在所有的 ipnodes 数据库中搜索 IPv4 地址,然后在 hosts 数据库中搜索 IPv4 地址。在指定 ipnodes 之前,请考虑在这两个数据库中都搜索 IPv4 地址所固有的延迟。
如果在/etc/passwd、/etc/shadow 和 /etc/group 文件中使用 +/-,则需要修改 nsswitch.conf 文件以确保与 +/- 兼容。
NIS+。要向 NIS+ 提供 +/- 语义,请将 passwd 和 groups 源更改为 compat。然后,将 passwd_compat: nisplus 项添加到 nsswitch.conf 文件中 passwd 或 group 项的后面,如下所示:
passwd: compat passwd_compat: nisplus group: compat group_compat: nisplus |
NIS。要提供与 Solaris 4.x 发行版中相同的语法,请将 passwd 和 groups 源更改为 compat。
passwd: compat group: compat |
指定 /etc 文件和由这些文件中的 +/- 项指定的 NIS 映射。
如果用户所使用的客户机由运行在 NIS 兼容模式下的 NIS+ 服务器提供服务,用户将无法针对 netgroup 表运行 ypcat。如果运行,即使该表中有项,所得到的结果也与该表为空时一样。
可以将口令信息包括在多个系统信息库(如 files 和 nisplus)中并访问它们。可以使用 nsswitch.conf 文件来为这些信息设置查找顺序。
files 必须是 nsswitch.conf 文件中 passwd 信息的第一个源。
在 NIS+ 环境中,nsswitch.conf 文件中的 passwd 行应当按以下顺序列出系统信息库:
passwd: files nisplus |
在 NIS 环境中,nsswitch.conf 文件中的 passwd 行应当按以下顺序列出系统信息库:
passwd: files nis |
首先列出 files 可允许 root 在大多数情况下(即使系统遇到某些网络问题或名称服务问题)登录。
建议不要为同一个用户维护多个系统信息库。通过为每个用户在单个系统信息库中维护集中的口令管理,可以减少发生混淆和错误的几率。如果要为每个用户维护多个系统信息库,请使用 passwd -r 命令来更新口令信息。
passwd -r repository |